Potential Risks
DISCLAIMER // NFA // DYOR
This analysis is based on observations of the contract behavior. We are not smart contract security experts. This document aims to explain what the contract appears to do based on the code. It should not be considered a comprehensive security audit or financial advice. Always verify critical information independently and consult with blockchain security professionals for important decisions.
⊙ generated by robots | curated by humans
| METADATA | |
|---|---|
| Contract Address | 0x41b242c36F7dc5f18be21c1a6B7b5e05b2FD6532 (etherscan) |
| Network | Ethereum Mainnet |
| Analysis Date | 2026-02-04 |
Risk Assessment Summary
| SEVERITY | COUNT | DESCRIPTION |
|---|---|---|
| Critical | 0 | No immediate critical risks identified |
| High | 3 | Immutability constraints, contract detection limitations, precision edge cases |
| Medium | 5 | Economic manipulation vectors, fee recipient constraints, refund pricing |
| Low | 4 | Self-conducted security testing, gas optimization trade-offs, user experience issues |
| Informational | 3 | Design choices and architectural considerations |
High Severity Risks
H-1: Permanent Immutability - No Emergency Controls
Risk: Ownership has been renounced to 0x0000000000000000000000000000000000000000, making the contract completely immutable with no pause, upgrade, or parameter adjustment capabilities.
Impact:
- ☒ No ability to fix discovered bugs or vulnerabilities
- ☒ No mechanism to adjust fees, limits, or economic parameters
- ☒ No circuit breaker for unexpected market conditions
- ☒ No way to update
devAddressif private key compromised
Code Reference:
// Owner renounced - all onlyOwner functions permanently disabled
function owner() public view returns (address) {
return _owner; // Returns 0x00
}
function setDevAddress(address _devAddress) external onlyOwner {
// Can never be called again
}
function excludeFromFee(address account, bool isExcluded) external onlyOwner {
// Can never be called again
}
Mitigation:
- △ Users must accept contract as-is with no future changes possible
- △ Project publishes test suite and Certora specs on GitHub — testing claims are reproducible but we did not independently run them
- △ No independent manual security audit by human reviewers was identified; automated third-party scans (CertiK) and self-conducted formal verification (Certora, Foundry) are available
Assessment: This is a design choice for trustlessness, but means any undiscovered edge cases are permanent.
H-2: Contract Detection Heuristics May Misclassify Addresses
Risk: The isContract() function uses interface detection heuristics to identify contracts and exclude them from dividends. This approach may misclassify some addresses.
Impact:
- △ Smart contract wallets (Safe, Argent) may be excluded from dividends unexpectedly
- △ Future protocols with novel interfaces may not be detected and could game dividends
- △ EOAs with delegatecall proxies may behave unexpectedly
- △ Some legitimate contracts might receive dividends they shouldn't
Code Reference:
function isContract(address _addr) internal view returns (bool) {
if (_addr.code.length == 0) return false;
// Checks for: token0/token1, factory, getReserves, getPair, swap, supply, deposit, sendToChain
// But many other contract types exist (multisigs, DAOs, staking, etc.)
(bool s0, bytes memory d0) = _addr.staticcall(abi.encodeWithSignature("token0()"));
(bool s1, bytes memory d1) = _addr.staticcall(abi.encodeWithSignature("token1()"));
if (s0 && s1 && d0.length == 32 && d1.length == 32) {
return true;
}
// ... 7 more checks ...
return false;
}
Scenarios:
- Safe multisig holding zETH: May NOT be detected as contract → receives dividends (possibly unintended)
- Custom yield aggregator: May NOT match any interface check → receives dividends (potential gaming vector)
- Gnosis Safe with no checked interfaces: Treated as EOA → earns dividends
Mitigation:
- ◇ Users should test dividend eligibility before large purchases
- ◇ Smart contract wallets should verify their status via
pendingDividends() - ◇ Community should document which wallet types work as expected
Assessment: False negatives (contracts treated as EOAs) are more likely than false positives, potentially allowing dividend gaming.
H-3: Precision Loss in Extreme Scenarios
Risk: While the contract uses Math.mulDiv for critical calculations and 2^128 magnitude for dividends, extreme scenarios could still exhibit precision loss or unexpected behavior.
Impact:
- △ Very small dividend amounts (< 1 wei) are lost to rounding
- △ Extremely large balances (approaching total supply) may overflow in dividend calculations
- △ Rapid buy/refund cycles could accumulate rounding errors
- △ Circulating supply near zero creates division by zero risk (checked but economic edge case)
Code Reference:
function _distributeDividends(uint256 amount) private {
if (amount == 0) return;
uint256 circulatingSupply = getCirculatingSupply();
if (circulatingSupply == 0) return; // Protected, but economic failure
uint256 dividendPerShare = (amount * MAGNITUDE) / circulatingSupply;
// If amount < circulatingSupply, dividendPerShare could be very small
magnifiedDividendPerShare += dividendPerShare;
}
Scenarios:
- User holds 1 wei of tokens: Dividend share = (1 * dividendDelta) / MAGNITUDE → likely rounds to 0
- Circulating supply = 1 token, reflection fee = 0.1 tokens: Works, but extreme ratio
- Many small trades: Each loses sub-wei amounts to rounding
Mitigation:
- ◇ Minimum 1 token refund threshold (line 2571) partially addresses this
- ◇ MAGNITUDE of 2^128 provides significant precision buffer
- ◇ View function
pendingDividends()allows users to check before claiming
Assessment: Unlikely in normal operation, but untested in extreme market stress or manipulation attempts.
Medium Severity Risks
M-1: Refund Price Manipulation via Flash Loans
Risk: The refund price calculation uses current contract state (address(this).balance and circulating supply), which could potentially be manipulated within a single transaction using flash loans.
Impact:
- △ Large ETH flash loan → buy tokens → increases backing ratio → refund at higher price
- △ Requires circumventing ReentrancyGuard (not possible in standard flow)
- △ MEV bots could sandwich large refunds to extract value
- △ 99.9% backing ratio and fees make exploitation economically marginal
Code Reference:
function _handleRefund(address sender, uint256 zETHAmount) private nonReentrant {
// Uses current balance at time of refund
uint256 effectiveBacking = (address(this).balance * EFFECTIVE_BACKING_NUMERATOR) / EFFECTIVE_BACKING_DENOMINATOR;
uint256 grossNativeValue = Math.mulDiv(zETHForUserRefund, effectiveBacking, currentCirculatingSupply);
// If someone inflates balance right before this, refund price increases
}
Mitigation:
- ☑ ReentrancyGuard prevents same-transaction re-entry
- ☑ 0.1% buy markup + 0.25% fees make round-trips costly
- ◇ No TWAP or oracle, but attack window limited to block boundaries
Assessment: Economically unfeasible under current fee structure, but theoretically possible with MEV extraction.
M-2: Dev Address Compromise - No Recovery Mechanism
Risk: The devAddress receives fees from all transactions but cannot be changed post-renouncement. If the private key is compromised, fees are permanently redirected to attacker.
Impact:
- ☒ All future dev fees (0.05% of transactions) sent to compromised address
- ☒ No ability to update or freeze the address
- ☒ Continued protocol operation but fee loss for intended recipient
Code Reference:
function setDevAddress(address _devAddress) external onlyOwner {
// onlyOwner = renounced = can never be called
if (_devAddress == address(0)) revert ZeroMoonAddress();
address oldDevAddress = devAddress;
_isExcludedFromFee[devAddress] = false;
devAddress = _devAddress;
_isExcludedFromFee[devAddress] = true;
}
Mitigation:
- ◇ Dev address should use cold storage or multisig
- ◇ Fees represent small percentage (0.05%), limiting damage
- ◇ Protocol continues to function normally for users
Assessment: Operational risk for protocol maintainers, minor impact on users.
M-3: Burn Cap Creates Economic Phase Shift
Risk: Once the 20% burn limit (250M tokens) is reached, burn fees redirect to reserves, doubling the reserve fee. This creates a sudden economic phase shift.
Impact:
- △ Refund economics change abruptly at 250M burned threshold
- △ Users near the cap boundary see different fee structures
- △ Reserve accumulation accelerates, backing ratio increases
- △ No liquidity or market depth concerns, but refund profitability changes
Code Reference:
uint256 burnFeezETH = (_totalBurned < BURNING_LIMIT) ? Math.mulDiv(zETHAmount, 75, 100000) : 0;
uint256 reserveFeezETH = (_totalBurned < BURNING_LIMIT) ? Math.mulDiv(zETHAmount, 75, 100000) : Math.mulDiv(zETHAmount, 150, 100000);
// Pre-cap: burn=0.075%, reserve=0.075%
// Post-cap: burn=0%, reserve=0.15%
Scenarios:
- User A refunds at 249.9M burned: Pays 0.075% burn + 0.075% reserve
- User B refunds at 250.1M burned: Pays 0% burn + 0.15% reserve
- Same total fee (0.25%), but different allocation
Mitigation:
- ☑ Total fee remains constant (0.25%)
- ◇ Users can check
totalBurnedbefore refunding - ◇ Strengthens backing ratio post-cap (more ETH retained)
Assessment: Economically neutral for users, but creates sudden shift in backing accumulation rate.
M-4: Dividend Exclusion May Not Catch All Contracts
Risk: Contracts not matching the 8 interface checks in isContract() are treated as EOAs and receive dividends. This could allow sophisticated protocols to game the dividend system.
Impact:
- △ Custom contracts designed to bypass detection could earn dividends
- △ Minimal balance contracts acting as "dividend proxies"
- △ Unknown future protocols with novel architectures
- △ Economic impact depends on gaming scale vs. legitimate holders
Code Reference:
function isContract(address _addr) internal view returns (bool) {
// Only checks 8 specific interfaces
// Returns false for any contract not matching these patterns
return false; // Default if none match
}
Mitigation:
- ◇ Economic attack requires: contract that passes checks, holds balance, doesn't match interfaces
- ◇ Gas costs of maintaining bypass contracts may exceed dividend yield
- ◇ Immutability means no fix possible if gaming discovered
Assessment: Low immediate risk, but surveillance recommended for unusual holder patterns.
M-5: No Minimum Liquidity Requirements
Risk: The contract has no minimum liquidity enforcement. If most tokens are refunded, backing ratio could become unstable with low liquidity depth.
Impact:
- △ Low liquidity makes refund prices volatile
- △ Last redeemer timing risk (race to exit)
- △ Dividend yield becomes extreme with few holders
- △ No enforcement of minimum circulation
Code Reference:
function getCirculatingSupply() private view returns (uint256) {
uint256 total = totalSupply();
uint256 contractBalance = balanceOf(address(this));
return total - contractBalance;
// No check if this is too low
}
Scenarios:
- 99% of tokens refunded: Remaining 1% has 99% of backing
- Extreme dividend concentration in few holders
- Refund pricing becomes extremely sensitive to single transactions
Mitigation:
- ◇ Economic incentives discourage complete drain (refund price increases as supply drops)
- ◇ 99.9% backing means last redeemers still get value
- ◇ No artificial minimum circulation requirement
Assessment: Self-correcting through economic incentives, but could see liquidity crises.
Low Severity Risks
L-1: Security Testing is Self-Conducted
Risk: The project has published extensive testing infrastructure and formal verification specs, but all security work appears to be self-conducted rather than commissioned from an independent third party.
Impact:
- △ Self-run Certora formal verification reported 14 properties verified and 9 violations — all 9 classified as false positives by the team
- △ Certora Prover job results (prover.certora.com) are behind authentication and cannot be independently reviewed without access
- △ Foundry test suite (fuzz, invariant, differential) is publicly available but we did not independently execute the tests
- △ No third-party commissioned audit report was identified during this analysis
Publicly Available Security Resources:
- ◇ GitHub repository with full source code, Foundry test suite, and Certora spec files
- ◇ CertiK Token Scan (automated) — checks for common vulnerability patterns
- ◇ Self-published Certora report and stress test results
- ◇ Certora spec files (
zeth.spec,zeth-comprehensive.spec) available for review incertora/zeth/ - ◇ Foundry tests:
ZeroMoonFuzz.t.sol,ZeroMoonInvariant.t.sol,ZeroMoonDifferential.t.sol
Mitigation:
- ◇ Verified source code on Etherscan (Exact Match) allows community review
- ◇ OpenZeppelin libraries (v4.9.3) are independently audited
- ◇ Test infrastructure and Certora specs are publicly reproducible
- ◇ Certora Prover is the same tool used by Uniswap V3, Compound V3, and Aave V3
Assessment: The project has invested in real testing infrastructure using industry-standard tools (Foundry, Certora Prover). The distinction is that this work was self-conducted and self-interpreted rather than commissioned from an independent auditor. Users can review and reproduce the tests themselves, but should understand the difference between self-run verification and an independent third-party audit.
L-2: Gas Costs Vary Significantly by Scenario
Risk: Transaction gas costs vary widely (120k-250k) depending on dividend state, making cost estimation difficult for users.
Impact:
- △ Users may set insufficient gas limits
- △ Failed transactions waste gas
- △ Cost unpredictability especially for first-time users
- △ Dividend claims can fail if balance insufficient
Scenarios:
- First buy of the day (distributes dividends): 200k gas
- Buy when no dividends: 150k gas
- Refund with burn: 250k gas
- Transfer between exempt addresses: 120k gas
Mitigation:
- ◇ Etherscan provides gas estimation before transactions
- ◇ Wallets auto-adjust gas limits based on simulation
- ◇ No gas griefing vectors (max bounded by operations)
Assessment: User experience issue, not security risk.
L-3: DEX Swap Fee Exemption May Cause Confusion
Risk: DEX swaps pay 0% fees while direct transfers pay 0.25%. This asymmetry could confuse users or create unexpected arbitrage.
Impact:
- ◇ Users transferring directly pay fees, but swapping via DEX is free
- ◇ Incentivizes all transfers to route through DEX (gas inefficient)
- ◇ Dividend distribution primarily from non-DEX transfers
- ◇ May lead to questions about "fair" fee application
Code Reference:
bool isDexSwap = (isContract(from) && isLiquidityPair(from)) || (isContract(to) && isLiquidityPair(to));
if (isDexSwap) {
devFeeBps = DEX_SWAP_DEV_FEE_BPS; // 0
reflectionFeeBps = DEX_SWAP_REFLECTION_FEE_BPS; // 0
reserveFeeBps = DEX_SWAP_RESERVE_FEE_BPS; // 0
}
Mitigation:
- ◇ Design choice to avoid penalizing DEX trading
- ◇ Documented behavior in code comments
- ◇ Creates trading efficiency vs. transfer inefficiency trade-off
Assessment: Intentional design, but may require user education.
L-4: Minimum Thresholds May Exclude Small Users
Risk: Minimum purchase of 0.0001 ETH (~$0.40 at $4k ETH) and minimum refund of 1 token may exclude very small participants.
Impact:
- △ Dust balances cannot be refunded (< 1 token)
- △ Very small holders locked in unless accumulate to 1+ tokens
- △ Sub-minimum purchases blocked entirely
- △ No sweep or dust consolidation mechanism
Code Reference:
if (amountNative < MINIMUM_PURCHASE_NATIVE) revert InsufficientNative(); // 0.0001 ETH
if (zETHAmount < 1 ether) revert InsufficientBalance(); // 1 token minimum refund
Mitigation:
- ◇ Thresholds prevent dust attacks and spam
- ◇ Amounts are economically reasonable (~$0.40 minimum)
- ◇ Users can transfer tokens instead of refunding
- ◇ Small holders can accumulate to threshold
Assessment: Anti-spam measure with minor accessibility impact.
Informational Risks
I-1: No Emergency Withdrawal for Mistaken Sends
Risk: If users accidentally send ETH or other tokens directly to the contract (not via buy()), there is no recovery mechanism.
Impact:
- △ Sent ERC-20 tokens are unrecoverable
- △ ETH sent via non-buy paths may be unrecoverable
- △ No sweep function for admin (owner renounced)
- △ Funds increase backing ratio but are effectively donated
Mitigation:
- ◇
receive()function catches direct ETH sends and executesbuy() - ◇ Standard ERC-20 transfers to contract address are rejected by ERC-20 standard
- ◇ Only non-standard token sends at risk
Assessment: Edge case with limited real-world risk (receive handles ETH).
I-2: ERC20Permit Nonce Not Monotonically Increasing
Risk: The ERC20Permit implementation uses Counters.Counter library which has been deprecated in newer OpenZeppelin versions in favor of monotonic nonces.
Impact:
- ◇ Current implementation (OZ 4.9.3) is secure
- ◇ No known exploits of Counter-based nonces
- ◇ Newer OZ versions use different approach
- ◇ Immutability prevents upgrade to new pattern
Mitigation:
- ☑ OZ 4.9.3 Counters library is audited and battle-tested
- ☑ No practical security difference for this use case
- ◇ Informational note only, not actionable
Assessment: Non-issue, current implementation is secure.
I-3: No Price Feed or Oracle Integration
Risk: Contract has no concept of "USD value" or external price feeds. All economics are ETH-denominated.
Impact:
- ◇ Token price floats with ETH price
- ◇ No stablecoin peg or floor price
- ◇ No oracle manipulation vectors (positive)
- ◇ Dollar-cost-averaging users face ETH price volatility
Mitigation:
- ☑ Removes oracle attack surface entirely
- ☑ Simpler architecture with fewer dependencies
- ◇ Users must mentally adjust for ETH price changes
Assessment: Design choice with security benefits (no oracle manipulation).
Recommendations for Users
Based on the identified risks, users should consider the following before interacting with the contract:
- Verify Immutability: Confirm owner is
0x00- contract cannot be changed - Test Dividend Eligibility: If using smart contract wallet, check
pendingDividends()before large purchases - Monitor Burn Cap: Check
totalBurnedto understand which fee phase is active - Understand Refund Pricing: Use
calculateNativeForZETH()to preview refund amounts - Gas Buffer: Set 20-30% higher gas limits than estimated due to variability
- Accept Permanence: Any bugs or issues cannot be fixed - contract is truly immutable
- Review Security Resources: Test suite, Certora specs, and CertiK scan are publicly available — no independent third-party audit was identified
Recommendations for Developers (Post-Renouncement)
Since ownership is renounced, these recommendations are informational only:
Consider emergency pause mechanism- Not possibleImplement timelock for parameter changes- Not possibleAdd circuit breaker for extreme scenarios- Not possibleEnable dev address rotation- Not possibleIndependent security audit- Self-conducted (Certora, Foundry) and automated third-party scan (CertiK)
The immutability is complete and intentional.
Conclusion
The ZeroMoon zETH token contract appears to be a well-structured implementation using established OpenZeppelin patterns with custom dividend and refund mechanics. The primary risks stem from its intentional immutability (renounced ownership) and the complexity of its economic model.
Risk Profile: Medium to High due to immutability constraints, but no obvious critical exploits identified in the code analysis.
Target Users: Sophisticated cryptocurrency users comfortable with:
- Immutable, ungoverned contracts
- ETH-backed token economics
- Dividend distribution mechanics
- No recourse for bugs or issues
Not Recommended For:
- Users expecting admin support or parameter adjustments
- Projects requiring publicly verifiable audit reports
- Users unfamiliar with dividend-bearing tokens
- Conservative DeFi participants requiring governance
This analysis should not be considered a substitute for a professional security audit. Users should conduct their own research and risk assessment before interacting with the contract.