Brother finance 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
- The constructor sets both
_address0and_address1to the owner (_address0 = owner; _address1 = owner;), so the_intscheck is skipped and the token behaves like a normal ERC-20 at launch. multiaddresslets the owner send tokens to a list of wallets and, for the firstAllowNof them, set_Addressint[receivers[i]] = true. On 2020-12-07 (transaction 0x88b67b7a…32283e) the deployer sent 1,300 BRO to ten wallets withAllowN= 10, so all ten were whitelisted.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.- For every transfer between two non-owner addresses,
_intsrequiressender == _address1 || sender == _router || _Addressint[sender]. A buy has the pair as sender and passes. A sell through the router moves tokens withtransferFrom(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. - The owner is exempt (
recipient != _address0 && sender != _address0must 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 calledremoveLiquidityETHWithPermit(transaction 0x2f368491…53135c) and received 36.39 WETH and 22,417.65 BRO.
Protocol details
Evidence
- report De.Fi REKT database entry for BRO (proof: CaptainJackAPE tweet, fxtwitter returned 404) twitter.com
- transaction Etherscan transaction 0x8928f7dd... (ints) etherscan.io
- transaction Etherscan transaction 0x88b67b7a... (multiaddress) etherscan.io
- transaction Etherscan transaction 0x2f368491... (removeLiquidityETHWithPermit) etherscan.io
- address Etherscan verified code for ERC20 (BRO) 0x5225741356d335663BEec2C787Db444CF714b329 etherscan.io
- address Etherscan address page for 0xaeae31febc1a58f372fd2823c6723bd120049b3d (Uniswap V2: BRO pair) etherscan.io
- analysis Web Archive web.archive.org
- analysis Sourcify match for 0x5225741356d335663BEec2C787Db444CF714b329 repo.sourcify.dev
Build your security review skills
Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.