The P00lsTokenCreator contract serves as an ERC-20 token with Merkle drop functionality, deployed as an upgradeable implementation behind a BeaconProxy. It leverages OpenZeppelin's upgradeable contracts and a RegistryOwnable pattern for access control. While the core ERC-20 and Merkle drop logic appears sound, a significant design decision grants unlimited allowance to an external xCreatorToken contract, posing a high economic risk if that dependency is compromised. Minor informational findings relate to upgradeability nuances and external dependencies.

On-chain security analysis — is it a scam or legit?
Is 00 Token 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 P00lsTokenCreator contract serves as an ERC-20 token with Merkle drop functionality, deployed as an upgradeable implementation behind a BeaconProxy.
Read the full analysis- Ownership not renounced — Multisig
- Proxy contract
- Non-standard proxy storage
- 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 High finding(s) from audit
- 1 Low finding(s) from audit
Exact factors
- Ownership NOT renounced — Multisig (2-of-4)
- Proxy contract (upgradeable — admin can replace logic)
- Non-standard proxy storage (Etherscan-confirmed)
- Top-10 concentration > 30% (89.5% total → 47.0% effective; 18.6% in EOAs, 70.9% 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)
- LP top3 unlocked holders = 100.0% (independent LP — depth risk)
- 1 High 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, staking70.9%
- Walletsanonymous holders, free to sell18.6%
- Everyone elsethe rest of the supply10.5%
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.
0xb554…1b0fNo privileged address appears among these holders: the unlocked liquidity sits with independent providers, not with the deployer.
Security Findings
HighUnlimited Allowance Granted to xCreatorToken
The allowance function in P00lsTokenCreator is overridden to return type(uint256).max for the xCreatorToken address. This design choice grants the xCreatorToken contract unlimited spending approval over all token holders' balances within this contract. This represents a significant trust assumption and a potential single point of failure. If xCreatorToken is compromised, exploited, or behaves maliciously, it could lead to the draining of all P00lsTokenCreator tokens from users who have approved this contract.H-01
xCreatorTokenIssue
The allowance function in P00lsTokenCreator is overridden to return type(uint256).max for the xCreatorToken address. This design choice grants the xCreatorToken contract unlimited spending approval over all token holders' balances within this contract. This represents a significant trust assumption and a potential single point of failure. If xCreatorToken is compromised, exploited, or behaves maliciously, it could lead to the draining of all P00lsTokenCreator tokens from users who have approved this contract.
Fix
Re-evaluate the necessity of granting unlimited allowance to xCreatorToken. If possible, implement a more granular allowance mechanism (e.g., specific amounts, time-bound approvals, or a pull-based system). If unlimited allowance is critical for functionality, ensure xCreatorToken undergoes rigorous security audits, has robust access control, and is managed by a highly secure entity (e.g., a multi-sig or DAO). Consider implementing circuit breakers or emergency pause mechanisms in `xCreator…
Status
Unresolved
LowBroad Solidity Pragma Version
The contract uses pragma solidity ^0.8.0;. This allows compilation with any 0.8.x version. While minor version updates are generally backward-compatible, it is a best practice to pin the pragma to a specific compiler version (e.g., pragma solidity 0.8.13;) to ensure consistent bytecode generation and avoid potential issues with future compiler updates that might introduce subtle changes or new warnings.L-01
Issue
The contract uses pragma solidity ^0.8.0;. This allows compilation with any 0.8.x version. While minor version updates are generally backward-compatible, it is a best practice to pin the pragma to a specific compiler version (e.g., pragma solidity 0.8.13;) to ensure consistent bytecode generation and avoid potential issues with future compiler updates that might introduce subtle changes or new warnings.
Fix
Pin the Solidity pragma to a specific compiler version used for deployment, for example, pragma solidity 0.8.13; to ensure consistent compilation results.
Status
Unresolved
InfoConstructor initializer() Call in Upgradeable Implementation
The P00lsTokenCreator constructor calls initializer(). In a BeaconProxy setup, the constructor of the implementation contract is called only once upon its deployment, not when the proxy is initialized. The initialize function, which also uses initializer(), is the one called via the proxy to set up the contract's state. While this constructor call is harmless as it only sets an internal flag that initialize also sets, it is redundant and can be confusing. The primary protection against re-initialization for proxy contracts comes from the initializer modifier on the initialize function itself.I-01
initializer() Call in Upgradeable ImplementationIssue
The P00lsTokenCreator constructor calls initializer(). In a BeaconProxy setup, the constructor of the implementation contract is called only once upon its deployment, not when the proxy is initialized. The initialize function, which also uses initializer(), is the one called via the proxy to set up the contract's state. While this constructor call is harmless as it only sets an internal flag that initialize also sets, it is redundant and can be confusing. The primary protection against re-initialization for proxy contracts comes from the initializer modifier on the initialize function itself.
Fix
Consider removing the initializer() call from the constructor of the implementation contract, as it is not strictly necessary for the proxy's upgradeability logic and can be misleading. The initialize function's initializer() modifier is sufficient.
Status
Unresolved
InfoInter-Contract Dependency on xCreatorToken Security
The P00lsTokenCreator contract has a strong dependency on the xCreatorToken contract. Specifically, the _delegate function mirrors delegation calls to xCreatorToken.__delegate, and xCreatorToken is granted unlimited allowance (as noted in H-01). This tight coupling means that the overall security and integrity of P00lsTokenCreator are directly tied to the security and trustworthiness of xCreatorToken. Any vulnerability, exploit, or malicious behavior within xCreatorToken could directly impact P00lsTokenCreator and its users.I-02
xCreatorToken SecurityIssue
The P00lsTokenCreator contract has a strong dependency on the xCreatorToken contract. Specifically, the _delegate function mirrors delegation calls to xCreatorToken.__delegate, and xCreatorToken is granted unlimited allowance (as noted in H-01). This tight coupling means that the overall security and integrity of P00lsTokenCreator are directly tied to the security and trustworthiness of xCreatorToken. Any vulnerability, exploit, or malicious behavior within xCreatorToken could directly impact P00lsTokenCreator and its users.
Fix
Ensure that the xCreatorToken contract undergoes equally rigorous security audits and adheres to the highest security standards. Implement robust monitoring for xCreatorToken's behavior and consider mechanisms to decouple or mitigate risks associated with this dependency if possible.
Status
Unresolved
Analysis
AI Copilotas of audit · Sep 4The contract demonstrates good technical architecture, inheriting from well-audited OpenZeppelin upgradeable contracts for ERC-20, ERC-20Votes, Multicall, and ERC-1363 functionalities (7.1 Architecture). The Merkle drop mechanism for token claims is correctly implemented using MerkleProof.verify and BitMaps to prevent double claims (7.2 Code Security). The ERC1363Upgradeable functions include try/catch blocks for external calls, mitigating some reentrancy risks. A minor issue is the broad Solidity pragma ^0.8.0, which could lead to inconsistent compilation across different minor versions.
Access control is managed through a RegistryOwnable pattern, allowing for flexible and potentially multi-sig ownership, which is a robust approach (7.3 Access Control, 7.5 Governance). However, a significant economic risk exists due to the allowance function being overridden to grant type(uint256).max approval to the xCreatorToken contract (7.4 Economic). This means xCreatorToken has unlimited spending power over all token holders' balances, creating a single point of failure if xCreatorToken is compromised. Additionally, the _delegate function mirrors delegation calls to xCreatorToken, tightly coupling the governance of the two tokens (7.5 Governance).
The contract is designed as an upgradeable implementation for a BeaconProxy, correctly utilizing OpenZeppelin's initializer() modifier to prevent re-initialization on upgrades (7.7 Upgrades). All state variables are added at the end of the contract, maintaining storage layout compatibility with inherited upgradeable contracts. A minor observation is the redundant initializer() call in the constructor of the implementation, which is harmless but not strictly necessary for proxy functionality (7.1 Architecture).
Prioritize addressing the high-severity finding regarding the unlimited allowance granted to xCreatorToken.
Evaluate if this level of trust is absolutely necessary and explore alternative, more granular approval mechanisms or robust security measures for xCreatorToken. Pin the Solidity pragma to a specific version to ensure consistent compilation. Review the necessity of the initializer() call in the constructor of the implementation contract for clarity, although it poses no direct security risk.
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 13, 202654Medium
Score changes are recorded as dated snapshots — history is append-only and cannot be edited.
Would You Like a More Detailed Audit of 00 Token?
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