The DopplerERC20V1 contract implements an ERC20 token with vesting capabilities and a balance limit mechanism. The audit identified a critical vulnerability where the intended balance limit mechanism is not enforced due to a missing override of the _beforeTokenTransfer hook. This renders the balance limit ineffective. Additionally, the contract exhibits centralized control by the owner and controller roles. The core vesting logic could not be fully assessed due to truncated code. Addressing the critical functional flaw is paramount to ensure the intended security properties of the token.
Early-stage security check — honeypot & rug-pull analysis
Is defi-native a Scam?
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 DopplerERC20V1 contract implements an ERC20 token with vesting capabilities and a balance limit mechanism.
Read the full analysis- Ownership not renounced — owner is a contract
- 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 = 52.4%
- LP top3 unlocked holders = 94.7%
- Token age < 7 days
- 1 Critical finding(s) from audit
- 1 Medium finding(s) from audit
- 1 Low finding(s) from audit
Exact factors
- Ownership NOT renounced — owner is a contract (governance/executor, not an EOA)
- Proxy contract (upgradeable — admin can replace logic)
- Non-standard proxy storage (Etherscan-confirmed)
- Top-10 concentration > 30% (65.9% total → 31.4% effective; 8.3% in EOAs, 57.5% in contracts — moderate)
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- LP top1 unlocked holder = 52.4% (independent LP — depth risk, pool = 100% of DEX liquidity)
- LP top3 unlocked holders = 94.7% (independent LP — depth risk, pool = 100% of DEX liquidity)
- Token age < 7 days (early, volatile)
- 1 Critical 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, staking57.5%
- Walletsanonymous holders, free to sell8.3%
- Everyone elsethe rest of the supply34.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 v4WETHAnalysed$79.7K99.6%
- Uniswap v4USDC$2800.3%
- Uniswap v4USDC$50.0%
- Uniswap v4USDC$30.0%
- Uniswap v4ETH$20.0%
- Uniswap v4USDC$10.0%
Show 1 more pair
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.
0x0792…b0810x0f44…33860x5c9b…0a8b0x789f…f2520x8a22…6c400x1c58…dc490xb63d…04c50xff59…adea0xd8ca…fd32No privileged address appears among these holders: the unlocked liquidity sits with independent providers, not with the deployer.
Security Findings
CriticalMissing _beforeTokenTransfer Override for Balance Limit Enforcement
The contract defines a balance limit mechanism (isBalanceLimitActive, maxBalanceLimit, balanceLimitEnd, isExcludedFromBalanceLimit) and related access control (disableBalanceLimit by controller). However, the provided code snippet does not include an override of the _beforeTokenTransfer hook from the inherited ERC20 (Solady) contract. Without this override, the maxBalanceLimit and balanceLimitEnd checks are not enforced during token transfers, rendering the entire balance limit mechanism ineffective for its primary purpose.C-01
_beforeTokenTransfer Override for Balance Limit EnforcementIssue
The contract defines a balance limit mechanism (isBalanceLimitActive, maxBalanceLimit, balanceLimitEnd, isExcludedFromBalanceLimit) and related access control (disableBalanceLimit by controller). However, the provided code snippet does not include an override of the _beforeTokenTransfer hook from the inherited ERC20 (Solady) contract. Without this override, the maxBalanceLimit and balanceLimitEnd checks are not enforced during token transfers, rendering the entire balance limit mechanism ineffective for its primary purpose.
Fix
Implement the _beforeTokenTransfer hook to include the necessary checks for isBalanceLimitActive, balanceLimitEnd, maxBalanceLimit, and isExcludedFromBalanceLimit for the to address before allowing any token transfer.
Status
Unresolved
MediumCentralized Control by Owner/Controller
The contract utilizes the Ownable pattern, granting the owner significant administrative privileges, including lockPool, unlockPool, and updateTokenURI. Additionally, a controller role is introduced with the ability to disableBalanceLimit. While common for initial deployment phases, this centralization of power introduces a single point of failure and potential for malicious or compromised control.M-01
Issue
The contract utilizes the Ownable pattern, granting the owner significant administrative privileges, including lockPool, unlockPool, and updateTokenURI. Additionally, a controller role is introduced with the ability to disableBalanceLimit. While common for initial deployment phases, this centralization of power introduces a single point of failure and potential for malicious or compromised control.
Fix
Consider implementing a multi-signature wallet for the owner and controller roles to enhance security and decentralization. For critical functions, explore time-locks or community governance mechanisms if the project matures.
Status
Unresolved
LowPotential Gas Cost for computeAvailableVestedAmount with Many Schedules
The computeAvailableVestedAmount(address beneficiary) function iterates through all schedule IDs associated with a beneficiary via _scheduleIdsOf[beneficiary]. If a beneficiary accumulates a very large number of individual vesting schedules, this array could grow significantly, leading to increased gas costs for calling this view function. While view functions don't directly cost the caller gas on-chain, they can impact off-chain queries and potentially on-chain calls if another contract were to query it.L-01
computeAvailableVestedAmount with Many SchedulesIssue
The computeAvailableVestedAmount(address beneficiary) function iterates through all schedule IDs associated with a beneficiary via _scheduleIdsOf[beneficiary]. If a beneficiary accumulates a very large number of individual vesting schedules, this array could grow significantly, leading to increased gas costs for calling this view function. While view functions don't directly cost the caller gas on-chain, they can impact off-chain queries and potentially on-chain calls if another contract were to query it.
Fix
For beneficiaries expected to have a very high number of vesting schedules, consider alternative data structures or aggregation methods to reduce iteration costs. For typical use cases, the current implementation is likely acceptable.
Status
Unresolved
InfoTruncated Code Prevents Full Vesting Logic Review
The provided contract snippet is truncated, specifically omitting the full implementation of the _available, _releaseFor, and _releaseAllFor internal functions. These functions are central to the core vesting mechanism, calculating releasable amounts and handling token transfers. Without their complete code, a comprehensive security assessment of the vesting logic cannot be performed.I-01
Issue
The provided contract snippet is truncated, specifically omitting the full implementation of the _available, _releaseFor, and _releaseAllFor internal functions. These functions are central to the core vesting mechanism, calculating releasable amounts and handling token transfers. Without their complete code, a comprehensive security assessment of the vesting logic cannot be performed.
Fix
Provide the complete source code for all relevant functions to enable a thorough security review of the vesting mechanism.
Status
Unresolved
Infopool Address Excluded from Balance Limit
The lockPool function, callable by the owner, sets a pool address and then explicitly excludes this address from the balance limit checks by setting isExcludedFromBalanceLimit[pool_] = true. This design choice allows the designated pool contract to hold an unlimited amount of tokens, bypassing the maxBalanceLimit.I-02
pool Address Excluded from Balance LimitIssue
The lockPool function, callable by the owner, sets a pool address and then explicitly excludes this address from the balance limit checks by setting isExcludedFromBalanceLimit[pool_] = true. This design choice allows the designated pool contract to hold an unlimited amount of tokens, bypassing the maxBalanceLimit.
Fix
Ensure that the pool contract is thoroughly audited and trusted, as its exclusion from the balance limit could be exploited if the pool contract itself is compromised or contains vulnerabilities. Document the rationale for this exclusion clearly.
Status
Unresolved
Analysis
AI Copilotas of audit · Sep 4The contract leverages well-audited Solady libraries for its ERC20 and Ownable functionalities, contributing to a solid foundation (7.1 Architecture). It utilizes custom errors for clear error handling and implements pre-mint limits to control initial allocations (7.2 Code Security). However, a critical flaw exists where the balance limit mechanism, a key security feature, is not enforced during token transfers due to a missing _beforeTokenTransfer override (7.2 Code Security). The core vesting logic could not be fully reviewed due to truncated code (7.2 Code Security).
The economic model incorporates vesting schedules with cliff and duration periods, along with pre-mint limits to manage initial token distribution effectively (7.4 Economic). The initialize function includes robust checks for vesting parameters and allocation limits. However, the contract relies on a centralized owner for critical administrative actions like lockPool and unlockPool, and a controller for disableBalanceLimit (7.5 Governance, 7.3 Access Control). This centralization introduces a single point of failure.
The contract incorporates the Initializable pattern from Solady and correctly calls _disableInitializers() in its constructor, preventing re-initialization in a non-proxy deployment (7.7 Upgrades). While the provided information indicates it is not a proxy, the code is structured to be compatible with proxy patterns if future upgradeability is desired. This demonstrates foresight in design.
Prioritize the immediate implementation of the _beforeTokenTransfer override to correctly enforce the balance limit mechanism, as its current state renders it ineffective.
Enhance access control by implementing a multi-signature wallet for the owner and controller roles to mitigate risks associated with centralized control. Ensure that the complete source code for all vesting-related functions is available for a comprehensive security review to validate the integrity of the token distribution logic.
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.
- Sep 4, 202676High
- Aug 31, 202685Critical
Score changes are recorded as dated snapshots — history is append-only and cannot be edited.
Would You Like a More Detailed Audit of defi-native?
This token is brand new. Run a deeper AI-powered analysis of the contract code — free and instant.
Get Detailed Audit Is this your token? Publish your own audit on this page