pragma solidity ^0.4.2;
contract EtherRock {
struct Rock {
address owner;
bool currentlyForSale;
uint price;
uint timesSold;
}
mapping (uint => Rock) public rocks;
mapping (address => uint[]) public rockOwners;
uint public latestNewRockForSale;
address owner;
modifier onlyOwner {
require(msg.sender == owner);
_;
}
function EtherRock() {
rocks[0].price = 10**15;
rocks[0].currentlyForSale = true;
owner = msg.sender;
}
function getRockInfo (uint rockNumber) returns (address, bool, uint, uint) {
return (rocks[rockNumber].owner, rocks[rockNumber].currentlyForSale, rocks[rockNumber].price, rocks[rockNumber].timesSold);
}
function rockOwningHistory (address _address) returns (uint[]) {
return rockOwners[_address];
}
function buyRock (uint rockNumber) payable {
require(rocks[rockNumber].currentlyForSale = true);
require(msg.value == rocks[rockNumber].price);
rocks[rockNumber].currentlyForSale = false;
rocks[rockNumber].timesSold++;
if (rockNumber != latestNewRockForSale) {
rocks[rockNumber].owner.transfer(rocks[rockNumber].price);
}
rocks[rockNumber].owner = msg.sender;
rockOwners[msg.sender].push(rockNumber);
if (rockNumber == latestNewRockForSale) {
if (rockNumber != 99) {
latestNewRockForSale++;
rocks[latestNewRockForSale].price = 10**15 + (latestNewRockForSale**2 * 10**15);
rocks[latestNewRockForSale].currentlyForSale = true;
}
}
}
function sellRock (uint rockNumber, uint price) {
require(msg.sender == rocks[rockNumber].owner);
require(price > 0);
rocks[rockNumber].price = price;
rocks[rockNumber].currentlyForSale = true;
}
function dontSellRock (uint rockNumber) {
require(msg.sender == rocks[rockNumber].owner);
rocks[rockNumber].currentlyForSale = false;
}
function giftRock (uint rockNumber, address receiver) {
require(msg.sender == rocks[rockNumber].owner);
rocks[rockNumber].owner = receiver;
rockOwners[receiver].push(rockNumber);
}
function() payable {
}
function withdraw() onlyOwner {
owner.transfer(this.balance);
}
}
{
"compilationTarget": {
"EtherRock.sol": "EtherRock"
},
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"constant":false,"inputs":[{"name":"rockNumber","type":"uint256"},{"name":"receiver","type":"address"}],"name":"giftRock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"rockOwners","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"rockNumber","type":"uint256"}],"name":"dontSellRock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"rockNumber","type":"uint256"}],"name":"buyRock","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"rocks","outputs":[{"name":"owner","type":"address"},{"name":"currentlyForSale","type":"bool"},{"name":"price","type":"uint256"},{"name":"timesSold","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"rockNumber","type":"uint256"}],"name":"getRockInfo","outputs":[{"name":"","type":"address"},{"name":"","type":"bool"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"rockOwningHistory","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"latestNewRockForSale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"rockNumber","type":"uint256"},{"name":"price","type":"uint256"}],"name":"sellRock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"}]