Quantstamp reviewed Nomad on 11 May 2022: 40 findings, 0 critical; 10 marked fixed, 24 acknowledged, 6 open.
Report hosted on certificate.quantstamp.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 | 0 | 1 |
| Medium | 2 | 0 | 4 |
| Low | 4 | 24 | 5 |
Whenever the `update` method in the `Home` contract is called, it will validate if the queue contains the new root. However, the queue `contains` method does a linear scan of all the items in the queue. If the root has not been updated in a long time (either mistakenly or maliciously), the queue might have too many items, causing the `contains` method to throw an `Out of Gas` exception.
Nomad architecture assumes the liveness of the watcher running on top of it to secure the Dapp running on top of it. We need the watcher to unroll from the replica within 30 minutes. Therefore, the availability of the watcher is critical. The current deployment is only configured with a single watcher, which concerns the availability of any hardware incident that occurs.
The `Encoding.sol:L52` abuses underflow to run the for-loop. The looping variable `i` starts from 15 and decreases one by one until it gets underflow and becomes 255 to break the for-loop. The underflow mechanism will work for solidity versions before 0.8.0 as solidity 8 introduces the safe math check into the run time. Nonetheless, the `pragma` definition of the contract is `>=0.6.11`, which means it can potentially be deployed with a version higher than 0.8.0.
During its operation, the `BridgeRouter` contract calls the `ensureLocalToken` and `enrollCustom` on the `TokenRegistry` contract. However, these methods can only be called by the owner of the contract. In other words, the `BridgeRouter` can only work if it's the owner of the `TokenRegistry` contract.
Contracts inheriting from `Ownable` or `OwnableUpgradeable` will have the address that deployed the contract as the owner. If the deployment script does not change the ownership right away, the deployment address will keep ownership (along with all its privileges) instead of the rightful owner (like governance).
All the contracts that extend from `Ownable` or `OwnableUpgradeable` inherit a method called `renounceOwnership`. The owner of the contract can use this method to give up their ownership, thereby leaving the contract without an owner. If that were to happen, it would not be possible to perform any owner-specific functionality on that contract any more.
The report names a repository or files. Open the report to see its scope.
Repository and files the report names (66)
236 projects reviewed · 332 reports · latest Oct 2026
See Quantstamp’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