ChainGPT Rug Pull
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:
- The constructor mints 1,000,000,000 tokens to the deployer and whitelists it:
_totalSupply = 1000000000e18; _balances[_msgSender()] = _totalSupply; _whitelist[_msgSender()] = true;. transferandtransferFromcontain no balance logic. Each is a call such asproxyAddr.delegatecall(abi.encodeWithSignature("transfer(address,uint256)",recipient,amount)), so whatever code sits atproxyAddrruns against the token's own storage: balances, allowances,_blacklist,_whitelistand_totalSupply.proxyAddris not set in the constructor and its code is not in the verified files.- 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 throughaddWhitelist(address[] memory accounts) public onlyOwner. - The owner can also maintain a blacklist with
addBlacklist(address[] memory accounts) public onlyOwner, but_blacklistis not checked anywhere in the verified code; any enforcement would live in the proxy, which could not be read. function mint(address account, uint256 amount) onlyOwner public virtual returns (bool)has no cap, andOwnableoffers onlytransferOwnership(it rejects the zero address), so ownership cannot be renounced. The current on-chaintotalSupplyread in the campaign metadata is about 2.5 trillion tokens against the 1 billion minted at deployment; this read does not show whethermintor the proxy produced the difference.
What was reported:
- 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
Evidence
- report @CertiKAlert incident report twitter.com
- report CertiK Alert post on large liquidity removal on ChainGPT (CGPT) twitter.com
- transaction bscscan.com transaction 0x3273…1e18 bscscan.com
- address ChainGPT (CGPT) verified contract source, ERC20Token.sol, BscScan bscscan.com
- address bscscan.com address 0xd961…1918 bscscan.com
- analysis Sourcify match for ChainGPT (CGPT) contract on BSC repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.