Quantum Audit Logo
Launch App

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

Is Euro Coin Safe?

EURCEthereum
Not verified This record has not gone through deep verification and is not being monitored. The score is a dated snapshot — the token’s risk can change at any time.Own this token? Put it under verification →
Last checked Sep 4, 2026 · 1 audit on record
SummaryAI Copilot

This audit covers the FiatTokenV2_2 implementation contract, which serves as the logic for a proxy-based ERC-20 stablecoin.

Read the full analysis
What raised the score
  • Ownership not renounced — owner is an EOA
  • Mintable supply — no cap found, dilution unbounded
  • Proxy contract
  • Admin is EOA
  • Top-10 concentration > 20%
  • Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
  • 1 Critical finding(s) from audit
Exact factors
  • Ownership NOT renounced — owner is an EOA (single private key)
  • Mintable supply — no cap found, dilution unbounded
  • Proxy contract (upgradeable — admin can replace logic)
  • Admin is EOA (single key controls upgrades)
  • Top-10 concentration > 20% (39.9% total → 22.3% effective; 10.6% in EOAs, 29.2% in contracts — mild)
  • Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
  • 1 Critical 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

Security Checklist

as of audit · Sep 41 of 5 checks passed
Contract verifiedVerified
OwnershipRetained
MintMintable
Liquidity lockNot locked
UpgradeabilityUpgradeable

Holders

as of audit · Sep 4, 2026
29.2%Contracts10.6%Wallets60.1%Everyone else
29.2%Contracts10.6%60.1%Everyone else
ContractsWalletsEveryone elseBubble area = share of supply
39.9%of supply sits with the top 10 holders
  • Contractstreasury, vesting, bridge, staking29.2%
  • Walletsanonymous holders, free to sell10.6%
  • Everyone elsethe rest of the supply60.1%
Effective concentrationwhat the score reads22.3%
How holder types affect the score

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.

Holder balances as recorded by the audit of Sep 4, 2026

Liquidity

as of audit · Sep 4$6.61M across 13 pairs
LP tokensNot locked

The LP tokens of the analysed pool are not locked or burned, so whoever holds them can withdraw that liquidity.

Analysed pool$3.52MShare of depth53.2%
Top-1 Unlocked Holder13.7%
Top-3 Unlocked39.2%
Unlocked LP held by
0xd2c3…8eb90x41df…ea1c0x1118…8af80x19a0…0feb0x27aa…a16d0xc93a…f89e0xd297…78d40x1a0e…980b0xa9d0…235c0xea57…13d2

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

Security Findings

1 Critical3 Info
Critical

Critical Upgrade Storage Collision and Data Loss

The FiatTokenV2_2 contract introduces a new storage mechanism by overriding _balanceOf, _isBlacklisted, _setBalance, and _setBlacklistState to use a single balanceAndBlacklistStates mapping. Previous versions, such as FiatTokenV1, utilized separate _balances and _blacklisted mappings. The initializeV2_2 function, intended for upgrade logic, only migrates accounts from _deprecatedBlacklisted to the new balanceAndBlacklistStates format. Crucially, it lacks any migration logic for existing token balances stored in the _balances mapping from prior versions. This design flaw means that upon upgrading to FiatTokenV2_2 from a version using separate balance storage, all…C-01

Issue

The FiatTokenV2_2 contract introduces a new storage mechanism by overriding _balanceOf, _isBlacklisted, _setBalance, and _setBlacklistState to use a single balanceAndBlacklistStates mapping. Previous versions, such as FiatTokenV1, utilized separate _balances and _blacklisted mappings. The initializeV2_2 function, intended for upgrade logic, only migrates accounts from _deprecatedBlacklisted to the new balanceAndBlacklistStates format. Crucially, it lacks any migration logic for existing token balances stored in the _balances mapping from prior versions. This design flaw means that upon upgrading to FiatTokenV2_2 from a version using separate balance storage, all…

Fix

If this contract was deployed as an upgrade from a version with separate _balances and _blacklisted mappings, an immediate and comprehensive audit of the upgrade process is required. A robust migration strategy must be implemented to transfer all existing token balances from the old _balances mapping to the new balanceAndBlacklistStates mapping during the upgrade. This typically involves a dedicated migration function or a more sophisticated proxy upgrade mechanism that handles storage…

Status

Unresolved

Info

Centralized Control by Privileged Roles

The contract inherits functionalities such as pausing and blacklisting, which grant significant control to privileged roles (e.g., owner, pauser, blacklister). These roles can pause all transfers, blacklist specific accounts (preventing them from sending/receiving tokens), and potentially mint/burn tokens (inherited from parent contracts). While common for stablecoins to ensure regulatory compliance and emergency response, this centralization introduces a single point of failure and trust, as a compromise of these roles could have severe consequences.I-01

Issue

The contract inherits functionalities such as pausing and blacklisting, which grant significant control to privileged roles (e.g., owner, pauser, blacklister). These roles can pause all transfers, blacklist specific accounts (preventing them from sending/receiving tokens), and potentially mint/burn tokens (inherited from parent contracts). While common for stablecoins to ensure regulatory compliance and emergency response, this centralization introduces a single point of failure and trust, as a compromise of these roles could have severe consequences.

Fix

Ensure that the private keys controlling these privileged roles are secured with the highest industry standards (e.g., multi-signature wallets, hardware security modules, robust access control policies). Consider implementing a time-lock mechanism for critical administrative actions to provide a window for community review or emergency intervention.

Status

Unresolved

Info

Hardcoded EIP-712 Domain Version String

The _domainSeparator() function uses EIP712.makeDomainSeparator with a hardcoded version string of "2". While this is a common practice for EIP-712 domains, if future contract upgrades introduce significant changes to the EIP-712 message structures or authorization logic, maintaining a static domain version might lead to confusion or require careful external communication to users about which domain version corresponds to which contract version. It might also imply that all FiatTokenV2.x versions share the same EIP-712 domain, which should be explicitly documented.I-02

Issue

The _domainSeparator() function uses EIP712.makeDomainSeparator with a hardcoded version string of "2". While this is a common practice for EIP-712 domains, if future contract upgrades introduce significant changes to the EIP-712 message structures or authorization logic, maintaining a static domain version might lead to confusion or require careful external communication to users about which domain version corresponds to which contract version. It might also imply that all FiatTokenV2.x versions share the same EIP-712 domain, which should be explicitly documented.

Fix

Document the rationale behind the hardcoded EIP-712 domain version "2" and clarify its relationship to the contract's semantic versioning (e.g., V2_2). If future changes to EIP-712 message structures are anticipated, consider making the EIP-712 version string configurable or derive it from the contract's semantic version to avoid potential ambiguities.

Status

Unresolved

Info

Blacklisting of Implementation Contract Address

The initializeV2_2 function explicitly calls _blacklist(address(this)), which blacklists the implementation contract itself. While implementation contracts are generally not intended to hold tokens, if tokens were accidentally sent to this address, they would become permanently locked and unrecoverable due to the blacklisting status. This is an edge case but represents a potential loss of funds if such an accidental transfer occurs.I-03

Issue

The initializeV2_2 function explicitly calls _blacklist(address(this)), which blacklists the implementation contract itself. While implementation contracts are generally not intended to hold tokens, if tokens were accidentally sent to this address, they would become permanently locked and unrecoverable due to the blacklisting status. This is an edge case but represents a potential loss of funds if such an accidental transfer occurs.

Fix

Confirm that there are no scenarios where the implementation contract is expected to hold tokens. If there are, re-evaluate the necessity of blacklisting address(this). Otherwise, ensure clear documentation and operational procedures are in place to prevent accidental token transfers to the implementation contract address.

Status

Unresolved

Analysis

AI Copilotas of audit · Sep 4
Executive SummaryWhat the contract is and what the review found

This audit covers the FiatTokenV2_2 implementation contract, which serves as the logic for a proxy-based ERC-20 stablecoin. The contract introduces a new storage mechanism for balances and blacklist status, combining them into a single mapping. While the new bit-packing logic is technically sound, the upgrade path from previous versions (e.g., FiatTokenV1) that used separate storage mappings for balances and blacklisted accounts appears to be critically flawed. The initializeV2_2 function only migrates blacklisted accounts, not existing token balances, leading to a high risk of data loss for all user balances upon upgrade. Other aspects, such as EIP-712 signature handling and access controls, are implemented robustly, but the upgrade safety issue overshadows these strengths.

Technical5/10Medium risk

The contract demonstrates strong technical implementation for its core functionalities, including robust EIP-712 signature handling for delegated operations and an efficient bit-packing mechanism for combining balance and blacklist status in storage (7.2 Code Security). The use of whenNotPaused and notBlacklisted modifiers ensures proper access control during critical operations (7.3 Access Control). However, a critical vulnerability exists in the upgrade mechanism related to storage layout changes, which could lead to severe data loss (7.1 Architecture).

Governance4/10Medium risk

The contract incorporates standard stablecoin governance features such as pausing and blacklisting, which are essential for emergency response and regulatory compliance (7.5 Governance). EIP-712 authorizations enhance user experience by enabling delegated transactions. However, these features inherently centralize significant control in privileged roles, posing a medium economic risk due to potential misuse or compromise of these roles (7.4 Economic).

Upgrades1/10High risk

The contract is designed as an upgradeable proxy implementation, featuring a versioned initializer (initializeV2_2) to manage upgrade logic (7.7 Upgrades). This initializer includes specific migration steps for previously blacklisted accounts. Despite these efforts, a critical flaw exists: the contract changes the storage layout for balances and blacklist status from separate mappings (in FiatTokenV1) to a combined balanceAndBlacklistStates without migrating existing user balances, leading to a complete loss of all token balances upon upgrade.

Final RecommendationWhat to do about this score

Prioritize a thorough review of the upgrade path, specifically focusing on storage layout compatibility and data migration strategies.

If this contract was deployed as an upgrade from a version using separate _balances and _blacklisted mappings without a comprehensive balance migration, immediate action is required to address the potential data loss. Ensure all future upgrades include explicit, audited migration logic for any changes in storage layout affecting user data. Additionally, consider documenting the EIP-712 domain versioning strategy to clarify its relationship with contract versions.

Contract & Record

1 audit on record
TypeFiatTokenProxy
NetworkEthereum
Token age4y
Contract0x1aba…c33c
Deployer0xe0bb…e69f
Proxy Upgrade Controls
Proxy TypeZeppelin Os Legacy
AdminEOA (single key controls upgrades)
ImplementationVerified source
Upgrades (30d)0 · stable
Badge for your website
Euro Coin security record badge

Free for any token on the record. It links to this page and always shows the current score and the date it was checked.

Audit History
  1. Aug 11, 202644Medium

Score changes are recorded as dated snapshots — history is append-only and cannot be edited.

Would You Like a More Detailed Audit of Euro Coin?

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

Get Detailed Audit Is this your token? Publish your own audit on this page