Brother finance Honeypot

Reported loss $8K
Ethereum
Honeypot

What happened

BRO's _transfer calls _ints, a check that does nothing while _address0 and _address1 are the same address; the constructor sets both to the owner. Once the owner calls ints(addressn) with a different address, any transfer where neither side is the owner reverts unless the sender is _address1, the Uniswap router, or a wallet the owner added through multiaddress. Etherscan shows the deployer 0xf77294Bf…5A637A calling multiaddress with AllowN set to 10 at 03:51:05 UTC on 2020-12-07 and ints at 04:01:30 UTC with the argument 0xaeae31fe…049b3d, which Etherscan lists as the Uniswap V2 BRO/WETH pair.

With the pair as _address1, buys (sender = pair) pass, while a sell, where the holder is the sender, reverts for any holder outside the ten wallets and the owner. On 2020-12-08 at 01:48:01 UTC the deployer removed liquidity, receiving 36.39 WETH and 22,417.65 BRO and burning 902.33 UNI-V2 tokens. De.Fi's REKT database lists the token as an exit scam/honeypot.

How it happened

  1. The constructor sets both _address0 and _address1 to the owner (_address0 = owner; _address1 = owner;), so the _ints check is skipped and the token behaves like a normal ERC-20 at launch.
  2. multiaddress lets the owner send tokens to a list of wallets and, for the first AllowN of them, set _Addressint[receivers[i]] = true. On 2020-12-07 (transaction 0x88b67b7a…32283e) the deployer sent 1,300 BRO to ten wallets with AllowN = 10, so all ten were whitelisted.
  3. ints(addressn) sets _address1. In transaction 0x8928f7dd…766e38 the deployer set it to 0xaeae31fe…049b3d, the Uniswap V2 BRO/WETH pair. From then on _address0 != _address1, so the restriction is armed.
  4. For every transfer between two non-owner addresses, _ints requires sender == _address1 || sender == _router || _Addressint[sender]. A buy has the pair as sender and passes. A sell through the router moves tokens with transferFrom(holder, pair, amount), so the sender is the holder, who is not the pair, not the router and not whitelisted: the call reverts with "ERC20: transfer from the zero address". Wallet-to-wallet transfers between ordinary holders revert the same way.
  5. The owner is exempt (recipient != _address0 && sender != _address0 must both hold for the check to run), and the router and pair are allowed as senders, so liquidity can still be pulled. On 2020-12-08 at 01:48:01 UTC the deployer called removeLiquidityETHWithPermit (transaction 0x2f368491…53135c) and received 36.39 WETH and 22,417.65 BRO.

Protocol details

Classification Token
Protocol Type Exit Scam/Honeypot
Affected asset / contract BRO
Protocol links Website

Build your security review skills

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