Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Lottery
- Optimization enabled
- true
- Compiler version
- v0.5.17+commit.d19bba13
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-09-26T15:32:31.186653Z
Contract source code
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.5.1; contract Entropy_interface { function get_entropy() public view returns (uint256); } contract Lottery { address public owner = msg.sender; address payable public entropy_contract; address payable public reward_pool_contract; // Token rewards go to the special "staking contract" uint256 public deposits_phase_duration = 3 days; // The length of a phase when deposits are accepted; uint256 public entropy_phase_duration = 1 days; // The length of a phase when entropy providers reveal their entropy inputs; uint256 public entropy_fee = 30; // (will be divided by 1000 during calculations i.e. 1 means 0.1%) | this reward goes to the entropy providers reward pool uint256 public token_reward_fee = 100; // This reward goes to staked tokens reward pool uint256 public min_allowed_bet = 1000 ether; // 1K CLO for now uint8 public max_allowed_deposits = 20; // A user can make 20 bets during a single round uint256 public current_round; uint256 public round_start_timestamp; uint256 public round_reward; uint256 private nonce = 0; bool public round_reward_paid = false; mapping (uint256 => bool) public round_successful; // Allows "refunds" of not succesful rounds. uint256 public current_interval_end; // Used for winner calculations struct interval { uint256 interval_start; uint256 interval_end; } struct player { mapping (uint256 => uint8) num_deposits; uint256 last_round; mapping (uint256 => mapping (uint8 => interval)) win_conditions; // This player is considered to be a winner when RNG provides a number that matches this intervals mapping (uint256 => bool) round_refunded; } mapping (address => player) public players; function() external payable { deposit(); } function get_round() public view returns (uint256) { return current_round; } function get_phase() public view returns (uint8) { // 0 - the lottery is not active / pending reward claim or new round start // 1 - a lottery round is in progress/ acquiring deposits // 2 - deposits are acquired / entropy revealing phase uint8 _status = 0; if(round_start_timestamp < now && now < round_start_timestamp + deposits_phase_duration) { _status = 1; } else if (round_start_timestamp < now && now < round_start_timestamp + deposits_phase_duration + entropy_phase_duration) { _status = 2; } return _status; } function deposit() public payable { require (msg.value > min_allowed_bet, "Minimum bet condition is not met"); require (players[msg.sender].num_deposits[current_round] < max_allowed_deposits || players[msg.sender].last_round < current_round, "Too much deposits during this round"); require (get_phase() == 1, "Deposits are only allowed during the depositing phase"); if(players[msg.sender].last_round < current_round) { players[msg.sender].last_round = current_round; players[msg.sender].num_deposits[current_round] = 0; } else { players[msg.sender].num_deposits[current_round]++; } // Assign the "winning interval" for the player players[msg.sender].win_conditions[current_round][players[msg.sender].num_deposits[current_round]].interval_start = current_interval_end; players[msg.sender].win_conditions[current_round][players[msg.sender].num_deposits[current_round]].interval_end = current_interval_end + msg.value; current_interval_end += msg.value; uint256 _reward_with_fees = msg.value; // TODO: replace it with SafeMath // TODO: update the contract to only send rewards upon completion of the round //send_token_reward(msg.value * token_reward_fee / 1000); _reward_with_fees -= msg.value * token_reward_fee / 1000; //send_entropy_reward(msg.value * entropy_fee / 1000); _reward_with_fees -= msg.value * entropy_fee / 1000; round_reward += _reward_with_fees; } function refund(uint256 _round) external { require(current_round > _round, "Only refunds of finished rounds are allowed"); require(!round_successful[_round], "Only refunds of FAILED rounds are allowed"); // Calculating the refund amount uint256 _reward = 0; for (uint8 i = 0; i < players[msg.sender].num_deposits[_round]; i++) { _reward += players[msg.sender].win_conditions[_round][i].interval_end - players[msg.sender].win_conditions[_round][i].interval_start; } // Subtract the entropy fee _reward -= _reward * entropy_fee / 1000; players[msg.sender].round_refunded[_round] = true; msg.sender.transfer(_reward); } function send_entropy_reward(uint256 _reward) internal { //entropy_contract.transfer(msg.value * entropy_fee / 1000); entropy_contract.transfer(_reward); } function send_token_reward(uint256 _reward) internal { //reward_pool_contract.transfer(msg.value * token_reward_fee / 1000); reward_pool_contract.transfer(_reward); } function start_new_round() public payable { require(current_round == 0 || round_reward_paid, "Cannot start a new round while reward for the previous one is not paid. Call finish_round function"); current_round++; round_start_timestamp = now; current_interval_end = 0; round_reward_paid = false; //require_entropy_provider(msg.sender); // Request the starter of a new round to also provide initial entropy // Initiate the first deposit of the round deposit(); } function finish_round(address payable _winner) public { // Important: finishing an active round does not automatically start a new one require(now > round_start_timestamp + deposits_phase_duration + entropy_phase_duration, "Round can be finished after the entropy reveal phase only"); //require(check_entropy_criteria(), "There is not enough entropy to ensure a fair winner calculation"); if(check_entropy_criteria()) { // Round is succsefully completed and there was enough entropy provided round_successful[current_round] = true; // Paying the winner // Safe loop, cannot be more than 20 iterations for (uint8 i = 0; i<players[_winner].num_deposits[current_round]; i++) { if(players[_winner].win_conditions[current_round][i].interval_start < RNG() && players[_winner].win_conditions[current_round][i].interval_end > RNG()) { _winner.transfer(round_reward); round_reward_paid = true; } } } else { // Round is completed without sufficient entropy => allow refunds and increase the round counter // round_successful[current_round] = false; // This values are `false` by default in solidity round_reward_paid = true; } require(round_reward_paid, "The provided address is not a winner of the current round"); } function pay_fees() internal { } function random(uint256 to) public returns (uint) { uint randomnumber = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, nonce))) % to; nonce++; return randomnumber; } function RNG() public returns (uint256) { // Primitive random number generator dependant on both `entropy` and `interval` for testing reasons uint256 _entropy = Entropy_interface(entropy_contract).get_entropy(); uint256 _result; // `entropy` is a random value; can be greater or less than `current_interval_end` uint256 _current_interval_end = random(current_interval_end + 1); if(_entropy > _current_interval_end) { _result = _entropy % _current_interval_end; } else { _result = _current_interval_end % _entropy; } return _result; } function check_entropy_criteria() public returns (bool) { // Needs to check the sufficiency of entropy for the round reward prizepool size return true; } modifier only_owner { require(msg.sender == owner); _; } modifier only_entropy_contract { require(msg.sender == entropy_contract); _; } }
Contract ABI
[{"type":"fallback","stateMutability":"payable","payable":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RNG","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"check_entropy_criteria","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"current_interval_end","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"current_round","inputs":[],"constant":true},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"deposit","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"deposits_phase_duration","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"entropy_contract","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"entropy_fee","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"entropy_phase_duration","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"finish_round","inputs":[{"type":"address","name":"_winner","internalType":"address payable"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"get_phase","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"get_round","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"max_allowed_deposits","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"min_allowed_bet","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"last_round","internalType":"uint256"}],"name":"players","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"random","inputs":[{"type":"uint256","name":"to","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"refund","inputs":[{"type":"uint256","name":"_round","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"reward_pool_contract","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"round_reward","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"round_reward_paid","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"round_start_timestamp","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"round_successful","inputs":[{"type":"uint256","name":"","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"start_new_round","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"token_reward_fee","inputs":[],"constant":true}]
Contract Creation Code
0x6080604052600080546001600160a01b031916331781556203f48060035562015180600455601e6005556064600655683635c9adc5dea000006007556008805460ff19908116601417909155600c91909155600d8054909116905534801561006657600080fd5b50610dce806100766000396000f3fe6080604052600436106101665760003560e01c80639f24eb67116100d1578063ce253f0d1161008a578063e037147211610064578063e0371472146103bc578063e2eb41ff146103d1578063ef0c67e114610404578063f71492201461041957610166565b8063ce253f0d14610392578063d0e30db014610166578063d1205e26146103a757610166565b80639f24eb67146102e1578063a2022a16146102f6578063a5b8600414610329578063b863bd371461033e578063b9802e3e14610368578063c15d80c31461037d57610166565b8063709c4e9111610123578063709c4e911461022b5780637cab348f146102545780638d9510d41461025c5780638da5cb5b1461028d5780638efdee23146102a25780639a74e1ed146102cc57610166565b8063214ab7d614610170578063278ecde1146101975780632d02c681146101c1578063319c068c146101d65780636021caab146101eb5780636893b41914610216575b61016e61042e565b005b34801561017c57600080fd5b50610185610654565b60408051918252519081900360200190f35b3480156101a357600080fd5b5061016e600480360360208110156101ba57600080fd5b503561065a565b3480156101cd57600080fd5b506101856107c0565b3480156101e257600080fd5b506101856107c6565b3480156101f757600080fd5b506102006107cc565b6040805160ff9092168252519081900360200190f35b34801561022257600080fd5b506101856107d5565b34801561023757600080fd5b506102406107db565b604080519115158252519081900360200190f35b61016e6107e0565b34801561026857600080fd5b50610271610852565b604080516001600160a01b039092168252519081900360200190f35b34801561029957600080fd5b50610271610861565b3480156102ae57600080fd5b50610240600480360360208110156102c557600080fd5b5035610870565b3480156102d857600080fd5b50610271610885565b3480156102ed57600080fd5b50610185610894565b34801561030257600080fd5b5061016e6004803603602081101561031957600080fd5b50356001600160a01b031661089a565b34801561033557600080fd5b50610200610a70565b34801561034a57600080fd5b506101856004803603602081101561036157600080fd5b5035610ac2565b34801561037457600080fd5b50610185610b1a565b34801561038957600080fd5b50610185610b20565b34801561039e57600080fd5b50610240610b26565b3480156103b357600080fd5b50610185610b2f565b3480156103c857600080fd5b50610185610b35565b3480156103dd57600080fd5b50610185600480360360208110156103f457600080fd5b50356001600160a01b0316610b3b565b34801561041057600080fd5b50610185610b50565b34801561042557600080fd5b50610185610b56565b6007543411610484576040805162461bcd60e51b815260206004820181905260248201527f4d696e696d756d2062657420636f6e646974696f6e206973206e6f74206d6574604482015290519081900360640190fd5b600854336000908152601060209081526040808320600954845290915290205460ff918216911610806104ca575060095433600090815260106020526040902060010154105b6105055760405162461bcd60e51b8152600401808060200182810382526023815260200180610d096023913960400191505060405180910390fd5b61050d610a70565b60ff1660011461054e5760405162461bcd60e51b8152600401808060200182810382526035815260200180610d2c6035913960400191505060405180910390fd5b60095433600090815260106020526040902060010154101561059a576009543360009081526010602090815260408083206001810185905593835292905220805460ff191690556105cb565b33600090815260106020908152604080832060095484529091529020805460ff8082166001011660ff199091161790555b600f8054336000908152601060209081526040808320600980548552600282018085528386208386528487205460ff908116885290865284872088905591548652845282852091845282852054168452909152902034918201600190910155815481019091556006546005546103e891830282900483039202600b805492909104909203019055565b600b5481565b806009541161069a5760405162461bcd60e51b815260040180806020018281038252602b815260200180610cb5602b913960400191505060405180910390fd5b6000818152600e602052604090205460ff16156106e85760405162461bcd60e51b8152600401808060200182810382526029815260200180610ce06029913960400191505060405180910390fd5b6000805b33600090815260106020908152604080832086845290915290205460ff908116908216101561075157336000908152601060209081526040808320868452600201825280832060ff8516845290915290208054600191820154039290920191016106ec565b506103e860055482028161076157fe5b336000818152601060209081526040808320888452600301909152808220805460ff191660011790555193909204909303929183156108fc0291849190818181858888f193505050501580156107bb573d6000803e3d6000fd5b505050565b600a5481565b60095481565b60085460ff1681565b60065481565b600190565b60095415806107f15750600d5460ff165b61082c5760405162461bcd60e51b8152600401808060200182810382526062815260200180610c536062913960800191505060405180910390fd5b60098054600101905542600a556000600f55600d805460ff1916905561085061042e565b565b6002546001600160a01b031681565b6000546001600160a01b031681565b600e6020526000908152604090205460ff1681565b6001546001600160a01b031681565b60055481565b600454600354600a54010142116108e25760405162461bcd60e51b8152600401808060200182810382526039815260200180610d616039913960400191505060405180910390fd5b6108ea6107db565b15610a1e576009546000908152600e60205260408120805460ff191660011790555b6001600160a01b0382166000908152601060209081526040808320600954845290915290205460ff9081169082161015610a1857610948610b56565b6001600160a01b03831660009081526010602090815260408083206009548452600201825280832060ff861684529091529020541080156109c5575061098c610b56565b6001600160a01b03831660009081526010602090815260408083206009548452600201825280832060ff86168452909152902060010154115b15610a1057600b546040516001600160a01b0384169180156108fc02916000818181858888f19350505050158015610a01573d6000803e3d6000fd5b50600d805460ff191660011790555b60010161090c565b50610a2c565b600d805460ff191660011790555b600d5460ff16610a6d5760405162461bcd60e51b8152600401808060200182810382526039815260200180610c1a6039913960400191505060405180910390fd5b50565b6000806000905042600a54108015610a8d5750600354600a540142105b15610a9a57506001610abd565b42600a54108015610ab45750600454600354600a54010142105b15610abd575060025b905090565b600c5460408051426020808301919091523360601b8284015260548083019490945282518083039094018452607490910190915281519101206000908190839081610b0957fe5b600c80546001019055069392505050565b60095490565b60035481565b600d5460ff1681565b600f5481565b60075481565b60106020526000908152604090206001015481565b60045481565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663658f17886040518163ffffffff1660e01b815260040160206040518083038186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d6020811015610bd157600080fd5b5051600f549091506000908190610bea90600101610ac2565b905080831115610c0557808381610bfd57fe5b069150610c12565b828181610c0e57fe5b0691505b509150509056fe5468652070726f76696465642061646472657373206973206e6f7420612077696e6e6572206f66207468652063757272656e7420726f756e6443616e6e6f742073746172742061206e657720726f756e64207768696c652072657761726420666f72207468652070726576696f7573206f6e65206973206e6f7420706169642e2043616c6c2066696e6973685f726f756e642066756e6374696f6e4f6e6c7920726566756e6473206f662066696e697368656420726f756e64732061726520616c6c6f7765644f6e6c7920726566756e6473206f66204641494c454420726f756e64732061726520616c6c6f776564546f6f206d756368206465706f7369747320647572696e67207468697320726f756e644465706f7369747320617265206f6e6c7920616c6c6f77656420647572696e6720746865206465706f736974696e67207068617365526f756e642063616e2062652066696e69736865642061667465722074686520656e74726f70792072657665616c207068617365206f6e6c79a265627a7a7231582031d6eed7cd9ae9ddfe3f0b9ac31b14442f9acdb2766692421d4ba21fdb87822964736f6c63430005110032
Deployed ByteCode
0x6080604052600436106101665760003560e01c80639f24eb67116100d1578063ce253f0d1161008a578063e037147211610064578063e0371472146103bc578063e2eb41ff146103d1578063ef0c67e114610404578063f71492201461041957610166565b8063ce253f0d14610392578063d0e30db014610166578063d1205e26146103a757610166565b80639f24eb67146102e1578063a2022a16146102f6578063a5b8600414610329578063b863bd371461033e578063b9802e3e14610368578063c15d80c31461037d57610166565b8063709c4e9111610123578063709c4e911461022b5780637cab348f146102545780638d9510d41461025c5780638da5cb5b1461028d5780638efdee23146102a25780639a74e1ed146102cc57610166565b8063214ab7d614610170578063278ecde1146101975780632d02c681146101c1578063319c068c146101d65780636021caab146101eb5780636893b41914610216575b61016e61042e565b005b34801561017c57600080fd5b50610185610654565b60408051918252519081900360200190f35b3480156101a357600080fd5b5061016e600480360360208110156101ba57600080fd5b503561065a565b3480156101cd57600080fd5b506101856107c0565b3480156101e257600080fd5b506101856107c6565b3480156101f757600080fd5b506102006107cc565b6040805160ff9092168252519081900360200190f35b34801561022257600080fd5b506101856107d5565b34801561023757600080fd5b506102406107db565b604080519115158252519081900360200190f35b61016e6107e0565b34801561026857600080fd5b50610271610852565b604080516001600160a01b039092168252519081900360200190f35b34801561029957600080fd5b50610271610861565b3480156102ae57600080fd5b50610240600480360360208110156102c557600080fd5b5035610870565b3480156102d857600080fd5b50610271610885565b3480156102ed57600080fd5b50610185610894565b34801561030257600080fd5b5061016e6004803603602081101561031957600080fd5b50356001600160a01b031661089a565b34801561033557600080fd5b50610200610a70565b34801561034a57600080fd5b506101856004803603602081101561036157600080fd5b5035610ac2565b34801561037457600080fd5b50610185610b1a565b34801561038957600080fd5b50610185610b20565b34801561039e57600080fd5b50610240610b26565b3480156103b357600080fd5b50610185610b2f565b3480156103c857600080fd5b50610185610b35565b3480156103dd57600080fd5b50610185600480360360208110156103f457600080fd5b50356001600160a01b0316610b3b565b34801561041057600080fd5b50610185610b50565b34801561042557600080fd5b50610185610b56565b6007543411610484576040805162461bcd60e51b815260206004820181905260248201527f4d696e696d756d2062657420636f6e646974696f6e206973206e6f74206d6574604482015290519081900360640190fd5b600854336000908152601060209081526040808320600954845290915290205460ff918216911610806104ca575060095433600090815260106020526040902060010154105b6105055760405162461bcd60e51b8152600401808060200182810382526023815260200180610d096023913960400191505060405180910390fd5b61050d610a70565b60ff1660011461054e5760405162461bcd60e51b8152600401808060200182810382526035815260200180610d2c6035913960400191505060405180910390fd5b60095433600090815260106020526040902060010154101561059a576009543360009081526010602090815260408083206001810185905593835292905220805460ff191690556105cb565b33600090815260106020908152604080832060095484529091529020805460ff8082166001011660ff199091161790555b600f8054336000908152601060209081526040808320600980548552600282018085528386208386528487205460ff908116885290865284872088905591548652845282852091845282852054168452909152902034918201600190910155815481019091556006546005546103e891830282900483039202600b805492909104909203019055565b600b5481565b806009541161069a5760405162461bcd60e51b815260040180806020018281038252602b815260200180610cb5602b913960400191505060405180910390fd5b6000818152600e602052604090205460ff16156106e85760405162461bcd60e51b8152600401808060200182810382526029815260200180610ce06029913960400191505060405180910390fd5b6000805b33600090815260106020908152604080832086845290915290205460ff908116908216101561075157336000908152601060209081526040808320868452600201825280832060ff8516845290915290208054600191820154039290920191016106ec565b506103e860055482028161076157fe5b336000818152601060209081526040808320888452600301909152808220805460ff191660011790555193909204909303929183156108fc0291849190818181858888f193505050501580156107bb573d6000803e3d6000fd5b505050565b600a5481565b60095481565b60085460ff1681565b60065481565b600190565b60095415806107f15750600d5460ff165b61082c5760405162461bcd60e51b8152600401808060200182810382526062815260200180610c536062913960800191505060405180910390fd5b60098054600101905542600a556000600f55600d805460ff1916905561085061042e565b565b6002546001600160a01b031681565b6000546001600160a01b031681565b600e6020526000908152604090205460ff1681565b6001546001600160a01b031681565b60055481565b600454600354600a54010142116108e25760405162461bcd60e51b8152600401808060200182810382526039815260200180610d616039913960400191505060405180910390fd5b6108ea6107db565b15610a1e576009546000908152600e60205260408120805460ff191660011790555b6001600160a01b0382166000908152601060209081526040808320600954845290915290205460ff9081169082161015610a1857610948610b56565b6001600160a01b03831660009081526010602090815260408083206009548452600201825280832060ff861684529091529020541080156109c5575061098c610b56565b6001600160a01b03831660009081526010602090815260408083206009548452600201825280832060ff86168452909152902060010154115b15610a1057600b546040516001600160a01b0384169180156108fc02916000818181858888f19350505050158015610a01573d6000803e3d6000fd5b50600d805460ff191660011790555b60010161090c565b50610a2c565b600d805460ff191660011790555b600d5460ff16610a6d5760405162461bcd60e51b8152600401808060200182810382526039815260200180610c1a6039913960400191505060405180910390fd5b50565b6000806000905042600a54108015610a8d5750600354600a540142105b15610a9a57506001610abd565b42600a54108015610ab45750600454600354600a54010142105b15610abd575060025b905090565b600c5460408051426020808301919091523360601b8284015260548083019490945282518083039094018452607490910190915281519101206000908190839081610b0957fe5b600c80546001019055069392505050565b60095490565b60035481565b600d5460ff1681565b600f5481565b60075481565b60106020526000908152604090206001015481565b60045481565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663658f17886040518163ffffffff1660e01b815260040160206040518083038186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d6020811015610bd157600080fd5b5051600f549091506000908190610bea90600101610ac2565b905080831115610c0557808381610bfd57fe5b069150610c12565b828181610c0e57fe5b0691505b509150509056fe5468652070726f76696465642061646472657373206973206e6f7420612077696e6e6572206f66207468652063757272656e7420726f756e6443616e6e6f742073746172742061206e657720726f756e64207768696c652072657761726420666f72207468652070726576696f7573206f6e65206973206e6f7420706169642e2043616c6c2066696e6973685f726f756e642066756e6374696f6e4f6e6c7920726566756e6473206f662066696e697368656420726f756e64732061726520616c6c6f7765644f6e6c7920726566756e6473206f66204641494c454420726f756e64732061726520616c6c6f776564546f6f206d756368206465706f7369747320647572696e67207468697320726f756e644465706f7369747320617265206f6e6c7920616c6c6f77656420647572696e6720746865206465706f736974696e67207068617365526f756e642063616e2062652066696e69736865642061667465722074686520656e74726f70792072657665616c207068617365206f6e6c79a265627a7a7231582031d6eed7cd9ae9ddfe3f0b9ac31b14442f9acdb2766692421d4ba21fdb87822964736f6c63430005110032