Ice Open Network security record

BNB Chain, Ethereumice.ioGitHub

As of 3 Nov 2026, Ice Open Network has 1 audit report on Trustblock, by CertiK, dated 10 Jan 2024. That report lists no open critical findings.

Critical findings
No open critical findings
In 1 report.
Open the latest report
Your label, live
Get the label for your site

Record last updated . It holds audits, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.

Audits1

Newest first

AuditSecurity firmDateScopeCritical findingsReport
Ice - Audit 1Security firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com

Findings17

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

SeverityOpenAcknowledgedFixed
Critical000
High024
Medium001
Low0010
HighIncorrect Usage of SlippageIce - Audit 1 · CertiK · 10 Jan 2024Fixed

In the `_addLiquidity()` function, the contract sets the minimum amount of the native token and the `ICE` token. However, it is noted that the minimum amount is calculated by the current corresponding balance in the contract, which is possibly inconsistent with the current token price in the pair and causes the failure to add liquidity. In the `_swapTokensForEth()` function, the contract uses this value `(tokenAmount * (100 - _slippage)) / 100` as the `amountOutMin` of `swapExactTokensForETHSupportingFeeOnTransferTokens()`, which is incorrect since the the output ETH amount is determined by the price in the pair.

Open the report
HighPausing Centralization RiskIce - Audit 1 · CertiK · 10 Jan 2024Fixed

In the contract `ICEToken`, the role `_owner` has authority to pause/resume the functionality of token transfer. Any compromise to the private key of the `owner` may allow hackers to take advantage of this authority and disable or enable the transfer.

Open the report
HighPotential Dos AttackIce - Audit 1 · CertiK · 10 Jan 2024Fixed

It is noted that the contract calls `_swapBack()` in every sell or normal transfer transaction. In the `_swapBack()` function, the contract will try to add liquidity if `totalTokensToSwap == 0` and `contractBalance != 0`. However, if a malicious holder transfers some tokens to the current token contract when `tokensForLiquidity = 0` and `tokensForOperations = 0`, the normal transfer transaction and sale will fail due to the `INSUFFICIENT_LIQUIDITY_MINTED` error. Although the `totalTokensToSwap` and `address(this).balance` can be changed by buying operations, it still can cause side effects to the project due to the following code. ```solidity=702 tokensForLiquidity = 0; tokensForOperations = 0; ... if (address(this).balance > 0) { (success,) = address(operationsAddress).call{value: address(this).balance}(""); } ```

Open the report
HighPotential Flashloan AttackIce - Audit 1 · CertiK · 10 Jan 2024Fixed

The contract takes an extra amount of tokens as the fee from the sender when buying, not directly deducting the fee from the transfer amount, and it is also noted that the contract supports more than one pool. However, we found that current implementation is vulnerable to the flashloan attack. For example, the malicious can use a flashloan and combination of calling `skim()` and `sync()` functions to decrease the pool liquidity and make a profit.

Open the report
MediumMissing Input Validation in `setUniswapV2LiquiditIce - Audit 1 · CertiK · 10 Jan 2024Fixed

The pointed input parameters are not validated. In particular, the following checks should be added: - Check if `pairAddress` already exists in `uniswapV2LiquidityPools` - Check if `routerAddress` is a zero address Moreover, there are no upper boundaries for **setUniswapV2LiquidityPool()** which is used to set the liquidity/operation fee of buy/sell. It is possible to set the total fee rate up to any arbitrary amount, which is unreasonable and may cause the loss of users' assets. - `buyOperationsFee` plus `buyLiquidityFee` should lie in (0, 100) according to the function `_transfer()`. - `sellOperationsFee` plus `sellLiquidityFee` should lie in (0, 100) according to the function `_transfer()`.

Open the report
Low`botsCaught` Will Always be ZeroIce - Audit 1 · CertiK · 10 Jan 2024Fixed

The state variable `botsCaught` is used to record caught bots with a default value of zero. However, per the function `_transfer()`, if a bot is caught, the function will raise a `NoBots` error, thus botsCaught won't be updated and will remain zero forever. ```solidity function _transfer(address from, address to, uint256 amount) internal { //... if (bots[from] || bots[to]) { botsCaught++; revert NoBots(); } //... } ```

Open the report
LowFrequent call to `_swapBack()`Ice - Audit 1 · CertiK · 10 Jan 2024Fixed

It is noted that the contract calls `_swapBack()` on every normal transfer and sell transaction, which is too frequent and unnecessary especially when the token amount in the token contract is very small.

Open the report
LowICE token should be excluded from `transferForeigIce - Audit 1 · CertiK · 10 Jan 2024Fixed

The function `transferForeignToken()` allows the owner to transfer any ERC20 token to any address. ```solidity function transferForeignToken(address _token, address _to) external onlyOwner returns (bool _sent) { require(_token != address(0), "_token address cannot be 0"); uint256 _contractBalance = IERC20(_token).balanceOf(address(this)); _sent = IERC20(_token).transfer(_to, _contractBalance); emit TransferForeignToken(_token, _contractBalance); } ``` However, per the function name, only foreign tokens except the' ICE' token can pass in. The owner can pass the ICE token address and transfer all the fee tokens to an arbitrary address.

Open the report
LowMissing Break In LoopIce - Audit 1 · CertiK · 10 Jan 2024Fixed

```solidity for (uint i = 0; i < uniswapV2LiquidityPools.length; i++) { if (uniswapV2LiquidityPoolSlots[uniswapV2LiquidityPools[i]].router == msg.sender) { interactingToRouter = true; } } ``` If `msg.sender` is found as a router, the loop can be finished and popped to save gas.

Open the report
LowMissing Check Input AmountIce - Audit 1 · CertiK · 10 Jan 2024Fixed

It is noted that the function `_swapTokensForEth()/_addLiquidity()` doesn't check if the amount variable is above zero before executing the `swapExactTokensForETHSupportingFeeOnTransferTokens()` or `addLiquidityETH()`, which cause the transaction fails. Since these functions are called in the normal transfer/sell/buy transactions, their side effects are amplified in current contract.

Open the report
Show 5 more
LowPotential Sandwich AttacksIce - Audit 1 · CertiK · 10 Jan 2024Fixed

A sandwich attack might happen when an attacker observes a transaction swapping tokens or adding liquidity without setting restrictions on slippage or minimum output amount. The attacker can manipulate the exchange rate by frontrunning (before the transaction being attacked) a transaction to purchase one of the assets and make profits by backrunning (after the transaction being attacked) a transaction to sell the asset. The following functions are called without setting restrictions on slippage or minimum output amount, so transactions triggering these functions are vulnerable to sandwich attacks, especially when the input amount is large: - `swapExactTokensForETHSupportingFeeOnTransferTokens()` - `addLiquidityETH()`

Open the report
LowRedundant CodeIce - Audit 1 · CertiK · 10 Jan 2024Fixed

It is noted that the contract calls `transferOwnership()` to transfer ownership to `operationsAddress`, which has been set to `msg.sender` in the previous statement. However, the `msg.sender` has been set to the owner of the contract in the `Ownable(msg.sender)`. ```solidity=168 constructor() ERC20("ICE", "ICE") Ownable(msg.sender) { operationsAddress = msg.sender; transferOwnership(operationsAddress); ... } ```

Open the report
LowUnchecked value from low-level callIce - Audit 1 · CertiK · 10 Jan 2024Fixed

Ignores return value of low-level calls. ```solidity=668 (success,) = address(operationsAddress).call{value: address(this).balance}(""); ``` ```solidity=682 (success,) = address(msg.sender).call{value: address(this).balance}(""); ```

Open the report
LowUnchecked Value of ERC-20 `transfer()`/`transferFIce - Audit 1 · CertiK · 10 Jan 2024Fixed

The linked `transfer()` invocation does not check the return value of the function call which should yield a `true` result in case of a proper ERC-20 implementation.

Open the report
LowUnused Return ValueIce - Audit 1 · CertiK · 10 Jan 2024Fixed

The smart contract does not check or store the return value of an external call in a local or state variable, which may introduce vulnerabilities due to the unhandled outcome. ```solidity=651 IDEXRouter(receiver.router).addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(0xdead), block.timestamp ); ```

Open the report

Contracts

No deployed address is recorded for these audits.

The reports name a repository or files. Open a report to see its scope.

The repositories and files the reports name

Show this on your site

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.

Content

Facts

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.

Fixed as
Language

Style

Layout
Theme
Accent
Corners

Format

Size
Date
Embed as
HTML
<head>
<script src="https://widget.trustblock.run/project-widget.min.js" defer></script>
</head>
<body>
<div
data-tb-project-widget
data-tb-project-slug="ice-open-network"
></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