Back to Home

Fomo3dAirdropBot

0x82d3fba65200...c343c40243ea
ByzantiumSource VerifiedEdit this contract
Deployed July 21, 2018 (8 years ago)Block 6,004,959

August 2018 FoMo3D airdrop bot: every call spawns a throwaway contract that buys exactly 0.1 ether of keys, withdraws, and self destructs in the same transaction.

Byzantium EraVerified Source

Historical Significance

FoMo3D was the summer of 2018 in one contract, and this is the machinery that grew around it within weeks. The interesting part is not that someone automated buying, it is what the automation had to do to work. The lottery's randomness came from the buyer's address, so the bot manufactures buyers. Creating and destroying a contract per attempt was cheaper than losing the draw, which tells you what the airdrop pot was worth at the time.

It is also an early, unusually clear case of onchain pseudorandomness being defeated rather than predicted. Nothing here guesses the hash. It simply pays to re-roll, and the game had no way to tell a fresh contract from a new player.

Key Facts
Deployment Block
6,004,959
Deployment Date
Jul 21, 2018, 04:44 PM
Code Size
566.0 B

Description

One function, execute, and a hardcoded blob. The blob is the creation code of a second contract, written into memory word by word and handed to CREATE with whatever ether the call carried. That child contract's constructor calls buyXid on FoMo3Dlong at 0xa62142888aba8370742be823c1782d17a0389da1 with affiliate id 7172 and team 1, calls withdraw on the same contract, then self destructs to tx.origin. It exists for the length of one transaction.

The reason for the child is the airdrop. FoMo3D ran a side lottery on every purchase at or above 0.1 ether, and the draw was decided by hashing block data together with the buyer's address. A player has one address. A contract that creates a fresh contract for every attempt has a new address every time, and the observed calls are all exactly 0.1 ether, the minimum that qualifies.

Access is by tx.origin, not msg.sender, checked against five addresses compiled into the code. One of them is the address that deployed these. In practice they were not called directly at all: a separate controller contract created them in bulk and then called through them, which is why tx.origin rather than msg.sender is the thing being checked.

Source Verified

Solidityeh_crack_source_verified
Compiler: v0.4.24

Bytecode Overview

Opcodes566
Unique Opcodes155
Jump Instructions15
Storage Operations2

External Links

Related contracts