Quantum Audit Logo

Is Marlin POND Safe?

On-chain security analysis — is it a scam or legit?

Is this your token? Publish your own audit on this page →

Marlin POND POND
0x57b9…d26c
Ethereum Not verifiedLast checked 3d ago 1 audit on record
Executive SummaryAI Copilot

The audit of the Token contract (implementation logic for a proxy) identified several high-severity issues related to centralized access control for minting and potential proxy initialization vulnerabilities. Medium and low-severity findings include a standard ERC20 approval race condition and minor code quality issues. The contract utilizes OpenZeppelin's `Initializable` pattern and `SafeMath`, demonstrating good foundational practices, but critical operational and upgrade risks remain.

2 High1 Medium1 Low2 Informational
Volume 24h
$11.8K
Liquidity
$125.1K
Price
$0.0008845
Token Age
5y
Top 10 Holders
72.2%

Security Findings

High

Centralized Minting Control

H-01The `MinterRole` contract implements a highly centralized access control mechanism for minting. The initial minter, set during initialization, has the sole ability to add or remove other minters. This creates a single point of failure, as a compromise or malicious action by this single entity could lead to uncontrolled token minting and significant economic damage through dilution. (7.3 Access Control, 7.4 Economic, 7.5 Governance)
IssueThe `MinterRole` contract implements a highly centralized access control mechanism for minting. The initial minter, set during initialization, has the sole ability to add or remove other minters. This creates a single point of failure, as a compromise or malicious action by this single entity could lead to uncontrolled token minting and significant economic damage through dilution. (7.3 Access Control, 7.4 Economic, 7.5 Governance)
FixImplement a more decentralized or robust access control mechanism for the `MinterRole`. This could involve a multi-signature wallet (e.g., Gnosis Safe) for the minter role, a time-locked governance mechanism, or a DAO vote for adding/removing minters. This distributes control and reduces the risk associated with a single point of failure.
StatusUnresolved
High

Proxy Initialization Vulnerability

H-02The `initialize` functions in `ERC20Detailed`, `MinterRole`, and `ERC20Mintable` are public and use the `initializer` modifier. If the proxy's `initialize` function does not correctly call all necessary `initialize` functions on the implementation, or if the implementation's `initialize` functions are called directly before proxy setup, it can lead to state corruption, re-initialization, or bypassing critical setup logic. The `isConstructor()` check helps prevent direct initialization on the implementation *after* deployment, but the proxy itself must correctly orchestrate initialization. (7.7 Upgrades, 7.3 Access Control)
IssueThe `initialize` functions in `ERC20Detailed`, `MinterRole`, and `ERC20Mintable` are public and use the `initializer` modifier. If the proxy's `initialize` function does not correctly call all necessary `initialize` functions on the implementation, or if the implementation's `initialize` functions are called directly before proxy setup, it can lead to state corruption, re-initialization, or bypassing critical setup logic. The `isConstructor()` check helps prevent direct initialization on the implementation *after* deployment, but the proxy itself must correctly orchestrate initialization. (7.7 Upgrades, 7.3 Access Control)
FixEnsure that the proxy contract's `initialize` function is meticulously designed to call all required `initialize` functions on the implementation contract exactly once and in the correct order. Implement robust testing for the proxy deployment and initialization process. Consider adding an `onlyProxy` modifier to the `initialize` functions if the proxy address is known and immutable, or ensure the `initializer` modifier's logic is fully understood in the context of the proxy pattern.
StatusUnresolved
Medium

ERC20 Approval Race Condition

M-01The standard ERC20 `approve()` function is susceptible to a known front-running attack. If a user approves an amount for a spender, and then attempts to approve a different amount, a malicious spender could front-run the second transaction by spending the original approved amount, and then again spending the newly approved amount, effectively spending double the intended amount. (7.2 Code Security)
IssueThe standard ERC20 `approve()` function is susceptible to a known front-running attack. If a user approves an amount for a spender, and then attempts to approve a different amount, a malicious spender could front-run the second transaction by spending the original approved amount, and then again spending the newly approved amount, effectively spending double the intended amount. (7.2 Code Security)
FixImplement the 'approve(0)' pattern to mitigate this risk. Before changing an existing allowance, the owner should first set the allowance to zero with a transaction, wait for it to be mined, and then issue a second transaction to set the new allowance. Alternatively, use `increaseAllowance` and `decreaseAllowance` functions, which are present in the contract and inherently safer against this specific race condition.
StatusUnresolved
Low

Inconsistent Pragma Directives

L-01The contract uses multiple `pragma` directives (`>=0.4.24 <0.7.0` and `^0.5.0`). While `^0.5.0` is compatible with `0.5.x` versions, and the broader range covers it, it is best practice to use a single, specific pragma (e.g., `pragma solidity 0.5.17;` or `pragma solidity ^0.5.0;`) for clarity and to avoid unexpected compiler behavior with future Solidity versions. (7.2 Code Security)
IssueThe contract uses multiple `pragma` directives (`>=0.4.24 <0.7.0` and `^0.5.0`). While `^0.5.0` is compatible with `0.5.x` versions, and the broader range covers it, it is best practice to use a single, specific pragma (e.g., `pragma solidity 0.5.17;` or `pragma solidity ^0.5.0;`) for clarity and to avoid unexpected compiler behavior with future Solidity versions. (7.2 Code Security)
FixConsolidate all `pragma solidity` directives to a single, consistent version, preferably `pragma solidity ^0.5.0;` or the exact compiler version used for deployment, `pragma solidity 0.5.17;`.
StatusUnresolved
Info

Unused Internal Function (`_burnFrom`)

I-01The internal function `_burnFrom(address account, uint256 amount)` is defined within the `ERC20` contract but is never called by any other function in the provided code. This constitutes dead code, which can increase contract size and potentially lead to confusion during future audits or maintenance. (7.2 Code Security)
IssueThe internal function `_burnFrom(address account, uint256 amount)` is defined within the `ERC20` contract but is never called by any other function in the provided code. This constitutes dead code, which can increase contract size and potentially lead to confusion during future audits or maintenance. (7.2 Code Security)
FixRemove the `_burnFrom` function if it is not intended to be used, or integrate it into a public `burnFrom` function if that functionality is desired.
StatusUnresolved
Info

Unnecessary `this;` statement

I-02The `_msgData()` function in the `Context` contract contains an unnecessary `this;` statement. This statement is a no-op and does not affect the contract's logic or state. (7.2 Code Security)
IssueThe `_msgData()` function in the `Context` contract contains an unnecessary `this;` statement. This statement is a no-op and does not affect the contract's logic or state. (7.2 Code Security)
FixRemove the `this;` statement from the `_msgData()` function for cleaner and more concise code.
StatusUnresolved

Category Ratings

TechnicalMedium5/10

The contract leverages battle-tested OpenZeppelin libraries like `SafeMath` and standard ERC20 patterns, enhancing code security and reliability. The use of storage gaps (`______gap`) is a good practice for upgradeability (7.1 Architecture, 7.2 Code Security). However, a significant concern is the potential for proxy initialization vulnerabilities, where `initialize` functions could be called directly on the implementation or incorrectly by the proxy (7.7 Upgrades, 7.3 Access Control). Additionally, the standard ERC20 `approve` function is susceptible to front-running attacks (7.2 Code Security).

GovernanceHigh2/10

Role-based access for minting is implemented, separating concerns and allowing for controlled token supply increases (7.3 Access Control). However, the `MinterRole` is highly centralized, posing a single point of failure if the minter's key is compromised or misused (7.4 Economic, 7.5 Governance). The truncation of `ERC20Capped` means the token's supply cap, a critical economic parameter, is not fully auditable from the provided code, potentially leading to uncontrolled dilution if not properly configured or if the cap is excessively high (7.4 Economic).

UpgradesHigh1/10

The contract is designed for upgradeability using OpenZeppelin's `Initializable` pattern and includes storage gap variables (`______gap`), which are crucial for preventing storage collisions during upgrades (7.7 Upgrades). A critical vulnerability exists if the proxy's `initialize` function does not correctly call all necessary `initialize` functions on the implementation, or if the implementation's `initialize` functions are called directly before proxy setup. This could lead to state corruption or re-initialization, compromising the contract's integrity (7.7 Upgrades, 7.3 Access Control).

Security Checklist

Contract VerifiedPass
Ownership Renounced?
No Mint FunctionFail
Liquidity LockedPass
Not a ProxyFail
HoneypotNoneBuy Tax0.0%Sell Tax0.0%

Proxy Upgrade Controls

Proxy TypeEip1967 Uups
ImplementationVerified source
Upgrades (30d)0 · stable

Holder Composition

7.8% in wallets64.4% in contracts
Effective Concentration33.6%

Share held by contracts — treasury, vesting, bridge or staking — is discounted against share held by wallets when the score is computed: a contract cannot decide to sell the way an anonymous holder can, though it can still be drained or voted to sell. Effective concentration is the figure the risk score is actually calculated from.

Liquidity Depth

The risk score reads depth across every pair. The volume figure and the volume-to-liquidity ratio elsewhere on this page describe only the pair this audit analysed, so the two are not directly comparable.

LP Distribution

Top-1 Unlocked Holder43.7%
Top-3 Unlocked80.8%

Key Addresses

Deployer
0xe661…ea19
Unlocked LP Held By
0x2b3f…0daa0x5b03…08e90x3320…84900xe1a3…687f0xae38…64e90x257e…e35d0x5a27…24be

No privileged address appears among these holders: the unlocked liquidity sits with independent providers, not with the deployer.

What Raised This Score

  • Ownership status UNKNOWN (owner could not be resolved)
  • Mintable supply, but capped at 0.0%/year
  • Proxy contract (upgradeable — admin can replace logic)
  • Top-10 concentration > 30% (72.2% total → 33.6% effective; 7.8% in EOAs, 64.4% in contracts — moderate)
  • LP top3 unlocked holders = 80.8% (independent LP — depth risk, pool = 87% of DEX liquidity)
  • LP claimed locked but only 0.0% actually locked
  • 2 High finding(s) from audit
  • 1 Medium finding(s) from audit
  • 1 Low finding(s) from audit

Each factor is an on-chain fact recorded at the time of this analysis. The score is computed from them by a deterministic function, so the same contract returns the same score for anyone who runs the audit. How scores are computed

Related Audits

SPACE ID (ID)High RiskUSDS Stablecoin (USDS)High RiskSushiToken (SUSHI)High RiskEspresso (ESP)High RiskSEIHigh RiskDolomite (DOLO)High Risk

Would You Like a More Detailed Audit of Marlin POND?

Our AI-powered scanner gives you a deeper, real-time smart contract analysis — free, with every scoring factor shown.

Get Detailed Audit