The audit of the FiatTokenV2_1 implementation contract identified a critical access control vulnerability in its initialization function, which could lead to unauthorized fund transfers and contract blacklisting. While the contract leverages well-audited OpenZeppelin libraries for core functionalities, the lack of proper protection for upgrade-specific logic poses a significant risk. Further, the absence of the base FiatTokenV2 contract code limits the scope of a comprehensive assessment.
On-chain security analysis — is it a scam or legit?
Is Coinbase Wrapped BTC 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 →The audit of the FiatTokenV2_1 implementation contract identified a critical access control vulnerability in its initialization function, which could lead to unauthorized fund transfers and contract blacklisting.
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 > 30%
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- LP top1 unlocked holder = 100.0%
- LP top3 unlocked holders = 100.0%
- 1 Critical finding(s) from audit
- 1 High finding(s) from audit
- 1 Medium finding(s) from audit
- 1 Low 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 > 30% (50.8% total → 38.4% effective; 30.1% in EOAs, 20.7% in contracts — moderate)
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- LP top1 unlocked holder = 100.0% (independent LP — depth risk, pool = 87% of DEX liquidity)
- LP top3 unlocked holders = 100.0% (independent LP — depth risk, pool = 87% of DEX liquidity)
- 1 Critical finding(s) from audit
- 1 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
Security Checklist
as of audit · Sep 4Holders
as of audit · Sep 4, 2026- Contractstreasury, vesting, bridge, staking20.7%
- Walletsanonymous holders, free to sell30.1%
- Everyone elsethe rest of the supply49.2%
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 4The 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.
0xbe2f…1b54No privileged address appears among these holders: the unlocked liquidity sits with independent providers, not with the deployer.
Security Findings
CriticalLack of Access Control on initializeV2_1 Function
The initializeV2_1 function, intended for upgrade-specific initialization, lacks proper access control. It only checks _initializedVersion == 1 but does not restrict *who* can call it. If the _initializedVersion state variable is set to 1 (e.g., by a previous initialize call in FiatTokenV2), any external caller can execute this function. This allows unauthorized parties to trigger critical state changes.C-01
initializeV2_1 FunctionIssue
The initializeV2_1 function, intended for upgrade-specific initialization, lacks proper access control. It only checks _initializedVersion == 1 but does not restrict *who* can call it. If the _initializedVersion state variable is set to 1 (e.g., by a previous initialize call in FiatTokenV2), any external caller can execute this function. This allows unauthorized parties to trigger critical state changes.
Fix
Implement a robust access control mechanism (e.g., onlyOwner or onlyProxyAdmin) for the initializeV2_1 function. Ensure that the _initializedVersion state is managed carefully across upgrades and that initialization functions are called only by authorized entities, typically the proxy admin.
Status
Unresolved
HighCritical State Changes in Unprotected initializeV2_1
The initializeV2_1 function performs two critical and irreversible state changes: transferring all tokens held by the contract (balances[address(this)]) to a lostAndFound address and then blacklisting the contract itself. Due to the lack of access control (C-01), an unauthorized caller could trigger these actions. If the lostAndFound address is incorrect or compromised, funds could be permanently lost. Blacklisting the contract prevents it from holding or transferring tokens, which could disrupt operational flows if not fully anticipated.H-01
initializeV2_1Issue
The initializeV2_1 function performs two critical and irreversible state changes: transferring all tokens held by the contract (balances[address(this)]) to a lostAndFound address and then blacklisting the contract itself. Due to the lack of access control (C-01), an unauthorized caller could trigger these actions. If the lostAndFound address is incorrect or compromised, funds could be permanently lost. Blacklisting the contract prevents it from holding or transferring tokens, which could disrupt operational flows if not fully anticipated.
Fix
Thoroughly review the necessity and implications of these actions. Ensure the lostAndFound address is secure and correctly configured, ideally a multi-signature wallet. Document the operational impact of blacklisting the contract address. Consider adding a timelock or multi-party confirmation for such critical operations.
Status
Unresolved
MediumIncomplete Audit Scope (Missing FiatTokenV2 Source)
The provided source code is for FiatTokenV2_1, which inherits from FiatTokenV2. The full source code for FiatTokenV2 was not provided, limiting the ability to conduct a comprehensive audit of the entire token logic, including its initialization, access control, and core ERC-20 functionalities. Potential vulnerabilities in the base contract could affect the FiatTokenV2_1 implementation.M-01
FiatTokenV2 Source)Issue
The provided source code is for FiatTokenV2_1, which inherits from FiatTokenV2. The full source code for FiatTokenV2 was not provided, limiting the ability to conduct a comprehensive audit of the entire token logic, including its initialization, access control, and core ERC-20 functionalities. Potential vulnerabilities in the base contract could affect the FiatTokenV2_1 implementation.
Fix
Provide the complete source code for all inherited contracts (FiatTokenV2 and any further dependencies) for a full security assessment of the entire system.
Status
Unresolved
LowUse of Older Solidity Version and OpenZeppelin Libraries
The contract uses Solidity 0.6.12 and corresponding OpenZeppelin libraries. While 0.6.x is generally stable, newer Solidity versions (e.g., 0.8.x) offer built-in overflow/underflow checks, reducing reliance on SafeMath, and other compiler optimizations. This can lead to minor gas inefficiencies and potential exposure to subtle compiler bugs present in older versions.L-01
Issue
The contract uses Solidity 0.6.12 and corresponding OpenZeppelin libraries. While 0.6.x is generally stable, newer Solidity versions (e.g., 0.8.x) offer built-in overflow/underflow checks, reducing reliance on SafeMath, and other compiler optimizations. This can lead to minor gas inefficiencies and potential exposure to subtle compiler bugs present in older versions.
Fix
Consider upgrading to a more recent Solidity compiler version (e.g., 0.8.x) and the latest compatible OpenZeppelin contracts to benefit from security enhancements, improved gas efficiency, and modern language features.
Status
Unresolved
InfoDeliberate Blacklisting of Contract Address
The initializeV2_1 function explicitly blacklists address(this), meaning the proxy contract itself will be unable to send or receive tokens. This is a deliberate design choice often seen in stablecoins to prevent the token contract from being frozen or having its balance manipulated by external actors or its own functions.I-01
Issue
The initializeV2_1 function explicitly blacklists address(this), meaning the proxy contract itself will be unable to send or receive tokens. This is a deliberate design choice often seen in stablecoins to prevent the token contract from being frozen or having its balance manipulated by external actors or its own functions.
Fix
Ensure this design choice is well-understood and documented within the project's specifications and operational procedures, as it has specific implications for how the token contract can interact with its own token supply.
Status
Unresolved
Analysis
AI Copilotas of audit · Sep 4The contract utilizes well-audited OpenZeppelin libraries like SafeMath and SafeERC20, enhancing code security against common integer and ERC-20 interaction vulnerabilities (7.2 Code Security). However, a critical architectural flaw exists in the initializeV2_1 function, which lacks proper access control, allowing any caller to trigger significant state changes (7.3 Access Control, C-01). The reliance on _initializedVersion == 1 as the sole protection is insufficient for a critical upgrade function.
The primary governance and economic risk stems from the unprotected initializeV2_1 function, which can be called by anyone if _initializedVersion is 1, leading to unauthorized transfer of contract-held tokens and blacklisting of the contract itself (7.3 Access Control, 7.4 Economic, C-01, H-01). This poses a severe risk to asset security and operational control. The lostAndFound address becomes a single point of failure for transferred funds, requiring robust management (7.6 External, 7.8 Operations).
As an implementation contract for a proxy, upgrade safety is paramount (7.1 Architecture). The initializeV2_1 function is designed for post-upgrade setup but critically lacks access control, making it callable by any address (7.7 Upgrades, C-01). This vulnerability allows unauthorized parties to execute critical initialization steps, including transferring funds and blacklisting the proxy contract (H-01), severely compromising the upgrade process and the integrity of the token.
Immediately implement robust access control (e.g., onlyOwner or onlyProxyAdmin) for the initializeV2_1 function to prevent unauthorized execution of critical state changes.
Ensure that the lostAndFound address is a secure, multi-signature controlled wallet. Conduct a full audit of the FiatTokenV2 base contract to identify any underlying vulnerabilities that could impact the overall system.
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, 202674High
Score changes are recorded as dated snapshots — history is append-only and cannot be edited.
Would You Like a More Detailed Audit of Coinbase Wrapped BTC?
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