Advertisement
Guest User

Untitled

a guest
Oct 21st, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.75 KB | None | 0 0
  1. pragma solidity ^0.4.24;
  2.  
  3. contract CoinCasino {
  4. address public owner;
  5. bytes32[] public hashes;
  6. Bet[] public bets;
  7. mapping (bytes32 => uint) public headbets;
  8. mapping (bytes32 => uint) public tailbets;
  9. uint public housebalance;
  10. uint public reserved;
  11. uint public unclaimedbets;
  12. uint public gasbalance;
  13. uint public fee = 1 finney;
  14.  
  15. event newhash(bytes32 hash);
  16. event betplaced(address better, uint amount, bool guess);
  17. event betcashed(address better, uint amount);
  18.  
  19. constructor (bytes32 hash) public {
  20. hashes.push(keccak256(abi.encodePacked(hash))); //uploadhash logic doesnt work with only one hash.
  21. hashes.push(hash);
  22. owner = msg.sender;
  23. }
  24.  
  25. function() public payable {
  26. housebalance += msg.value;
  27. }
  28.  
  29. function createbet(bool guess) public payable {
  30. require(msg.value >= fee);
  31. uint amount = msg.value - fee;
  32. require(housecancover(amount, guess));
  33. gasbalance += fee;
  34. housebalance += amount;
  35. if(guess) {
  36. headbets[hashes[hashes.length - 1]] += amount;
  37. } else {
  38. tailbets[hashes[hashes.length - 1]] += amount;
  39. }
  40. Bet memory bet;
  41. bet.better = msg.sender;
  42. bet.hashheight = hashes.length - 1;
  43. bet.amount = amount;
  44. bet.headsortails = guess;
  45. bet.cashedout = false;
  46. bets.push(bet);
  47. emit betplaced(msg.sender, amount, guess);
  48. }
  49.  
  50. function cashinbet(uint id) public {
  51. Bet memory bet = bets[id];
  52. require(bet.better == msg.sender);
  53. require(!bet.cashedout);
  54. require(hashes.length-1 >= bet.hashheight + 2);
  55. bet.cashedout = true;
  56. if(hashtobool(hashes[bet.hashheight + 2]) == bet.headsortails) {
  57. unclaimedbets -= bet.amount *2;
  58. msg.sender.transfer(bet.amount*2);
  59. }
  60. emit betcashed(msg.sender, bet.amount * 2);
  61. }
  62.  
  63. function uploadhash(bytes32 hash) public {
  64. require(keccak256(abi.encodePacked(hash)) == hashes[hashes.length - 1]);
  65. hashes.push(hash);
  66. if(hashtobool(hashes[hashes.length - 1])) {
  67. housebalance -= headbets[hashes[hashes.length - 1 - 2]] * 2;
  68. unclaimedbets += headbets[hashes[hashes.length - 1 - 2]] * 2;
  69. } else {
  70. housebalance -= tailbets[hashes[hashes.length - 1 - 2]] * 2;
  71. unclaimedbets += tailbets[hashes[hashes.length - 1 - 2]] * 2;
  72. }
  73. if(headbets[hashes[hashes.length - 1 - 1]] >= tailbets[hashes[hashes.length - 1 - 1]]) {
  74. reserved = headbets[hashes[hashes.length - 1 - 1]] * 2;
  75. } else {
  76. reserved = tailbets[hashes[hashes.length - 1 - 1]] * 2;
  77. }
  78. owner.transfer(gasbalance);
  79. gasbalance = 0;
  80. emit newhash(hash);
  81. }
  82.  
  83. function hashtobool(bytes32 hash) pure internal returns (bool) {
  84. if(uint(hash)%2 == 0) {
  85. return true;
  86. } else {
  87. return false;
  88. }
  89. }
  90.  
  91. function housecancover(uint amount, bool guess) internal view returns (bool) {
  92. if(guess) {
  93. if((headbets[hashes[hashes.length - 1]] + amount)*2 <= housebalance + amount - reserved) {
  94. return true;
  95. }
  96. } else {
  97. if((tailbets[hashes[hashes.length - 1]] + amount)*2 < housebalance + amount - reserved) {
  98. return true;
  99. }
  100. }
  101. return false;
  102. }
  103.  
  104. /*function getbets() public view returns (Bet[]) {
  105. return bets;
  106. }*/
  107.  
  108. struct Bet {
  109. address better;
  110. uint hashheight;
  111. uint amount;
  112. bool headsortails;
  113. bool cashedout;
  114. }
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement