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": "5eae8593-c4d4-4410-9bc2-7107c2eda7dd",
"scope": {
"pragma": "^0.8.24",
"network": "mantle-mainnet",
"lineCount": 530,
"protocols": [
"mETH",
"cmETH",
"USDY",
"Aave V3",
"Merchant Moe",
"Agni"
],
"sourceKind": "paste",
"aiReasoning": {
"hits": 115,
"total": 115,
"misses": 0,
"batches": 0,
"skipped": 0,
"enriched": 0,
"provider": "tokenhub",
"timeoutMs": 75000,
"fallbackCount": 0,
"providersUsed": []
},
"reducedMode": null,
"solcVersion": "0.8.24",
"gasOptimizer": {
"pricing": {
"mode": "calibrated-receipts",
"pricedAt": "2026-06-16T20:18:53.117Z",
"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": "0x4d4c49ad4272172a7f8ba937a85468cd3981a19cab333ae7b4f963e13b167b0f",
"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": "Group adjacent bool/address/small uint fields together and place full-slot fields after them.",
"before": "mapping(address => uint256[]) public userPositions; … mapping(bytes32 => bool) public reportExists;",
"ruleId": "storage-packing",
"safety": "review",
"status": "skipped",
"l2GasDelta": 20000,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "Group adjacent bool/address/small uint fields together and place full-slot fields after them.",
"before": "mapping(bytes32 => bool) public consumedMessages; … address[] public listedTokens;",
"ruleId": "storage-packing",
"safety": "review",
"status": "skipped",
"l2GasDelta": 20000,
"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 onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4);",
"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 pendingReward(uint256 id) 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 claimReward(uint256 id) public 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(uint256 id) public 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 withdrawWithHook(uint256 id, address hook, bytes calldata data) 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(uint256 id, uint256 debtAmount) 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 repay(uint256 id, 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 liquidate(uint256 id) 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 healthFactor(uint256 id) 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 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 sweepByOrigin(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 TOKENNOTLISTED(); … if (!(condition)) revert TOKENNOTLISTED();",
"before": "require(listedToken[token], \"TOKEN_NOT_LISTED\");",
"ruleId": "custom-errors",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 120,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"before": "require(p.user == msg.sender, \"NOT_POSITION_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 NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"before": "require(p.user == msg.sender, \"NOT_POSITION_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 NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"before": "require(p.user == msg.sender, \"NOT_POSITION_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 NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"before": "require(p.user == msg.sender, \"NOT_POSITION_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 UNDERCOLLATERALIZED(); … if (!(condition)) revert UNDERCOLLATERALIZED();",
"before": "require((collateralValue * 6500) / BPS >= debtAmount, \"UNDERCOLLATERALIZED\");",
"ruleId": "custom-errors",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 120,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"before": "require(p.user == msg.sender, \"NOT_POSITION_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 ALREADYCONSUMED(); … if (!(condition)) revert ALREADYCONSUMED();",
"before": "require(!consumedMessages[messageHash], \"ALREADY_CONSUMED\");",
"ruleId": "custom-errors",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 120,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "error DELEGATECALLFAILED(); … if (!(condition)) revert DELEGATECALLFAILED();",
"before": "require(ok, \"DELEGATECALL_FAILED\");",
"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 = listedToken[token]; // reuse cached value",
"before": "listedToken[token] 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 = positions[id]; // reuse cached value",
"before": "positions[id] read 9 times",
"ruleId": "cache-repeated-sload",
"safety": "review",
"status": "skipped",
"l2GasDelta": 800,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "uint256 cached = reportExists[reportHash]; // reuse cached value",
"before": "reportExists[reportHash] 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 = hashes[i]; // reuse cached value",
"before": "hashes[i] 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 = consumedMessages[messageHash]; // reuse cached value",
"before": "consumedMessages[messageHash] 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": "for (uint256 i = 0; i < ids.length; unchecked { ++i; }) {",
"before": "for (uint256 i = 0; i < ids.length; i++) {",
"ruleId": "unchecked-loop-increment",
"safety": "review",
"status": "skipped",
"l2GasDelta": 30,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "for (uint256 i = 0; i < hashes.length; unchecked { ++i; }) {",
"before": "for (uint256 i = 0; i < hashes.length; i++) {",
"ruleId": "unchecked-loop-increment",
"safety": "review",
"status": "skipped",
"l2GasDelta": 30,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "for (uint256 i = 0; i < allPositions.length; unchecked { ++i; }) {",
"before": "for (uint256 i = 0; i < allPositions.length; i++) {",
"ruleId": "unchecked-loop-increment",
"safety": "review",
"status": "skipped",
"l2GasDelta": 30,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "uint256 len = array.length; for (...; i < len; ) { ... }",
"before": "for (uint256 i = 0; i < ids.length; i++) {",
"ruleId": "loop-hygiene",
"safety": "review",
"status": "skipped",
"l2GasDelta": 100,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "uint256 len = array.length; for (...; i < len; ) { ... }",
"before": "for (uint256 i = 0; i < hashes.length; i++) {",
"ruleId": "loop-hygiene",
"safety": "review",
"status": "skipped",
"l2GasDelta": 100,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "uint256 len = array.length; for (...; i < len; ) { ... }",
"before": "for (uint256 i = 0; i < allPositions.length; i++) {",
"ruleId": "loop-hygiene",
"safety": "review",
"status": "skipped",
"l2GasDelta": 100,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "require(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(debtAmount != 0, \"ZERO_DEBT\");",
"before": "require(debtAmount > 0, \"ZERO_DEBT\");",
"ruleId": "nonzero-comparison",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 3,
"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": "require(p.debt != 0, \"NO_DEBT\");",
"before": "require(p.debt > 0, \"NO_DEBT\");",
"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": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "if (implementation != address(0) && arbitraryData.length != 0) {",
"before": "if (implementation != address(0) && arbitraryData.length > 0) {",
"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 listedToken;",
"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 keeper;",
"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 frozen;",
"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 reportExists;",
"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 consumedMessages;",
"ruleId": "bitmap-bools",
"safety": "review",
"status": "skipped",
"l2GasDelta": 20000,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "for (uint256 i; i < ids.length; i++) {",
"before": "for (uint256 i = 0; i < ids.length; i++) {",
"ruleId": "remove-zero-init",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 3,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "for (uint256 i; i < hashes.length; i++) {",
"before": "for (uint256 i = 0; i < hashes.length; i++) {",
"ruleId": "remove-zero-init",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 3,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "for (uint256 i; i < allPositions.length; i++) {",
"before": "for (uint256 i = 0; i < allPositions.length; i++) {",
"ruleId": "remove-zero-init",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 3,
"l1DaDeltaWei": null
}
],
"version": "archon.gasMeasurement.v1",
"measuredAt": "2026-06-16T15:20:20.369Z",
"rulesetHash": "1c02c9b0fe33d4a14a30849dff8c8cc3719db0071e3e6561575dd69b551b0ab8",
"contractHash": "4d4c49ad4272172a7f8ba937a85468cd3981a19cab333ae7b4f963e13b167b0f"
},
"opportunities": [
{
"id": "storage-packing",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Group adjacent bool/address/small uint fields together and place full-slot fields after them.",
"patch": {
"newText": " mapping(address => uint256[]) public userPositions; // REVIEW: reorder adjacent small storage fields with nearby small fields to reduce SSTORE/SLOAD slots",
"oldText": " mapping(address => uint256[]) public userPositions;"
},
"title": "Pack small storage variables into fewer slots",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:83",
"before": "mapping(address => uint256[]) public userPositions; … mapping(bytes32 => bool) public reportExists;",
"safety": "review",
"newText": " mapping(address => uint256[]) public userPositions; // REVIEW: reorder adjacent small storage fields with nearby small fields to reduce SSTORE/SLOAD slots",
"oldText": " mapping(address => uint256[]) public userPositions;",
"category": "storage",
"severity": "medium",
"lineStart": 83,
"rationale": "Storage slot packing can remove entire SSTORE/SLOAD slots but changes layout, so upgradeable contracts need manual review.",
"confidence": 0.64,
"estL1Delta": null,
"estL2Delta": 20000,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 20000,
"estimatedDataBytesSaved": null
},
{
"id": "storage-packing",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Group adjacent bool/address/small uint fields together and place full-slot fields after them.",
"patch": {
"newText": " mapping(bytes32 => bool) public consumedMessages; // REVIEW: reorder adjacent small storage fields with nearby small fields to reduce SSTORE/SLOAD slots",
"oldText": " mapping(bytes32 => bool) public consumedMessages;"
},
"title": "Pack small storage variables into fewer slots",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:88",
"before": "mapping(bytes32 => bool) public consumedMessages; … address[] public listedTokens;",
"safety": "review",
"newText": " mapping(bytes32 => bool) public consumedMessages; // REVIEW: reorder adjacent small storage fields with nearby small fields to reduce SSTORE/SLOAD slots",
"oldText": " mapping(bytes32 => bool) public consumedMessages;",
"category": "storage",
"severity": "medium",
"lineStart": 88,
"rationale": "Storage slot packing can remove entire SSTORE/SLOAD slots but changes layout, so upgradeable contracts need manual review.",
"confidence": 0.64,
"estL1Delta": null,
"estL2Delta": 20000,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 20000,
"estimatedDataBytesSaved": null
},
{
"id": "calldata-smaller-types",
"file": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:24",
"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": 24,
"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": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:25",
"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": 25,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4); // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4);"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:35",
"before": "function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4);",
"safety": "review",
"newText": " function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4); // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4);",
"category": "calldata",
"severity": "low",
"lineStart": 35,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function pendingReward(uint256 id) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function pendingReward(uint256 id) public view returns (uint256) {"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:211",
"before": "function pendingReward(uint256 id) public view returns (uint256) {",
"safety": "review",
"newText": " function pendingReward(uint256 id) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function pendingReward(uint256 id) public view returns (uint256) {",
"category": "calldata",
"severity": "low",
"lineStart": 211,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function claimReward(uint256 id) public notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function claimReward(uint256 id) public notPaused {"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:219",
"before": "function claimReward(uint256 id) public notPaused {",
"safety": "review",
"newText": " function claimReward(uint256 id) public notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function claimReward(uint256 id) public notPaused {",
"category": "calldata",
"severity": "low",
"lineStart": 219,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function withdraw(uint256 id) public notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function withdraw(uint256 id) public notPaused {"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:236",
"before": "function withdraw(uint256 id) public notPaused {",
"safety": "review",
"newText": " function withdraw(uint256 id) public notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function withdraw(uint256 id) public notPaused {",
"category": "calldata",
"severity": "low",
"lineStart": 236,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused {"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:253",
"before": "function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused {",
"safety": "review",
"newText": " function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused {",
"category": "calldata",
"severity": "low",
"lineStart": 253,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function borrow(uint256 id, uint256 debtAmount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function borrow(uint256 id, uint256 debtAmount) external notPaused {"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:279",
"before": "function borrow(uint256 id, uint256 debtAmount) external notPaused {",
"safety": "review",
"newText": " function borrow(uint256 id, uint256 debtAmount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function borrow(uint256 id, uint256 debtAmount) external notPaused {",
"category": "calldata",
"severity": "low",
"lineStart": 279,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function repay(uint256 id, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function repay(uint256 id, uint256 amount) external notPaused {"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:297",
"before": "function repay(uint256 id, uint256 amount) external notPaused {",
"safety": "review",
"newText": " function repay(uint256 id, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function repay(uint256 id, uint256 amount) external notPaused {",
"category": "calldata",
"severity": "low",
"lineStart": 297,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function liquidate(uint256 id) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function liquidate(uint256 id) external notPaused {"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:312",
"before": "function liquidate(uint256 id) external notPaused {",
"safety": "review",
"newText": " function liquidate(uint256 id) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function liquidate(uint256 id) external notPaused {",
"category": "calldata",
"severity": "low",
"lineStart": 312,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function healthFactor(uint256 id) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function healthFactor(uint256 id) public view returns (uint256) {"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:340",
"before": "function healthFactor(uint256 id) public view returns (uint256) {",
"safety": "review",
"newText": " function healthFactor(uint256 id) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function healthFactor(uint256 id) public view returns (uint256) {",
"category": "calldata",
"severity": "low",
"lineStart": 340,
"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": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:348",
"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": 348,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function sweepByOrigin(address token, address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function sweepByOrigin(address token, address to, uint256 amount) external {"
},
"title": "Review calldata parameter width",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:497",
"before": "function sweepByOrigin(address token, address to, uint256 amount) external {",
"safety": "review",
"newText": " function sweepByOrigin(address token, address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function sweepByOrigin(address token, address to, uint256 amount) external {",
"category": "calldata",
"severity": "low",
"lineStart": 497,
"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": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:149",
"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": 149,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "error TOKENNOTLISTED(); … if (!(condition)) revert TOKENNOTLISTED();",
"patch": {
"newText": " if (!(listedToken[token])) revert TOKENNOTLISTED();",
"oldText": " require(listedToken[token], \"TOKEN_NOT_LISTED\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:178",
"before": "require(listedToken[token], \"TOKEN_NOT_LISTED\");",
"safety": "safe",
"newText": " if (!(listedToken[token])) revert TOKENNOTLISTED();",
"oldText": " require(listedToken[token], \"TOKEN_NOT_LISTED\");",
"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": 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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"patch": {
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:222",
"before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"safety": "safe",
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"category": "deployment",
"severity": "info",
"lineStart": 222,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"patch": {
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:239",
"before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"safety": "safe",
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"category": "deployment",
"severity": "info",
"lineStart": 239,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"patch": {
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:256",
"before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"safety": "safe",
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"category": "deployment",
"severity": "info",
"lineStart": 256,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"patch": {
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:282",
"before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"safety": "safe",
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"category": "deployment",
"severity": "info",
"lineStart": 282,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "error UNDERCOLLATERALIZED(); … if (!(condition)) revert UNDERCOLLATERALIZED();",
"patch": {
"newText": " if (!((collateralValue * 6500) / BPS >= debtAmount)) revert UNDERCOLLATERALIZED();",
"oldText": " require((collateralValue * 6500) / BPS >= debtAmount, \"UNDERCOLLATERALIZED\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:287",
"before": "require((collateralValue * 6500) / BPS >= debtAmount, \"UNDERCOLLATERALIZED\");",
"safety": "safe",
"newText": " if (!((collateralValue * 6500) / BPS >= debtAmount)) revert UNDERCOLLATERALIZED();",
"oldText": " require((collateralValue * 6500) / BPS >= debtAmount, \"UNDERCOLLATERALIZED\");",
"category": "deployment",
"severity": "info",
"lineStart": 287,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
"patch": {
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:300",
"before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"safety": "safe",
"newText": " if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
"oldText": " require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
"category": "deployment",
"severity": "info",
"lineStart": 300,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "error ALREADYCONSUMED(); … if (!(condition)) revert ALREADYCONSUMED();",
"patch": {
"newText": " if (!(!consumedMessages[messageHash])) revert ALREADYCONSUMED();",
"oldText": " require(!consumedMessages[messageHash], \"ALREADY_CONSUMED\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:457",
"before": "require(!consumedMessages[messageHash], \"ALREADY_CONSUMED\");",
"safety": "safe",
"newText": " if (!(!consumedMessages[messageHash])) revert ALREADYCONSUMED();",
"oldText": " require(!consumedMessages[messageHash], \"ALREADY_CONSUMED\");",
"category": "deployment",
"severity": "info",
"lineStart": 457,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "error DELEGATECALLFAILED(); … if (!(condition)) revert DELEGATECALLFAILED();",
"patch": {
"newText": " if (!(ok)) revert DELEGATECALLFAILED();",
"oldText": " require(ok, \"DELEGATECALL_FAILED\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:494",
"before": "require(ok, \"DELEGATECALL_FAILED\");",
"safety": "safe",
"newText": " if (!(ok)) revert DELEGATECALLFAILED();",
"oldText": " require(ok, \"DELEGATECALL_FAILED\");",
"category": "deployment",
"severity": "info",
"lineStart": 494,
"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": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:500",
"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": 500,
"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": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:42",
"before": "address public owner;",
"safety": "review",
"newText": " address immutable public owner;",
"oldText": " address public owner;",
"category": "storage",
"severity": "info",
"lineStart": 42,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "uint256 cached = listedToken[token]; // reuse cached value",
"patch": {
"newText": "listedToken[token]",
"oldText": "listedToken[token]"
},
"title": "Cache repeated storage read",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:135",
"before": "listedToken[token] read 3 times",
"safety": "review",
"newText": "listedToken[token]",
"oldText": "listedToken[token]",
"category": "storage",
"severity": "info",
"lineStart": 135,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "uint256 cached = positions[id]; // reuse cached value",
"patch": {
"newText": "positions[id]",
"oldText": "positions[id]"
},
"title": "Cache repeated storage read",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:193",
"before": "positions[id] read 9 times",
"safety": "review",
"newText": "positions[id]",
"oldText": "positions[id]",
"category": "storage",
"severity": "info",
"lineStart": 193,
"rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
"confidence": 0.7,
"estL1Delta": null,
"estL2Delta": 800,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 800,
"estimatedDataBytesSaved": null
},
{
"id": "cache-repeated-sload",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "uint256 cached = reportExists[reportHash]; // reuse cached value",
"patch": {
"newText": "reportExists[reportHash]",
"oldText": "reportExists[reportHash]"
},
"title": "Cache repeated storage read",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:365",
"before": "reportExists[reportHash] read 2 times",
"safety": "review",
"newText": "reportExists[reportHash]",
"oldText": "reportExists[reportHash]",
"category": "storage",
"severity": "info",
"lineStart": 365,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "uint256 cached = hashes[i]; // reuse cached value",
"patch": {
"newText": "hashes[i]",
"oldText": "hashes[i]"
},
"title": "Cache repeated storage read",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:399",
"before": "hashes[i] read 2 times",
"safety": "review",
"newText": "hashes[i]",
"oldText": "hashes[i]",
"category": "storage",
"severity": "info",
"lineStart": 399,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "uint256 cached = consumedMessages[messageHash]; // reuse cached value",
"patch": {
"newText": "consumedMessages[messageHash]",
"oldText": "consumedMessages[messageHash]"
},
"title": "Cache repeated storage read",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:457",
"before": "consumedMessages[messageHash] read 2 times",
"safety": "review",
"newText": "consumedMessages[messageHash]",
"oldText": "consumedMessages[messageHash]",
"category": "storage",
"severity": "info",
"lineStart": 457,
"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": "unchecked-loop-increment",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "for (uint256 i = 0; i < ids.length; unchecked { ++i; }) {",
"patch": {
"newText": " for (uint256 i = 0; i < ids.length; ++i /* wrap increment in unchecked block after refactor */) {",
"oldText": " for (uint256 i = 0; i < ids.length; i++) {"
},
"title": "Use unchecked loop increment where bounded",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:274",
"before": "for (uint256 i = 0; i < ids.length; i++) {",
"safety": "review",
"newText": " for (uint256 i = 0; i < ids.length; ++i /* wrap increment in unchecked block after refactor */) {",
"oldText": " for (uint256 i = 0; i < ids.length; i++) {",
"category": "computation",
"severity": "info",
"lineStart": 274,
"rationale": "A loop counter bounded by array length cannot overflow in practical execution; unchecked removes overflow checks after manual review.",
"confidence": 0.58,
"estL1Delta": null,
"estL2Delta": 30,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 30,
"estimatedDataBytesSaved": null
},
{
"id": "unchecked-loop-increment",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "for (uint256 i = 0; i < hashes.length; unchecked { ++i; }) {",
"patch": {
"newText": " for (uint256 i = 0; i < hashes.length; ++i /* wrap increment in unchecked block after refactor */) {",
"oldText": " for (uint256 i = 0; i < hashes.length; i++) {"
},
"title": "Use unchecked loop increment where bounded",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:398",
"before": "for (uint256 i = 0; i < hashes.length; i++) {",
"safety": "review",
"newText": " for (uint256 i = 0; i < hashes.length; ++i /* wrap increment in unchecked block after refactor */) {",
"oldText": " for (uint256 i = 0; i < hashes.length; i++) {",
"category": "computation",
"severity": "info",
"lineStart": 398,
"rationale": "A loop counter bounded by array length cannot overflow in practical execution; unchecked removes overflow checks after manual review.",
"confidence": 0.58,
"estL1Delta": null,
"estL2Delta": 30,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 30,
"estimatedDataBytesSaved": null
},
{
"id": "unchecked-loop-increment",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "for (uint256 i = 0; i < allPositions.length; unchecked { ++i; }) {",
"patch": {
"newText": " for (uint256 i = 0; i < allPositions.length; ++i /* wrap increment in unchecked block after refactor */) {",
"oldText": " for (uint256 i = 0; i < allPositions.length; i++) {"
},
"title": "Use unchecked loop increment where bounded",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:512",
"before": "for (uint256 i = 0; i < allPositions.length; i++) {",
"safety": "review",
"newText": " for (uint256 i = 0; i < allPositions.length; ++i /* wrap increment in unchecked block after refactor */) {",
"oldText": " for (uint256 i = 0; i < allPositions.length; i++) {",
"category": "computation",
"severity": "info",
"lineStart": 512,
"rationale": "A loop counter bounded by array length cannot overflow in practical execution; unchecked removes overflow checks after manual review.",
"confidence": 0.58,
"estL1Delta": null,
"estL2Delta": 30,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 30,
"estimatedDataBytesSaved": null
},
{
"id": "loop-hygiene",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "uint256 len = array.length; for (...; i < len; ) { ... }",
"patch": {
"newText": " for (uint256 i = 0; i < ids.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
"oldText": " for (uint256 i = 0; i < ids.length; i++) {"
},
"title": "Cache array length before loop",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:274",
"before": "for (uint256 i = 0; i < ids.length; i++) {",
"safety": "review",
"newText": " for (uint256 i = 0; i < ids.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
"oldText": " for (uint256 i = 0; i < ids.length; i++) {",
"category": "storage",
"severity": "info",
"lineStart": 274,
"rationale": "Caching storage array length avoids repeated SLOADs; using ++i/unchecked can reduce loop overhead.",
"confidence": 0.82,
"estL1Delta": null,
"estL2Delta": 100,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 100,
"estimatedDataBytesSaved": null
},
{
"id": "loop-hygiene",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "uint256 len = array.length; for (...; i < len; ) { ... }",
"patch": {
"newText": " for (uint256 i = 0; i < hashes.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
"oldText": " for (uint256 i = 0; i < hashes.length; i++) {"
},
"title": "Cache array length before loop",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:398",
"before": "for (uint256 i = 0; i < hashes.length; i++) {",
"safety": "review",
"newText": " for (uint256 i = 0; i < hashes.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
"oldText": " for (uint256 i = 0; i < hashes.length; i++) {",
"category": "storage",
"severity": "info",
"lineStart": 398,
"rationale": "Caching storage array length avoids repeated SLOADs; using ++i/unchecked can reduce loop overhead.",
"confidence": 0.82,
"estL1Delta": null,
"estL2Delta": 100,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 100,
"estimatedDataBytesSaved": null
},
{
"id": "loop-hygiene",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "uint256 len = array.length; for (...; i < len; ) { ... }",
"patch": {
"newText": " for (uint256 i = 0; i < allPositions.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
"oldText": " for (uint256 i = 0; i < allPositions.length; i++) {"
},
"title": "Cache array length before loop",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:512",
"before": "for (uint256 i = 0; i < allPositions.length; i++) {",
"safety": "review",
"newText": " for (uint256 i = 0; i < allPositions.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
"oldText": " for (uint256 i = 0; i < allPositions.length; i++) {",
"category": "storage",
"severity": "info",
"lineStart": 512,
"rationale": "Caching storage array length avoids repeated SLOADs; using ++i/unchecked can reduce loop overhead.",
"confidence": 0.82,
"estL1Delta": null,
"estL2Delta": 100,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 100,
"estimatedDataBytesSaved": null
},
{
"id": "nonzero-comparison",
"file": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:179",
"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": 179,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "if (fee != 0) {",
"patch": {
"newText": " if (fee != 0) {",
"oldText": " if (fee > 0) {"
},
"title": "Use != 0 for unsigned non-zero checks",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:187",
"before": "if (fee > 0) {",
"safety": "safe",
"newText": " if (fee != 0) {",
"oldText": " if (fee > 0) {",
"category": "computation",
"severity": "info",
"lineStart": 187,
"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": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:226",
"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": 226,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "require(debtAmount != 0, \"ZERO_DEBT\");",
"patch": {
"newText": " require(debtAmount != 0, \"ZERO_DEBT\");",
"oldText": " require(debtAmount > 0, \"ZERO_DEBT\");"
},
"title": "Use != 0 for unsigned non-zero checks",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:284",
"before": "require(debtAmount > 0, \"ZERO_DEBT\");",
"safety": "safe",
"newText": " require(debtAmount != 0, \"ZERO_DEBT\");",
"oldText": " require(debtAmount > 0, \"ZERO_DEBT\");",
"category": "computation",
"severity": "info",
"lineStart": 284,
"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": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:301",
"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": 301,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "require(p.debt != 0, \"NO_DEBT\");",
"patch": {
"newText": " require(p.debt != 0, \"NO_DEBT\");",
"oldText": " require(p.debt > 0, \"NO_DEBT\");"
},
"title": "Use != 0 for unsigned non-zero checks",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:316",
"before": "require(p.debt > 0, \"NO_DEBT\");",
"safety": "safe",
"newText": " require(p.debt != 0, \"NO_DEBT\");",
"oldText": " require(p.debt > 0, \"NO_DEBT\");",
"category": "computation",
"severity": "info",
"lineStart": 316,
"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": "MantleCompactRiskVault_Suite__4_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": "MantleCompactRiskVault_Suite__4_contracts_.sol:422",
"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": 422,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "if (implementation != address(0) && arbitraryData.length != 0) {",
"patch": {
"newText": " if (implementation != address(0) && arbitraryData.length != 0) {",
"oldText": " if (implementation != address(0) && arbitraryData.length > 0) {"
},
"title": "Use != 0 for unsigned non-zero checks",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:461",
"before": "if (implementation != address(0) && arbitraryData.length > 0) {",
"safety": "safe",
"newText": " if (implementation != address(0) && arbitraryData.length != 0) {",
"oldText": " if (implementation != address(0) && arbitraryData.length > 0) {",
"category": "computation",
"severity": "info",
"lineStart": 461,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
"patch": {
"newText": " mapping(address => bool) public listedToken; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(address => bool) public listedToken;"
},
"title": "Bitmap-pack boolean flags",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:79",
"before": "mapping(address => bool) public listedToken;",
"safety": "review",
"newText": " mapping(address => bool) public listedToken; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(address => bool) public listedToken;",
"category": "storage",
"severity": "medium",
"lineStart": 79,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
"patch": {
"newText": " mapping(address => bool) public keeper; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(address => bool) public keeper;"
},
"title": "Bitmap-pack boolean flags",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:80",
"before": "mapping(address => bool) public keeper;",
"safety": "review",
"newText": " mapping(address => bool) public keeper; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(address => bool) public keeper;",
"category": "storage",
"severity": "medium",
"lineStart": 80,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
"patch": {
"newText": " mapping(address => bool) public frozen; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(address => bool) public frozen;"
},
"title": "Bitmap-pack boolean flags",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:81",
"before": "mapping(address => bool) public frozen;",
"safety": "review",
"newText": " mapping(address => bool) public frozen; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(address => bool) public frozen;",
"category": "storage",
"severity": "medium",
"lineStart": 81,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
"patch": {
"newText": " mapping(bytes32 => bool) public reportExists; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(bytes32 => bool) public reportExists;"
},
"title": "Bitmap-pack boolean flags",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:87",
"before": "mapping(bytes32 => bool) public reportExists;",
"safety": "review",
"newText": " mapping(bytes32 => bool) public reportExists; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(bytes32 => bool) public reportExists;",
"category": "storage",
"severity": "medium",
"lineStart": 87,
"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": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
"patch": {
"newText": " mapping(bytes32 => bool) public consumedMessages; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(bytes32 => bool) public consumedMessages;"
},
"title": "Bitmap-pack boolean flags",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:88",
"before": "mapping(bytes32 => bool) public consumedMessages;",
"safety": "review",
"newText": " mapping(bytes32 => bool) public consumedMessages; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(bytes32 => bool) public consumedMessages;",
"category": "storage",
"severity": "medium",
"lineStart": 88,
"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": "remove-zero-init",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "for (uint256 i; i < ids.length; i++) {",
"patch": {
"newText": " for (uint256 i; i < ids.length; i++) {",
"oldText": " for (uint256 i = 0; i < ids.length; i++) {"
},
"title": "Remove redundant zero initialization",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:274",
"before": "for (uint256 i = 0; i < ids.length; i++) {",
"safety": "safe",
"newText": " for (uint256 i; i < ids.length; i++) {",
"oldText": " for (uint256 i = 0; i < ids.length; i++) {",
"category": "deployment",
"severity": "info",
"lineStart": 274,
"rationale": "Solidity initializes variables to zero by default; explicit zero init adds bytecode/instructions.",
"confidence": 0.86,
"estL1Delta": 4,
"estL2Delta": 3,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 3,
"estimatedDataBytesSaved": 4
},
{
"id": "remove-zero-init",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "for (uint256 i; i < hashes.length; i++) {",
"patch": {
"newText": " for (uint256 i; i < hashes.length; i++) {",
"oldText": " for (uint256 i = 0; i < hashes.length; i++) {"
},
"title": "Remove redundant zero initialization",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:398",
"before": "for (uint256 i = 0; i < hashes.length; i++) {",
"safety": "safe",
"newText": " for (uint256 i; i < hashes.length; i++) {",
"oldText": " for (uint256 i = 0; i < hashes.length; i++) {",
"category": "deployment",
"severity": "info",
"lineStart": 398,
"rationale": "Solidity initializes variables to zero by default; explicit zero init adds bytecode/instructions.",
"confidence": 0.86,
"estL1Delta": 4,
"estL2Delta": 3,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 3,
"estimatedDataBytesSaved": 4
},
{
"id": "remove-zero-init",
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"after": "for (uint256 i; i < allPositions.length; i++) {",
"patch": {
"newText": " for (uint256 i; i < allPositions.length; i++) {",
"oldText": " for (uint256 i = 0; i < allPositions.length; i++) {"
},
"title": "Remove redundant zero initialization",
"where": "MantleCompactRiskVault_Suite__4_contracts_.sol:512",
"before": "for (uint256 i = 0; i < allPositions.length; i++) {",
"safety": "safe",
"newText": " for (uint256 i; i < allPositions.length; i++) {",
"oldText": " for (uint256 i = 0; i < allPositions.length; i++) {",
"category": "deployment",
"severity": "info",
"lineStart": 512,
"rationale": "Solidity initializes variables to zero by default; explicit zero init adds bytecode/instructions.",
"confidence": 0.86,
"estL1Delta": 4,
"estL2Delta": 3,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 3,
"estimatedDataBytesSaved": 4
}
]
}
},
"scanId": "a83a2ed4-198b-4061-9a9a-7ed1a997023d",
"createdAt": "2026-06-16T20:19:02.682Z",
"riskScore": 100,
"contractName": "MantleCompactRiskVault_Suite__4_contracts_",
"severityCounts": {
"low": 46,
"high": 13,
"info": 38,
"medium": 18,
"critical": 0
},
"executiveSummary": "Archon completed a read-only Mantle Mainnet audit of MantleCompactRiskVault_Suite__4_contracts_ and found 115 deterministic findings. The highest-priority issue is Weak Prng, with risk score 100/100 based on severity-weighted findings. The weakRandomPayout function derives randomness entirely from predictable, miner/miner-influenced values (block.timestamp, block.prevrandao, block.number, msg.sender, tx.origin). This allows miners or validators to manipulate the outcome, potentially draining the vault. 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": "d1d74e16-b309-4ef0-9627-76dee619d9f9",
"title": "Weak Prng",
"category": "weak-prng",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 442,
"lineStart": 421
},
"severity": "high"
},
{
"id": "f0569eeb-2dba-420c-8df6-91507111ce6b",
"title": "Controlled Delegatecall",
"category": "controlled-delegatecall",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 495,
"lineStart": 483
},
"severity": "high"
},
{
"id": "2e46dffd-fc46-4f0b-a33d-1916a9a3a520",
"title": "Encode Packed Collision",
"category": "encode-packed-collision",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 467,
"lineStart": 444
},
"severity": "high"
},
{
"id": "9d32ff9c-b4c4-451b-912b-7ae3e380ecd6",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 209,
"lineStart": 172
},
"severity": "high"
},
{
"id": "c6cb5990-c41b-4a2a-b36a-22d24b76fe83",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 503,
"lineStart": 497
},
"severity": "high"
},
{
"id": "186cfbac-40cd-4e89-9c5e-6b6015bb82ce",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 442,
"lineStart": 421
},
"severity": "high"
},
{
"id": "8e4e0083-8a47-4f7e-8a5e-0d16be26ad99",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 338,
"lineStart": 312
},
"severity": "high"
},
{
"id": "f1a727af-b845-479e-abc0-3677c42faa32",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 310,
"lineStart": 297
},
"severity": "high"
},
{
"id": "78c0439b-4d9d-4f63-841e-3e178af84a63",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "high"
},
{
"id": "920b1fb4-c884-4070-9c8d-a6951c6ce1c5",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 295,
"lineStart": 279
},
"severity": "high"
},
{
"id": "09c274aa-22f8-4591-b91d-21aa25c1de08",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "high"
},
{
"id": "a4d94a02-4782-4535-8aea-eb81ab9f01e7",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 234,
"lineStart": 219
},
"severity": "high"
},
{
"id": "b7ca72f5-e39b-448a-89af-cac65b103a10",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "medium"
},
{
"id": "1eaea383-aa1f-4ef7-a055-ab25660fc279",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "medium"
},
{
"id": "69940c1b-f8ad-4ec1-8c1a-e176967b4489",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 310,
"lineStart": 297
},
"severity": "medium"
},
{
"id": "350fd3f5-29d4-4ef1-afef-294cdc2dbbde",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 234,
"lineStart": 219
},
"severity": "medium"
},
{
"id": "9bbfc03a-d4c3-4324-a3e8-d7cebed2aae4",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 338,
"lineStart": 312
},
"severity": "medium"
},
{
"id": "384cc315-c418-4b5e-a505-fecb56820c3e",
"title": "Tx Origin",
"category": "tx-origin",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 503,
"lineStart": 497
},
"severity": "medium"
},
{
"id": "e3ca5961-3238-4db4-bfa3-b1847240c290",
"title": "Tx Origin",
"category": "tx-origin",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 151,
"lineStart": 147
},
"severity": "medium"
},
{
"id": "97f8f871-2008-4610-832a-e6ee131b3dd0",
"title": "Unchecked Lowlevel",
"category": "unchecked-lowlevel",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 467,
"lineStart": 444
},
"severity": "medium"
},
{
"id": "35b4f53e-3771-4328-9b36-da81ab90ebf2",
"title": "Unused Return",
"category": "unused-return",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "medium"
},
{
"id": "3e35ac55-de84-47ad-a203-8e9093b0cbce",
"title": "Unused Return",
"category": "unused-return",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 356,
"lineStart": 348
},
"severity": "medium"
},
{
"id": "829df173-aa1b-4bce-84bc-caa587c4effa",
"title": "Events Access",
"category": "events-access",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 156,
"lineStart": 153
},
"severity": "low"
},
{
"id": "70cee5bf-da80-4042-8b49-677ee6a8bfa9",
"title": "Events Maths",
"category": "events-maths",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 145,
"lineStart": 142
},
"severity": "low"
},
{
"id": "9fcbd31a-a43e-45ef-8117-332ae787c8a4",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 113,
"lineStart": 113
},
"severity": "low"
},
{
"id": "a061a198-f027-460e-a61f-4449ab3a7496",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 483,
"lineStart": 483
},
"severity": "low"
},
{
"id": "826a217b-5781-45dc-8846-76c63775f685",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 158,
"lineStart": 158
},
"severity": "low"
},
{
"id": "91d21966-7d16-4050-87fe-766ab2d6fc6f",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 162,
"lineStart": 162
},
"severity": "low"
},
{
"id": "3c0cad97-ae58-4e6d-b707-eb28a663a48f",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 153,
"lineStart": 153
},
"severity": "low"
},
{
"id": "db19e18c-f8b1-4512-93c4-bacc574c5f3d",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 147,
"lineStart": 147
},
"severity": "low"
},
{
"id": "e2d843f0-0821-48cf-afea-b6f2abb126f8",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 469,
"lineStart": 469
},
"severity": "low"
},
{
"id": "cc92fec3-16b8-4f1f-bbb3-da8507f63e76",
"title": "Calls Loop",
"category": "calls-loop",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "low"
},
{
"id": "bdb97153-ad79-484d-9b1e-008363e04df7",
"title": "Reentrancy Benign",
"category": "reentrancy-benign",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 209,
"lineStart": 172
},
"severity": "low"
},
{
"id": "6bb300d9-03c5-44d2-ab38-c0d5c99b5dc9",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 295,
"lineStart": 279
},
"severity": "low"
},
{
"id": "5e3c055a-1901-47fa-8288-05c31953c924",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 234,
"lineStart": 219
},
"severity": "low"
},
{
"id": "06ed2526-b9e6-4202-bee6-9abaf96d39c6",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 467,
"lineStart": 444
},
"severity": "low"
},
{
"id": "8c151600-e9a8-4cc9-b7c4-6a62f4bf7f5f",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "low"
},
{
"id": "5f916818-17b6-44d5-8532-24e211ee331e",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "low"
},
{
"id": "6f9c3cfe-624f-44bc-9abe-b2dfb2b83cf2",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 481,
"lineStart": 469
},
"severity": "low"
},
{
"id": "857ee4fc-1579-4f10-9296-bfc2f8e1e9ec",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 338,
"lineStart": 312
},
"severity": "low"
},
{
"id": "400b0eb1-f848-4127-8946-a441e9ddb49b",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 495,
"lineStart": 483
},
"severity": "low"
},
{
"id": "ab769671-5779-4df2-8e1f-08bc655c406b",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 442,
"lineStart": 421
},
"severity": "low"
},
{
"id": "01d1017b-af0e-4af1-8093-d2d49ecf255a",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 209,
"lineStart": 172
},
"severity": "low"
},
{
"id": "73bacf91-687c-4054-8a13-09ad9e42306b",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "low"
},
{
"id": "9baaa050-32c9-4ece-8b81-4af782128626",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 234,
"lineStart": 219
},
"severity": "low"
},
{
"id": "23d4ff90-1e04-43d7-b72a-67a214577f79",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "low"
},
{
"id": "1490a4d6-f016-4c61-bf66-824750b83f62",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 338,
"lineStart": 312
},
"severity": "low"
},
{
"id": "3e236e38-3c69-4b35-8532-360e7ee85a32",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 295,
"lineStart": 279
},
"severity": "low"
},
{
"id": "004bb733-6807-489a-a921-009ef8b601e3",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 310,
"lineStart": 297
},
"severity": "low"
},
{
"id": "b5875138-42be-4fe9-b19f-24485accb48d",
"title": "Costly Loop",
"category": "costly-loop",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 382,
"lineStart": 358
},
"severity": "info"
},
{
"id": "b48a0a22-1626-4ac8-add8-f45415e8f963",
"title": "Low Level Calls",
"category": "low-level-calls",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 481,
"lineStart": 469
},
"severity": "info"
},
{
"id": "42923962-6957-40c8-9c15-9735120609eb",
"title": "Low Level Calls",
"category": "low-level-calls",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 495,
"lineStart": 483
},
"severity": "info"
},
{
"id": "1db0d422-eb8f-4c78-8701-8a643c65b041",
"title": "Low Level Calls",
"category": "low-level-calls",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 467,
"lineStart": 444
},
"severity": "info"
},
{
"id": "7c081e50-afb3-47bc-849e-3821e26585a7",
"title": "Cache Array Length",
"category": "cache-array-length",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 512,
"lineStart": 512
},
"severity": "low"
},
{
"id": "f78a0ef2-1e7c-4a42-a27a-e171c725826d",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 53,
"lineStart": 53
},
"severity": "low"
},
{
"id": "b2a6095f-d4b4-4137-a9ba-bb8f539f0ffd",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 54,
"lineStart": 54
},
"severity": "low"
},
{
"id": "fe630b3b-ecdc-426c-8af0-a015a47d354b",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 57,
"lineStart": 57
},
"severity": "low"
},
{
"id": "3591d9f7-9a36-4f9c-82ce-c63ad883b05a",
"title": "Immutable States",
"category": "immutable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 44,
"lineStart": 44
},
"severity": "low"
},
{
"id": "6ce9378c-8d34-4fe2-8572-489e80ee0a41",
"title": "Immutable States",
"category": "immutable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 43,
"lineStart": 43
},
"severity": "low"
},
{
"id": "5d1b423d-aa14-429b-aa2c-2e0dd985d850",
"title": "tx.origin authorization can be phished through proxy calls",
"category": "mantle-origin-auth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": null,
"lineStart": 11
},
"severity": "high"
},
{
"id": "d714847c-65e3-41bc-a0c2-977639f5ca35",
"title": "Timestamp-sensitive settlement lacks explicit tolerance window",
"category": "mantle-timestamp-assumption",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": null,
"lineStart": 198
},
"severity": "medium"
},
{
"id": "0657fb05-b75e-4754-aee4-bedac3ed4aeb",
"title": "Pack small storage variables into fewer slots",
"category": "mantle-gas-optimizer/storage/storage-packing",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 83,
"lineStart": 83
},
"severity": "medium"
},
{
"id": "82bd6afd-a4b1-41a2-ad9e-1eac88fe2ba1",
"title": "Pack small storage variables into fewer slots",
"category": "mantle-gas-optimizer/storage/storage-packing",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 88,
"lineStart": 88
},
"severity": "medium"
},
{
"id": "04e4dc4d-17ea-43f2-8c7d-b4d36969cb6d",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 24,
"lineStart": 24
},
"severity": "low"
},
{
"id": "0d6ecb3a-dca8-488e-a8e1-7d4d0d4eb71b",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 25,
"lineStart": 25
},
"severity": "low"
},
{
"id": "ffef3f08-5bcf-49f4-8d53-63ee9a2bec40",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 35,
"lineStart": 35
},
"severity": "low"
},
{
"id": "24fcce6b-7343-44fe-be4b-e2bbecd7b994",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 211,
"lineStart": 211
},
"severity": "low"
},
{
"id": "0ce4ab70-8267-405c-b26e-fcceccbafd43",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 219,
"lineStart": 219
},
"severity": "low"
},
{
"id": "eb9c38cc-2f23-4133-b533-75c0bb7f6019",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 236,
"lineStart": 236
},
"severity": "low"
},
{
"id": "f2f02007-db65-41a5-995a-752617b9844d",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 253,
"lineStart": 253
},
"severity": "low"
},
{
"id": "d6c2fe95-5dbc-40a3-a1ad-5e9ee933af96",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 279,
"lineStart": 279
},
"severity": "low"
},
{
"id": "d8caf0a6-4683-41e9-b172-a87897031281",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 297,
"lineStart": 297
},
"severity": "low"
},
{
"id": "6378987d-0bc6-4b31-9047-b83447a232b9",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 312,
"lineStart": 312
},
"severity": "low"
},
{
"id": "b0059444-9d03-4e72-b0e2-cdceb7ec211e",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 340,
"lineStart": 340
},
"severity": "low"
},
{
"id": "9c7f5c19-b930-4e2b-b471-17591fd8e0fe",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 348,
"lineStart": 348
},
"severity": "low"
},
{
"id": "31988b11-ab3b-46ea-b607-12433df89ed6",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 497,
"lineStart": 497
},
"severity": "low"
},
{
"id": "d0c35437-3f11-444c-91f5-e7e446ef1436",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 149,
"lineStart": 149
},
"severity": "info"
},
{
"id": "49d1acb7-f7b1-4e8a-be28-b2bf58ddcdce",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 178,
"lineStart": 178
},
"severity": "info"
},
{
"id": "d67325ca-a232-4ffa-9b4b-782854539871",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 222,
"lineStart": 222
},
"severity": "info"
},
{
"id": "6dd300a1-10da-48e6-bb3e-d85eb01514bb",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 239,
"lineStart": 239
},
"severity": "info"
},
{
"id": "6ef0158e-eab9-4dfc-a13a-62129bfc13b6",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 256,
"lineStart": 256
},
"severity": "info"
},
{
"id": "163a1f34-7120-4b4e-b37c-dd9dbf771910",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 282,
"lineStart": 282
},
"severity": "info"
},
{
"id": "48b5f7a7-63a5-4bb0-a793-44319c597f67",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 287,
"lineStart": 287
},
"severity": "info"
},
{
"id": "f75352fe-4bab-4d44-998c-674bb46d798b",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 300,
"lineStart": 300
},
"severity": "info"
},
{
"id": "da2ff0d6-7779-4741-913e-57dc97df4f7d",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 457,
"lineStart": 457
},
"severity": "info"
},
{
"id": "66f8c9f2-71eb-4555-8df6-08e4b7c61b9a",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 494,
"lineStart": 494
},
"severity": "info"
},
{
"id": "f14cb836-1d8c-49c8-bf16-5e5b80987a7b",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 500,
"lineStart": 500
},
"severity": "info"
},
{
"id": "5ee64f41-1763-4144-bb80-4fcc03d756b0",
"title": "Mark never-changing value constant or immutable",
"category": "mantle-gas-optimizer/storage/immutable-constant",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 42,
"lineStart": 42
},
"severity": "info"
},
{
"id": "e7ce4f46-5289-417c-87b3-2dcdda53662a",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 135,
"lineStart": 135
},
"severity": "info"
},
{
"id": "202ceeed-3b5f-4d51-ac36-5e39e0e2f5b6",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 193,
"lineStart": 193
},
"severity": "info"
},
{
"id": "505438fb-8295-477a-9f9f-f06201a3c8d4",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 365,
"lineStart": 365
},
"severity": "info"
},
{
"id": "328d658c-396f-4c45-9793-0b470dbc3641",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 399,
"lineStart": 399
},
"severity": "info"
},
{
"id": "4a50472e-8a59-472b-9ba9-1a812af2e174",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 457,
"lineStart": 457
},
"severity": "info"
},
{
"id": "b0943248-37a5-4983-9a53-8cd3bb7aaf6f",
"title": "Use unchecked loop increment where bounded",
"category": "mantle-gas-optimizer/computation/unchecked-loop-increment",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 274,
"lineStart": 274
},
"severity": "info"
},
{
"id": "39825fc8-dc42-47c6-a182-b7f71229ab14",
"title": "Use unchecked loop increment where bounded",
"category": "mantle-gas-optimizer/computation/unchecked-loop-increment",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 398,
"lineStart": 398
},
"severity": "info"
},
{
"id": "1d79f0d3-535d-41e5-bfc4-6788c065549e",
"title": "Use unchecked loop increment where bounded",
"category": "mantle-gas-optimizer/computation/unchecked-loop-increment",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 512,
"lineStart": 512
},
"severity": "info"
},
{
"id": "77d41fc8-3b2f-4708-9ef0-7978cb9dcbe9",
"title": "Cache array length before loop",
"category": "mantle-gas-optimizer/storage/loop-hygiene",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 274,
"lineStart": 274
},
"severity": "info"
},
{
"id": "8a643266-0fef-44b7-a372-51f07939fcc7",
"title": "Cache array length before loop",
"category": "mantle-gas-optimizer/storage/loop-hygiene",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 398,
"lineStart": 398
},
"severity": "info"
},
{
"id": "29891ad8-00c0-4fff-9ac2-1df945f95f95",
"title": "Cache array length before loop",
"category": "mantle-gas-optimizer/storage/loop-hygiene",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 512,
"lineStart": 512
},
"severity": "info"
},
{
"id": "33cf2725-7931-4e1b-8ad3-9a30885732ef",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 179,
"lineStart": 179
},
"severity": "info"
},
{
"id": "9b3debf9-834c-49b2-904b-1aa496990452",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 187,
"lineStart": 187
},
"severity": "info"
},
{
"id": "1914fd3a-dc9c-4b4b-b578-a81daeee9d50",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 226,
"lineStart": 226
},
"severity": "info"
},
{
"id": "6166ffc4-833d-4758-b697-2abb7b53b3a7",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 284,
"lineStart": 284
},
"severity": "info"
},
{
"id": "83fd199a-d6e9-449c-bb49-f15f08715da5",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 301,
"lineStart": 301
},
"severity": "info"
},
{
"id": "44d1431f-08ec-4c77-900e-33869af30121",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 316,
"lineStart": 316
},
"severity": "info"
},
{
"id": "2cc39564-7a42-4ebb-8508-17235a5871f6",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 422,
"lineStart": 422
},
"severity": "info"
},
{
"id": "649f5669-3082-48fd-95d3-3658a86efb04",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 461,
"lineStart": 461
},
"severity": "info"
},
{
"id": "72f85e70-7b03-40a3-ba8c-9952ee488e78",
"title": "Bitmap-pack boolean flags",
"category": "mantle-gas-optimizer/storage/bitmap-bools",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 79,
"lineStart": 79
},
"severity": "medium"
},
{
"id": "e35b7ec8-fe88-42cd-9649-5175c7643e91",
"title": "Bitmap-pack boolean flags",
"category": "mantle-gas-optimizer/storage/bitmap-bools",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 80,
"lineStart": 80
},
"severity": "medium"
},
{
"id": "b8344e47-f297-4e11-84ad-178d1829604a",
"title": "Bitmap-pack boolean flags",
"category": "mantle-gas-optimizer/storage/bitmap-bools",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 81,
"lineStart": 81
},
"severity": "medium"
},
{
"id": "b140538d-0ec4-4e60-8a57-6a91b84b5298",
"title": "Bitmap-pack boolean flags",
"category": "mantle-gas-optimizer/storage/bitmap-bools",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 87,
"lineStart": 87
},
"severity": "medium"
},
{
"id": "edcbc894-777d-4dcf-b4ed-4e6409134d8d",
"title": "Bitmap-pack boolean flags",
"category": "mantle-gas-optimizer/storage/bitmap-bools",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 88,
"lineStart": 88
},
"severity": "medium"
},
{
"id": "4f24b57b-6aa4-4d50-b6b3-e32148f14b37",
"title": "Remove redundant zero initialization",
"category": "mantle-gas-optimizer/deployment/remove-zero-init",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 274,
"lineStart": 274
},
"severity": "info"
},
{
"id": "3f5cfbbb-01f5-4b59-8593-b1d2ffb8e2b2",
"title": "Remove redundant zero initialization",
"category": "mantle-gas-optimizer/deployment/remove-zero-init",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 398,
"lineStart": 398
},
"severity": "info"
},
{
"id": "83182ed3-8448-43d2-b6f1-57843467c988",
"title": "Remove redundant zero initialization",
"category": "mantle-gas-optimizer/deployment/remove-zero-init",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 512,
"lineStart": 512
},
"severity": "info"
}
]
}
ipfs://QmRBqGL1xgfegcs5zF22U4csCFLR3Gz1Rjq3wd6tJuTJLL