ChainGPT Rug Pull

Reported loss $43K
Rugpull

What happened

CGPT is a BEP20 token on BNB Smart Chain, listed by CertiK Alert and De.Fi's REKT database as a liquidity removal by the deployer on 2023-03-18. CertiK Alert reported about 43.4K USD removed by the deployer from contract 0x6e70ee54…29eBBF and cautioned that it should not be confused with projects of a similar name. De.Fi's listing adds that the deployer removed liquidity from the pair contract and sold a large quantity of tokens, which dropped the price by roughly 90%, and gives the deployer address 0xd9618606…1f1918 and an example liquidity-removal transaction 0x32730a68…6e1e18.

In the verified source, the owner-only mint function and the owner-managed whitelist and blacklist sit in the token, while the actual transfer and transferFrom logic is delegated to a swappable proxyAddr contract whose code is not part of the verified source, so holders could not read the real transfer rules.

How it happened

What the code allows:

  1. The constructor mints 1,000,000,000 tokens to the deployer and whitelists it: _totalSupply = 1000000000e18; _balances[_msgSender()] = _totalSupply; _whitelist[_msgSender()] = true;.
  2. transfer and transferFrom contain no balance logic. Each is a call such as proxyAddr.delegatecall(abi.encodeWithSignature("transfer(address,uint256)",recipient,amount)), so whatever code sits at proxyAddr runs against the token's own storage: balances, allowances, _blacklist, _whitelist and _totalSupply. proxyAddr is not set in the constructor and its code is not in the verified files.
  3. The proxy address is changeable: function setProxyAddr(address _addr) public { require(_whitelist[msg.sender] == true, "No permission."); proxyAddr = _addr; }. Whitelisted addresses can repoint it at any time, and the owner controls the whitelist through addWhitelist(address[] memory accounts) public onlyOwner.
  4. The owner can also maintain a blacklist with addBlacklist(address[] memory accounts) public onlyOwner, but _blacklist is not checked anywhere in the verified code; any enforcement would live in the proxy, which could not be read.
  5. function mint(address account, uint256 amount) onlyOwner public virtual returns (bool) has no cap, and Ownable offers only transferOwnership (it rejects the zero address), so ownership cannot be renounced. The current on-chain totalSupply read in the campaign metadata is about 2.5 trillion tokens against the 1 billion minted at deployment; this read does not show whether mint or the proxy produced the difference.

What was reported:

  1. CertiK Alert reported a large liquidity removal on CGPT, about 43.4K USD removed by the deployer. De.Fi's REKT database lists the deployer removing liquidity from the pair and selling a large quantity of tokens, with a price drop of about 90%. No transaction page was opened, so this analysis does not show whether mint, the blacklist or the proxy was used, or who held the LP tokens.

Protocol details

Classification Token
Protocol Type Launchpad
Affected asset / contract CGPT
Protocol links Website @Chain_GPT

Build your security review skills

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