false
false
0

Contract Address Details

0x7ba45297070ecBa87cf32cd9D36279187a81F1A3

Contract Name
Lottery
Creator
0x7f0901–391c41 at 0x03ad18–3f8f88
Balance
0 CLO
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
16288105
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

Verify & Publish
0x6080604052600080546001600160a01b031916331781556203f48060035562015180600455601e6005556064600655683635c9adc5dea000006007556008805460ff19908116601417909155600c91909155600d8054909116905534801561006657600080fd5b50610dce806100766000396000f3fe6080604052600436106101665760003560e01c80639f24eb67116100d1578063ce253f0d1161008a578063e037147211610064578063e0371472146103bc578063e2eb41ff146103d1578063ef0c67e114610404578063f71492201461041957610166565b8063ce253f0d14610392578063d0e30db014610166578063d1205e26146103a757610166565b80639f24eb67146102e1578063a2022a16146102f6578063a5b8600414610329578063b863bd371461033e578063b9802e3e14610368578063c15d80c31461037d57610166565b8063709c4e9111610123578063709c4e911461022b5780637cab348f146102545780638d9510d41461025c5780638da5cb5b1461028d5780638efdee23146102a25780639a74e1ed146102cc57610166565b8063214ab7d614610170578063278ecde1146101975780632d02c681146101c1578063319c068c146101d65780636021caab146101eb5780636893b41914610216575b61016e61042e565b005b34801561017c57600080fd5b50610185610654565b60408051918252519081900360200190f35b3480156101a357600080fd5b5061016e600480360360208110156101ba57600080fd5b503561065a565b3480156101cd57600080fd5b506101856107c0565b3480156101e257600080fd5b506101856107c6565b3480156101f757600080fd5b506102006107cc565b6040805160ff9092168252519081900360200190f35b34801561022257600080fd5b506101856107d5565b34801561023757600080fd5b506102406107db565b604080519115158252519081900360200190f35b61016e6107e0565b34801561026857600080fd5b50610271610852565b604080516001600160a01b039092168252519081900360200190f35b34801561029957600080fd5b50610271610861565b3480156102ae57600080fd5b50610240600480360360208110156102c557600080fd5b5035610870565b3480156102d857600080fd5b50610271610885565b3480156102ed57600080fd5b50610185610894565b34801561030257600080fd5b5061016e6004803603602081101561031957600080fd5b50356001600160a01b031661089a565b34801561033557600080fd5b50610200610a70565b34801561034a57600080fd5b506101856004803603602081101561036157600080fd5b5035610ac2565b34801561037457600080fd5b50610185610b1a565b34801561038957600080fd5b50610185610b20565b34801561039e57600080fd5b50610240610b26565b3480156103b357600080fd5b50610185610b2f565b3480156103c857600080fd5b50610185610b35565b3480156103dd57600080fd5b50610185600480360360208110156103f457600080fd5b50356001600160a01b0316610b3b565b34801561041057600080fd5b50610185610b50565b34801561042557600080fd5b50610185610b56565b6007543411610484576040805162461bcd60e51b815260206004820181905260248201527f4d696e696d756d2062657420636f6e646974696f6e206973206e6f74206d6574604482015290519081900360640190fd5b600854336000908152601060209081526040808320600954845290915290205460ff918216911610806104ca575060095433600090815260106020526040902060010154105b6105055760405162461bcd60e51b8152600401808060200182810382526023815260200180610d096023913960400191505060405180910390fd5b61050d610a70565b60ff1660011461054e5760405162461bcd60e51b8152600401808060200182810382526035815260200180610d2c6035913960400191505060405180910390fd5b60095433600090815260106020526040902060010154101561059a576009543360009081526010602090815260408083206001810185905593835292905220805460ff191690556105cb565b33600090815260106020908152604080832060095484529091529020805460ff8082166001011660ff199091161790555b600f8054336000908152601060209081526040808320600980548552600282018085528386208386528487205460ff908116885290865284872088905591548652845282852091845282852054168452909152902034918201600190910155815481019091556006546005546103e891830282900483039202600b805492909104909203019055565b600b5481565b806009541161069a5760405162461bcd60e51b815260040180806020018281038252602b815260200180610cb5602b913960400191505060405180910390fd5b6000818152600e602052604090205460ff16156106e85760405162461bcd60e51b8152600401808060200182810382526029815260200180610ce06029913960400191505060405180910390fd5b6000805b33600090815260106020908152604080832086845290915290205460ff908116908216101561075157336000908152601060209081526040808320868452600201825280832060ff8516845290915290208054600191820154039290920191016106ec565b506103e860055482028161076157fe5b336000818152601060209081526040808320888452600301909152808220805460ff191660011790555193909204909303929183156108fc0291849190818181858888f193505050501580156107bb573d6000803e3d6000fd5b505050565b600a5481565b60095481565b60085460ff1681565b60065481565b600190565b60095415806107f15750600d5460ff165b61082c5760405162461bcd60e51b8152600401808060200182810382526062815260200180610c536062913960800191505060405180910390fd5b60098054600101905542600a556000600f55600d805460ff1916905561085061042e565b565b6002546001600160a01b031681565b6000546001600160a01b031681565b600e6020526000908152604090205460ff1681565b6001546001600160a01b031681565b60055481565b600454600354600a54010142116108e25760405162461bcd60e51b8152600401808060200182810382526039815260200180610d616039913960400191505060405180910390fd5b6108ea6107db565b15610a1e576009546000908152600e60205260408120805460ff191660011790555b6001600160a01b0382166000908152601060209081526040808320600954845290915290205460ff9081169082161015610a1857610948610b56565b6001600160a01b03831660009081526010602090815260408083206009548452600201825280832060ff861684529091529020541080156109c5575061098c610b56565b6001600160a01b03831660009081526010602090815260408083206009548452600201825280832060ff86168452909152902060010154115b15610a1057600b546040516001600160a01b0384169180156108fc02916000818181858888f19350505050158015610a01573d6000803e3d6000fd5b50600d805460ff191660011790555b60010161090c565b50610a2c565b600d805460ff191660011790555b600d5460ff16610a6d5760405162461bcd60e51b8152600401808060200182810382526039815260200180610c1a6039913960400191505060405180910390fd5b50565b6000806000905042600a54108015610a8d5750600354600a540142105b15610a9a57506001610abd565b42600a54108015610ab45750600454600354600a54010142105b15610abd575060025b905090565b600c5460408051426020808301919091523360601b8284015260548083019490945282518083039094018452607490910190915281519101206000908190839081610b0957fe5b600c80546001019055069392505050565b60095490565b60035481565b600d5460ff1681565b600f5481565b60075481565b60106020526000908152604090206001015481565b60045481565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663658f17886040518163ffffffff1660e01b815260040160206040518083038186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d6020811015610bd157600080fd5b5051600f549091506000908190610bea90600101610ac2565b905080831115610c0557808381610bfd57fe5b069150610c12565b828181610c0e57fe5b0691505b509150509056fe5468652070726f76696465642061646472657373206973206e6f7420612077696e6e6572206f66207468652063757272656e7420726f756e6443616e6e6f742073746172742061206e657720726f756e64207768696c652072657761726420666f72207468652070726576696f7573206f6e65206973206e6f7420706169642e2043616c6c2066696e6973685f726f756e642066756e6374696f6e4f6e6c7920726566756e6473206f662066696e697368656420726f756e64732061726520616c6c6f7765644f6e6c7920726566756e6473206f66204641494c454420726f756e64732061726520616c6c6f776564546f6f206d756368206465706f7369747320647572696e67207468697320726f756e644465706f7369747320617265206f6e6c7920616c6c6f77656420647572696e6720746865206465706f736974696e67207068617365526f756e642063616e2062652066696e69736865642061667465722074686520656e74726f70792072657665616c207068617365206f6e6c79a265627a7a7231582031d6eed7cd9ae9ddfe3f0b9ac31b14442f9acdb2766692421d4ba21fdb87822964736f6c63430005110032

Deployed ByteCode

0x6080604052600436106101665760003560e01c80639f24eb67116100d1578063ce253f0d1161008a578063e037147211610064578063e0371472146103bc578063e2eb41ff146103d1578063ef0c67e114610404578063f71492201461041957610166565b8063ce253f0d14610392578063d0e30db014610166578063d1205e26146103a757610166565b80639f24eb67146102e1578063a2022a16146102f6578063a5b8600414610329578063b863bd371461033e578063b9802e3e14610368578063c15d80c31461037d57610166565b8063709c4e9111610123578063709c4e911461022b5780637cab348f146102545780638d9510d41461025c5780638da5cb5b1461028d5780638efdee23146102a25780639a74e1ed146102cc57610166565b8063214ab7d614610170578063278ecde1146101975780632d02c681146101c1578063319c068c146101d65780636021caab146101eb5780636893b41914610216575b61016e61042e565b005b34801561017c57600080fd5b50610185610654565b60408051918252519081900360200190f35b3480156101a357600080fd5b5061016e600480360360208110156101ba57600080fd5b503561065a565b3480156101cd57600080fd5b506101856107c0565b3480156101e257600080fd5b506101856107c6565b3480156101f757600080fd5b506102006107cc565b6040805160ff9092168252519081900360200190f35b34801561022257600080fd5b506101856107d5565b34801561023757600080fd5b506102406107db565b604080519115158252519081900360200190f35b61016e6107e0565b34801561026857600080fd5b50610271610852565b604080516001600160a01b039092168252519081900360200190f35b34801561029957600080fd5b50610271610861565b3480156102ae57600080fd5b50610240600480360360208110156102c557600080fd5b5035610870565b3480156102d857600080fd5b50610271610885565b3480156102ed57600080fd5b50610185610894565b34801561030257600080fd5b5061016e6004803603602081101561031957600080fd5b50356001600160a01b031661089a565b34801561033557600080fd5b50610200610a70565b34801561034a57600080fd5b506101856004803603602081101561036157600080fd5b5035610ac2565b34801561037457600080fd5b50610185610b1a565b34801561038957600080fd5b50610185610b20565b34801561039e57600080fd5b50610240610b26565b3480156103b357600080fd5b50610185610b2f565b3480156103c857600080fd5b50610185610b35565b3480156103dd57600080fd5b50610185600480360360208110156103f457600080fd5b50356001600160a01b0316610b3b565b34801561041057600080fd5b50610185610b50565b34801561042557600080fd5b50610185610b56565b6007543411610484576040805162461bcd60e51b815260206004820181905260248201527f4d696e696d756d2062657420636f6e646974696f6e206973206e6f74206d6574604482015290519081900360640190fd5b600854336000908152601060209081526040808320600954845290915290205460ff918216911610806104ca575060095433600090815260106020526040902060010154105b6105055760405162461bcd60e51b8152600401808060200182810382526023815260200180610d096023913960400191505060405180910390fd5b61050d610a70565b60ff1660011461054e5760405162461bcd60e51b8152600401808060200182810382526035815260200180610d2c6035913960400191505060405180910390fd5b60095433600090815260106020526040902060010154101561059a576009543360009081526010602090815260408083206001810185905593835292905220805460ff191690556105cb565b33600090815260106020908152604080832060095484529091529020805460ff8082166001011660ff199091161790555b600f8054336000908152601060209081526040808320600980548552600282018085528386208386528487205460ff908116885290865284872088905591548652845282852091845282852054168452909152902034918201600190910155815481019091556006546005546103e891830282900483039202600b805492909104909203019055565b600b5481565b806009541161069a5760405162461bcd60e51b815260040180806020018281038252602b815260200180610cb5602b913960400191505060405180910390fd5b6000818152600e602052604090205460ff16156106e85760405162461bcd60e51b8152600401808060200182810382526029815260200180610ce06029913960400191505060405180910390fd5b6000805b33600090815260106020908152604080832086845290915290205460ff908116908216101561075157336000908152601060209081526040808320868452600201825280832060ff8516845290915290208054600191820154039290920191016106ec565b506103e860055482028161076157fe5b336000818152601060209081526040808320888452600301909152808220805460ff191660011790555193909204909303929183156108fc0291849190818181858888f193505050501580156107bb573d6000803e3d6000fd5b505050565b600a5481565b60095481565b60085460ff1681565b60065481565b600190565b60095415806107f15750600d5460ff165b61082c5760405162461bcd60e51b8152600401808060200182810382526062815260200180610c536062913960800191505060405180910390fd5b60098054600101905542600a556000600f55600d805460ff1916905561085061042e565b565b6002546001600160a01b031681565b6000546001600160a01b031681565b600e6020526000908152604090205460ff1681565b6001546001600160a01b031681565b60055481565b600454600354600a54010142116108e25760405162461bcd60e51b8152600401808060200182810382526039815260200180610d616039913960400191505060405180910390fd5b6108ea6107db565b15610a1e576009546000908152600e60205260408120805460ff191660011790555b6001600160a01b0382166000908152601060209081526040808320600954845290915290205460ff9081169082161015610a1857610948610b56565b6001600160a01b03831660009081526010602090815260408083206009548452600201825280832060ff861684529091529020541080156109c5575061098c610b56565b6001600160a01b03831660009081526010602090815260408083206009548452600201825280832060ff86168452909152902060010154115b15610a1057600b546040516001600160a01b0384169180156108fc02916000818181858888f19350505050158015610a01573d6000803e3d6000fd5b50600d805460ff191660011790555b60010161090c565b50610a2c565b600d805460ff191660011790555b600d5460ff16610a6d5760405162461bcd60e51b8152600401808060200182810382526039815260200180610c1a6039913960400191505060405180910390fd5b50565b6000806000905042600a54108015610a8d5750600354600a540142105b15610a9a57506001610abd565b42600a54108015610ab45750600454600354600a54010142105b15610abd575060025b905090565b600c5460408051426020808301919091523360601b8284015260548083019490945282518083039094018452607490910190915281519101206000908190839081610b0957fe5b600c80546001019055069392505050565b60095490565b60035481565b600d5460ff1681565b600f5481565b60075481565b60106020526000908152604090206001015481565b60045481565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663658f17886040518163ffffffff1660e01b815260040160206040518083038186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d6020811015610bd157600080fd5b5051600f549091506000908190610bea90600101610ac2565b905080831115610c0557808381610bfd57fe5b069150610c12565b828181610c0e57fe5b0691505b509150509056fe5468652070726f76696465642061646472657373206973206e6f7420612077696e6e6572206f66207468652063757272656e7420726f756e6443616e6e6f742073746172742061206e657720726f756e64207768696c652072657761726420666f72207468652070726576696f7573206f6e65206973206e6f7420706169642e2043616c6c2066696e6973685f726f756e642066756e6374696f6e4f6e6c7920726566756e6473206f662066696e697368656420726f756e64732061726520616c6c6f7765644f6e6c7920726566756e6473206f66204641494c454420726f756e64732061726520616c6c6f776564546f6f206d756368206465706f7369747320647572696e67207468697320726f756e644465706f7369747320617265206f6e6c7920616c6c6f77656420647572696e6720746865206465706f736974696e67207068617365526f756e642063616e2062652066696e69736865642061667465722074686520656e74726f70792072657665616c207068617365206f6e6c79a265627a7a7231582031d6eed7cd9ae9ddfe3f0b9ac31b14442f9acdb2766692421d4ba21fdb87822964736f6c63430005110032