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.

On-chain security analysis — is it a scam or legit?
Is Euro Coin Safe?
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 →This audit covers the FiatTokenV2_2 implementation contract, which serves as the logic for a proxy-based ERC-20 stablecoin.
Read the full analysis- 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 4Holders
as of audit · Sep 4, 2026- Contractstreasury, vesting, bridge, staking29.2%
- Walletsanonymous holders, free to sell10.6%
- Everyone elsethe rest of the supply60.1%
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- Uniswap v3USDCAnalysed$3.52M53.2%
- Uniswap v4USDC$1.65M24.9%
- Uniswap v4USDC$635.8K9.6%
- Uniswap v4ETH$514.5K7.8%
- Uniswap v4USDC$199.9K3.0%
- Uniswap v3USDT$36.5K0.6%
Show 4 more pairs
The 3 remaining pairs hold $944 between them and are not listed. The risk score reads depth across every pair.
The LP tokens of the analysed pool are not locked or burned, so whoever holds them can withdraw that liquidity.
0xd2c3…8eb90x41df…ea1c0x1118…8af80x19a0…0feb0x27aa…a16d0xc93a…f89e0xd297…78d40x1a0e…980b0xa9d0…235c0xea57…13d2No privileged address appears among these holders: the unlocked liquidity sits with independent providers, not with the deployer.
Security Findings
CriticalCritical 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
InfoCentralized 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
InfoHardcoded 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
InfoBlacklisting 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 4The 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).
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).
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.
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
Free for any token on the record. It links to this page and always shows the current score and the date it was checked.
- 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