ZEON Info

A fixed 1,000,000,000 supply, priced in USDT, with real holder rewards built in from day one. No minting, no hidden levers — every rule is locked on-chain and verifiable before you buy in.

ZEON Logo

TrustNet Score

The TrustNet Score evaluates crypto projects based on audit results, security, KYC verification, and social media presence. This score offers a quick, transparent view of a project's credibility, helping users make informed decisions in the Web3 space.

76.43
Poor Excellent

Real-Time Threat Detection

Real-time threat detection, powered by Cyvers.io, is currently not activated for this project.

This advanced feature provides continuous monitoring and instant alerts to safeguard your assets from potential security threats. Real-time detection enhances your project's security by proactively identifying and mitigating risks. For more information, click here.

Security Assessments

Select the audit
"Static Analysis Dynamic Analysis Symbolic Execution SWC Check Manual Review"
Contract address
N/A
Network N/A
License N/A
Compiler N/A
Type N/A
Language Solidity
Onboard date 2026/08/26
Revision date 2026/09/02

Summary and Final Words

No crucial issues found

The contract does not contain issues of high or medium criticality. This means that no known vulnerabilities were found in the source code.

Ownership is not renounced

The owner retains significant control, which could potentially be used to modify key contract parameters.

Contract is not upgradeable

The contract does not use proxy patterns or other mechanisms to allow future upgrades. Its behavior is locked in its current state.

Scope of Work

This audit encompasses the evaluation of the files listed below, each verified with a SHA-1 Hash. The team referenced above has provided the necessary files for assessment.

The auditing process consists of the following systematic steps:

  1. Specification Review: Analyze the provided specifications, source code, and instructions to fully understand the smart contract's size, scope, and functionality.
  2. Manual Code Examination: Conduct a thorough line-by-line review of the source code to identify potential vulnerabilities and areas for improvement.
  3. Specification Alignment: Ensure that the code accurately implements the provided specifications and intended functionalities.
  4. Test Coverage Assessment: Evaluate the extent and effectiveness of test cases in covering the codebase, identifying any gaps in testing.
  5. Symbolic Execution: Analyze the smart contract to determine how various inputs affect execution paths, identifying potential edge cases and vulnerabilities.
  6. Best Practices Evaluation: Assess the smart contracts against established industry and academic best practices to enhance efficiency, maintainability, and security.
  7. Actionable Recommendations: Provide detailed, specific, and actionable steps to secure and optimize the smart contracts.

A file with a different Hash has been intentionally or otherwise modified after the security review. A different Hash may indicate a changed condition or potential vulnerability that was not within the scope of this review.

Final Words

The following provides a concise summary of the audit report, accompanied by insightful comments from the auditor. This overview captures the key findings and observations, offering valuable context and clarity.


Smart Contract Analysis Statement

Contract Analysis

The ZEON Presale contract implements a stablecoin-denominated token sale with an optional whitelist, a per-wallet contribution cap, an owner-set price bounded by immutable minimum and maximum rails, an optional purchase bonus capped at 25 percent, and a two-part release schedule in which a configurable share of each purchase unlocks immediately and the remainder vests linearly. Each purchase is recorded as a lot that captures the release terms in force at the time it was made, so a later configuration change cannot retroactively alter an existing buyer's schedule. The contract is not upgradeable and uses no proxy. It is intended for deployment on BNB Smart Chain against the USDT contract at 0x55d398326f99059fF775485246999027B3197955, which uses 18 decimals and returns a success value from its transfer functions.

This statement covers the second re-review of the contract, carried out against the revision submitted as final. Everything established in the previous review still holds: the immediate and vesting portions of every purchase sum exactly to the total, no buyer can claim more than they purchased, no lot is ever over-drawn, claims release only what has matured, the price never leaves its immutable bounds, and the contract always holds at least what it owes buyers. The obligation reserve introduced in the previous revision, which was the substantive fix in this engagement, was re-verified rather than assumed and was never broken.

All three items carried into this round are closed, and one of them was closed by the preferred remedy rather than a workaround. The contribution cap no longer applies a hardcoded 18-decimal scaling factor and is stored in the payment token's own units, so it now binds correctly against any payment token rather than only the selected one. Re-run against the six-decimal asset that previously voided it entirely, the cap refuses a purchase above it, accepts one exactly at it, and refuses one unit more. The constructor now requires the sale token and the payment token to be different addresses, which closes the configuration where the proceeds sweep would have walked straight through the obligation reserve, and it also rejects a zero contribution cap, which previously made every purchase revert until the sale was taken offline and reconfigured.

The third change is new accounting on the payment path, so we verified it from first principles rather than by comparison. A purchase that arrives under the same timestamp and the same schedule as the buyer's most recent lot is now folded into that lot instead of opening a new one, which removes the accumulation pressure on the per-buyer lot limit at its source. Fifty purchases in one block now produce one lot rather than fifty. We checked that the fold keeps the split exact, keeps the lot totals equal to the buyer's ledger, leaves the vesting anchor unchanged and pays the whole folded position out in full; that a change of schedule correctly opens a new lot instead of folding; and that it still holds in the one configuration where the reasoning given in the source does not, namely a zero-length schedule, where a lot can be drawn down in the block it was opened in. It survives that case because the counter it leaves untouched is cumulative against the same lot, so growing the position without growing the counter credits exactly the new money and nothing more. The property was also proved symbolically over two unbounded payment amounts and exercised across sixteen thousand stateful calls.

Ownership Privileges

The ownership of the contract has been assigned at deployment to a single externally owned account, with no multi-signature wallet and no delay on any privileged function. The owner retains full privileges including:

  • Withdrawing all sale proceeds at any time, with no vesting condition. This is the only unbounded withdrawal in the contract, and it means an operator can collect all revenue before delivering anything. It is a policy choice rather than a defect, but it should be understood as one.
  • Changing the price, the bonus and the release schedule, adding or removing any address from the whitelist, opening the sale to the public and bypassing the whitelist entirely, halting new purchases, and changing the address that receives withdrawn funds.
  • The owner cannot withdraw tokens that buyers have already paid for. The recovery function computes what is owed before it moves anything and can only take the remainder. This was the critical finding in the first review and it remains closed on this revision.
  • The owner can no longer reach the obligation reserve through the proceeds withdrawal either. That route depended on both configured token addresses pointing at the same asset, which the constructor now refuses. Both addresses are written once at construction and have no setter, so the guarantee holds for the life of the contract rather than only at deployment.
  • The owner cannot change the price, the bonus or the release schedule while the sale is live. All three require the sale to be paused first. This should not be relied on as protection against a deliberate front-run, because pausing, repricing and resuming is three transactions and an operator willing to send them can still land all three ahead of a pending purchase. The control that actually protects a buyer is the minimum-output argument on the purchase function.
  • The owner cannot set a release schedule longer than two years, and cannot set one that disables a buyer's claims. Both the length and the arithmetic are bounded.
  • The owner cannot set a per-wallet contribution cap of zero, in the constructor or afterwards, so the configuration that silently disabled every purchase is no longer reachable.
  • The owner cannot strand the contract's assets. Ownership moves in two steps and requires the incoming address to accept, and renouncing is refused while the contract holds either asset.
  • The owner cannot set a price outside the minimum and maximum bounds fixed at deployment. These rails are immutable and cannot be changed afterwards, and they meaningfully limit how far a price change can move against a buyer. We verified that no setter can escape them.
  • The owner cannot set the purchase bonus above 25 percent. This ceiling is a fixed constant and is enforced whenever the bonus is changed.
  • The owner cannot alter an existing purchase's release schedule. Each lot stores its own terms at the moment of purchase, so a later change affects only subsequent purchases. The owner also cannot claim on a buyer's behalf, redirect a buyer's claim to another address, or cause a buyer to be credited more than they purchased.
  • The owner cannot halt claims. Pausing the sale stops new purchases only; buyers can always withdraw what has matured.
  • The owner cannot change the token addresses after deployment. Both the sale token and the payment token are fixed in the constructor and no function exists to alter them.

Security Features

The contract implements several positive security features:

  • An enforced obligation reserve. The contract cannot sell what it does not hold and cannot release what it owes. This is the change that turns a sale where buyers held an unbacked claim into one where their allocation is backed at every moment, and it is verified as a standing property rather than a code-reading exercise.
  • Buyer-side execution bounds. A purchase carries both a minimum acceptable quantity and an expiry, so a buyer can bound what they are willing to accept rather than committing to whatever terms happen to be in force when their transaction lands.
  • Immutable price rails. The minimum and maximum price are fixed at deployment and cannot be changed, placing a hard and verifiable bound on how far the owner can move the sale price in either direction.
  • A decimal-agnostic contribution cap. The cap is now held in the payment token's own units with no assumption about how many decimals that token has, which makes the whole contract decimal-agnostic rather than only its pricing arithmetic.
  • Per-lot capture of release terms. Because each purchase records its own immediate-unlock share and vesting length, a configuration change cannot retroactively worsen the terms of a purchase already made. This is a deliberate and well-chosen design decision.
  • Correct ordering and a reentrancy guard on every value-moving path. State is fully updated before any token leaves the contract, and the guard covers the purchase and both claim paths together, so a callback cannot re-enter one from another. Re-running the first review's attack against a payment token that notifies the payer, the nested purchase is rejected and the ledger records exactly what was paid.
  • Bounded, overflow-proof release arithmetic shared by the claim path and the read-only view, with a hard ceiling on the schedule length enforced at deployment as well as at configuration time.
  • A bounded claim cost, now bounded from two directions. Purchase lots per buyer are capped and a paginated claim is available, and rapid accumulation no longer consumes the cap at all because same-block purchases are folded into one lot. Measured at the cap, draining a full position still costs well under a block on the target chain.
  • A hard ceiling on the purchase bonus and an explicit cap on the immediate-unlock share, both enforced on every change, together with an exact per-lot ledger that never allowed a buyer to be credited or paid more than they had purchased across several hundred thousand automated operations.

Recommendations

Nothing outstanding is blocking, the contract is in good shape, and nothing raised in this round is rated above informational. Four items remain, two of which are deployment discipline rather than code.

The change to the contribution cap is correct but it reverses the meaning of an argument. The constructor and the setter now store exactly what they are handed, where they previously multiplied it. A script written against the previous revision would pass a whole-unit figure and silently produce a cap smaller than intended by a factor of one quintillion against the selected asset, which we confirmed on this revision. It is recoverable by pausing and reconfiguring, so the cost is a failed launch window rather than lost funds, but reading the stored cap back and comparing it against the intended human-readable figure should now be a required deployment step rather than a recommended one.

The minimum-output argument is the control that protects a buyer from a change of terms, and it is opt-in. A front end that submits zero leaves buyers exactly as exposed as they were before that fix. Deriving that value from the price the buyer was shown, and rejecting a zero value client-side, should be treated as a hard requirement of the interface rather than an optional refinement.

The new purchase fold is described in the source as applying within a single block, but what it actually tests is that the previous lot's timestamp equals the current one. On BNB Smart Chain those are different statements, because the chain has produced a block every 0.75 seconds since the Maxwell hardfork while the timestamp available to contracts still has second precision, so consecutive blocks routinely share a value. The chain's own specification for that change flags using the timestamp as an identity key as a pattern needing adjustment. The effect here is benign, because the accounting depends on elapsed time rather than on block identity and zero seconds have still passed, but the documentation should describe what the fold does rather than what it was intended to do. The one practical consequence is off-chain: a folded purchase reuses the lot index it folded into, so the index carried by the release event no longer identifies a purchase and an indexer keyed on it will collapse two payouts into one. Emitting a sequence number alongside the index would remove that ambiguity.

The per-buyer lot limit is still permanent once reached, which is now much harder to reach by accident and remains self-inflicted, and no minimum purchase size was added, so at a low price a purchase worth a fraction of a cent still opens a lot. Both are worth closing eventually but neither is urgent.

Finally, ownership of the contract should be moved to a multi-signature wallet, with a delay on the recovery function and the vesting configuration. This is the largest remaining risk. We also recommend verifying the deployment wiring on a fork before doing it for real: the sale depends on two separate flags being set on it in the token contract, and setting only one still produces a sale that cannot be funded or cannot pay out. That requirement has not gone away, and it matters more now that the token's transaction limit is immutable and can no longer be raised to work around a missing exemption.

Note - This Audit report consists of a security analysis of the ZEON Presale smart contract. This analysis did not include economic analysis of the contract's tokenomics. Moreover, we only audited the main contract for the ZEON team. Other contracts associated with the project were not audited by our team. We recommend investors do their own research before investing.

Files and details

Findings and Audit result

critical Issues | 1 findings

Resolved

#1 critical Issue
Unsold token recovery drains tokens already sold and vesting
ZeonPresale.sol
L379-387
Description

The recovery function transferred the contract's entire token balance to the owner. That single balance held two economically distinct pools: genuinely unsold inventory, and tokens buyers had already paid for that were part way through vesting. Nothing distinguished them, so at any point during a vesting schedule the owner could remove every token buyers had paid for and not yet received, leaving them with an accounting entry saying they were owed tokens and a claim that reverted forever.

high Issues | 3 findings

Resolved

#1 high Issue
No solvency check, so the sale can promise more tokens than it holds
ZeonPresale.sol
L214-218
Description

The purchase function credited the buyer and recorded a vesting lot without ever comparing the cumulative amount sold against the contract's token balance. The sale would accept payment for tokens it did not have, which turned buyer claims into a first-come-first-served race against an unreserved pool and left later claimants with a worthless entry and a reverting claim.

Resolved

#2 high Issue
Price, bonus and vesting terms are mutable mid-sale with no buyer slippage protection
ZeonPresale.sol
L199-212
Description

The purchase function accepted only an input amount, so a buyer committed to whatever price, bonus and vesting configuration happened to be in force when their transaction executed. All three were owner-mutable at any moment with no delay and no minimum output, and in testing a buyer received ten times fewer tokens than the advertised price implied.

Resolved

#3 high Issue
Vesting duration is unbounded, and an overflowing value permanently disables all claims
ZeonPresale.sol
L37
L106
L162
L314-324
Description

The vesting setter placed no upper bound on the schedule length. An extremely large but non-overflowing duration meant the linear portion effectively never released. Worse, the maturity test added the duration to the purchase timestamp, so a value near the integer maximum overflowed and reverted, and because both the claim path and the read-only view looped over all of a buyer's lots, a single poisoned lot permanently disabled claiming and the view for that buyer, including for earlier lots that were fully matured.

low Issues | 6 findings

Resolved

#1 low Issue
Unbounded purchase lot array makes claim gas grow without limit
ZeonPresale.sol
L40
L204
L269-283
Description

Every purchase appended a new six-slot record to the buyer's lot array with no cap on how many could accumulate, and both the claim function and the claimable view iterated the whole array. Measured at four hundred lots the claim path cost roughly twenty-two thousand gas per lot, so a large enough position would eventually exceed a block and the holder could never claim again, with no partial-claim escape hatch.

Resolved

#2 low Issue
Purchase updates state after the external call and overwrites rather than accumulates
ZeonPresale.sol
L199
L220
L236
L240-246
Description

The contribution cap was checked, the payment was pulled, and only then was the contribution recorded. The write was an assignment computed from a value read before the call rather than an increment, so a re-entrant purchase would have had its contribution erased by the outer frame on resumption, while the token credit and the lot array used accumulating writes. Against a payment token that notifies the payer during a transfer this let a caller pay past the cap while the ledger recorded less.

Resolved

#3 low Issue
Single-step ownership transfer, and renouncing strands proceeds and inventory
ZeonPresale.sol
L9
L184-188
L373
L385
L395-401
Description

Plain single-step ownership was used, so a transfer took effect immediately with no acceptance step and a mistyped destination was unrecoverable. Both withdrawal functions sent to the current owner, so renouncing set that recipient to the zero address and left the proceeds and the token inventory permanently stranded, since the owner-only guard could then never be satisfied by any caller.

Resolved

#4 low Issue
A purchase that rounds down to zero tokens still takes payment
ZeonPresale.sol
L211
Description

The purchase function required only that the payment be non-zero and never checked the resulting quantity. Whenever the payment was small relative to the price the calculation floored to zero, the payment settled, the buyer was credited nothing, and a zero-value lot was still appended. Each empty lot permanently entered the claim loop while consuming almost none of the contribution cap, which made it the cheapest route to inflating that array.

Pending

#5 low Issue
The per-buyer lot cap is permanent and its revert message misstates the remedy
ZeonPresale.sol
L40
L204
Description

Purchases per buyer are capped at five hundred, which correctly bounds the claim loop. The lot array is never compacted and never shrinks, so the count only ever rises and an address that reaches the cap can never buy again, whatever it does afterwards. The revert message tells the buyer to claim first, but claiming does not reduce the count: an address that has bought five hundred times and been paid in full, owing nothing and owed nothing, is still refused and is directed toward an action that cannot help. It is self-inflicted and needs five hundred transactions to reach, but it is reachable by ordinary accumulation rather than only by deliberate abuse.

Pending

#6 low Issue
Nothing prevents the two configured token addresses being the same
ZeonPresale.sol
L101-102
L369-374
Description

The constructor rejects a zero address for the sale token and for the payment token but never compares them against each other. The proceeds withdrawal sweeps the entire balance of the payment token with no reserve logic, because it is not supposed to be holding sale inventory. If both addresses were ever set to the same asset that sweep would take the reserved tokens the new recovery control exists to protect: buyers would be credited normally, the recovery function would correctly refuse to touch their tokens, and the proceeds sweep would remove them anyway. The likelihood is low and the misconfiguration would be visible on the block explorer, but a control that protects user funds should not have a configuration in which it silently does nothing.

informational Issues | 2 findings

Resolved

#1 informational Issue
Payment token handling assumes a boolean return, which does not hold for every stablecoin
ZeonPresale.sol
L10
L236
L244
L263
L280
L373
L385
Description

Every payment movement was wrapped as a check on the return value of a transfer, which assumes the token returns a boolean. The declared asset does, so this worked as written, but the canonical Ethereum mainnet equivalent returns nothing, and when a caller expects a boolean and receives an empty return buffer the decoder reverts the whole transaction. On that network every purchase would have reverted unconditionally and anything that reached the contract would have been unrecoverable.

Pending

#2 informational Issue
Per-wallet cap hard-codes an eighteen-decimal payment token
ZeonPresale.sol
L115
L154
Description

The contribution cap is scaled by a fixed eighteen-decimal factor and then compared against a running total of raw token units. The declared asset uses eighteen decimals, so the cap functions exactly as intended and this is not a live defect. It is retained because the equivalent asset on three other major networks uses six decimals, and against any of those the cap inflates by a factor of one trillion and stops functioning entirely. Re-tested against a six-decimal asset on the resubmitted source, a single wallet contributed five hundred times the intended limit in one transaction. The pricing arithmetic elsewhere is correctly decimal-agnostic, which makes this the single point of failure if the asset or network ever changes.