

Archon public report
MantleUSDCe_Interface
Mantle Mainnet · scan depth deep · generated 6/23/2026, 4:25:16 AM
Risk Score
65
Archon completed a read-only Mantle Mainnet audit of MantleUSDCe_Interface and found 17 deterministic findings. The highest-priority issue is Naming Convention, with risk score 65/100 based on severity-weighted findings. The contract name 'MantleUSDCe_Interface' is misleading because it declares state variables and functions with implementations, which is not typical for an interface. This naming convention may confuse developers expecting a pure interface, potentially leading to misuse during integration. Review the recommended fixes and run regression tests before deployment.
Models used: Tencent Cloud TokenHub (deepseek-v4-pro), OpenAI (gpt-4o-mini) — AI reasoning served on Tencent Cloud TokenHub.
Findings
| Severity | Finding | Location | Confidence |
|---|---|---|---|
| info | Naming Convention The contract name 'MantleUSDCe_Interface' is misleading because it declares state variables and functions with implementations, which is not typical for an interface. This naming convention may confuse developers expecting a pure interface, potentially leading to misuse during integration. | MantleUSDCe_Interface.sol:7 | 90% |
| low | Constable States The `totalSupply` state variable is declared with default visibility and no constant/immutable qualifier, yet it is not updated via any setter logic shown in the provided interface snippet. This could lead to a permanently zero or stale total supply if intended to be mutable but lacking update mechanisms, or represents unnecessary storage overhead if meant to be constant. | MantleUSDCe_Interface.sol:12 | 30% |
| low | Constable States The `decimals` state variable is declared `public` and assigned a literal value, but not marked `constant` or `immutable`. This means it occupies storage and may be unintentionally mutable, even though its value is meant to be fixed, potentially leading to accidental or malicious changes if the contract includes fallback or upgrade logic. | MantleUSDCe_Interface.sol:10 | 70% |
| low | Constable States The `symbol` state variable is hardcoded and declared as `public`, but no setter function exists and the contract does not inherit any mutable logic. This makes the state effectively constant, which can confuse readers and may not match upgradable proxy patterns. | MantleUSDCe_Interface.sol:9 | 80% |
| low | Constable States The `name` state variable is hardcoded as `"USD Coin"` and cannot be updated. While often immutable in practice, the absence of a setter and the public visibility give a false impression of configurability. | MantleUSDCe_Interface.sol:8 | 80% |
| low | Immutable States The 'owner' state variable is declared as 'address public owner', which, if uninitialized, defaults to address(0). This can lead to owner-only functions being inaccessible or improperly guarded if the constructor does not set it. Additionally, if the contract intends to be immutable (as suggested by the category), this variable should be declared as 'immutable' or set only once in the constructor to prevent accidental or malicious changes. | MantleUSDCe_Interface.sol:13 | 85% |
| medium | Pack small storage variables into fewer slots The `decimals` variable (8 bits) could be packed together with other small storage variables to share a single storage slot instead of occupying one full slot. | MantleUSDCe_Interface.sol:10 | 80% |
| low | Review calldata parameter width The `approve` function uses `uint256` for the `amount` parameter, but typical token approval amounts stay within smaller ranges. On Mantle, using smaller calldata types (e.g., `uint96` or `uint128`) can reduce calldata cost without sacrificing accuracy, as the Mantle chain inherits Ethereum's calldata pricing model. | MantleUSDCe_Interface.sol:40 | 90% |
| info | Replace long revert string with custom error The revert string 'INSUFFICIENT_BALANCE' is long and can be replaced with a custom error to reduce gas costs on Mantle. Custom errors are more efficient because they only pass the error selector, not the full string. | MantleUSDCe_Interface.sol:53 | 95% |
| info | Replace long revert string with custom error The revert string `"INSUFFICIENT_BALANCE"` (18 characters) on line 68 can be replaced with a custom error to reduce contract size and deployment gas costs. | MantleUSDCe_Interface.sol:68 | 100% |
| info | Replace long revert string with custom error The revert string `"INSUFFICIENT_ALLOWANCE"` (21 characters) on line 69 can be replaced with a custom error to reduce contract size and deployment gas costs. | MantleUSDCe_Interface.sol:69 | 100% |
| info | Mark never-changing value constant or immutable The `owner` state variable is never modified after deployment. On Mantle, marking it `immutable` reduces storage reads to 0 gas (loaded from contract code), saving ~2100 gas (cold SLOAD) or ~100 gas (warm SLOAD) per access. | MantleUSDCe_Interface.sol:13 | 100% |
| info | Cache repeated storage read The function makes two separate storage reads of `balanceOf[msg.sender]` (first inside the `require` and then again in the subtraction). Caching the value in a local variable eliminates the second SLOAD, saving ~100–2100 gas. | MantleUSDCe_Interface.sol:53 | 100% |
| info | Cache repeated storage read Repeated storage read optimization opportunity. | MantleUSDCe_Interface.sol:56 | 80% |
| info | Cache repeated storage read Repeated storage read optimization opportunity. | MantleUSDCe_Interface.sol:68 | 80% |
| info | Cache repeated storage read The allowance mapping is read on line 69 and immediately decremented on line 71 without caching the value, leading to a redundant storage read in the same transaction. | MantleUSDCe_Interface.sol:69 | 95% |
| medium | Bitmap-pack boolean flags The `blacklisted` mapping holds boolean flags. Bitmap-packing them into a uint256 mapping would reduce storage cost per key from one slot to 1/256th of a slot on average. | MantleUSDCe_Interface.sol:18 | 90% |

