Finance Rug Pull

Reported loss $81K
Rugpull

What happened

Finance (ARKEN) is a BNB Chain token deployed on 25 March 2023 at 0x636cc5d8…CbCE25 by 0x8Db85c73…C85661 and paired with USDT on PancakeSwap. Its transfer logic lets anyone buy from the pair, but a sale or wallet-to-wallet transfer by an ordinary holder reverts with "canSell" unless the flag canSell is on, and canSell starts off and can be flipped only by _tokenOwner, an address fixed at deployment. The same address can put a per-wallet sell cap on any holder with maxSellToken, and it is the only address allowed to add liquidity to the pair. Fee-exempt addresses (the tokenOwner argument, the deployer and the contract) skip the canSell check, the sell cap and the fee, but not the add-liquidity check; only the contract itself and any extra pair the owner registers with addOtherTokenPair bypass every rule. Because these powers hang on _tokenOwner rather than owner, the fact that owner now reads as the dead address does not remove them.

On 27 March 2023 CertiK reported that the deployer removed about $81k from the liquidity pool and that the token also appeared to be a honeypot. De.Fi's REKT database adds that the deployer sold a large amount of tokens and the price fell about 90%, and gives 0x4b251122…a1903f as an example liquidity-removal transaction.

How it happened

  1. The constructor mints 100,000,000 ARKEN to the tokenOwner argument, creates an ARKEN/USDT pair, and exempts tokenOwner, the deployer and the contract from fees.
  2. For non-exempt addresses, _transfer treats a transfer to the pair as a sale and any non-pair transfer the same way, and both branches run require(canSell,"canSell"). canSell is a plain boolean that starts false.
  3. changeCanSell() checks only require(_tokenOwner == msg.sender) and flips the flag, so that one address decides whether holders can sell and can close selling again at any time.
  4. maxSellToken(userAddress, tokens) lets the same address set a cumulative sell limit per wallet, enforced with require(_maxSell[from] >= _haveSell[from].add(amount), "maxSell"), so a tiny limit freezes a chosen holder even while selling is open.
  5. Buys from the pair skip these checks and pay a 5% fee sent to the dead address, so money can keep flowing into the pool while holders cannot get out.
  6. CertiK reported that the deployer then removed about $81k from the pool, which is the USDT side holders would have sold into.

Protocol details

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

Build your security review skills

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