Neoteric Finance Rug Pull

Reported loss $17K
Rugpull

What happened

Neoteric (NTRC) is a BEP-20 token on BNB Smart Chain with a fixed supply of 500,000,000 tokens minted once to the deployer. Its contract leaves the owner() account uncapped, unilateral switches over who can sell: a blacklist, per-direction fee setters, a maximum-sell setter and a trading start time. The contract has no function that withdraws pool liquidity.

De.Fi's REKT database lists the project as rug pulled by its team, with a profit of about 67 BNB. It describes the project as having a Telegram group, a Twitter account and a simple website, and says that a day after the NTRC/BNB pair was created on PancakeSwap it posted about a successful capitalization. According to the listing, the token creator received 100 BNB from address B (transaction 0xc965f8c0…dd176b) and then, once the price had risen, removed liquidity for a profit of about 67 WBNB in two transactions, 0xf3a2bd56…059c1d and 0x2add9377…1d0221. The listing adds that the same team ran the same scheme with the $PEECAT token.

Addresses and transactions named by the listing: token creator (address A) 0x8f0d9acb…2387e4; address B 0x6e9afd53…2209b1; pair creation transaction 0x574679ed…8fd93a; deployment transaction 0x8b26c3e8…742c18.

How it happened

  1. The constructor mints the whole supply to the deployer with _mint(owner(), 500000000 * (10**decimals())); and creates the PancakeSwap pair with createPair(address(this), _uniswapV2Router.WETH()). It also sets excludeFromFees(owner(), true);, so the owner pays no fees on its own transfers. This is the only mint of NTRC itself.
  2. What the code allows on the sell side: updateSellFees(...) takes six percentages with no upper bound. On a sell into the pair the transfer computes uint256 feeAmount = amount.mul(calcFee).div(100); and then amount = amount.sub(feeAmount).sub(burnAmount);, so a combined sell fee above 100 reverts every sale by a non-excluded seller. updateMaxSellTx(0) makes require(amount + sellnumber[from] <= maxSellTransactionAmount fail for any non-zero sale by a seller who is neither the owner (from != owner()) nor in _isExcludedFromLimits. All sell fees and limits start at 0 or at the full supply.
  3. What the code allows on trading start: updateTradingEnabledTime sets tradingEnabledTimestamp = newTimeInEpoch;. While the current time is earlier than that value, require(canTransferBeforeTradingIsEnabled[from] rejects every sender not on that list, which includes the pair when it sends tokens to a buyer and holders when they sell.
  4. What the code allows with the blacklist: blacklistAddress(address account, bool excluded) sets _isBlacklisted[account] = excluded;, and _transfer begins with require(!_isBlacklisted[from] and the same check on to. A listed holder can neither send nor receive; listing the pair address would stop all buys and sells.
  5. The owner role is transferable (transferOwnership) and can be given up (renounceOwnership). A current-state read on 2026-09-30 returned 0x9b28e5a3…f29e91 as owner(), which is not the deployer, but that read does not show who held the role at the time of the incident.
  6. What happened, per De.Fi's REKT database: the token creator removed liquidity after the price rose in the two transactions listed above, taking about 67 WBNB. No opened source shows that any of the switches in steps 2 to 4 was used.

Protocol details

Classification Token
Protocol Type Exit Scam/Rugpull
Affected asset / contract NTRC

Build your security review skills

Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.