CertiK reviewed HeHe (Hehe token) on 7 Dec 2023: 8 findings, 0 critical; 4 marked fixed, 3 acknowledged, 1 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 | 1 | 0 | 1 |
| Medium | 0 | 0 | 0 |
| Low | 0 | 3 | 3 |
### Ownable In the contract `Ownable` the role `_owner` has authority over the functions listed below. - transferOwnership(): transfer ownership of the contract to a new account. - renounceOwnership(): leave the contract without owner. Any compromise to the `_owner` account may allow the hacker to take advantage of this authority and manage the ownership of the contract. ### LzApp In the contract `LzApp` the role `_owner` has authority over the functions listed below. - setConfig(): set the configuration of the LayerZero messaging library of the specified version. - setSendVersion(): set the `send()` LayerZero messaging library version to `_version`. - setReceiveVersion(): set the `lzReceive()` LayerZero messaging library version to `_version` - forceResumeReceive(): only when the UA needs to resume the message flow in blocking mode and clear the stored payload. - setTrustedRemote(): manage state variable `trustedRemoteLookup`. - setTrustedRemoteAddress(): manage state variable `trustedRemoteLookup`. - setPrecrime(): manage state variable `precrime`. - setMinDstGas(): manage state variable `minDstGasLookup`. - setPayloadSizeLimit(): manage state variable `payloadSizeLimitLookup`. Any compromise to the `_owner` account may allow the hacker to take advantage of this authority and manage the configuration of the contract. ### OFTCore In the contract `OFTCore` the role `_owner` has authority over the functions listed below. - setUseCustomAdapterParams(): manage state variable `useCustomAdapterParams` Any compromise to the `_owner` account may allow the hacker to take advantage of this authority and manage the configuration of the contract.
In the function `setTrustedRemote()`, it is noted that `_path` should be `abi.encodePacked(address, address)`. However, the `bytes calldata _path` is missing a sanity check for ensuring it is correct(e.g. address size == 20 bytes on EVM chains), which may cause the contract can not work as intended. Similar issue happens in the other functions, which contain `bytes calldata` or `bytes memory` address input.
There should always be events emitted in sensitive functions that are controlled by centralization roles.
Addresses are not validated before assignment or external calls, potentially allowing the use of zero addresses and leading to unexpected behavior or vulnerabilities. For example, transferring tokens to a zero address can result in a permanent loss of those tokens. ```solidity=119 precrime = _precrime; ``` - `_precrime` is not zero-checked before being used. ```solidity=32 lzEndpoint = ILayerZeroEndpoint(_endpoint); ``` - `_endpoint` is not zero-checked before being used.
| Address | Chain | Source code |
|---|---|---|
| 0x488c…ab8d0x488cf9905cd9f5dea7212b4571c8b1052631ab8d | Chain: Ethereum | 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