Contract Source Code
Find Similiar Contracts
pragma solidity ^0.4.13;
library SafeMath {
function sub(uint a, uint b) internal returns (uint) {
assert(b <= a);
return a - b;
}
function add(uint a, uint b) internal returns (uint) {
uint c = a + b;
assert(c >= a);
return c;
}
}
contract ERC20Basic {
uint public totalSupply;
address public owner; //owner
address public animator; //animator
function balanceOf(address who) constant returns (uint);
function transfer(address to, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function commitDividend(address who) internal; // pays remaining dividend
}
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) constant returns (uint);
function transferFrom(address from, address to, uint value);
function approve(address spender, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
}
contract BasicToken is ERC20Basic {
using SafeMath for uint;
mapping(address => uint) balances;
modifier onlyPayloadSize(uint size) {
assert(msg.data.length >= size + 4);
_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
function transfer(address _to, uint _value) onlyPayloadSize(2 * 32) {
commitDividend(msg.sender);
balances[msg.sender] = balances[msg.sender].sub(_value);
if(_to == address(this)) {
commitDividend(owner);
balances[owner] = balances[owner].add(_value);
Transfer(msg.sender, owner, _value);
}
else {
commitDividend(_to);
balances[_to] = balances[_to].add(_value);
Transfer(msg.sender, _to, _value);
}
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint representing the amount owned by the passed address.
*/
function balanceOf(address _owner) constant returns (uint balance) {
return balances[_owner];
}
}
contract StandardToken is BasicToken, ERC20 {
mapping (address => mapping (address => uint)) allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint the amout of tokens to be transfered
*/
function transferFrom(address _from, address _to, uint _value) onlyPayloadSize(3 * 32) {
var _allowance = allowed[_from][msg.sender];
commitDividend(_from);
commitDividend(_to);
balances[_to] = balances[_to].add(_value);
balances[_from] = balances[_from].sub(_value);
allowed[_from][msg.sender] = _allowance.sub(_value);
Transfer(_from, _to, _value);
}
/**
* @dev Aprove the passed address to spend the specified amount of tokens on beahlf of msg.sender.
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
function approve(address _spender, uint _value) {
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
assert(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
}
/**
* @dev Function to check the amount of tokens than an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint specifing the amount of tokens still avaible for the spender.
*/
function allowance(address _owner, address _spender) constant returns (uint remaining) {
return allowed[_owner][_spender];
}
}
/**
* @title SmartBillions contract
*/
contract SmartBillions is StandardToken {
// metadata
string public constant name = "SmartBillions Token";
string public constant symbol = "PLAY";
uint public constant decimals = 0;
// contract state
struct Wallet {
uint208 balance; // current balance of user
uint16 lastDividendPeriod; // last processed dividend period of user's tokens
uint32 nextWithdrawBlock; // next withdrawal possible after this block number
}
mapping (address => Wallet) wallets;
struct Bet {
uint192 value; // bet size
uint32 betHash; // selected numbers
uint32 blockNum; // blocknumber when lottery runs
}
mapping (address => Bet) bets;
uint public walletBalance = 0; // sum of funds in wallets
// investment parameters
uint public investStart = 1; // investment start block, 0: closed, 1: preparation
uint public investBalance = 0; // funding from investors
uint public investBalanceMax = 200000 ether; // maximum funding
uint public dividendPeriod = 1;
uint[] public dividends; // dividens collected per period, growing array
// betting parameters
uint public maxWin = 0; // maximum prize won
uint public hashFirst = 0; // start time of building hashes database
uint public hashLast = 0; // last saved block of hashes
uint public hashNext = 0; // next available bet block.number
uint public hashBetSum = 0; // used bet volume of next block
uint public hashBetMax = 5 ether; // maximum bet size per block
uint[] public hashes; // space for storing lottery results
// constants
//uint public constant hashesSize = 1024 ; // DEBUG ONLY !!!
uint public constant hashesSize = 16384 ; // 30 days of blocks
uint public coldStoreLast = 0 ; // block of last cold store transfer
// events
event LogBet(address indexed player, uint bethash, uint blocknumber, uint betsize);
event LogLoss(address indexed player, uint bethash, uint hash);
event LogWin(address indexed player, uint bethash, uint hash, uint prize);
event LogInvestment(address indexed investor, address indexed partner, uint amount);
event LogRecordWin(address indexed player, uint amount);
event LogLate(address indexed player,uint playerBlockNumber,uint currentBlockNumber);
event LogDividend(address indexed investor, uint amount, uint period);
modifier onlyOwner() {
assert(msg.sender == owner);
_;
}
modifier onlyAnimator() {
assert(msg.sender == animator);
_;
}
// constructor
function SmartBillions() {
owner = msg.sender;
animator = msg.sender;
wallets[owner].lastDividendPeriod = uint16(dividendPeriod);
dividends.push(0); // not used
dividends.push(0); // current dividend
}
/* getters */
/**
* @dev Show length of allocated swap space
*/
function hashesLength() constant external returns (uint) {
return uint(hashes.length);
}
/**
* @dev Show balance of wallet
* @param _owner The address of the account.
*/
function walletBalanceOf(address _owner) constant external returns (uint) {
return uint(wallets[_owner].balance);
}
/**
* @dev Show last dividend period processed
* @param _owner The address of the account.
*/
function walletPeriodOf(address _owner) constant external returns (uint) {
return uint(wallets[_owner].lastDividendPeriod);
}
/**
* @dev Show block number when withdraw can continue
* @param _owner The address of the account.
*/
function walletBlockOf(address _owner) constant external returns (uint) {
return uint(wallets[_owner].nextWithdrawBlock);
}
/**
* @dev Show bet size.
* @param _owner The address of the player.
*/
function betValueOf(address _owner) constant external returns (uint) {
return uint(bets[_owner].value);
}
/**
* @dev Show block number of lottery run for the bet.
* @param _owner The address of the player.
*/
function betHashOf(address _owner) constant external returns (uint) {
return uint(bets[_owner].betHash);
}
/**
* @dev Show block number of lottery run for the bet.
* @param _owner The address of the player.
*/
function betBlockNumberOf(address _owner) constant external returns (uint) {
return uint(bets[_owner].blockNum);
}
/**
* @dev Print number of block till next expected dividend payment
*/
function dividendsBlocks() constant external returns (uint) {
if(investStart > 0) {
return(0);
}
uint period = (block.number - hashFirst) / (10 * hashesSize);
if(period > dividendPeriod) {
return(0);
}
return((10 * hashesSize) - ((block.number - hashFirst) % (10 * hashesSize)));
}
/* administrative functions */
/**
* @dev Change owner.
* @param _who The address of new owner.
*/
function changeOwner(address _who) external onlyOwner {
assert(_who != address(0));
commitDividend(msg.sender);
commitDividend(_who);
owner = _who;
}
/**
* @dev Change animator.
* @param _who The address of new animator.
*/
function changeAnimator(address _who) external onlyAnimator {
assert(_who != address(0));
commitDividend(msg.sender);
commitDividend(_who);
animator = _who;
}
/**
* @dev Set ICO Start block.
* @param _when The block number of the ICO.
*/
function setInvestStart(uint _when) external onlyOwner {
require(investStart == 1 && hashFirst > 0 && block.number < _when);
investStart = _when;
}
/**
* @dev Set maximum bet size per block
* @param _maxsum The maximum bet size in wei.
*/
function setBetMax(uint _maxsum) external onlyOwner {
hashBetMax = _maxsum;
}
/**
* @dev Reset bet size accounting, to increase bet volume above safe limits
*/
function resetBet() external onlyOwner {
hashNext = block.number + 3;
hashBetSum = 0;
}
/**
* @dev Move funds to cold storage
* @dev investBalance and walletBalance is protected from withdraw by owner
* @dev if funding is > 50% admin can withdraw only 0.25% of balance weakly
* @param _amount The amount of wei to move to cold storage
*/
function coldStore(uint _amount) external onlyOwner {
houseKeeping();
require(_amount > 0 && this.balance >= (investBalance * 9 / 10) + walletBalance + _amount);
if(investBalance >= investBalanceMax / 2){ // additional jackpot protection
require((_amount <= this.balance / 400) && coldStoreLast + 4 * 60 * 24 * 7 <= block.number);
}
msg.sender.transfer(_amount);
coldStoreLast = block.number;
}
/**
* @dev Move funds to contract jackpot
*/
function hotStore() payable external {
houseKeeping();
}
/* housekeeping functions */
/**
* @dev Update accounting
*/
function houseKeeping() public {
if(investStart > 1 && block.number >= investStart + (hashesSize * 5)){ // ca. 14 days
investStart = 0; // start dividend payments
}
else {
if(hashFirst > 0){
uint period = (block.number - hashFirst) / (10 * hashesSize );
if(period > dividends.length - 2) {
dividends.push(0);
}
if(period > dividendPeriod && investStart == 0 && dividendPeriod < dividends.length - 1) {
dividendPeriod++;
}
}
}
}
/* payments */
/**
* @dev Pay balance from wallet
*/
function payWallet() public {
if(wallets[msg.sender].balance > 0 && wallets[msg.sender].nextWithdrawBlock <= block.number){
uint balance = wallets[msg.sender].balance;
wallets[msg.sender].balance = 0;
walletBalance -= balance;
pay(balance);
}
}
function pay(uint _amount) private {
uint maxpay = this.balance / 2;
if(maxpay >= _amount) {
msg.sender.transfer(_amount);
if(_amount > 1 finney) {
houseKeeping();
}
}
else {
uint keepbalance = _amount - maxpay;
walletBalance += keepbalance;
wallets[msg.sender].balance += uint208(keepbalance);
wallets[msg.sender].nextWithdrawBlock = uint32(block.number + 4 * 60 * 24 * 30); // wait 1 month for more funds
msg.sender.transfer(maxpay);
}
}
/* investment functions */
/**
* @dev Buy tokens
*/
function investDirect() payable external {
invest(owner);
}
/**
* @dev Buy tokens with affiliate partner
* @param _partner Affiliate partner
*/
function invest(address _partner) payable public {
//require(fromUSA()==false); // fromUSA() not yet implemented :-(
require(investStart > 1 && block.number < investStart + (hashesSize * 5) && investBalance < investBalanceMax);
uint investing = msg.value;
if(investing > investBalanceMax - investBalance) {
investing = investBalanceMax - investBalance;
investBalance = investBalanceMax;
investStart = 0; // close investment round
msg.sender.transfer(msg.value.sub(investing)); // send back funds immediately
}
else{
investBalance += investing;
}
if(_partner == address(0) || _partner == owner){
walletBalance += investing / 10;
wallets[owner].balance += uint208(investing / 10);} // 10% for marketing if no affiliates
else{
walletBalance += (investing * 5 / 100) * 2;
wallets[owner].balance += uint208(investing * 5 / 100); // 5% initial marketing funds
wallets[_partner].balance += uint208(investing * 5 / 100);} // 5% for affiliates
wallets[msg.sender].lastDividendPeriod = uint16(dividendPeriod); // assert(dividendPeriod == 1);
uint senderBalance = investing / 10**15;
uint ownerBalance = investing * 16 / 10**17 ;
uint animatorBalance = investing * 10 / 10**17 ;
balances[msg.sender] += senderBalance;
balances[owner] += ownerBalance ; // 13% of shares go to developers
balances[animator] += animatorBalance ; // 8% of shares go to animator
totalSupply += senderBalance + ownerBalance + animatorBalance;
Transfer(address(0),msg.sender,senderBalance); // for etherscan
Transfer(address(0),owner,ownerBalance); // for etherscan
Transfer(address(0),animator,animatorBalance); // for etherscan
LogInvestment(msg.sender,_partner,investing);
}
/**
* @dev Delete all tokens owned by sender and return unpaid dividends and 90% of initial investment
*/
function disinvest() external {
require(investStart == 0);
commitDividend(msg.sender);
uint initialInvestment = balances[msg.sender] * 10**15;
Transfer(msg.sender,address(0),balances[msg.sender]); // for etherscan
delete balances[msg.sender]; // totalSupply stays the same, investBalance is reduced
investBalance -= initialInvestment;
wallets[msg.sender].balance += uint208(initialInvestment * 9 / 10);
payWallet();
}
/**
* @dev Pay unpaid dividends
*/
function payDividends() external {
require(investStart == 0);
commitDividend(msg.sender);
payWallet();
}
/**
* @dev Commit remaining dividends before transfer of tokens
*/
function commitDividend(address _who) internal {
uint last = wallets[_who].lastDividendPeriod;
if((balances[_who]==0) || (last==0)){
wallets[_who].lastDividendPeriod=uint16(dividendPeriod);
return;
}
if(last==dividendPeriod) {
return;
}
uint share = balances[_who] * 0xffffffff / totalSupply;
uint balance = 0;
for(;last<dividendPeriod;last++) {
balance += share * dividends[last];
}
balance = (balance / 0xffffffff);
walletBalance += balance;
wallets[_who].balance += uint208(balance);
wallets[_who].lastDividendPeriod = uint16(last);
LogDividend(_who,balance,last);
}
/* lottery functions */
function betPrize(Bet _player, uint24 _hash) constant private returns (uint) { // house fee 13.85%
uint24 bethash = uint24(_player.betHash);
uint24 hit = bethash ^ _hash;
uint24 matches =
((hit & 0xF) == 0 ? 1 : 0 ) +
((hit & 0xF0) == 0 ? 1 : 0 ) +
((hit & 0xF00) == 0 ? 1 : 0 ) +
((hit & 0xF000) == 0 ? 1 : 0 ) +
((hit & 0xF0000) == 0 ? 1 : 0 ) +
((hit & 0xF00000) == 0 ? 1 : 0 );
if(matches == 6){
return(uint(_player.value) * 7000000);
}
if(matches == 5){
return(uint(_player.value) * 20000);
}
if(matches == 4){
return(uint(_player.value) * 500);
}
if(matches == 3){
return(uint(_player.value) * 25);
}
if(matches == 2){
return(uint(_player.value) * 3);
}
return(0);
}
/**
* @dev Check if won in lottery
*/
function betOf(address _who) constant external returns (uint) {
Bet memory player = bets[_who];
if( (player.value==0) ||
(player.blockNum<=1) ||
(block.number<player.blockNum) ||
(block.number>=player.blockNum + (10 * hashesSize))){
return(0);
}
if(block.number<player.blockNum+256){
return(betPrize(player,uint24(block.blockhash(player.blockNum))));
}
if(hashFirst>0){
uint32 hash = getHash(player.blockNum);
if(hash == 0x1000000) { // load hash failed :-(, return funds
return(uint(player.value));
}
else{
return(betPrize(player,uint24(hash)));
}
}
return(0);
}
/**
* @dev Check if won in lottery
*/
function won() public {
Bet memory player = bets[msg.sender];
if(player.blockNum==0){ // create a new player
bets[msg.sender] = Bet({value: 0, betHash: 0, blockNum: 1});
return;
}
if((player.value==0) || (player.blockNum==1)){
payWallet();
return;
}
require(block.number>player.blockNum); // if there is an active bet, throw()
if(player.blockNum + (10 * hashesSize) <= block.number){ // last bet too long ago, lost !
LogLate(msg.sender,player.blockNum,block.number);
bets[msg.sender] = Bet({value: 0, betHash: 0, blockNum: 1});
return;
}
uint prize = 0;
uint32 hash = 0;
if(block.number<player.blockNum+256){
hash = uint24(block.blockhash(player.blockNum));
prize = betPrize(player,uint24(hash));
}
else {
if(hashFirst>0){ // lottery is open even before swap space (hashes) is ready, but player must collect results within 256 blocks after run
hash = getHash(player.blockNum);
if(hash == 0x1000000) { // load hash failed :-(, return funds
prize = uint(player.value);
}
else{
prize = betPrize(player,uint24(hash));
}
}
else{
LogLate(msg.sender,player.blockNum,block.number);
bets[msg.sender] = Bet({value: 0, betHash: 0, blockNum: 1});
return();
}
}
bets[msg.sender] = Bet({value: 0, betHash: 0, blockNum: 1});
if(prize>0) {
LogWin(msg.sender,uint(player.betHash),uint(hash),prize);
if(prize > maxWin){
maxWin = prize;
LogRecordWin(msg.sender,prize);
}
pay(prize);
}
else{
LogLoss(msg.sender,uint(player.betHash),uint(hash));
}
}
/**
* @dev Send ether to buy tokens during ICO
* @dev or send less than 1 ether to contract to play
* @dev or send 0 to collect prize
*/
function () payable external {
if(msg.value > 0){
if(investStart>1){ // during ICO payment to the contract is treated as investment
invest(owner);
}
else{ // if not ICO running payment to contract is treated as play
play();
}
return;
}
//check for dividends and other assets
if(investStart == 0 && balances[msg.sender]>0){
commitDividend(msg.sender);}
won(); // will run payWallet() if nothing else available
}
/**
* @dev Play in lottery
*/
function play() payable public returns (uint) {
return playSystem(uint(sha3(msg.sender,block.number)), address(0));
}
/**
* @dev Play in lottery with random numbers
* @param _partner Affiliate partner
*/
function playRandom(address _partner) payable public returns (uint) {
return playSystem(uint(sha3(msg.sender,block.number)), _partner);
}
/**
* @dev Play in lottery with own numbers
* @param _partner Affiliate partner
*/
function playSystem(uint _hash, address _partner) payable public returns (uint) {
won(); // check if player did not win
uint24 bethash = uint24(_hash);
require(msg.value <= 1 ether && msg.value < hashBetMax);
if(msg.value > 0){
if(investStart==0) { // dividends only after investment finished
dividends[dividendPeriod] += msg.value / 20; // 5% dividend
}
if(_partner != address(0)) {
uint fee = msg.value / 100;
walletBalance += fee;
wallets[_partner].balance += uint208(fee); // 1% for affiliates
}
if(hashNext < block.number + 3) {
hashNext = block.number + 3;
hashBetSum = msg.value;
}
else{
if(hashBetSum > hashBetMax) {
hashNext++;
hashBetSum = msg.value;
}
else{
hashBetSum += msg.value;
}
}
bets[msg.sender] = Bet({value: uint192(msg.value), betHash: uint32(bethash), blockNum: uint32(hashNext)});
LogBet(msg.sender,uint(bethash),hashNext,msg.value);
}
putHash(); // players help collecing data
return(hashNext);
}
/* database functions */
/**
* @dev Create hash data swap space
* @param _sadd Number of hashes to add (<=256)
*/
function addHashes(uint _sadd) public returns (uint) {
require(hashFirst == 0 && _sadd > 0 && _sadd <= hashesSize);
uint n = hashes.length;
if(n + _sadd > hashesSize){
hashes.length = hashesSize;
}
else{
hashes.length += _sadd;
}
for(;n<hashes.length;n++){ // make sure to burn gas
hashes[n] = 1;
}
if(hashes.length>=hashesSize) { // assume block.number > 10
hashFirst = block.number - ( block.number % 10);
hashLast = hashFirst;
}
return(hashes.length);
}
/**
* @dev Create hash data swap space, add 128 hashes
*/
function addHashes128() external returns (uint) {
return(addHashes(128));
}
function calcHashes(uint32 _lastb, uint32 _delta) constant private returns (uint) {
return( ( uint(block.blockhash(_lastb )) & 0xFFFFFF )
| ( ( uint(block.blockhash(_lastb+1)) & 0xFFFFFF ) << 24 )
| ( ( uint(block.blockhash(_lastb+2)) & 0xFFFFFF ) << 48 )
| ( ( uint(block.blockhash(_lastb+3)) & 0xFFFFFF ) << 72 )
| ( ( uint(block.blockhash(_lastb+4)) & 0xFFFFFF ) << 96 )
| ( ( uint(block.blockhash(_lastb+5)) & 0xFFFFFF ) << 120 )
| ( ( uint(block.blockhash(_lastb+6)) & 0xFFFFFF ) << 144 )
| ( ( uint(block.blockhash(_lastb+7)) & 0xFFFFFF ) << 168 )
| ( ( uint(block.blockhash(_lastb+8)) & 0xFFFFFF ) << 192 )
| ( ( uint(block.blockhash(_lastb+9)) & 0xFFFFFF ) << 216 )
| ( ( uint(_delta) / hashesSize) << 240));
}
function getHash(uint _block) constant private returns (uint32) {
uint delta = (_block - hashFirst) / 10;
uint hash = hashes[delta % hashesSize];
if(delta / hashesSize != hash >> 240) {
return(0x1000000); // load failed, incorrect data in hashes
}
uint slotp = (_block - hashFirst) % 10;
return(uint32((hash >> (24 * slotp)) & 0xFFFFFF));
}
/**
* @dev Fill hash data
*/
function putHash() public returns (bool) {
uint lastb = hashLast;
if(lastb == 0 || block.number <= lastb + 10) {
return(false);
}
uint blockn256;
if(block.number<256) { // useless test for testnet :-(
blockn256 = 0;
}
else{
blockn256 = block.number - 256;
}
if(lastb < blockn256) {
uint num = blockn256;
num += num % 10;
lastb = num;
}
uint delta = (lastb - hashFirst) / 10;
hashes[delta % hashesSize] = calcHashes(uint32(lastb),uint32(delta));
hashLast = lastb + 10;
return(true);
}
/**
* @dev Fill hash data many times
* @param _num Number of iterations
*/
function putHashes(uint _num) external {
uint n=0;
for(;n<_num;n++){
if(!putHash()){
return;
}
}
}
} Contract ABI
[{"constant":false,"inputs":[{"name":"_partner","type":"address"}],"name":"invest","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_maxsum","type":"uint256"}],"name":"setBetMax","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"won","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"putHash","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"maxWin","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_partner","type":"address"}],"name":"playRandom","outputs":[{"name":"","type":"uint256"}],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"_hash","type":"uint256"},{"name":"_partner","type":"address"}],"name":"playSystem","outputs":[{"name":"","type":"uint256"}],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"animator","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"hashesSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_sadd","type":"uint256"}],"name":"addHashes","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"dividendsBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"betValueOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"}],"name":"changeAnimator","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_num","type":"uint256"}],"name":"putHashes","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"betOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"resetBet","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"hashes","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"walletBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"hashFirst","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"hashesLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"hashNext","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"walletBlockOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dividends","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"betBlockNumberOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"betHashOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"play","outputs":[{"name":"","type":"uint256"}],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"payWallet","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"investStart","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"addHashes128","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"hashLast","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"hotStore","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"hashBetMax","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"investDirect","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"investBalanceMax","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"walletBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"coldStore","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"coldStoreLast","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"houseKeeping","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"hashBetSum","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"payDividends","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"investBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"disinvest","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"dividendPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"walletPeriodOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_when","type":"uint256"}],"name":"setInvestStart","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"player","type":"address"},{"indexed":false,"name":"bethash","type":"uint256"},{"indexed":false,"name":"blocknumber","type":"uint256"},{"indexed":false,"name":"betsize","type":"uint256"}],"name":"LogBet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"player","type":"address"},{"indexed":false,"name":"bethash","type":"uint256"},{"indexed":false,"name":"hash","type":"uint256"}],"name":"LogLoss","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"player","type":"address"},{"indexed":false,"name":"bethash","type":"uint256"},{"indexed":false,"name":"hash","type":"uint256"},{"indexed":false,"name":"prize","type":"uint256"}],"name":"LogWin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"investor","type":"address"},{"indexed":true,"name":"partner","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogInvestment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"player","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogRecordWin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"player","type":"address"},{"indexed":false,"name":"playerBlockNumber","type":"uint256"},{"indexed":false,"name":"currentBlockNumber","type":"uint256"}],"name":"LogLate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"investor","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"period","type":"uint256"}],"name":"LogDividend","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}] Contract Creation Code
Switch To Opcodes View 6060604052600060075560016008556000600955692a5a058fc295ed000000600a556001600b556000600d556000600e556000600f5560006010556000601155674563918244f40000601255600060145534156200005c57600080fd5b5b60018054600160a060020a03338116600160a060020a0319928316811780855560028054909416909117909255600b5491166000908152600560205260409020805461ffff9092167a0100000000000000000000000000000000000000000000000000000260d060020a61ffff0219909216919091179055600c805490918101620000e983826200012c565b916000526020600020900160005b506000905550600c8054600181016200011183826200012c565b916000526020600020900160005b5060009055505b6200017d565b81548183558181151162000153576000838152602090206200015391810190830162000159565b5b505050565b6200017a91905b8082111562000176576000815560010162000160565b5090565b90565b612c1f806200018d6000396000f300606060405236156102825763ffffffff60e060020a60003504166303f9c793811461030057806306fdde03146103165780630751076d146103a1578063095ea7b3146103b957806312c8052f146103dd57806313e4b51f146103f257806316d190e31461041957806318160ddd1461043e57806323b872dd146104635780632406e9fa1461048d57806326699576146104b3578063313ce567146104dc57806331c2b6e61461050157806337c4308814610530578063380f3087146105555780633de8d3401461057d5780633e43b652146105a257806340c73d17146105d3578063413e90e7146105f45780634288d7591461060c57806343146f361461063d578063501895ae1461065257806366ce3bd21461067a5780636b486818146106ab57806370a08231146106d057806370ccd928146107015780637227c7ce14610726578063785ce7ca1461074b578063814b3fe01461077c5780638da5cb5b146107a45780638eecddcf146107d3578063904d22481461080457806393e84cd91461083557806395d89b411461084f5780639ce962ca146108da578063a367d99a146108ef578063a6f9dae114610914578063a9059cbb14610935578063b3470e9714610959578063bc8517181461097e578063be1eefbf146109a3578063bfba9029146109ad578063c27509cf146109d2578063c4164365146109dc578063cd0a314b14610a01578063cd88333e14610a26578063d6d2500814610a3e578063d9fa933514610a63578063dd62ed3e14610a78578063de46907114610aaf578063de88a34214610ad4578063df12b94e14610ae9578063df1ead8214610b0e578063e4cc98a514610b23578063e73cc2eb14610b48578063e76ece0114610b79575b5b60003411156102c057600160085411156102b1576001546102ac90600160a060020a0316610b91565b6102bb565b6102b9610f04565b505b6102fd565b6008541580156102e65750600160a060020a033316600090815260036020526040812054115b156102f4576102f433610f49565b5b6102fd611118565b5b005b6102fd600160a060020a0360043516610b91565b005b341561032157600080fd5b6103296116b8565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103665780820151818401525b60200161034d565b50505050905090810190601f1680156103935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103ac57600080fd5b6102fd6004356116ef565b005b34156103c457600080fd5b6102fd600160a060020a0360043516602435611711565b005b34156102f457600080fd5b6102fd611118565b005b34156103fd57600080fd5b6104056117b0565b604051901515815260200160405180910390f35b341561042457600080fd5b61042c611857565b60405190815260200160405180910390f35b341561044957600080fd5b61042c61185d565b60405190815260200160405180910390f35b341561046e57600080fd5b6102fd600160a060020a0360043581169060243516604435611863565b005b61042c600160a060020a036004351661198e565b60405190815260200160405180910390f35b61042c600435600160a060020a03602435166119d4565b60405190815260200160405180910390f35b34156104e757600080fd5b61042c611c0d565b60405190815260200160405180910390f35b341561050c57600080fd5b610514611c12565b604051600160a060020a03909116815260200160405180910390f35b341561053b57600080fd5b61042c611c21565b60405190815260200160405180910390f35b341561056057600080fd5b61042c600435611c27565b60405190815260200160405180910390f35b341561058857600080fd5b61042c611ce9565b60405190815260200160405180910390f35b34156105ad57600080fd5b61042c600160a060020a0360043516611d39565b60405190815260200160405180910390f35b34156105de57600080fd5b6102fd600160a060020a0360043516611d61565b005b34156105ff57600080fd5b6102fd600435611dca565b005b341561061757600080fd5b61042c600160a060020a0360043516611df6565b60405190815260200160405180910390f35b341561064857600080fd5b6102fd611f4b565b005b341561065d57600080fd5b61042c600435611f73565b60405190815260200160405180910390f35b341561068557600080fd5b61042c600160a060020a0360043516611f96565b60405190815260200160405180910390f35b34156106b657600080fd5b61042c611fbe565b60405190815260200160405180910390f35b34156106db57600080fd5b61042c600160a060020a0360043516611fc4565b60405190815260200160405180910390f35b341561070c57600080fd5b61042c611fe3565b60405190815260200160405180910390f35b341561073157600080fd5b61042c611fea565b60405190815260200160405180910390f35b341561075657600080fd5b61042c600160a060020a0360043516611ff0565b60405190815260200160405180910390f35b341561078757600080fd5b61042c60043561201c565b60405190815260200160405180910390f35b34156107af57600080fd5b61051461203f565b604051600160a060020a03909116815260200160405180910390f35b34156107de57600080fd5b61042c600160a060020a036004351661204e565b60405190815260200160405180910390f35b341561080f57600080fd5b61042c600160a060020a036004351661207a565b60405190815260200160405180910390f35b61042c610f04565b60405190815260200160405180910390f35b341561085a57600080fd5b6103296120a6565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103665780820151818401525b60200161034d565b50505050905090810190601f1680156103935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108e557600080fd5b6102fd6120dd565b005b34156108fa57600080fd5b61042c612185565b60405190815260200160405180910390f35b341561091f57600080fd5b6102fd600160a060020a036004351661218b565b005b341561094057600080fd5b6102fd600160a060020a03600435166024356121f4565b005b341561096457600080fd5b61042c612370565b60405190815260200160405180910390f35b341561098957600080fd5b61042c612382565b60405190815260200160405180910390f35b6102fd612388565b005b34156109b857600080fd5b61042c612393565b60405190815260200160405180910390f35b6102fd612399565b005b34156109e757600080fd5b61042c6123b1565b60405190815260200160405180910390f35b3415610a0c57600080fd5b61042c6123b7565b60405190815260200160405180910390f35b3415610a3157600080fd5b6102fd6004356123bd565b005b3415610a4957600080fd5b61042c612496565b60405190815260200160405180910390f35b3415610a6e57600080fd5b6102fd61249c565b005b3415610a8357600080fd5b61042c600160a060020a0360043581169060243516612551565b60405190815260200160405180910390f35b3415610aba57600080fd5b61042c61257e565b60405190815260200160405180910390f35b3415610adf57600080fd5b6102fd612584565b005b3415610af457600080fd5b61042c6125a5565b60405190815260200160405180910390f35b3415610b1957600080fd5b6102fd6125ab565b005b3415610b2e57600080fd5b61042c61267d565b60405190815260200160405180910390f35b3415610b5357600080fd5b61042c600160a060020a0360043516612683565b60405190815260200160405180910390f35b3415610b8457600080fd5b6102fd6004356126ad565b005b6000806000806001600854118015610baf5750600854620140000143105b8015610bbe5750600a54600954105b1515610bc957600080fd5b349350600954600a5403841115610c355760098054600a5491829055600060085590039350600160a060020a0333166108fc610c0b348763ffffffff6126f916565b9081150290604051600060405180830381858888f193505050501515610c3057600080fd5b610c3e565b60098054850190555b600160a060020a0385161580610c615750600154600160a060020a038681169116145b15610cc057600a845b60078054929091049091019055600a845b600154600160a060020a031660009081526005602052604090208054600160d060020a0319811693909204600160d060020a0392831601909116919091179055610d66565b6064600585025b600780549290910460020290910190556064600585025b600154600160a060020a031660009081526005602081905260409091208054600160d060020a0319811694909304600160d060020a039384160190921692909217905560649085025b600160a060020a03871660009081526005602052604090208054600160d060020a0319811693909204600160d060020a03928316019091169190911790555b600b54600160a060020a0333166000908152600560205260409020805461ffff90921660d060020a027bffff00000000000000000000000000000000000000000000000000001990921691909117905566038d7ea4c68000845b04925067016345785d8a0000601085025b04915067016345785d8a0000600a85025b600160a060020a0333811660008181526003602052604080822080548a01905560015484168252808220805489019055600254909316815282812080549590940494850190935582548688018501018355929350600080516020612bd48339815191529086905190815260200160405180910390a3600154600160a060020a03166000600080516020612bd48339815191528460405190815260200160405180910390a3600254600160a060020a03166000600080516020612bd48339815191528360405190815260200160405180910390a384600160a060020a031633600160a060020a03167f36a013c86c271c703c54dee591bc768e347954a0a9a1937dd17f5a29e9a8e6458660405190815260200160405180910390a35b5050505050565b6000610f433343604051600160a060020a03929092166c01000000000000000000000000028252601482015260340160405190819003902060006119d4565b90505b90565b600160a060020a038116600090815260056020908152604080832054600390925282205460d060020a90910461ffff16919081901580610f87575082155b15610fe157600b54600160a060020a0385166000908152600560205260409020805461ffff90921660d060020a027bffff000000000000000000000000000000000000000000000000000019909216919091179055611112565b600b54831415610ff057611112565b60008054600160a060020a0386168252600360205260409091205463ffffffff0281151561101a57fe5b049150600090505b600b5483101561105957600c80548490811061103a57fe5b906000526020600020900160005b50548202015b600190920191611022565b63ffffffff815b60078054929091049182019055600160a060020a038516600081815260056020526040908190208054600160d060020a03198116600160d060020a039182168601909116177bffff0000000000000000000000000000000000000000000000000000191660d060020a61ffff891602179055919250907fe1e87f40e4de2a6b68365d854f85940aad44d84933d399007702c6d340da445f90839086905191825260208201526040908101905180910390a25b50505050565b611120612b3e565b600160a060020a03331660009081526006602052604080822082916060905190810160409081529154600160c060020a038116825263ffffffff60c060020a82048116602084015260e060020a9091041691810191825293505163ffffffff161515611226576060604051908101604090815260008083526020808401829052600183850152600160a060020a0333168252600690522081518154600160c060020a031916600160c060020a03919091161781556020820151815463ffffffff9190911660c060020a0260c060020a63ffffffff02199091161781556040820151815463ffffffff9190911660e060020a02600160e060020a03909116179055506116b2565b8251600160c060020a031615806112475750826040015163ffffffff166001145b15611259576112546120dd565b6116b2565b826040015163ffffffff16431161126f57600080fd5b4362028000604085015163ffffffff1601116113745733600160a060020a03167f770d64c654906ebab085526dd881064f61f0e5990caa94c94167eb29bc4645c684604001514360405163ffffffff909216825260208201526040908101905180910390a26060604051908101604090815260008083526020808401829052600183850152600160a060020a0333168252600690522081518154600160c060020a031916600160c060020a03919091161781556020820151815463ffffffff9190911660c060020a0260c060020a63ffffffff02199091161781556040820151815463ffffffff9190911660e060020a02600160e060020a03909116179055506116b2565b50600090508060408301516101000163ffffffff164310156113b857826040015163ffffffff16406001900462ffffff1690506113b18382612710565b91506114fd565b6000600e54111561140e576113d6836040015163ffffffff16612865565b90508063ffffffff16630100000014156113fc578251600160c060020a03169150611409565b6113b18382612710565b91505b6114fd565b33600160a060020a03167f770d64c654906ebab085526dd881064f61f0e5990caa94c94167eb29bc4645c684604001514360405163ffffffff909216825260208201526040908101905180910390a26060604051908101604090815260008083526020808401829052600183850152600160a060020a0333168252600690522081518154600160c060020a031916600160c060020a03919091161781556020820151815463ffffffff9190911660c060020a0260c060020a63ffffffff02199091161781556040820151815463ffffffff9190911660e060020a02600160e060020a03909116179055506116b2565b5b6060604051908101604090815260008083526020808401829052600183850152600160a060020a0333168252600690522081518154600160c060020a031916600160c060020a03919091161781556020820151815463ffffffff9190911660c060020a0260c060020a63ffffffff02199091161781556040820151815463ffffffff9190911660e060020a02600160e060020a0390911617905550600082111561165d5733600160a060020a03167e362509948ea59afac5c6fa93fea5327b624bc705a6574f4e9f26e9d8bd7ccc846020015163ffffffff168363ffffffff168560405180848152602001838152602001828152602001935050505060405180910390a2600d5482111561164f57600d829055600160a060020a0333167f955214d16f858518f04c701d01a6e2f5668548b6be3c6f2f0f8981f77f2cfc068360405190815260200160405180910390a25b61125482612904565b6116b2565b33600160a060020a03167f7375ed8230669ea9d64a9db629d7ce9501779604a67c95c0111377cf09f5b9b9846020015163ffffffff168363ffffffff1660405191825260208201526040908101905180910390a25b5b505050565b60408051908101604052601381527f536d61727442696c6c696f6e7320546f6b656e00000000000000000000000000602082015281565b60015433600160a060020a0390811691161461170757fe5b60128190555b5b50565b80158015906117445750600160a060020a0333811660009081526004602090815260408083209386168352929052205415155b1561174b57fe5b600160a060020a03338116600081815260046020908152604080832094871680845294909152908190208490557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259084905190815260200160405180910390a35b5050565b600f546000908180808315806117c9575083600a014311155b156117d75760009450611850565b6101004310156117ea57600092506117f2565b610100430392505b8284101561180a57829150600a825b06820191508193505b600e54600a9085035b04905061182084826129ff565b6013614000835b0681548110151561183457fe5b906000526020600020900160005b5055600a8401600f55600194505b5050505090565b600d5481565b60005481565b60006060606436101561187257fe5b600160a060020a038086166000908152600460209081526040808320339094168352929052205491506118a485610f49565b6118ad84610f49565b600160a060020a0384166000908152600360205260409020546118d6908463ffffffff612b2416565b600160a060020a03808616600090815260036020526040808220939093559087168152205461190b908463ffffffff6126f916565b600160a060020a038616600090815260036020526040902055611934828463ffffffff6126f916565b600160a060020a0380871660008181526004602090815260408083203386168452909152908190209390935590861691600080516020612bd48339815191529086905190815260200160405180910390a35b5b5050505050565b60006119cc3343604051600160a060020a03929092166c010000000000000000000000000282526014820152603401604051908190039020836119d4565b90505b919050565b60008060006119e1611118565b849150670de0b6b3a764000034111580156119fd575060125434105b1515611a0857600080fd5b6000341115611bf6576008541515611a47576014345b04600c600b54815481101515611a3057fe5b906000526020600020900160005b50805490910190555b600160a060020a03841615611aa1576064345b60078054929091049182019055600160a060020a03851660009081526005602052604090208054600160d060020a03808216840116600160d060020a031990911617905590505b436003016010541015611abe576003430160105534601155611ae5565b6012546011541115611adc5760108054600101905534601155611ae5565b60118054340190555b5b60606040519081016040908152600160c060020a033416825262ffffff841660208084019190915260105463ffffffff1682840152600160a060020a033316600090815260069091522081518154600160c060020a031916600160c060020a03919091161781556020820151815463ffffffff9190911660c060020a0260c060020a63ffffffff02199091161781556040820151815463ffffffff9190911660e060020a02600160e060020a0390911617905550601054600160a060020a033316907f063f4540040cf99a22f577ef321c170763020e6277e47275ed9b3d17ec14e13d9062ffffff8516903460405180848152602001838152602001828152602001935050505060405180910390a25b611bfe6117b0565b5060105492505b505092915050565b600081565b600254600160a060020a031681565b61400081565b600080600e546000148015611c3c5750600083115b8015611c4a57506140008311155b1515611c5557600080fd5b506013546140008382011115611c7957614000611c73601382612b5e565b50611c8c565b60138054840190611c8a9082612b5e565b505b5b601354811015611cc1576001601382815481101515611ca857fe5b906000526020600020900160005b50555b600101611c8c565b6013546140009010611cdd57600a435b064303600e819055600f555b60135491505b50919050565b60008060006008541115611d005760009150611d35565b600e54620280009043035b049050600b54811115611d215760009150611d35565b600e54620280009043035b06620280000391505b5090565b600160a060020a038116600090815260066020526040902054600160c060020a03165b919050565b60025433600160a060020a03908116911614611d7957fe5b600160a060020a0381161515611d8b57fe5b611d9433610f49565b611d9d81610f49565b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b60005b818110156117ac57611ddd6117b0565b1515611de8576117ac565b5b600101611dcd565b5b5050565b6000611e00612b3e565b600160a060020a038316600090815260066020526040808220906060905190810160409081529154600160c060020a038116825263ffffffff60c060020a82048116602084015260e060020a909104169181019190915291508151600160c060020a03161580611e7b57506001826040015163ffffffff1611155b80611e8f5750816040015163ffffffff1643105b80611ea9575062028000604083015163ffffffff16014310155b15611eb75760009250611f44565b81604001516101000163ffffffff16431015611ee957611ee282836040015163ffffffff1640612710565b9250611f44565b6000600e541115611f3e57611f07826040015163ffffffff16612865565b90508063ffffffff1663010000001415611f2d578151600160c060020a03169250611f44565b611ee28282612710565b9250611f44565b5b600092505b5050919050565b60015433600160a060020a03908116911614611f6357fe5b6003430160105560006011555b5b565b6013805482908110611f8157fe5b906000526020600020900160005b5054905081565b600160a060020a038116600090815260056020526040902054600160d060020a03165b919050565b600e5481565b600160a060020a0381166000908152600360205260409020545b919050565b6013545b90565b60105481565b600160a060020a03811660009081526005602052604090205460e060020a900463ffffffff165b919050565b600c805482908110611f8157fe5b906000526020600020900160005b5054905081565b600154600160a060020a031681565b600160a060020a03811660009081526006602052604090205460e060020a900463ffffffff165b919050565b600160a060020a03811660009081526006602052604090205460c060020a900463ffffffff165b919050565b60408051908101604052600481527f504c415900000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a033316600090815260056020526040812054600160d060020a03168190118015612134575033600160a060020a03166000908152600560205260409020544360e060020a90910463ffffffff1611155b1561170d5750600160a060020a03331660009081526005602052604090208054600160d060020a0319811690915560078054600160d060020a0390921691829003905561170d81612904565b5b5b50565b60085481565b60015433600160a060020a039081169116146121a357fe5b600160a060020a03811615156121b557fe5b6121be33610f49565b6121c781610f49565b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b6040604436101561220157fe5b61220a33610f49565b600160a060020a033316600090815260036020526040902054612233908363ffffffff6126f916565b600160a060020a033381166000908152600360205260409020919091558381163090911614156122f05760015461227290600160a060020a0316610f49565b600154600160a060020a031660009081526003602052604090205461229d908363ffffffff612b2416565b60018054600160a060020a03908116600090815260036020526040908190209390935590548116913390911690600080516020612bd48339815191529085905190815260200160405180910390a36116b2565b6122f983610f49565b600160a060020a038316600090815260036020526040902054612322908363ffffffff612b2416565b600160a060020a038085166000818152600360205260409081902093909355913390911690600080516020612bd48339815191529085905190815260200160405180910390a35b5b5b505050565b6000610f436080611c27565b90505b90565b600f5481565b611f7061249c565b5b565b60125481565b600154611f7090600160a060020a0316610b91565b5b565b600a5481565b60075481565b60015433600160a060020a039081169116146123d557fe5b6123dd61249c565b60008111801561240e575080600754600a6009546009028115156123fd57fe5b04010130600160a060020a03163110155b151561241957600080fd5b600a546002905b0460095410151561245b57610190600160a060020a033016315b048111158015612450575043601454619d800111155b151561245b57600080fd5b5b600160a060020a03331681156108fc0282604051600060405180830381858888f19350505050151561248d57600080fd5b436014555b5b50565b60145481565b600060016008541180156124b7575060085462014000014310155b156124c657600060085561170d565b6000600e54111561170d57600e54620280009043035b600c5491900491506001190181111561251657600c8054600181016125018382612b5e565b916000526020600020900160005b5060009055505b600b54811180156125275750600854155b801561253c57506001600c8054905003600b54105b1561170d57600b805460010190555b5b5b5b50565b600160a060020a038083166000908152600460209081526040808320938516835292905220545b92915050565b60115481565b6008541561259157600080fd5b61259a33610f49565b611f706120dd565b5b565b60095481565b600854600090156125bb57600080fd5b6125c433610f49565b50600160a060020a0333166000818152600360205260408082205466038d7ea4c6800081029391600080516020612bd483398151915291905190815260200160405180910390a3600160a060020a033316600090815260036020526040812055600980548290038155600a9082025b33600160a060020a031660009081526005602052604090208054600160d060020a0319811693909204600160d060020a039283160190911691909117905561170d6120dd565b5b50565b600b5481565b600160a060020a03811660009081526005602052604090205460d060020a900461ffff165b919050565b60015433600160a060020a039081169116146126c557fe5b60085460011480156126d957506000600e54115b80156126e457508043105b15156126ef57600080fd5b60088190555b5b50565b60008282111561270557fe5b508082035b92915050565b60008060008085602001519250848318915062f00000821615612734576000612737565b60015b620f000083161561274957600061274c565b60015b61f00084161561275d576000612760565b60015b610f00851615612771576000612774565b60015b60f0861615612784576000612787565b60015b600f87161561279757600061279a565b60015b010101010160ff1690508062ffffff16600614156127c9578551600160c060020a0316626acfc002935061285c565b8062ffffff16600514156127ed578551600160c060020a0316614e2002935061285c565b8062ffffff1660041415612811578551600160c060020a03166101f402935061285c565b8062ffffff1660031415612834578551600160c060020a0316601902935061285c565b8062ffffff1660021415612857578551600160c060020a0316600302935061285c565b600093505b50505092915050565b600080600080600a600e54860381151561287b57fe5b0492506013614000845b0681548110151561289257fe5b906000526020600020900160005b505491507e010000000000000000000000000000000000000000000000000000000000008204614000845b04146128dd57630100000093506128fc565b600e54600a9086035b06905080601802829060020a900462ffffff1693505b505050919050565b6000806002600160a060020a033016315b04915082821061296d57600160a060020a03331683156108fc0284604051600060405180830381858888f19350505050151561295057600080fd5b66038d7ea4c680008311156112545761125461249c565b5b6116b2565b506007805482840390810190915533600160a060020a0316600081815260056020526040908190208054600160d060020a03198116600160d060020a03918216860190911617600160e060020a031660e060020a436202a3000163ffffffff16021790556108fc84150290849051600060405180830381858888f1935050505015156116b257600080fd5b5b5b505050565b600060f061400063ffffffff84165b63ffffffff8087164062ffffff908116630100000060018a0184164083160217660100000000000060028a810185164084169190910291909117690100000000000000000060038b01851640841602176c0100000000000000000000000060048b01851640841602176f0100000000000000000000000000000060058b0185164084160217720100000000000000000000000000000000000060068b0185164084160217750100000000000000000000000000000000000000000060078b018516408416021760c060020a60088b01851640841602177b0100000000000000000000000000000000000000000000000000000060098b01949094164092909216929092021793900a919004021790505b92915050565b600082820183811015612b3357fe5b8091505b5092915050565b606060405190810160409081526000808352602083018190529082015290565b8154818355818115116116b2576000838152602090206116b2918101908301612bb2565b5b505050565b8154818355818115116116b2576000838152602090206116b2918101908301612bb2565b5b505050565b610f4691905b80821115611d355760008155600101612bb8565b5090565b905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582015a763785f2914ac64f2b42ef38e63447e686f857e58004ea24a5b71e142d1a50029
Swarm Source:
bzzr://15a763785f2914ac64f2b42ef38e63447e686f857e58004ea24a5b71e142d1a5