As of 3 Nov 2026, EML has 1 audit report on Trustblock, by CertiK, dated 13 Jun 2023. That report lists no open critical findings. It also holds 1 deployed contract on 1 chain.
Record last updated . It holds audits, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.
Newest first
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 2 | 0 |
| Medium | 0 | 1 | 0 |
| Low | 9 | 0 | 3 |
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.
Open the reportIn 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.
Open the reportIt 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.
Open the report| Address | Chain | Source code |
|---|---|---|
| 0x03dd…10620x03dde9e5bb31ee40a471476e2fccf75c67921062 | Chain: Ethereum | Source code: Verified source |
Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.
Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.
<head><script src="https://widget.trustblock.run/project-widget.min.js" defer></script></head><body><divdata-tb-project-widgetdata-tb-project-slug="eml-protocol"></div></body>
Paste the code where the label should appear. It uses no API credit and updates by itself.
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