ANT Token Rug Pull
What happened
ANT (ANT) is a BEP20 token on BNB Chain (contract 0xd029fdbf…8363fe) traded in an ANT/USDT pool on PancakeSwap. On 2023-04-17 CertiK Alert reported a price drop of more than 95% and roughly 36k BSC-USD transferred to the EOA 0x2c15a4d6…d1a7b6. De.Fi's REKT database lists the event as an exit scam/rugpull in which a deployer-related EOA, 0xb0b5ce4f…cea4ad, drained 36,496 USD from the pool; its example transaction is 0xa2fe7b49…75c372, and the listing says the funds (36,496 BUSD) were moved on to 0x2c15a4d6…d1a7b6.
The verified source gives the owner several levers over trading: setRates sets four transfer fees with no upper bound, and changePancakeSetting together with a whitelist can restrict buying and selling to approved addresses. The contract has no function that withdraws pool liquidity, so draining the pool depends on who holds the LP tokens, which the code does not show. owner() returned the zero address when read on 2026-09-30, so the owner-only functions cannot be called now; when ownership was renounced is not shown.
How it happened
What the code allows:
- The constructor mints the whole supply to the deployer (
_totalSupply = initNumber * 10**decimals();withinitNumber = 500 * 10**4,_balances[msg.sender] = _totalSupply;) and creates the pool pair withcreatePair(address(this), address(usdtAddress)). Liquidity itself is added outside the token contract, so the code does not lock or hold the LP tokens. - Any transfer between the pair and a non-whitelisted address is taxed by four fee lines such as
uint256 feeAmount = (amount * lpRate) / 10000;. The sender is debited the full amount (_balances[from] = fromBalance - amount;) while the recipient receivestoAmountafter the fees are subtracted. The defaults are 200 + 50 + 150 + 100 = 500 basis points (5%). setRatesisonlyOwnerand has no cap. If the four rates sum to 10000,toAmountbecomes 0 and the receiving side of a buy or sell gets nothing; above that,toAmount = toAmount - feeAmount;underflows and the transfer reverts under Solidity 0.8.17. The owner can exempt an address from this withaddFeeWhitelist.changePancakeSetting(bool _openPancake, uint256 _minPancakeCount)isonlyOwner. WithopenPancakeset to false, buys requireisPancakeWhitelist(to)and sells requirerequire(isPancakeWhitelist(from), "Not on the whitelist");, and the owner controls that list throughaddPancakeWhitelist. The constructor starts withopenPancake = true.
What was reported:
- CertiK Alert reported a price drop of more than 95% on 2023-04-17 and about 36k BSC-USD sent to 0x2c15a4d6…d1a7b6; De.Fi's REKT database lists 36,496 USD drained from the pool by a deployer-related EOA. No transaction was opened for this record, so which mechanism removed the funds (LP removal or a fee or trading-switch change) is not established.
Protocol details
Evidence
- report @CertiKAlert incident report twitter.com
- report CertiK Alert post on ANT slippage twitter.com
- transaction bscscan.com transaction 0xa2fe…c372 bscscan.com
- address ANT (ANT) verified source on BscScan bscscan.com
- address bscscan.com address 0x2c15…a7b6 bscscan.com
- address bscscan.com address 0xb0b5…a4ad bscscan.com
- analysis ANT (ANT) Sourcify repository entry repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.