One of the earliest Ponzi schemes on Ethereum - a 102% payout contract where new deposits fund earlier investors, deployed on Frontier Day 4.
Historical Significance
One of the earliest known Ponzi/pyramid contracts on Ethereum mainnet, deployed just days after Frontier launch. Demonstrates that financial experiments (both legitimate and fraudulent) began on Day 1 of Ethereum.
Context
In the first days of Ethereum Frontier (August 2015), developers immediately began experimenting with financial contracts. Ponzi schemes were among the earliest deployed, alongside voting contracts, name registries, and token prototypes. This 102% payout scheme is structurally similar to other early Ponzi contracts like DynamicPyramid.
Key Facts
Description
A Ponzi scheme deployed at block 52,970 (August 8, 2015) on Ethereum Frontier. New investors send ETH via the payable fallback. Each deposit is promised a 102% return (msg.value + msg.value/50). Investors are stored in an outputs array with their payout amount. The contract automatically pays earlier investors from new deposits whenever the balance is sufficient, working through the queue sequentially. The totalOutstanding variable tracks the total amount still owed to unpaid investors. At 683 bytes, it is one of the simplest Ponzi implementations from Ethereum's first week. Same deployer (0x8674c218) as the MessageStore at rank 27.
Source Verified
near_exact_match: reconstructed source produces 677b runtime (target 683b = 99.1% match) with soljson v0.3.1 optimizer ON. All selectors confirmed via openchain.xyz. 6-byte diff likely from minor source expression variant.
Historian Categories
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Frontier Era
The initial release of Ethereum. A bare-bones implementation for technical users.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology (near-exact bytecode match).
Show source code (Solidity)
contract Ponzi {
struct Output { address addr; uint amount; }
Output[] public outputs;
uint public totalOutstanding = 0;
uint nextOutput = 0;
function() {
uint payout = msg.value + msg.value / 50;
outputs.push(Output({addr: msg.sender, amount: payout}));
totalOutstanding += payout;
while (this.balance >= outputs[nextOutput].amount) {
outputs[nextOutput].addr.send(outputs[nextOutput].amount);
totalOutstanding -= outputs[nextOutput].amount;
nextOutput++;
}
}
}