Fomo3D player-in-a-transaction where the proceeds are hardcoded: the child buys, withdraws, and selfdestructs to the operator's address, not the caller's.
Historical Significance
Read next to the bots that refund the caller, this is the same machinery pointed the other way. The mechanism is identical and the economics are inverted, which is a compact illustration of how little of a contract's behaviour is visible from its interface: LetsGo takes no arguments and returns nothing, and the only thing that distinguishes generosity from extraction is one address literal in the child.
Key Facts
Description
LetsGo forwards whatever it was sent into a newly deployed child. The child's constructor names the game and the affiliate address as literals, buys keys with the incoming value for team two, calls withdraw, and then selfdestructs.
The destination of that selfdestruct is the interesting part. Sibling bots send the balance to tx.origin, so whoever pays the gas collects. This one sends it to the same fixed address it names as the affiliate, which means the caller funds the play and the operator keeps both the referral and whatever the game paid out.
Both game calls are typed interface calls with the usual code-size check, so a game that has been destroyed makes the whole transaction revert rather than silently swallowing the ether.
Source Verified
Byzantium Era
First Metropolis hard fork. Added zk-SNARK precompiles, REVERT opcode, and staticcall.
Bytecode Overview
Verified Source Available
This contract has verified source code.
View Verification ProofShow source code (Solidity)
// Submitted by EthereumHistory (ethereumhistory.com)
pragma solidity ^0.4.24;
contract Game {
function buyXaddr(address _affCode, uint256 _team) public payable;
function withdraw() public;
}
contract Player {
constructor() public payable {
Game game = Game(0xDd9fd6b6F8f7ea932997992bbE67EabB3e316f3C);
game.buyXaddr.value(msg.value)(0xeB54F65775e6A2A42e243823D86486A64Fd1f0d6, 2);
game.withdraw();
selfdestruct(0xeB54F65775e6A2A42e243823D86486A64Fd1f0d6);
}
}
contract Bot {
function LetsGo() public payable {
(new Player).value(msg.value)();
}
}