EML Token

CertiK1 address on Ethereum

CertiK reviewed EML (EML Token) on 13 Jun 2023: 15 findings, 0 critical; 3 marked fixed, 3 acknowledged, 9 open.

No open critical findings
Open the reportOpen EML’s security record

Report hosted on skynet.certik.com.

Trustblock does not review code.

Findings15

Statuses are the security firm’s own, from its report.

SeverityOpenAcknowledgedFixed
Critical000
High020
Medium010
Low903
LowIncorrect calculation of the unlocking of vestingFixed

The following is the calculation for the remaining locked vesting amounts in function `getVestingLockedAmount()`. ```solidity=376 vestingLockedAmount += (amount * ((expiresAt - timestamp) / period)) / count; ``` Due to the truncation, vesting locked amounts will unlock earlier than expected, leading to discrepancies between the amount that should be locked and the amounts that are actually locked in the implementation.

LowLack of checking on vesting lock `startDate`Fixed

In functions `_addVestingLock()` and `_updateVestingLock()` there is no checking for the input parameter `startsAt` when creating or updating a vesting lock entry. The original checking has been commented out in both functions. ```solidity // require(startsAt > block.timestamp, "VestingLock: must set after now"); ``` This could lead to cases where the `_locker` role can effectively unlock transactions that have vesting locks by setting a `startsAt` date far enough into the past that it leads to the expiration of the vesting lock.

LowTransfer of external tokens when are allowed whenFixed

It is noted that although transfers of the internal ERC-20 token is not allowed while the token contract is paused due to checks implemented in the `_beforeTokenTransfer()` function, transfers of other tokens within the token contract are still allowed. ```solidity function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override(ERC20Upgradeable) { require(!isFreezed(from), "Freezable: token transfer from freezed account"); require(!isFreezed(to), "Freezable: token transfer to freezed account"); require(!isFreezed(_msgSender()), "Freezable: token transfer called from freezed account"); require(!paused(), "Pausable: token transfer while paused"); // Note: This restricts the internal ERC-20 token from being transferred while the contract is paused ``` Transfer of tokens other than the internal ERC-20 token can be executed using the `recoverToken()` function by the owner. ```solidity=424 function recoverToken(address tokenAddress, uint256 tokenAmount) public onlyOwner { IERC20Upgradeable(tokenAddress).transfer(owner(), tokenAmount); } ``` The audit team would like to check to see if this aligns with the intended design since the transfer of other tokens within the contract will still be possible when the contract is paused.

Contracts in scope1

AddressChainSource code
0x03dde9e5bb31ee40a471476e2fccf75c67921062Chain: EthereumSource code: Verified source

Part of EML’s security record

EML
Audits1 audit by 1 firmLast audit Jun 2023, by CertiK.
Critical findingsNo open critical findingsIn 1 report.
Open EML’s security record

Security firm

CertiK

1,044 projects reviewed · 1,375 reports · latest May 2025

See CertiK’s audits

Something 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