Sell Token security record

BNB Chain, Ethereumselltoken.org

As of 3 Nov 2026, Sell Token has 1 audit report on Trustblock, by CertiK, dated 30 Mar 2023. 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
selltokenSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com

Findings16

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

SeverityOpenAcknowledgedFixed
Critical000
High100
Medium001
Low3011
MediumIncorrect restrictions of withdrawselltoken · CertiK · 30 Mar 2023Fixed

In the `ShortStart()` function, when the user's bnb is greater than 10% of the pool balance, he cannot call `ShortStart()` for more amount. However, the balance of a specific coin can change, due to the withdrawal from other users. So when he calls `withdraw()`, his balance might be greater than 1-% of the pool balance at that moment and the below restriction is incorrect. ```solidity=498 if(getTokens >= tokens){ mkt.sell(token,Short[_msgSender()][token].token,tokens,_msgSender()); mkt.setPools(token,tokens,false); }else { mkt.sell(token,Short[_msgSender()][token].token,getTokens,_msgSender()); mkt.setPools(token,getTokens,false); } ```

Open the report
LowDiscussion of the logic purposeselltoken · CertiK · 30 Mar 2023Fixed

We would like to know what is the purpose of the below logic: ```solidity=455 if(mkt.balanceOf(coin) <=0) return ; ``` This could prevent the first user to call `ShortStart()`.

Open the report
LowIncompatibility With Deflationary Tokensselltoken · CertiK · 30 Mar 2023Fixed

When transferring standard ERC20 deflationary tokens, the input amount may not be equal to the received amount due to the charged transaction fee. As a result, an inconsistency in the amount will occur and the transaction may fail due to the validation checks. For example, if a user sends 100 deflationary tokens (with a 10% transaction fee) to the target contract, only 90 tokens actually arrive at the contract. In the function `Minerals.buy()`, the swap accepts at most 5% of slippage. The below logic does not consider both deflationary loss and swap slippage loss, and still record the min as the received amount. ```solidity=283 IRouter(_router).swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount0In}(min*95/100,path,address(this),block.timestamp); if(_token!=_USDT){ balanceOf[_token]+=min; } } ```

Open the report
Lowincomplete logicselltoken · CertiK · 30 Mar 2023Fixed

In the function `setPool()`, when the input `isPool` is not zero, the logic is as below: ```solidity=374 }else{ require(msg.value>=fee); IERC20(token).transferFrom(_msgSender(),address(this),coin); balanceOf[token]+=coin; balanceOfLook[token]+=coin; uint oldCoin=IERC20(_TRDT).balanceOf(address(this)); if(msg.value>0){ buy(_WBNB,address(_TRDT),msg.value); if(IERC20(_TRDT).balanceOf(address(this))>oldCoin){ uint ut=IERC20(_TRDT).balanceOf(address(this))-oldCoin; balanceOfLook[_TRDT]+=ut; } } if(pair[token]==address(0)){ pair[token]=token1; } } ``` The caller will transfer in a specific type of token, which is not recorded for the caller. The caller will also transfer in some bnb and these bnb will be used to buy _TRDT token. This will also not be recorded for the caller. Only the balanceOf/balanceOfLook will be updated.

Open the report
LowLack of access controlselltoken · CertiK · 30 Mar 2023Fixed

The function should be only accessible for the ceo contract.

Open the report
LowLack of checks for `bnborUsdt` is `_WBNB` or `_USselltoken · CertiK · 30 Mar 2023Fixed

In the function `ShortStart()`, the value of `bnborUsdt` is retrieved from the Minerals.getPair() function. There is no check to ensure the `bnborUsdt` must be either _WBNB or _USDT. There is only one check to ensure it's not a zero address. In the following get price logic, if the `bnborUsdt` is not _WBNB, it will be treated as _USDT anyway. The admin should carefully manage the setup of pair info.

Open the report
LowNot able to minerWithdrawselltoken · CertiK · 30 Mar 2023Fixed

In the `setPool()` function, the caller will transfer a specific type of token, which is decided by the parameter he inputs. And he will get staking rewards after some time for the same type of tokens. However, this type of token might not be one of the tokens in the pair info, then there is no resource for the rewards. And he will be unable to withdraw.

Open the report
LowPotential Sandwich Attacksselltoken · CertiK · 30 Mar 2023Fixed

A sandwich attack may 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 (executing before the target) a transaction to purchase one of the assets and make profits by backrunning (executing after the target) 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: ```solidity function buy(address bnbOrUsdt,address _token,uint amount0In) public{ ... IRouter(_router).swapExactTokensForTokens(amount0In,0,path,address(this),block.timestamp); ... } ```

Open the report
LowRedundant logic in setPoolsselltoken · CertiK · 30 Mar 2023Fixed

The function Minerals.setPools() can only be called by the ceo, which should be the SellToken contract. In the SellToken contract, the all calls of `setPools()` are as below and the last parameter are false. ```solidity if(getTokens >= tokens){ mkt.sell(token,Short[_msgSender()][token].token,tokens,_msgSender()); mkt.setPools(token,tokens,false); }else { mkt.sell(token,Short[_msgSender()][token].token,getTokens,_msgSender()); mkt.setPools(token,getTokens,false); } ``` Hence the logic inside the case `zt is true` is redundant. ```solidity=263 function setPools(address token,uint value,bool zt)public{ require(_msgSender()==ceo,"You are not a routing contract administrator"); if(zt){ balanceOf[token]+=value; }else{ if(balanceOf[token] > value){ balanceOf[token]-=value; }else{ balanceOf[token]=0; } } } ```

Open the report
LowRedundant Statementsselltoken · CertiK · 30 Mar 2023Fixed

The below logic in the `getMyPrice()` function is the same in different cases. ```solidity=600 if(nowPrice < Short[_msgSender()][token].tokenPrice){ zt=nowPrice * 1 ether / Short[_msgSender()][token].tokenPrice; }else { zt=nowPrice * 1 ether / Short[_msgSender()][token].tokenPrice; } ```

Open the report
Show 2 more
Lowunauthorized queryselltoken · CertiK · 30 Mar 2023Fixed

The function `getMyPriceSell()` can be used to view other users balance in the pool, without any authorizations.

Open the report
LowUnchecked ERC-20 `transfer()`/`transferFrom()` Caselltoken · CertiK · 30 Mar 2023Fixed

The return value of the transfer()/transferFrom() call is not checked. ```solidity=339 IERC20(token).transfer(_msgSender(),value); ``` --- ```solidity=357 IERC20(token).transferFrom(_msgSender(),address(this),coin); ``` --- ```solidity=376 IERC20(token).transferFrom(_msgSender(),address(this),coin); ``` --- ```solidity=406 IERC20(token).transfer(owner(),_token); ```

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="selltoken"
></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