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.
Low | Medium | High | Critical | Total | |
---|---|---|---|---|---|
Not fixed | - | - | - | - | 0 |
Fixed | 1 | 1 | 2 | - | 4 |
Total | 1 | 1 | 2 | 0 | 4 |
fixed/high
The wallets tokenAllocation "_T" is first divided before being multiplied, this will lead to the allocation being rounded down before being multiplied
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
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.
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.
# | File Name |
---|---|
1 | BasicMetaTransaction.sol |
2 | VestingOzolio.sol |
3 | OwnedUpgradeabilityProxy.sol |
4 | Ozolio.sol |