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": "80544ffc-f3e0-4be1-aba5-26b8e28314ea",
"scope": {
"pragma": "^0.8.24",
"network": "mantle-mainnet",
"lineCount": 530,
"protocols": [
"mETH",
"cmETH",
"USDY",
"Aave V3",
"Merchant Moe",
"Agni"
],
"sourceKind": "paste",
"aiReasoning": {
"hits": 0,
"total": 115,
"misses": 115,
"batches": 8,
"reasons": {
"bounded": 99
},
"skipped": 99,
"provider": "tokenhub",
"timeoutMs": 75000,
"fallbackCount": 99,
"providersUsed": [
"Tencent Cloud TokenHub (deepseek-v4-pro)"
]
},
"reducedMode": null,
"solcVersion": "0.8.24",
"gasOptimizer": {
"pricing": {
"mode": "calibrated-receipts",
"pricedAt": "2026-06-16T15:20:20.081Z",
"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": "b92c9de2-5566-41dc-af0a-30a9bca4e5f7",
"createdAt": "2026-06-16T15:28:08.622Z",
"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": "e33ceae3-c7fd-467c-8c03-10ee9ab3ab22",
"title": "Weak Prng",
"category": "weak-prng",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 442,
"lineStart": 421
},
"severity": "high"
},
{
"id": "a893ae7a-ec57-4e45-9190-1b3fe2f005dc",
"title": "Controlled Delegatecall",
"category": "controlled-delegatecall",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 495,
"lineStart": 483
},
"severity": "high"
},
{
"id": "ab2e3225-24f6-4f58-9a6a-11e2f3142ada",
"title": "Encode Packed Collision",
"category": "encode-packed-collision",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 467,
"lineStart": 444
},
"severity": "high"
},
{
"id": "85ecc6a0-ca18-4a8a-9b4a-2a70f837348e",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 209,
"lineStart": 172
},
"severity": "high"
},
{
"id": "f89fdc7c-6121-4152-9443-91dd01c4c5a0",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 503,
"lineStart": 497
},
"severity": "high"
},
{
"id": "2c8ca22d-8f50-4456-aeef-b3e1ddd4da13",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 442,
"lineStart": 421
},
"severity": "high"
},
{
"id": "6a0f9a53-c518-4a2d-8f6a-8c4932f39522",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 338,
"lineStart": 312
},
"severity": "high"
},
{
"id": "7f114546-11c4-4f32-8f0f-b22a66074581",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 310,
"lineStart": 297
},
"severity": "high"
},
{
"id": "9b3fa6d1-12d3-418f-b7e0-950098f950ed",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "high"
},
{
"id": "7eb11dec-cfca-4bbf-8514-b3450f3ec681",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 295,
"lineStart": 279
},
"severity": "high"
},
{
"id": "c95198d3-b18a-43ef-b8f9-a642d89c1e90",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "high"
},
{
"id": "92ec8d52-1175-4650-8851-cc783845d8cb",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 234,
"lineStart": 219
},
"severity": "high"
},
{
"id": "b45a2cb7-00af-41b7-9cc5-2b4bcc635f43",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "medium"
},
{
"id": "f3f7c274-1f97-45ad-9a53-a1150a09aed5",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "medium"
},
{
"id": "252efb42-ba9b-4e44-8b0b-7390bfbaa852",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 310,
"lineStart": 297
},
"severity": "medium"
},
{
"id": "4a859dc8-dcba-4fee-b2c6-8bfaac682293",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 234,
"lineStart": 219
},
"severity": "medium"
},
{
"id": "e652c44e-61d8-4210-8f85-1db418b84cad",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 338,
"lineStart": 312
},
"severity": "medium"
},
{
"id": "1dacdc41-613c-4c8e-b4eb-118e63d395fe",
"title": "Tx Origin",
"category": "tx-origin",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 503,
"lineStart": 497
},
"severity": "medium"
},
{
"id": "fe08711d-82fd-4766-b77b-19e855b6c421",
"title": "Tx Origin",
"category": "tx-origin",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 151,
"lineStart": 147
},
"severity": "medium"
},
{
"id": "1350bc83-6f6b-4574-9fde-956b686e78d9",
"title": "Unchecked Lowlevel",
"category": "unchecked-lowlevel",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 467,
"lineStart": 444
},
"severity": "medium"
},
{
"id": "969b3eaa-a99a-4cd2-9383-578ee253b20e",
"title": "Unused Return",
"category": "unused-return",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "medium"
},
{
"id": "cff50318-ec65-481d-becd-9aa72a545751",
"title": "Unused Return",
"category": "unused-return",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 356,
"lineStart": 348
},
"severity": "medium"
},
{
"id": "50d0f271-47f9-45ec-9348-a1dea9099548",
"title": "Events Access",
"category": "events-access",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 156,
"lineStart": 153
},
"severity": "low"
},
{
"id": "bb135a7e-0209-43f3-b16b-440eb64ff2f7",
"title": "Events Maths",
"category": "events-maths",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 145,
"lineStart": 142
},
"severity": "low"
},
{
"id": "1f2c618d-bacb-496d-b171-82f9738a3e9e",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 113,
"lineStart": 113
},
"severity": "low"
},
{
"id": "57ce941d-0797-491e-b1ca-590562301bf5",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 483,
"lineStart": 483
},
"severity": "low"
},
{
"id": "d26d6d29-6847-4627-a5b6-59977ac85119",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 158,
"lineStart": 158
},
"severity": "low"
},
{
"id": "8a9217b9-ff6f-4045-bd34-9c5f74a51ca9",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 162,
"lineStart": 162
},
"severity": "low"
},
{
"id": "22eb9d31-2180-494e-9357-ad27021fd1f6",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 153,
"lineStart": 153
},
"severity": "low"
},
{
"id": "de4bbec7-ce99-4f42-bb8c-b24f8e18afe0",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 147,
"lineStart": 147
},
"severity": "low"
},
{
"id": "c163d694-29ba-4576-a860-f7ed22cb6be7",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 469,
"lineStart": 469
},
"severity": "low"
},
{
"id": "26990f40-1f9b-4c59-b045-b1e5c1bcbd70",
"title": "Calls Loop",
"category": "calls-loop",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "low"
},
{
"id": "d1725d7b-f8e5-4c42-a451-8b06fd5016d2",
"title": "Reentrancy Benign",
"category": "reentrancy-benign",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 209,
"lineStart": 172
},
"severity": "low"
},
{
"id": "2498f80f-ef89-4778-bbfc-f94b419f3d06",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 295,
"lineStart": 279
},
"severity": "low"
},
{
"id": "2807556b-b686-42a8-8c81-e6e58449b0ef",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 234,
"lineStart": 219
},
"severity": "low"
},
{
"id": "cfae1fa2-043f-49aa-bd5f-02f0951e1949",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 467,
"lineStart": 444
},
"severity": "low"
},
{
"id": "202631e1-6b50-42c1-b4bc-b167bddf14bb",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "low"
},
{
"id": "8ef26232-d74f-4ff6-8e57-13199686a309",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "low"
},
{
"id": "1d7559f7-eb54-459d-8eeb-c3e23a681116",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 481,
"lineStart": 469
},
"severity": "low"
},
{
"id": "696cd6df-317d-49a8-97cb-cd985fdd49ec",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 338,
"lineStart": 312
},
"severity": "low"
},
{
"id": "2be2515d-5a8c-49af-a529-f45fbb435e4a",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 495,
"lineStart": 483
},
"severity": "low"
},
{
"id": "815b3aba-630b-4393-81e9-e95fd5cb0747",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 442,
"lineStart": 421
},
"severity": "low"
},
{
"id": "5524493d-9cfa-44f5-8687-71f2a1d2982e",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 209,
"lineStart": 172
},
"severity": "low"
},
{
"id": "3dc6f5c0-c3eb-4f8b-b8b7-b487057ea9ad",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 270,
"lineStart": 253
},
"severity": "low"
},
{
"id": "3ebecbe4-f077-41ba-bf6b-b3a532284860",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 234,
"lineStart": 219
},
"severity": "low"
},
{
"id": "84b007fc-d192-4c1c-b542-490520f75eb6",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 251,
"lineStart": 236
},
"severity": "low"
},
{
"id": "8a6fc7e1-69d7-4a43-ac7a-214117f83d4e",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 338,
"lineStart": 312
},
"severity": "low"
},
{
"id": "2dcd2898-61e1-41ea-9da6-2433742f6013",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 295,
"lineStart": 279
},
"severity": "low"
},
{
"id": "4277dc34-3902-4e03-b6c8-f009b6a87bb5",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 310,
"lineStart": 297
},
"severity": "low"
},
{
"id": "8a992670-de97-4bf6-a095-1bd825331b39",
"title": "Costly Loop",
"category": "costly-loop",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 382,
"lineStart": 358
},
"severity": "info"
},
{
"id": "c7da2a54-ed1f-4d39-bbc6-2d6f932a20e9",
"title": "Low Level Calls",
"category": "low-level-calls",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 481,
"lineStart": 469
},
"severity": "info"
},
{
"id": "c32f9c95-6910-43ef-afdb-9c2ae27ceb09",
"title": "Low Level Calls",
"category": "low-level-calls",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 495,
"lineStart": 483
},
"severity": "info"
},
{
"id": "2aa4931b-ffda-4f02-845e-b39b88994dff",
"title": "Low Level Calls",
"category": "low-level-calls",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 467,
"lineStart": 444
},
"severity": "info"
},
{
"id": "5d009eb8-ddfd-4798-aca5-ffcc7c92ee01",
"title": "Cache Array Length",
"category": "cache-array-length",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 512,
"lineStart": 512
},
"severity": "low"
},
{
"id": "4571d6a8-73a6-4e60-8c35-51841d44c946",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 53,
"lineStart": 53
},
"severity": "low"
},
{
"id": "a0b96aec-72ba-42c5-b1bc-22a0a6cf1942",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 54,
"lineStart": 54
},
"severity": "low"
},
{
"id": "65a526b3-4dec-4405-86c6-3df3a3528826",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 57,
"lineStart": 57
},
"severity": "low"
},
{
"id": "a1cf37f1-0c90-4087-8007-066541671be4",
"title": "Immutable States",
"category": "immutable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 44,
"lineStart": 44
},
"severity": "low"
},
{
"id": "b63d74ce-fe76-4d57-84e0-6cbd6bb94018",
"title": "Immutable States",
"category": "immutable-states",
"location": {
"file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
"lineEnd": 43,
"lineStart": 43
},
"severity": "low"
},
{
"id": "711d776f-8635-4a2c-9dfb-998de31fea52",
"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": "090c1735-2f0e-4e67-b778-86e3709e2d19",
"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": "1d8ac032-9b8b-46d3-abbc-678789566b76",
"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": "1c785423-40d2-49e8-8126-70d208f8dd45",
"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": "319d43da-05a6-40b3-8bc2-0cda5b714e5f",
"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": "657b7aeb-ccc6-4fc3-849d-ba1fc8afba4d",
"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": "cbb41058-851c-4c17-bf4f-4519acc9cab2",
"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": "2d901f17-6b4a-41ba-9691-a5f56615a255",
"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": "8f3e2db6-76b3-4afa-b556-6c36f06bce02",
"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": "fca5ff04-5182-4136-a4e6-42e99f678b73",
"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": "9cfc8030-e3a5-421b-92bd-bd6123bbd088",
"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": "cec05681-76f9-490b-b40c-92c8078d4bdd",
"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": "38a7768a-bbd9-46b8-9a28-09de76f5c76c",
"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": "b0ff2b0d-5f09-4060-b83c-a964db5ebbc6",
"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": "0a8696f6-9773-48c9-ab43-8ec3909b0ae5",
"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": "cdcfd9f9-2a85-4f41-8ad5-d9b8cdbda38c",
"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": "051e44d2-cd04-4593-8be4-627173770562",
"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": "81d70e3e-290d-4ec0-b2f6-b2192c14f3d4",
"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": "2c25e400-9db9-4be0-b0be-0c5bde606cd6",
"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": "3aa8f4bc-088b-4c35-9b1a-1cf7c6144c4d",
"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": "1f0cce85-fe59-4a4a-bd3c-c4cbebff7ef4",
"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": "6eaa24fa-e878-4491-a2bb-4226360f48f3",
"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": "8ff7a261-02b8-4818-8ab4-89d2fedb768d",
"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": "eed8d896-5bdb-452e-93d2-9a2d4539e7e0",
"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": "88bbabaa-e64e-4d93-baf3-58754351bd07",
"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": "9c7f200b-052d-4527-9706-1978b2af8d87",
"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": "07f0ff28-95fd-437d-ba3a-05ac486aebe6",
"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": "ba4e0c1a-62f9-4bd5-b6b2-aebe4b941d30",
"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": "ca36b9bc-6fc1-41a4-a43b-abe3f3881db3",
"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": "dbf225b3-2457-477c-b932-b2cd7fce2e03",
"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": "d57d80c7-7b14-4017-9d9a-aa251f72ccf8",
"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": "f4b7c627-ec4c-412a-b103-ca520a374721",
"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": "67f4cc6c-597c-4dc7-8cdb-03e766d34d2d",
"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": "4499166d-7f43-4e33-bcde-009f54a0d11f",
"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": "16890fbe-d781-4d50-b06e-b848e0e7a5a6",
"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": "d302cf08-d73f-4570-976b-3b986ee8eba6",
"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": "63bdbd13-98f7-4fe7-afcf-10b6c466978c",
"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": "5b4ce148-6eab-4d9c-a39c-9257f3f70d85",
"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": "8590bcdc-a259-4be0-b9cc-34c14ab734b5",
"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": "043d9cf7-4dac-4ca0-b9c1-e820e4f78758",
"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": "e6abeeaa-abcd-4b1e-a51c-08bc098a6158",
"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": "2ff9b6c1-c8c1-4140-91bb-ebee094af5e0",
"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": "05e29541-c2b2-4c3e-b8fd-2d478321d55c",
"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": "f2177625-567d-4e43-a5c2-326f021bcd98",
"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": "60ab624a-c74d-4ae1-917e-63c39bbb60cd",
"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": "adaa081a-47ad-4e22-acf7-dbd444545cac",
"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": "6e1d50ef-3dff-473f-970c-81ed074789e3",
"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": "a453cca3-9ba9-4534-be5b-4f02963850f7",
"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": "b14c3ce4-95df-4b89-99d6-4390a79b8941",
"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": "8853fefb-db2c-4659-afb2-91fe0b2bb832",
"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": "c9ff88c1-cfa9-4994-8831-2dc486ba59b0",
"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": "95214460-95a0-401d-8c80-c2cd11f955f4",
"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": "f59739bb-771d-437e-a331-9c82770bba42",
"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": "14de395a-0635-4c92-bfd6-e4e82b6ebeaf",
"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": "5cba8a67-927a-4cef-85d0-65819e9151f0",
"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": "b217e33c-2799-4f44-a216-50ca7e752fb1",
"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://QmXnUMXbbkh5u3TXxdiFNFkw1o4j8FsmPiKeQeKhramuqV