$25
Implement an autonomous decentralized lottery (called Bogazici Lottery (BULOT) ) as a Solidity smart contract. One lottery round lasts two weeks and consists of two stages. A new lottery round starts right after the first stage of previous one is completed. A lottery ticket costs 10 TL.
Winner tickets will be selected by computing random numbers that determine each winner ticket. A random number is to be supplied by the ticket purchasers. The lottery should employ (i) ticket purchase and random number submission (ii) reveal stages. The details of how a random number can be generated in order to determine winners is given here:
https://ethereum.stackexchange.com/questions/191/how-can-i-securely-generate-a- randomnumber-in-my-smart-contract
The stages of each lottery round are scheduled as follows in an overlapping manner:
Ticket purchase and random number submission stage : One
Random number reveal stage : One Note that if previously submitted random numbers are not submitted correctly in the reveal stage, the chance of winning is lost. Also, no ticket refund is made in this case.
Purchase/
Random No
Submission
(1 week)
Reveal (1 week)
Purchase/
Random No
Submission
(1 week)
Reveal (1 week)
Lottery 1
Lottery 2
…. ...
Let M be the amount money collected from the sale of tickets at the current lottery. The ith prize Pi will be awarded to the winners as follows: \
Pi = ⌊M/2i⌋ + (⌊M/2i−1⌋ mod 2) i = 1,...,⌈lo g2(M )⌉
Note that a winning user should be able to withdraw his prize anytime after the lottery round ends. Also, it is possible that a ticket may win more than one ticket.
Your implementation should provide the following interface (and only the following interface) to the external world:
function buyTicket(bytes32 hash_rnd_number) public
function revealRndNumber(uint ticketno, uint rnd_number) public function getLastBoughtTicketNo(uint lottery_no) public view returns(uint) function getIthBoughtTicketNo(uint i,uint lottery_no) public view returns(uint)
function checkIfTicketWon(uint lottery_no, uint ticket_no) public view returns (uint amount) function withdrawTicketPrize(uint lottery_no, uint ticket_no) public
function getIthWinningTicket(uint i, uint lottery_no) public view returns (uint ticket_no,uint amount) function getCurrentLotteryNo() public view returns (uint lottery_no)
function getMoneyCollected(uint lottery_no) public view returns (uint amount)
You should also prepare a table of gas usages for the interface functions and discuss them.
Timestamping
Project file should include your names in it. Please timestamp your project file using https://opentimestamps.org/ before you submit it. Keep the project file and its corresponding timestamp .ots file.