OZolio

Off-Chain (Private)
Audited on 2025/02/10
No active critical issues

Summary

Ozolio’s contract manages vesting schedules for different wallets (Team, Advisory, Partner, Treasury), allocating tokens from an ERC20 token contract. It utilizes an exponential decay formula to calculate claimable amounts over time, factoring in lock-up periods and vesting durations. Wallets can claim their vested tokens, and the contract includes functionality for the owner to update wallet addresses and retrieve wallet information, with upgradeability and reentrancy protection.

Issues (4)

Low
Medium
High
Critical
Total
Not fixed
----0
Fixed
112-4
Total11204
Some funds are stuck due to division before multiplication
fixed/high

The wallets tokenAllocation "_T" is first divided before being multiplied, this will lead to the allocation being rounded down before being multiplied
The nonce increment mechanism is improperly implemented
fixed/high

The nonce increment mechanism is improperly implemented, resulting in nonces never being incremented. This completely breaks the replay protection mechanism of the meta-transaction system.The vulnerability stems from the misuse of the post-increment operator (++). In Solidity, when using post-increment, the following sequence occurs: The current value is returned The value is incremented The returned value (pre-increment) is assigned back to the variable Therefore: If nonce starts at 0 nonces[userAddress]++ returns 0 and increments to 1 nonces[userAddress] = then assigns 0 back The nonce effectively never changes
Uses Ownable2StepUpgradeable instead of Ownable Upgradeable
fixed/medium

One issue is that the contract does not utilize the __Ownable2StepUpgradeable_init() function, designed to facilitate a two-step ownership transfer process. Without this mechanism, ownership transfers occur immediately, exposing the contract to potential risks. The two-step process enhances security by requiring a confirmation step before ownership is fully transferred, thereby reducing the likelihood of unauthorized access or control over the contract.
Enhance Contract Robustness and Security
fixed/low

Add the sanity checks and best practices that make the contract more robust SafeERC20: Replaced direct token.transfer() with token.safeTransfer() to prevent issues with tokens that don't return true on successful transfers.Non-Negative N Check: Added a require(N >= 0, ...) check before converting N to a uint256 in claimableAmount() to prevent unexpected behavior if the vesting calculation results in a negative claimable amount.

Contracts (4)

#File Name
1

BasicMetaTransaction.sol

2

VestingOzolio.sol

3

OwnedUpgradeabilityProxy.sol

4

Ozolio.sol