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
Security Checklist
nonReentrant on all critical write functions in TokenLocker and Launchpad. TokenFactory follows CEI pattern.
Solidity 0.8.24 — built-in checked arithmetic across all contracts
OpenZeppelin Ownable on all 3 contracts. Admin functions properly gated.
TokenLocker and Launchpad use SafeERC20. TokenFactory creates tokens directly (no external transfer needed).
No self-destruct in any contract
No delegatecall or upgradeable proxy pattern in any contract
No oracle dependency. Token price in Launchpad is set by creator, not fetched from external source.
Launchpad contributions could be front-run. Risk is inherent to first-come-first-served presales and considered acceptable.
TokenLocker — Findings (4)
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.
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).
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).
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)
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.
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.
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)
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.
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.
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.
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.
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
Polygon
0xBEdDcf2c709B3cEd29560E32322E09AEaC79316E
BNB Chain
0x0504C1048E3E8f49B435638496202337881c7F89
Arbitrum
0xBEdDcf2c709B3cEd29560E32322E09AEaC79316E
Polygon
0xFAA5B7639705ea9409e11f0c85f71CE9eC58A774
BNB Chain
0x1c24CB61ffe95D8aFF407e4fb920E7c505FAB7f3
Arbitrum
0xD0ee70b60f9dB438645d68A18D3832c9538A65c6
Polygon
0x5Fc4BE29462a646F1D4e3f94D47412f80d1C7146
BNB Chain
0x6b3c3af05506564539da61F79b778114ecfeAFf2
Arbitrum
0x1c24CB61ffe95D8aFF407e4fb920E7c505FAB7f3
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.