Price for next empty location:3.03 Ether - Locations left:9849

What?

The One Million Ether Page is a smart contract in the ethereum blockchain at address: 0x709C7134053510FCe03b464982EAb6E3d89728a5

Abi:

[{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getProvisionBalance","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"buyImagePriv","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"noShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"collectProvisions","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"buySharePriv","outputs":[],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"setSale","type":"bool"},{"name":"to","type":"address"},{"name":"p","type":"uint256"}],"name":"setSaleImg","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"noSales","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"setSale","type":"bool"},{"name":"to","type":"address"},{"name":"p","type":"uint256"}],"name":"setSaleShare","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"shares","outputs":[{"name":"owner","type":"address"},{"name":"lastCashout","type":"uint256"},{"name":"sale","type":"bool"},{"name":"saleTo","type":"address"},{"name":"price","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"mssg","type":"string"}],"name":"setMessage","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"buyEmptyLocation","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"latestprice","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"locations","outputs":[{"name":"owner","type":"address"},{"name":"image","type":"string"},{"name":"message","type":"string"},{"name":"sale","type":"bool"},{"name":"saleTo","type":"address"},{"name":"price","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"},{"name":"img","type":"string"}],"name":"setImage","outputs":[],"payable":false,"type":"function"},{"inputs":[],"type":"constructor"},{"payable":false,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint256"},{"indexed":false,"name":"eventType","type":"string"}],"name":"Change","type":"event"}]

Its purpose is to manage the ownership and trading of 1 million pixels grouped into 10,000 locations of 10x10 pixels stored in the ethereum blockchain. At time of creation of the contract all of the 10,000 locations are up for sale. Everyone with an ether address and enough ether can obtain the ownership of one or more empty locations. The price for a location starts at 0.01 ether and rises with every sold location by 0.02 ether. So the 10th location will cost 0.19 ether the 100th 1.99 ether and the last location 199.99 ether. But what do you get for your ether?

If you buy a location you receive two privileges and the option to sell them.

Data-Privilege: First of all you can link arbitrary data to the location you own. There are two possible data values an owner can set: a 10x10 pixel image (max.5kB) which is displayed on this website and a message (max.500B) which can be a link to another website for example. Linking data to your location is free of charge (besides the gas for the transaction).

Share-Privilege: The second privilege you obtain by buying a foremost empty location is the right to receive commisions for every sale of a location in the future.Tell me more on commisions please!

Trading: Yes that’s right. You can set up your privileges for sale separatly to any price you want on your own.

So how does all this work?


Prerequisites

There are several ways to interact with the contract. The easiest way to buy locations is using MetaMask and their chrome plugin or ethereums Mist Browser. The other functions like uploading images are not yet possible with MetaMask and Mist but will be available later.

To use them you need an ethereum client like Parity or Geth and their graphical or command line interfaces. Here is a demo video for Paritys graphical user interface.

How..

..to buy an empty location?

If you use MetaMask or Mist just click the "Buy me!" button in the locations tooltip and confirm the transaction. Thats it!

The locations are numbered from 0 to 9999 beginning at the upper left to the lower right.

To get the ownership information of a location call the constant locations(uint id) function of the contract where id is the id of the location.

If a location has no owner (indicated by the value "0x000.." in the field "owner" of a location) you can obtain the ownership of the location by buying it. The price depends on how many locations are already sold. The first location costs 0.01 ether and the following locations get 0.02 ether more expensive for every empty location sold. When all the empty locations are sold the contract collected 1 million ether (whereof 90% were distributed amongst the share owners Tell me more on commisions please!).

If you use Parity here is a short video.

The following instructions are all based on the usage of the JavaScript-API web3.js with a command line interface like the one included in Geth.

To get the actual price of an empty location you can call the constant latestprice() function of the contract.

You can obtain the ownership of an empty location by calling the buyLocation(uint id) method where id is the id of the location you want to buy and sending the right amount of ether (machting the actual prize) and gas (about 300000).

Console Example:

//unlock your account you want to buy the location from
personal.unlockAccount(eth.accounts[0],"passphrase",1000000);

//define the contract interface (using the abi shown at the beginning)
omepDef = eth.contract(abi_from_above);

//create the contract interface to interact with the contract at the given address
omep = omepDef.at("0x709C7134053510FCe03b464982EAb6E3d89728a5");

//show the ownership information of the location at the given id
omep.locations(id)[0];
> '0x0000000000000000000000000000000000000000'

//show the actual price
omep.latestprice();

//buy the location at the given id sending as much ether matching the actual price
omep.buyEmptyLocation(id,{from:eth.accounts[0], value: omep.latestprice(), gas:500000});

..to set the image or message of a location?

It is now possible for MetaMask or Mist users to upload the images directly via the website by clicking the button in the locations tooltip.

When you are the owner of the data-privilege of a location (this means that you control the ether address which bought the location or the data-privilege of the location) you can set the data linked to the location buy calling the function setImage(uint id, string b64encImg) of the contract from that address.

The intention is to link base64 encoded strings of 10x10 pixel *.png images to the locations so the website can render them. To encode a 10x10 pixel image to a base64 string you can use this website: online image encoder.

If you want to change the message field of a location it’s the same procedure despite calling setMessage(uint id, string mssg). If the message contains a link this website will connect the image of the loaction of the link making it clickable.

Console Example:

omep.setImage(id, "data:image/png;base64,iVBORw0K....", {from:eth.accounts[0], gas:500000});
omep.setMessage(id, "https://github.com/ethereum", {from:eth.accounts[0], gas:500000});

The maximum size of the data is limited to 5kB for the image field and 500B for the message field.


..to sell your privileges?

When you are the owner of a locations privilege, you can offer it for sale for any price to anyone you want on your own. To offer the data-privilege for sale just call the setSaleImg(uint id, bool sale, address to, uint price) from the address owning the data-privilege and set:

If you want to sell the share-privilege it’s the same procedure despite calling setSaleShare(uint id, bool sale, address to, uint price).

If your privilege is up for sale someone can buy it by calling buyImagePriv(uint id) or buySharePriv(uint id) and sending at least as much ether matching the price you set. The sale of a privilege is charged with a 10% fee. The fee is subtracted from the sales price and distributed among the holders of the Share-Privilege (9%) and the the contract owner (1%). The remainder of the sales price is credited to the account balance of the seller.

You can offer and sell your privileges from the time you obtained them.

Console Example:

//set the sales price for the data-privilege of the location at the given id to 100 ether as open offer
omep.setSaleImg(id, true, '0x0', web3.toWei('100', 'ether'), {from:eth.accounts[0], gas:500000});

//set the sales price for the share-privilege of the location at the given id to 100 ether as closed offer
omep.setSaleShare(id, true, '0xa5b...', web3.toWei('100', 'ether'), {from:eth.accounts[0], gas:500000});

..to buy privileges?

You can check if a locations data-privilege is up for sale by calling the constant locations(uint id) function of the contract. If the field "sale" is set to true and the field "saleTo" = 0x0 anyone can buy the data-privilege by calling buyImagePriv(uint id) and sending enough ether matching the price set in the field "price".

If an ether address is set in the field "saleTo" only the owner of this address can buy the data-privilege of the location buy calling the buyImagePriv(uint id) function and sending the ether from this address.

Console Example:

//retrieve the data of a location
loc = omep.locations(id);

//show the fields "sale", "saleTo", "price"
loc[3]
loc[4]
loc[5]

//buy the data-privilege of the location
omep.buyImagePriv(id, {from:eth.accounts[0], value:loc[5], gas:500000});

Buying the share-privilege works accordingly dispite calling the shares(uint id) function to retrieve the data of a share and buySharePriv(uint id) to buy the share-privilege.

Keep in mind that a share may hold uncollected commisions which would devolve to the new owner. Read more about commisions here.

Console Example:

//retrieve the data of a share
share = omep.shares(id);

//show the fields "sale", "saleTo", "price"
share[2]
share[3]
share[4]

//buy the data-privilege of the location
omep.buySharePriv(id, {from:eth.accounts[0], value:share[4], gas:500000});

..to receive commisions?

Every of the 10,000 locations is associated with a “share”. So there are also 10,000 shares besides the locations. If you buy an empty location you automatically become the owner of the corresponding share. You can view the ownership information of a share by calling the constant shares(uint id) function of the contract.

For every sale of an empty location or data- or share-privilege the owners of the shares get commisions.

For every sale of an empty location 90%! of the sales price is distributed equally amongst the shareholders. If there were 3 shareholders at the point of the sale (which happens when the 4th location is sold) every shareholder got 1/3 of the 90% commision.

For every sale of a data- or share-privilege 9% of the sales price is distributed equally amongst the shareholders.

Commisions are stored on a “per-share-basis”. By calling the constant getProvisionBalance(uint id) function of the contract the owner of a share can see how many commisions are credited (and not yet collected!) to the share.

By calling the constant balances(address add) function of the contract you can see the account balance of an address.

Paying out your commisions requires two steps:

You can collect the commisions of a share you own into your account balance by calling the collectProvisions(uint id) function of the contract. Crediting the commisions of a share into your account balance requires the transaction to be mined into the blockchain so it may take a few seconds.

You can pay out the account balance of an address you own by calling the withdrawBalance() function of the contract from that address.

Console Example:

//step 1.1 (optional) checking the commision balance of your share
omep.getProvisionBalance(id);

//step 1.2 collecting the commision balance of your share into your account balance
omep.collectProvisions(id, {from:eth.accounts[0], gas:500000});

//repeat the above for every share you own.

//step 2.1 (optional) check your account balance
omep.balances(eth.accounts[0]);

//step 2.2 withdraw your account balance
omep.withdrawBalance({from:eth.accounts[0], gas:500000});

..more on commisions

Examples:

If you were smart and bought the first empty location (for 0.01 ether), you owned at that point 100% of the shares (1 from 1). So when the second location was sold you obtained the whole 90% commision of the sales price (90% * 0.03 = 0,027). At that point you obtained more commisions than you spend buying the first location and reached break even and earn more ether with every sale in the future.

If there are 10% (1000) of the empty locations sold and you were able to snatch 60 of them. You own at that point 6% of the shares (60/1000) and obtain 5.4% (6% from 90%) of the sales price of the next empty location which will cost 19,99 ether resulting into (5.4% * 19.99) approx. 1,08 ether commision for you.

If all the empty locations are sold, every single share privilege is worth 0,01% (1/10000) of the future sales fees of sold privileges.