Internal Security Review — v2

Smart Contract Audit

Manual security review of all Aurevaz smart contracts — TokenLocker, TokenFactory, and Launchpad — covering reentrancy, access control, integer overflow, token handling, and common Solidity vulnerability patterns.

12

Findings

3

Medium

5

Low

4/12

Fixed

8

Acknowledged

Scope & Methodology

Files
contracts/src/TokenLocker.solcontracts/src/TokenFactory.solcontracts/src/Launchpad.sol
CompilerSolidity ^0.8.24
LibrariesOpenZeppelin 5.x — SafeERC20, ReentrancyGuard, Ownable, ERC20, ERC20Burnable
MethodManual code review against OWASP Smart Contract Top 10 and SWC Registry
Tests80 tests passing (27 TokenLocker + 18 TokenFactory + 35 Launchpad)
DateJune 21, 2026

Security Checklist

Reentrancy

nonReentrant on all critical write functions in TokenLocker and Launchpad. TokenFactory follows CEI pattern.

SAFE
Integer Overflow

Solidity 0.8.24 — built-in checked arithmetic across all contracts

SAFE
Access Control

OpenZeppelin Ownable on all 3 contracts. Admin functions properly gated.

SAFE
SafeERC20

TokenLocker and Launchpad use SafeERC20. TokenFactory creates tokens directly (no external transfer needed).

SAFE
Self-destruct

No self-destruct in any contract

SAFE
Delegatecall / Proxy

No delegatecall or upgradeable proxy pattern in any contract

SAFE
Oracle / Price Feed

No oracle dependency. Token price in Launchpad is set by creator, not fetched from external source.

SAFE
Front-running / MEV

Launchpad contributions could be front-run. Risk is inherent to first-come-first-served presales and considered acceptable.

INFO

TokenLocker — Findings (4)

TL-M01MEDIUM FIXED

transferLock did not clean up _userLocks for the previous owner

transferLock() pushed the lockId into _userLocks[newOwner] but never removed it from _userLocks[oldOwner]. The old owner would still see transferred locks.

Impact: Data integrity — old owner still sees transferred locks on My Locks page.

Resolution: Added _removeFromArray() helper using swap-and-pop pattern.

TL-L01LOW FIXED

withdrawFees and _refundExcess used .transfer() instead of .call()

.transfer() forwards only 2300 gas. If recipient is a multisig whose fallback requires more gas, withdrawals revert.

Impact: Admin may be unable to withdraw fees with multisig wallets.

Resolution: Replaced with low-level call{value: ...}("") + require(ok).

TL-I01INFO FIXED

No FeeWithdrawn event on withdrawal

withdrawFees() emitted no event, making admin activity invisible to off-chain indexers.

Impact: Low — reduces auditability of admin actions.

Resolution: Added event FeeWithdrawn(address indexed to, uint256 amount).

TL-I02INFO FIXED

No maximum length on description field

Unbounded calldata string could increase gas cost disproportionately.

Impact: Low — only affects gas cost.

Resolution: Added require(bytes(description).length <= 256).

TokenFactory — Findings (3)

TF-L01LOW ACKNOWLEDGED

createToken lacks ReentrancyGuard

createToken() performs an external call (refund excess fee) without nonReentrant modifier. The function follows CEI pattern (state changes before external call), so re-entrancy risk is minimal.

Impact: Low — CEI pattern prevents exploitation, but defense-in-depth recommends the guard.

Resolution: Acknowledged. Contract inherits Ownable but not ReentrancyGuard. CEI ordering mitigates the risk.

TF-L02LOW ACKNOWLEDGED

No input length validation on name and symbol

Token name and symbol have no maximum length constraint. Extremely long strings increase deployment gas costs and may cause display issues in wallets and explorers.

Impact: Low — only affects gas cost and UX.

Resolution: Frontend enforces max 32 chars for name and 10 chars for symbol. On-chain enforcement not critical.

TF-I01INFO ACKNOWLEDGED

Supply overflow reverts silently for large values

supply_ * 10 ** decimals_ can overflow for extremely large supply values. Solidity 0.8.24 checked arithmetic will revert, but the error message is unclear to users.

Impact: Low — transaction reverts safely but user may not understand why.

Resolution: Frontend validates supply input. On-chain revert is safe behavior.

Launchpad — Findings (5)

LP-M01MEDIUM ACKNOWLEDGED

Token calculation hardcodes 1e18 decimals assumption

finalize() calculates tokensSold as (totalRaised * 1e18) / tokenPrice, and claimTokens() uses the same formula. This assumes all presale tokens use 18 decimals. Tokens with different decimals (e.g. 6 or 8) will have incorrect distribution amounts.

Impact: Medium — tokens with non-18 decimals will have wrong claim amounts. Could result in over/under distribution.

Resolution: Acknowledged. Platform documentation states presale tokens must use 18 decimals. Frontend enforces this by filtering token input. Future version may add dynamic decimal support.

LP-M02MEDIUM ACKNOWLEDGED

No validation that deposited tokens cover hardCap allocation

createPresale() does not verify that tokenAmount_ is sufficient to cover the maximum possible token distribution (hardCap / tokenPrice). If insufficient tokens are deposited, claimTokens() will revert for later claimers due to insufficient contract balance.

Impact: Medium — some contributors may be unable to claim tokens if the presale sells out but deposit is insufficient.

Resolution: Acknowledged. Frontend calculates required token amount from hardCap/price and pre-fills the field. A future upgrade could add on-chain validation.

LP-L01LOW ACKNOWLEDGED

cancelPresale not marked nonReentrant

cancelPresale() performs a safeTransfer (external call) without nonReentrant modifier. Status is set to Cancelled before the transfer, so re-entrancy would fail the status check.

Impact: Low — CEI pattern prevents exploitation.

Resolution: Acknowledged. Status change before external call mitigates the risk.

LP-L02LOW ACKNOWLEDGED

Fee-on-transfer tokens not supported

safeTransferFrom records the nominal amount, but fee-on-transfer tokens deliver less than the specified amount. This affects totalTokens tracking in Launchpad and lock amounts in TokenLocker.

Impact: Low — fee-on-transfer tokens are uncommon. Users of such tokens would see incorrect balances.

Resolution: Acknowledged. Platform documentation advises against using fee-on-transfer tokens. Standard ERC-20 tokens work correctly.

LP-I01INFO ACKNOWLEDGED

Presale status stays Active after soft cap failure

When a presale ends without reaching soft cap, status remains Active. Refunds are allowed via time-based check, but status does not transition to a terminal state automatically.

Impact: Info — no security impact. Status is cosmetic; refund logic works correctly.

Resolution: Acknowledged. On-chain automatic status transition would require an external trigger. Frontend displays the correct state based on timestamp and cap checks.

Deployed & Verified Contracts

TokenLocker

Polygon

0xBEdDcf2c709B3cEd29560E32322E09AEaC79316E

View on Explorer ↗

BNB Chain

0x0504C1048E3E8f49B435638496202337881c7F89

View on Explorer ↗

Arbitrum

0xBEdDcf2c709B3cEd29560E32322E09AEaC79316E

View on Explorer ↗
TokenFactory

Polygon

0xFAA5B7639705ea9409e11f0c85f71CE9eC58A774

View on Explorer ↗

BNB Chain

0x1c24CB61ffe95D8aFF407e4fb920E7c505FAB7f3

View on Explorer ↗

Arbitrum

0xD0ee70b60f9dB438645d68A18D3832c9538A65c6

View on Explorer ↗
Launchpad

Polygon

0x5Fc4BE29462a646F1D4e3f94D47412f80d1C7146

View on Explorer ↗

BNB Chain

0x6b3c3af05506564539da61F79b778114ecfeAFf2

View on Explorer ↗

Arbitrum

0x1c24CB61ffe95D8aFF407e4fb920E7c505FAB7f3

View on Explorer ↗

Source code is verified on all explorers. Anyone can inspect the contracts directly on-chain.

Disclaimer: This review was conducted internally and is not a substitute for a professional third-party audit (e.g. Certik, Trail of Bits, Hacken). No code is 100% bug-free. Use at your own risk.

Lock TokensCreate TokenLaunch Presale