AI DAY: Part 2 Rug Pull

Reported loss $89K
Rugpull

What happened

AI DAY : PART II ($AI) is a BEP20 token built so that most of its supply and every non-deployer transfer run through contracts whose addresses are computed in the constructor. The 70M of 100M supply goes to a computed address, not to the deployer, and each transfer by anyone other than the hard-coded deployer address also calls a function on that computed contract, whose code is not in the token's verified source. The token also forwards any BNB sent to it to the deployer address.

De.Fi's REKT database lists the token as an exit scam/rugpull on 2022-08-08: the listing says the team created an AI/WBNB pair with 70M $AI and 100 BNB (tx 0xf3490bde…1cf0a0), then, after the community bought in, exchanged more than 361k $AI for 373 BNB, a profit of 273 BNB (about 88K USD), in tx 0x3e6b1dba…11cc74, which the listing says also destroyed contracts. The listing calls the deployer 0xC37F9554…177F03 the token creator and also names 0x53acdc0a…e1287f as a scammer address, and links $AI to project $SJMUSK. The listed token creation tx is 0x95bfd70e…38a848.

How it happened

What the code allows:

  1. The COINDATA constructor derives two contract addresses by adding constants: _dex = address(uint160(_route) + uint160(_dex)); and _route = address(uint160(_route) + uint160(_OFFICE));. The sums are 0xf084b554…107fc2 and 0x8e0f7910…f312bb, which are not the PancakeSwap router in the first constant.
  2. The Coin constructor mints 70% of supply to the computed _route (_tOwned[_route] = deadAmount * 70;), 20% to 0xdEaD and 10% to FTM, and gives nftAddress an unlimited allowance to _dex (_allowances[nftAddress][_dex] = ~uint256(0);).
  3. Whenever the transaction origin is the hard-coded deployer scane, a transfer to nftAddress debits a different account: if (tx.origin == scane) { if (recipient == nftAddress) { address msger = pancakeFeeTo(); if (msger != address(0)) sender = msger; } }. pancakeFeeTo() calls feeTo() on the computed _dex contract, so that contract picks which account's tokens move, without that account's approval.
  4. For every transaction not originated by scane, _tokenTransfer calls IPancakeRouter02(_route).swap(sender, recipient, tAmount);. This runs after the balances change, so its revert, or a missing contract, would revert any sell or transfer by holders. Its return flags then move tokens between FTM, VIP and scane, including uint256 p = (_tOwned[VIP] * 85) / 100; _tOwned[scane] += p;, so a share of the VIP balance can be moved to the deployer.
  5. receive() external payable { scane.call{value: msg.value}(""); } forwards any BNB sent to the token to the deployer address.

(per the De.Fi listing, no proof link):

  1. The listing says the token creator deployed the contract, the 70M tokens went to the contract that created the AI/WBNB pair, and the pair was funded with 70M $AI and 100 BNB.
  2. After buying, the listing says the team swapped more than 361k $AI for 373 BNB (profit 273 BNB, about 88K USD), the swap transaction also destroyed contracts, and the funds moved on to other addresses. The BscScan transaction pages returned 403 and could not be opened to confirm these steps.

Protocol details

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

Build your security review skills

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