The original MyScheme pyramid contract with a 1 ETH entry fee, deployed on August 7, 2015.
Key Facts
Description
The earliest of four pyramid scheme variants deployed by the same developer in the first days of Ethereum. MyScheme implements a binary tree payout structure: investors send 1 ETH to join, and payouts cascade up the tree as new members join. The deployer (0x881b0a4e) deployed four variants: 1 ETH (this contract, block 49924), 10 ETH (block 49931), EarlyChainLetterSmall at 0.1 ETH (block 49936), and 100 ETH (block 60143). The source was published to Etherscan by the original author.
Source Verified
Exact creation bytecode match (925 bytes). Compiled with soljson v0.1.1+commit.6ff4cd6, optimizer ON. The original MyScheme pyramid contract with 1 ETH entry fee, deployed 7 blocks before the 10 ETH variant by the same deployer (0x881b0a4e). Source independently verified via Etherscan.
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 and exact bytecode matching.
View Verification ProofShow source code (Solidity)
contract MyScheme {
uint treeBalance;
uint numInvestorsMinusOne;
uint treeDepth;
address[] myTree;
function MyScheme() {
treeBalance = 0;
myTree.length = 6;
myTree[0] = msg.sender;
numInvestorsMinusOne = 0;
}
function getNumInvestors() constant returns (uint a){
a = numInvestorsMinusOne+1;
}
function() {
uint amount = msg.value;
if (amount>=1000000000000000000){
numInvestorsMinusOne+=1;
myTree[numInvestorsMinusOne]=msg.sender;
amount-=1000000000000000000;
treeBalance+=1000000000000000000;
if (numInvestorsMinusOne<=2){
myTree[0].send(treeBalance);
treeBalance=0;
treeDepth=1;
}
else if (numInvestorsMinusOne+1==myTree.length){
for(uint i=myTree.length-3*(treeDepth+1);i<myTree.length-treeDepth-2;i++){
myTree[i].send(500000000000000000);
treeBalance-=500000000000000000;
}
uint eachLevelGets = treeBalance/(treeDepth+1)-1;
uint numInLevel = 1;
for(i=0;i<myTree.length-treeDepth-2;i++){
myTree[i].send(eachLevelGets/numInLevel-1);
treeBalance -= eachLevelGets/numInLevel-1;
if (numInLevel*(numInLevel+1)/2 -1== i){
numInLevel+=1;
}
}
myTree.length+=treeDepth+3;
treeDepth+=1;
}
}
treeBalance+=amount;
}
}