CertiK reviewed Aeterna on 27 Sep 2023: 16 findings, 0 critical; 9 marked fixed, 3 acknowledged, 4 open.
Report hosted on skynet.certik.com.
Trustblock does not review code.
Statuses are the security firm’s own, from its report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 3 | 0 |
| Medium | 0 | 0 | 1 |
| Low | 4 | 0 | 8 |
There are no upper limits restricting parameters of `setTaxes()`, potentially enabling up to 100% of fees on transactions.
The **require** can be used to check for conditions and throw an exception if the condition is not met. It is better to provide a string message containing details about the error that will be passed back to the caller.
The value of variable `inSwap` can only be changed in the modifier `swapping`, it is set to false in the end. The view function `isNotInSwap()` always return false. ```solidity=457 modifier swapping() { inSwap = true; _; inSwap = false; } ```
Solidity frequently releases new compiler versions. Using an old version prevents access to new Solidity security features. Also, recent versions may be too early to be trusted. File: Aeterna.sol (Line 2) ```solidity pragma solidity ^0.7.4; ```
The total supply increases based on its previous value as the following statements. If the variables `_rewardYield` and `_rewardYieldDenominator` are not changed, the total supply will grow faster and faster. Over time, the `Aeterna` balance in all wallets will grow much faster than it did when it was launched. ```solidity=682 for (uint256 i = 0; i < times; i++) { _totalSupply = _totalSupply .mul((_rewardYieldDenominator).add(_rewardYield)) .div(_rewardYieldDenominator); } ``` We would like to confirm with the client if the current implementation aligns with the original project design.
One or more state variables are never used in the codebase. Variable `MAX_INT256` in `SafeMathInt` is never used in `SafeMathInt`. File: Aeterna.sol (Line 6, Contract `SafeMathInt`) ```solidity int256 private constant MAX_INT256 = ~(int256(1) << 255); ```
If the `_rebasePairTokens` is disabled, the increased `Aeterna` token in the DEX pair will be burned. If the auto rebase is disabled for a long time, after a manual rebase, the supply of the `Aeterna` token will increase significantly and will be distributed to all wallets. As a result, if the wallet owner sells `Aeterna` to the DEX in the first place, he can get more BNB. ```solidity=692 if(!_rebasePairTokens && pairBalanceAfter > pairBalanceBefore) { uint256 diffTokens = pairBalanceAfter - pairBalanceBefore; _basicTransfer(pairAddress, DEAD, diffTokens); emit Transfer(pairAddress, DEAD, diffTokens); } ``` We would like to confirm with the client if the current implementation aligns with the original project design.
The linked variables could be declared as `constant` since these state variables are never modified.
The linked variables assigned in the constructor can be declared as `immutable`. Immutable state variables can be assigned during contract creation but will remain constant throughout the lifetime of a deployed contract. A big advantage of immutable variables is that reading them is significantly cheaper than reading from regular state variables since they will not be stored in storage.
| Address | Chain | Source code |
|---|---|---|
| 0xe75b…855a0xe75bf67df2388183d9b7714231996c937d4a855a | Chain: BNB Chain | Source code: Verified source |
| 0xd043…22a00xd04301b19e74efc656548be601a4f1fd37a822a0 | Chain: BNB Chain | Source code: Verified source |
1,044 projects reviewed · 1,375 reports · latest May 2025
See CertiK’s auditsSomething wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.
Tell us