Spaces:
Runtime error
Runtime error
/** | |
*Submitted for verification at Etherscan.io on 2017-11-25 | |
*/ | |
pragma solidity ^0.4.11; | |
contract simplelottery { | |
enum State { Started, Locked } | |
State public state = State.Started; | |
struct Guess{ | |
address addr; | |
//uint guess; | |
} | |
uint arraysize=1000; | |
uint constant maxguess=1000000; | |
uint bettingprice = 1 ether; | |
Guess[1000] guesses; | |
uint numguesses = 0; | |
bytes32 curhash = ''; | |
uint _gameindex = 1; | |
uint _starttime = 0; | |
modifier inState(State _state) { | |
require(state == _state); | |
_; | |
} | |
address developer = 0x0; | |
address _winner = 0x0; | |
event SentPrizeToWinner(address winner, uint money, uint gameindex, uint lotterynumber, uint starttime, uint finishtime); | |
event SentDeveloperFee(uint amount, uint balance); | |
function simplelottery() | |
{ | |
if(developer==address(0)){ | |
developer = msg.sender; | |
state = State.Started; | |
_starttime = block.timestamp; | |
} | |
} | |
function setBettingCondition(uint _contenders, uint _bettingprice) | |
{ | |
if(msg.sender != developer) | |
return; | |
arraysize = _contenders; | |
if(arraysize>1000) | |
arraysize = 1000; | |
bettingprice = _bettingprice; | |
} | |
function findWinner(uint value) | |
{ | |
uint i = value % numguesses; | |
_winner = guesses[i].addr; | |
} | |
function getMaxContenders() constant returns(uint){ | |
return arraysize; | |
} | |
function getBettingPrice() constant returns(uint){ | |
return bettingprice; | |
} | |
function getDeveloperAddress() constant returns(address) | |
{ | |
return developer; | |
} | |
function getDeveloperFee() constant returns(uint) | |
{ | |
uint developerfee = this.balance/100; | |
return developerfee; | |
} | |
function getBalance() constant returns(uint) | |
{ | |
return this.balance; | |
} | |
function getLotteryMoney() constant returns(uint) | |
{ | |
uint developerfee = getDeveloperFee(); | |
uint prize = (this.balance - developerfee); | |
return prize; | |
} | |
function getBettingStatus() | |
constant | |
returns (uint, uint, uint, uint, uint, uint, uint) | |
{ | |
return ((uint)(state), _gameindex, _starttime, numguesses, getLotteryMoney(), this.balance, bettingprice); | |
} | |
function finish() | |
{ | |
if(msg.sender != developer) | |
return; | |
_finish(); | |
} | |
function _finish() private | |
{ | |
state = State.Locked; | |
uint block_timestamp = block.timestamp; | |
uint lotterynumber = (uint(curhash)+block_timestamp)%(maxguess+1); | |
findWinner(lotterynumber); | |
uint prize = getLotteryMoney(); | |
uint numwinners = 1; | |
uint remain = this.balance - (prize*numwinners); | |
_winner.transfer(prize); | |
SentPrizeToWinner(_winner, prize, _gameindex, lotterynumber, _starttime, block_timestamp); | |
// give delveoper the money left behind | |
developer.transfer(remain); | |
SentDeveloperFee(remain, this.balance); | |
numguesses = 0; | |
_gameindex++; | |
state = State.Started; | |
_starttime = block.timestamp; | |
} | |
function () payable | |
{ | |
_addguess(); | |
} | |
function addguess() | |
inState(State.Started) | |
payable | |
{ | |
_addguess(); | |
} | |
function _addguess() private | |
inState(State.Started) | |
{ | |
require(msg.value >= bettingprice); | |
curhash = sha256(block.timestamp, block.coinbase, block.difficulty, curhash); | |
if((uint)(numguesses+1)<=arraysize) { | |
guesses[numguesses++].addr = msg.sender; | |
if((uint)(numguesses)>=arraysize){ | |
_finish(); | |
} | |
} | |
} | |
} |