Openfabric AI Rug Pull
What happened
On 2023-10-19, PeckShield flagged that wallet 0x76fA0caE…d841C5 swapped 1,000,000,000,000,000 OFN for about 278.4 BNB (about $58,681 at the time), after which the token price fell to roughly zero. De.Fi's REKT database lists the incident as a rug pull exit scam worth 58,644 USD (278.40 WBNB). It also lists that the deployer 0x975bf151…8a463C and the scammer addresses had earlier sent funds from Binance to themselves, that the deployer renounced ownership, that the proceeds were moved to another EOA and then split across several addresses, and that the draining transaction is 0x310ef4d1…91db07.
Scammer addresses listed: 0x76fA0caE…d841C5, 0xFcCe0c3B…8FD2d4 and 0x17F06EC1…a47831. The verified contract does not use a visible owner-controlled switch. Instead, every transfer asks an external helper contract what the sender's balance should be and stores the answer, so whoever controls that helper's logic can give any address a balance or give a victim a balance too low to sell.
Ownership renunciation does not remove this, because the contract has no owner-only functions to give up.
How it happened
- The constructor takes a second argument and stores it as a private address:
IWFIpAVOYnOUOnOIEopbM = (address(uint160(ac5cf7p)));. No function in the source can change it, and the helper contract's code is not part of the verified source. - Every transfer, including router sells that arrive through
transferFrom, runs_transfer, which does_balance[afclcncxfrom] = _4b5600ccc(afclcncxfrom, amount, _balance[afclcncxfrom]);. The helper's return value, not the stored balance, becomes the sender's balance. _4b5600ccccallsVmRnZHqrsPbKNzTAQfvOa(IWFIpAVOYnOUOnOIEopbM).a1c29f34eb3c(sender, amount, balance)and receives the sender, the amount and the current balance. The helper can therefore treat addresses differently: return a value belowamountsorequire(_balance[afclcncxfrom] >= amount, "ERC20: transfer amount exceeds balance")reverts for one holder, or return a huge value for another.- After the require, the contract runs
_balance[afclcncxfrom] -= amount;against that returned value. Total supply stays at_totalSupply = 1000000000 * 10**_decimals, so a sender can spend more than any real balance without the supply variable changing. - What happened, per PeckShield (opened): 0x76fA...41C5 swapped 1,000,000,000,000,000 OFN for about 278.4 BNB, a figure far above the 1,000,000,000 supply set in the constructor if the alert counts whole tokens. De.Fi's REKT database lists the incident as a rug pull and attributes it to a minted-and-sold balance. This worker did not open the draining transaction, so how the helper answered for that wallet is not shown by the source.
- Ownership renunciation by the deployer is listed by De.Fi. The source has no
onlyOwnerfunction other thanrenounceOwnershipandtransferOwnership, so renouncing removes no balance-control power; that control sits in the helper address fixed at deployment.
Protocol details
Evidence
- report PeckShield Alert post on Openfabric AI $OFN slippage (via fxtwitter mirror) twitter.com
- transaction bscscan.com transaction 0x310e…db07 bscscan.com
- address BscScan verified source for OFN token 0x91f8a9975604110c27630Efaa069d3F6A4B844E7 (local Sourcify copy, TOKEN.sol) bscscan.com
- address bscscan.com address 0x17F0…7831 bscscan.com
- address bscscan.com address 0x76fA…41C5 bscscan.com
- address bscscan.com address 0x975b…463C bscscan.com
- address bscscan.com address 0xFcCe…D2d4 bscscan.com
- analysis Sourcify repository entry for the same address repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.