ArchonArchon
Public verified reportRun your own audit

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

low: 6high: 0info: 9medium: 2critical: 0
SeverityFindingLocationConfidence
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:790%
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:1230%
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:1070%
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:980%
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:880%
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:1385%
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:1080%
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:4090%
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:5395%
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:68100%
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:69100%
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:13100%
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:53100%
info

Cache repeated storage read

Repeated storage read optimization opportunity.

MantleUSDCe_Interface.sol:5680%
info

Cache repeated storage read

Repeated storage read optimization opportunity.

MantleUSDCe_Interface.sol:6880%
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:6995%
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:1890%