These are the first ever verifiable pyramid schemes with provably known rules! Each level has one more member than the previous one. Once a level fills up, each member in the preceding two layers gets half of their investment back. The remaining funds are distributed between all members in all of the preceding layers so that the members in the upper layers get a slightly larger amount. Anyone can verify that the code provided below is identical to the one in the Ethereum blockchain, by compiling it (with optimizations enabled), for example at

https://chriseth.github.io/browser-solidity/

and comparing the data with the output of:

eth.getCode("0x109c4f2ccc82c4d77bde15f306707320294aea3f")

This is the 1 ether scheme, the 0.1 and 10 schemes can be verified in the same way (by adding or removing zeros in the code provided below)

USAGE:

In a geth console, type one of the three following commands (either the 1 ether, 10 ether, or 0.1 ether pyramid):

eth.sendTransaction({from:eth.accounts[0], to:"0x109c4f2ccc82c4d77bde15f306707320294aea3f", value: 100000000000000000000})

eth.sendTransaction({from:eth.accounts[0], to:"0xa327075af2a223a1c83a36ada1126afe7430f955", value: 1000000000000000000000})

eth.sendTransaction({from:eth.accounts[0], to:"0xbaa54d6e90c3f4d7ebec11bd180134c7ed8ebb52", value: 10000000000000000000})

That's it! Make sure the amounts are precisely as written. Simply wait for other people to do the same, and watch your investment grow. You might need to increase the default gas amount.

In order to see the current number of investors, type the following commands in the geth console:

var myschemeContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"getNumInvestors","outputs":[{"name":"a","type":"uint256"}],"type":"function"},{"inputs":[],"type":"constructor"}]);

var c = myschemeContract.at("0x109c4f2ccc82c4d77bde15f306707320294aea3f")

c.getNumInvestors()

SOLIDITY CODE:

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;

}