As of 14 Oct 2026, Noah has 2 audit reports by 1 security firm on Trustblock; the latest is by CertiK, dated 5 Jul 2023. Those reports list no open critical findings. It also holds 2 deployed contracts on 1 chain.
Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Statuses are the security firms’ own. 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 | 1 | 1 | 0 |
| Medium | 0 | 0 | 0 |
| Low | 14 | 0 | 1 |
All **Noah** tokens are sent to the deployer assigned address `addr` when deploying the contract. This is a potential centralization risk as the deployer can distribute **Noah** tokens without the consensus of the community.
Open the reportAddresses should be checked before assignment or external call to make sure they are not zero addresses. ```solidity=18 admin = _admin; ``` - `_admin` is not zero-checked before being used. --- ```solidity=47 feeTo = _feeTo; ``` - `_feeTo` is not zero-checked before being used. --- ```solidity=52 admin = _admin; ``` - `_admin` is not zero-checked before being used. --- ```solidity=73 token0 = _token0; ``` - `_token0` is not zero-checked before being used. --- ```solidity=74 token1 = _token1; ``` - `_token1` is not zero-checked before being used. --- ```solidity=25 factory = _factory; ``` - `_factory` is not zero-checked before being used. --- ```solidity=26 WETH = _WETH; ``` - `_WETH` is not zero-checked before being used.
Open the reportThe return value of the transfer()/transferFrom() call is not checked. ```solidity=137 INoahPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair ```
Open the reportThe return value of an external call is not stored in a local or state variable. ```solidity=44 INoahFactory(factory).createPair(tokenA, tokenB); ```
Open the report```solidity=19 address public factory; ``` The above 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.
Open the reportIt is expected that invocations of the form `transfer(recipient, amount)` succeed and return `true` if * The address in `recipient` is not the zero address, * `amount` does not exceed the balance of address `msg.sender`, * transferring `amount` to the address `recipient` does not lead to an overflow of the recipient's balance, and * the supplied gas suffices to complete the call. Nevertheless, the `transfer` function of `Token` fails in some of those admissible cases.
Open the reportIt is expected that invocations of the form `transfer(recipient, amount)` where the address in `recipient` equals the address in `msg.sender` (i.e. self-transfers) succeed and return `true` if * The value in `amount` does not exceed the balance of `msg.sender` and * the supplied gas suffices to complete the call. Nevertheless, the `transfer` function of `Token` fails in some of those admissible cases.
Open the reportIt is expected that non-reverting invocations of `transfer(recipient, amount)` that return `true` and where the address in `recipient` equals the address of `msg.sender` (i.e. self-transfers) do not change the balance of address `msg.sender`. However, in `Token.transfer` the balance of address `msg.sender` is changed by executing a self-transfer.
Open the reportIt is expected that invocations of `transferFrom(from, dest, amount)` succeed and return `true` if * the value of `amount` does not exceed the balance of address `from`, * the value of `amount` does not exceed the allowance of `msg.sender` for address `from`, * transferring a value of `amount` to the address in `dest` does not lead to an overflow of the recipient's balance, and * the supplied gas suffices to complete the call. Nevertheless, the `transferFrom` function of `Token` fails in some of those admissible cases.
Open the reportIt is expected that invocations of `transferFrom(from, dest, amount)` where the address in `dest` equals the address in `from` (i.e. self-transfers) succeed and return `true` if: * The value of `amount` does not exceed the balance of address `from`, * the value of `amount` does not exceed the allowance of `msg.sender` for address `from`, and * the supplied gas suffices to complete the call. Nevertheless, the `transferFrom` function of `Token` fails for some self-transfers in these admissible cases.
Open the reportIt is expected that non-reverting invocations of `transferFrom(from, dest, amount)` that return `true` and where the address in `from` equals the address in `dest` (i.e. self-transfers) do not change the balance entry of the address in `from` (which equals `dest`). However, in `Token.transferFrom`, at least one balance entry of the addresses provided in the `from` or `dest` input parameters is changed when executing a self-transfer.
Open the reportIt is expected that all invocations of `transferFrom(from, dest, amount)` that succeed (i.e. that do not revert) and that return `true` subtract the value in `amount` from the balance entry for the address in `from` and add the same value to the balance entry for the address in `dest`. However, the amount that the `transferFrom` function in `Token` deducts from the balance of address `from` is not always equal to the amount that it credits to the balance of the recipient's address in `dest`.
Open the reportAddresses should be checked before assignment or external call to make sure they are not zero addresses. ```solidity=599 _marketAddress = marketAddress_; ``` - `marketAddress_` is not zero-checked before being used. --- ```solidity=660 _marketAddress = marketAddress; ``` - `marketAddress` is not zero-checked before being used.
Open the reportState variables that never change should be declared as `constant` to save gas. ```solidity=584 uint16 public _marketRatio = 2; ``` - `_marketRatio` should be declared `constant`.
Open the reportThe `SafeMath` library is used unnecessarily. With Solidity compiler versions 0.8.0 or newer, arithmetic operations will automatically revert in case of integer overflow or underflow. ```solidity=126 library SafeMath { ``` - An implementation of `SafeMath` library is found. --- ```solidity=572 using SafeMath for uint256; ``` - `SafeMath` library is used for `uint256` type in `Token` contract.
Open the report| Address | Chain | Source code |
|---|---|---|
| 0x494a…078f0x494aed889b52baa32bec68460ab9786a3e41078f | Chain: BNB Chain | Source code: Verified source |
| 0xcf96…bba30xcf968cec61c8883c1b52f3bc8a87c3101734bba3 | Chain: BNB Chain | 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="noah"></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