The DERC20 token contract implements standard ERC20 functionality with extensions for voting, permit, and ownership. It includes custom features for token vesting, an inflation mechanism, and a configurable pool lock. The audit identified a critical vulnerability related to potential division by zero in the vesting calculation, which could render vested tokens unclaimable. High-severity issues include significant owner control over token supply inflation and the ability to arbitrarily lock/unlock transfers to a designated pool address. Several medium and low-severity findings highlight design considerations and minor inefficiencies.
On-chain security analysis — is it a scam or legit?
Is Ratspeak 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 DERC20 token contract implements standard ERC20 functionality with extensions for voting, permit, and ownership.
Read the full analysis- Ownership not renounced — owner is a contract
- Top-10 concentration > 20%
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- LP top1 unlocked holder = 84.4%
- LP top3 unlocked holders = 99.4%
- 1 Critical finding(s) from audit
- 2 High finding(s) from audit
- 2 Medium finding(s) from audit
- 2 Low finding(s) from audit
Exact factors
- Ownership NOT renounced — owner is a contract (governance/executor, not an EOA)
- Top-10 concentration > 20% (38.9% total → 23.2% effective; 12.8% in EOAs, 26.1% in contracts — mild)
- Liquidity not locked, but no owner/deployer address holds LP — market-depth risk, not rug risk
- LP top1 unlocked holder = 84.4% (independent LP — depth risk, pool = 97% of DEX liquidity)
- LP top3 unlocked holders = 99.4% (independent LP — depth risk, pool = 97% of DEX liquidity)
- 1 Critical finding(s) from audit
- 2 High finding(s) from audit
- 2 Medium finding(s) from audit
- 2 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, staking26.1%
- Walletsanonymous holders, free to sell12.8%
- Everyone elsethe rest of the supply61.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$354.7K96.5%
- Uniswap v4USDC$11.2K3.0%
- Uniswap v4USDC$1.3K0.4%
- Uniswap v4USDC$1330.0%
- Hydrex CLAMMWETH$300.0%
- Uniswap v4USDC$250.0%
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.
0x575e…fe980x50f5…d2700xced6…c2490x3269…b9070xe1f6…806f0xbc75…a8dd0xd0f5…48170x6c94…80160x8457…d8f2No privileged address appears among these holders: the unlocked liquidity sits with independent providers, not with the deployer.
Security Findings
CriticalDivision by Zero in Vesting Calculation
The computeAvailableVestedAmount function performs a division by vestingDuration. If vestingDuration is initialized to 0 in the constructor, any call to computeAvailableVestedAmount (and consequently release()) will result in a division-by-zero error, making all vested tokens permanently unclaimable. The constructor currently lacks a check to ensure vestingDuration_ is greater than zero.C-01
Issue
The computeAvailableVestedAmount function performs a division by vestingDuration. If vestingDuration is initialized to 0 in the constructor, any call to computeAvailableVestedAmount (and consequently release()) will result in a division-by-zero error, making all vested tokens permanently unclaimable. The constructor currently lacks a check to ensure vestingDuration_ is greater than zero.
Fix
Add a require(vestingDuration_ > 0, "Vesting duration must be positive") check in the constructor to prevent vestingDuration from being set to zero.
Status
Unresolved
HighCentralized Control Over Token Inflation
The mintInflation() function, which controls the token's supply expansion, mints all new tokens exclusively to the owner(). Additionally, the updateMintRate() function, which sets the yearlyMintRate, is restricted to onlyOwner. This grants the contract owner significant centralized control over the token's economic policy and the accumulation of newly minted supply, potentially leading to manipulation or disproportionate ownership.H-01
Issue
The mintInflation() function, which controls the token's supply expansion, mints all new tokens exclusively to the owner(). Additionally, the updateMintRate() function, which sets the yearlyMintRate, is restricted to onlyOwner. This grants the contract owner significant centralized control over the token's economic policy and the accumulation of newly minted supply, potentially leading to manipulation or disproportionate ownership.
Fix
Consider implementing a more decentralized approach for inflation management. Options include: (1) directing minted tokens to a community treasury or a staking pool, (2) requiring a governance vote for updateMintRate changes, or (3) transferring ownership to a robust multi-signature wallet or a DAO.
Status
Unresolved
HighArbitrary Pool Lock/Unlock by Owner
The lockPool() and unlockPool() functions, which control whether transfers to the designated pool address are allowed, are restricted to onlyOwner. This means the contract owner can arbitrarily prevent or allow transfers to a critical external protocol (the pool), potentially disrupting its functionality or creating a single point of failure for users interacting with that pool.H-02
Issue
The lockPool() and unlockPool() functions, which control whether transfers to the designated pool address are allowed, are restricted to onlyOwner. This means the contract owner can arbitrarily prevent or allow transfers to a critical external protocol (the pool), potentially disrupting its functionality or creating a single point of failure for users interacting with that pool.
Fix
Evaluate the necessity of this level of centralized control. If a pool lock mechanism is required, consider implementing a time-lock for lockPool()/unlockPool() operations or requiring a multi-signature approval to provide a delay and transparency for such critical actions.
Status
Unresolved
MediumPERMIT_2 Infinite Allowance Implications
The allowance function is overridden to return type(uint256).max (infinite allowance) if the spender is PERMIT_2 (0x0000…8BA3). While this is a feature of the Permit2 standard, it means that any user who interacts with Permit2 and approves this token effectively grants Permit2 the ability to move an unlimited amount of their tokens. This is a significant security implication that users should be fully aware of.M-01
Issue
The allowance function is overridden to return type(uint256).max (infinite allowance) if the spender is PERMIT_2 (). While this is a feature of the Permit2 standard, it means that any user who interacts with Permit2 and approves this token effectively grants Permit2 the ability to move an unlimited amount of their tokens. This is a significant security implication that users should be fully aware of.
Fix
Ensure clear communication to users about the implications of interacting with Permit2 and the infinite allowance granted to it. Provide educational resources or warnings within the dApp interface if applicable.
Status
Unresolved
MediumUnclear Purpose of tokenURI for ERC20
The contract includes a tokenURI state variable and an updateTokenURI function, typically associated with ERC721 or ERC1155 tokens for metadata. For an ERC20 token, this field is non-standard and its intended purpose is unclear from the code alone. This could lead to confusion or indicate an incomplete design if it was meant to integrate with NFT-like features.M-02
tokenURI for ERC20Issue
The contract includes a tokenURI state variable and an updateTokenURI function, typically associated with ERC721 or ERC1155 tokens for metadata. For an ERC20 token, this field is non-standard and its intended purpose is unclear from the code alone. This could lead to confusion or indicate an incomplete design if it was meant to integrate with NFT-like features.
Fix
Clarify the intended use case for the tokenURI field in the contract documentation. If it's not serving a specific purpose, consider removing it to reduce contract complexity and potential for misinterpretation. If it's for off-chain metadata, ensure its purpose is well-defined.
Status
Unresolved
LowLimited Burn Functionality
The burn() function is restricted to onlyOwner and only allows burning tokens from the owner()'s balance. This provides a very limited burn mechanism, as general users cannot burn their own tokens, nor can the owner burn tokens from other addresses. If a broader token burning utility was intended, the current implementation is insufficient.L-01
Issue
The burn() function is restricted to onlyOwner and only allows burning tokens from the owner()'s balance. This provides a very limited burn mechanism, as general users cannot burn their own tokens, nor can the owner burn tokens from other addresses. If a broader token burning utility was intended, the current implementation is insufficient.
Fix
If a general burn mechanism for all token holders is desired, consider implementing a public burn(uint256 amount) function that allows msg.sender to burn their own tokens. If the current limited functionality is intentional, document this design choice clearly.
Status
Unresolved
LowRedundant Vesting Start Check
The hasVestingStarted modifier includes require(vestingStart > 0, VestingNotStartedYet()). However, vestingStart is initialized to block.timestamp in the constructor, which will always be a positive value. Therefore, this check is redundant and will always pass.L-02
Issue
The hasVestingStarted modifier includes require(vestingStart > 0, VestingNotStartedYet()). However, vestingStart is initialized to block.timestamp in the constructor, which will always be a positive value. Therefore, this check is redundant and will always pass.
Fix
Remove the require(vestingStart > 0, VestingNotStartedYet()) check from the hasVestingStarted modifier as it is redundant.
Status
Unresolved
Analysis
AI Copilotas of audit · Sep 4The contract leverages OpenZeppelin libraries for core ERC20 functionality, contributing to a robust foundation (7.2 Code Security). The custom vesting and inflation mechanisms are generally well-structured, with clear state variables and modifiers (7.1 Architecture). However, a critical vulnerability exists where passing a zero vestingDuration in the constructor leads to a division-by-zero error, making vested tokens permanently inaccessible (7.2 Code Security). Additionally, the PERMIT_2 infinite allowance, while a feature, introduces a significant security consideration for users (7.3 Access Control).
The contract design grants significant centralized control to the owner (7.5 Governance). The owner can control the yearlyMintRate (within a cap) and is the sole recipient of all minted inflation tokens, allowing for substantial influence over the token's economic supply (7.4 Economic). Furthermore, the owner has the exclusive ability to lock and unlock transfers to a designated pool address, which could disrupt interactions with integrated protocols (7.3 Access Control, 7.6 External). While MAX_YEARLY_MINT_RATE_WAD provides a cap, the owner's discretion over minting timing and recipient remains a central point of control.
The DERC20 contract is not designed as an upgradeable proxy (7.7 Upgrades). Its core logic and state variables are immutable once deployed, which eliminates upgrade-related risks such as storage collisions or faulty upgrade paths. Any changes to the contract's functionality would require a new deployment and migration of assets, a standard practice for non-upgradeable contracts.
Address the critical division-by-zero vulnerability by adding a require check for vestingDuration_ > 0 in the constructor.
Consider decentralizing control over inflation and pool locking mechanisms, potentially through a multi-signature wallet or a time-locked governance contract, to reduce single points of failure and enhance trust. Clearly document the purpose of the tokenURI field for an ERC20 token to avoid confusion. Ensure users are fully aware of the implications of granting infinite allowance to PERMIT_2.
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 30, 202680High
Score changes are recorded as dated snapshots — history is append-only and cannot be edited.
Frequently Asked Questions
What is the RATSPEAK contract address?
The Ratspeak contract on Base is 0xf1e9baa65d418a9025e1851dd2d37f1ad208bba3. Compare it with the address the project itself publishes before trading: other contracts can carry the same name and ticker.
Is Ratspeak a scam?
Quantum Audit's risk score for Ratspeak is 80/100 (High risk) as of Sep 4, 2026, computed by a deterministic function from on-chain facts — Contract verified: Verified; Ownership: Retained; Mint: No mint; Liquidity lock: Not locked; Upgradeability: Fixed code; Honeypot: None found; Buy / sell tax: 0% / 0%. A score is a dated snapshot of those facts, not a guarantee; each one is listed on this page.
Is RATSPEAK liquidity locked?
Liquidity lock: Not locked (as of Sep 4, 2026). Total DEX liquidity: $367.4K.
Who holds RATSPEAK?
As of Sep 4, 2026, the 10 largest holders own 38.9% of the supply. The Holders section on this page shows who they are by holder type.
Would You Like a More Detailed Audit of Ratspeak?
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