ETH Price: $2,684.08 (-1.03%)
Gas: 0.76 Gwei

Contract

0x69fd0E5d0a93bf8BAc02C154d343A8e3709aDAbF
 

Overview

ETH Balance

0.0000000001 ETH

Eth Value

Less Than $0.01 (@ $2,684.08/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Contracts Mi...70712662019-01-15 16:19:312226 days ago1547569171IN
0x69fd0E5d...3709aDAbF
0 ETH0.0004608410
Buy Booster70349962019-01-09 4:34:272232 days ago1547008467IN
0x69fd0E5d...3709aDAbF
0.01 ETH0.000211992
Buy Engineer70334882019-01-08 22:12:012233 days ago1546985521IN
0x69fd0E5d...3709aDAbF
0.02 ETH0.000160251.1
Buy Engineer70319212019-01-08 15:18:032233 days ago1546960683IN
0x69fd0E5d...3709aDAbF
0 ETH0.000310352
Buy Engineer70299392019-01-08 6:54:052233 days ago1546930445IN
0x69fd0E5d...3709aDAbF
0 ETH0.000149951.5
Buy Engineer70270952019-01-07 18:29:212234 days ago1546885761IN
0x69fd0E5d...3709aDAbF
0.04 ETH0.000189391.3
Buy Engineer70263692019-01-07 15:22:532234 days ago1546874573IN
0x69fd0E5d...3709aDAbF
0.32 ETH0.000437063
Buy Engineer70258252019-01-07 13:05:382234 days ago1546866338IN
0x69fd0E5d...3709aDAbF
0 ETH0.000331243
Buy Engineer70258132019-01-07 13:03:162234 days ago1546866196IN
0x69fd0E5d...3709aDAbF
0.02 ETH0.000437063
Buy Engineer70256702019-01-07 12:24:052234 days ago1546863845IN
0x69fd0E5d...3709aDAbF
0.08 ETH0.000437063
Buy Engineer70223122019-01-06 22:08:022235 days ago1546812482IN
0x69fd0E5d...3709aDAbF
0 ETH0.000510533
Buy Engineer70216262019-01-06 19:14:372235 days ago1546802077IN
0x69fd0E5d...3709aDAbF
0.01 ETH0.000177061.1
Buy Engineer70214262019-01-06 18:21:552235 days ago1546798915IN
0x69fd0E5d...3709aDAbF
0 ETH0.000310352
Buy Engineer70168542019-01-05 22:39:362236 days ago1546727976IN
0x69fd0E5d...3709aDAbF
0.02 ETH0.000328972
Buy Engineer70168422019-01-05 22:37:352236 days ago1546727855IN
0x69fd0E5d...3709aDAbF
0 ETH0.000288432
Buy Engineer70168322019-01-05 22:34:192236 days ago1546727659IN
0x69fd0E5d...3709aDAbF
0.01 ETH0.000328972
Buy Engineer70168252019-01-05 22:32:502236 days ago1546727570IN
0x69fd0E5d...3709aDAbF
0.02 ETH0.000328972
Buy Engineer70167942019-01-05 22:26:112236 days ago1546727171IN
0x69fd0E5d...3709aDAbF
0.02 ETH0.000328972
Buy Engineer70167832019-01-05 22:23:352236 days ago1546727015IN
0x69fd0E5d...3709aDAbF
0.02 ETH0.000328972
Buy Engineer70167732019-01-05 22:20:092236 days ago1546726809IN
0x69fd0E5d...3709aDAbF
0.02 ETH0.000328972
Buy Booster70167632019-01-05 22:17:562236 days ago1546726676IN
0x69fd0E5d...3709aDAbF
0.01 ETH0.000211992
Buy Engineer70122372019-01-05 3:07:182237 days ago1546657638IN
0x69fd0E5d...3709aDAbF
0 ETH0.000576864
Buy Engineer70122322019-01-05 3:06:052237 days ago1546657565IN
0x69fd0E5d...3709aDAbF
0 ETH0.000288432
Buy Engineer70121062019-01-05 2:34:242237 days ago1546655664IN
0x69fd0E5d...3709aDAbF
0 ETH0.000288432
Buy Booster70115172019-01-04 23:50:452237 days ago1546645845IN
0x69fd0E5d...3709aDAbF
0.04 ETH0.000310523
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
75827382019-04-17 2:43:222135 days ago1555469002
0x69fd0E5d...3709aDAbF
0 ETH
75827382019-04-17 2:43:222135 days ago1555469002
0x69fd0E5d...3709aDAbF
0 ETH
75827382019-04-17 2:43:222135 days ago1555469002
0x69fd0E5d...3709aDAbF
0 ETH
75827382019-04-17 2:43:222135 days ago1555469002
0x69fd0E5d...3709aDAbF
0 ETH
75827382019-04-17 2:43:222135 days ago1555469002
0x69fd0E5d...3709aDAbF
0 ETH
75827382019-04-17 2:43:222135 days ago1555469002
0x69fd0E5d...3709aDAbF
0 ETH
75827382019-04-17 2:43:222135 days ago1555469002
0x69fd0E5d...3709aDAbF
0 ETH
75827382019-04-17 2:43:222135 days ago1555469002
0x69fd0E5d...3709aDAbF
0 ETH
75827382019-04-17 2:43:222135 days ago1555469002
0x69fd0E5d...3709aDAbF
0 ETH
74769472019-03-31 15:29:282151 days ago1554046168
0x69fd0E5d...3709aDAbF
0 ETH
74769472019-03-31 15:29:282151 days ago1554046168
0x69fd0E5d...3709aDAbF
0 ETH
74769472019-03-31 15:29:282151 days ago1554046168
0x69fd0E5d...3709aDAbF
0 ETH
74769472019-03-31 15:29:282151 days ago1554046168
0x69fd0E5d...3709aDAbF
0 ETH
74769472019-03-31 15:29:282151 days ago1554046168
0x69fd0E5d...3709aDAbF
0 ETH
74769472019-03-31 15:29:282151 days ago1554046168
0x69fd0E5d...3709aDAbF
0 ETH
74769472019-03-31 15:29:282151 days ago1554046168
0x69fd0E5d...3709aDAbF
0 ETH
74769472019-03-31 15:29:282151 days ago1554046168
0x69fd0E5d...3709aDAbF
0 ETH
74769472019-03-31 15:29:282151 days ago1554046168
0x69fd0E5d...3709aDAbF
0 ETH
73927912019-03-18 12:08:352164 days ago1552910915
0x69fd0E5d...3709aDAbF
0 ETH
73927912019-03-18 12:08:352164 days ago1552910915
0x69fd0E5d...3709aDAbF
0 ETH
73927912019-03-18 12:08:352164 days ago1552910915
0x69fd0E5d...3709aDAbF
0 ETH
73927912019-03-18 12:08:352164 days ago1552910915
0x69fd0E5d...3709aDAbF
0 ETH
73927912019-03-18 12:08:352164 days ago1552910915
0x69fd0E5d...3709aDAbF
0 ETH
73927912019-03-18 12:08:352164 days ago1552910915
0x69fd0E5d...3709aDAbF
0 ETH
73927912019-03-18 12:08:352164 days ago1552910915
0x69fd0E5d...3709aDAbF
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoEngineer

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-09-21
*/

pragma solidity ^0.4.24;

library SafeMath {

    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    /**
    * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}
contract PullPayment {
  using SafeMath for uint256;

  mapping(address => uint256) public payments;
  uint256 public totalPayments;

  /**
  * @dev Withdraw accumulated balance, called by payee.
  */
  function withdrawPayments() public {
    address payee = msg.sender;
    uint256 payment = payments[payee];

    require(payment != 0);
    require(address(this).balance >= payment);

    totalPayments = totalPayments.sub(payment);
    payments[payee] = 0;

    payee.transfer(payment);
  }

  /**
  * @dev Called by the payer to store the sent amount as credit to be pulled.
  * @param dest The destination address of the funds.
  * @param amount The amount to transfer.
  */
  function asyncSend(address dest, uint256 amount) internal {
    payments[dest] = payments[dest].add(amount);
    totalPayments = totalPayments.add(amount);
  }
}
contract CryptoMiningWarInterface {
    address public sponsor;
    address public administrator;
    mapping(address => PlayerData) public players;
    struct PlayerData {
        uint256 roundNumber;
        mapping(uint256 => uint256) minerCount;
        uint256 hashrate;
        uint256 crystals;
        uint256 lastUpdateTime;
        uint256 referral_count;
        uint256 noQuest;
    }
    function getHashratePerDay(address /*minerAddr*/) public pure returns (uint256 /*personalProduction*/) {}
    function addCrystal( address /*_addr*/, uint256 /*_value*/ ) public pure {}
    function subCrystal( address /*_addr*/, uint256 /*_value*/ ) public pure {}
    function fallback() public payable {}
}
interface MiniGameInterface {
    function isContractMiniGame() external pure returns( bool _isContractMiniGame );
    function fallback() external payable;
}
contract CryptoEngineer is PullPayment{
    // engineer info
	address public administrator;
    uint256 public prizePool = 0;
    uint256 public engineerRoundNumber = 0;
    uint256 public numberOfEngineer;
    uint256 public numberOfBoosts;
    address public gameSponsor;
    uint256 public gameSponsorPrice;
    uint256 private randNonce;
    uint256 constant public VIRUS_MINING_PERIOD = 86400; 
    uint256 constant public VIRUS_NORMAL = 0;
    uint256 constant public HALF_TIME_ATK = 60 * 15;   
    
    // mining war game infomation
    address public miningWarContractAddress;
    address public miningWarAdministrator;
    uint256 constant public CRTSTAL_MINING_PERIOD = 86400;
    uint256 constant public BASE_PRICE = 0.01 ether;

    CryptoMiningWarInterface public MiningWarContract;
    
    // engineer player information
    mapping(address => PlayerData) public players;
    // engineer boost information
    mapping(uint256 => BoostData) public boostData;
    // engineer information
    mapping(uint256 => EngineerData) public engineers;
    // engineer virut information
    mapping(uint256 => VirusData) public virus;
    
    // minigame info
    mapping(address => bool) public miniGames; 
    
    struct PlayerData {
        uint256 engineerRoundNumber;
        mapping(uint256 => uint256) engineersCount;
        uint256 virusNumber;
        uint256 virusDefence;
        uint256 research;
        uint256 lastUpdateTime;
        uint256 nextTimeAtk;
        uint256 endTimeUnequalledDef;
    }
    struct BoostData {
        address owner;
        uint256 boostRate;
        uint256 basePrice;
    }
    struct EngineerData {
        uint256 basePrice;
        uint256 baseETH;
        uint256 baseResearch;
        uint256 limit;
    }
    struct VirusData {
        uint256 atk;
        uint256 def;
    }
    event eventEndAttack(
        address playerAtk,
        address playerDef,
        bool isWin,
        uint256 winCrystals,
        uint256 virusPlayerAtkDead,
        uint256 virusPlayerDefDead,
        uint256 timeAtk,
        uint256 engineerRoundNumber,
        uint256 atk,
        uint256 def // def of player 
    );
    modifier disableContract()
    {
        require(tx.origin == msg.sender);
        _;
    }
    modifier isAdministrator()
    {
        require(msg.sender == administrator);
        _;
    }
    modifier onlyContractsMiniGame() 
    {
        require(miniGames[msg.sender] == true);
        _;
    }

    constructor() public {
        administrator = msg.sender;

        //default game sponsor
        gameSponsor = administrator;
        gameSponsorPrice = 0.32 ether;
        // set interface main contract
        miningWarContractAddress = address(0xf84c61bb982041c030b8580d1634f00fffb89059);
        MiningWarContract = CryptoMiningWarInterface(miningWarContractAddress);
        miningWarAdministrator = MiningWarContract.administrator();
        
        numberOfEngineer = 8;
        numberOfBoosts = 5;
        // setting virusupd
        virus[VIRUS_NORMAL] = VirusData(1,1);

        //                          price crystals    price ETH         research  limit                         
        engineers[0] = EngineerData(10,               BASE_PRICE * 0,   10,       10   );   //lv1 
        engineers[1] = EngineerData(50,               BASE_PRICE * 1,   200,      2    );   //lv2
        engineers[2] = EngineerData(200,              BASE_PRICE * 2,   800,      4    );   //lv3
        engineers[3] = EngineerData(800,              BASE_PRICE * 4,   3200,     8    );   //lv4
        engineers[4] = EngineerData(3200,             BASE_PRICE * 8,   9600,     16   );   //lv5
        engineers[5] = EngineerData(12800,            BASE_PRICE * 16,  38400,    32   );   //lv6
        engineers[6] = EngineerData(102400,           BASE_PRICE * 32,  204800,   64   );   //lv7
        engineers[7] = EngineerData(819200,           BASE_PRICE * 64,  819200,   65536);   //lv8
        initData();
    }
    function () public payable
    {
        addPrizePool(msg.value);
    }
    function initData() private
    {
        //init booster data
        boostData[0] = BoostData(0x0, 150, BASE_PRICE * 1);
        boostData[1] = BoostData(0x0, 175, BASE_PRICE * 2);
        boostData[2] = BoostData(0x0, 200, BASE_PRICE * 4);
        boostData[3] = BoostData(0x0, 225, BASE_PRICE * 8);
        boostData[4] = BoostData(0x0, 250, BASE_PRICE * 16);
    }
    /** 
    * @dev MainContract used this function to verify game's contract
    */
    function isContractMiniGame() public pure returns( bool _isContractMiniGame )
    {
    	_isContractMiniGame = true;
    }

    /** 
    * @dev Main Contract call this function to setup mini game.
    */
    function setupMiniGame( uint256 /*_miningWarRoundNumber*/, uint256 /*_miningWarDeadline*/ ) public
    {
    
    }
    //--------------------------------------------------------------------------
    // SETTING CONTRACT MINI GAME 
    //--------------------------------------------------------------------------
    function setContractsMiniGame( address _contractMiniGameAddress ) public isAdministrator 
    {
        MiniGameInterface MiniGame = MiniGameInterface( _contractMiniGameAddress );
        if( MiniGame.isContractMiniGame() == false ) { revert(); }

        miniGames[_contractMiniGameAddress] = true;
    }
    /**
    * @dev remove mini game contract from main contract
    * @param _contractMiniGameAddress mini game contract address
    */
    function removeContractMiniGame(address _contractMiniGameAddress) public isAdministrator
    {
        miniGames[_contractMiniGameAddress] = false;
    }
    //@dev use this function in case of bug
    function upgrade(address addr) public 
    {
        require(msg.sender == administrator);
        selfdestruct(addr);
    }

    //--------------------------------------------------------------------------
    // BOOSTER 
    //--------------------------------------------------------------------------
    function buyBooster(uint256 idx) public payable 
    {
        require(idx < numberOfBoosts);
        BoostData storage b = boostData[idx];
        if (msg.value < b.basePrice || msg.sender == b.owner) {
            revert();
        }
        address beneficiary = b.owner;
        uint256 devFeePrize = devFee(b.basePrice);
        
        distributedToOwner(devFeePrize);
        addMiningWarPrizePool(devFeePrize);
        addPrizePool(SafeMath.sub(msg.value, SafeMath.mul(devFeePrize,3)));
        
        updateVirus(msg.sender);
        if ( beneficiary != 0x0 ) {
            updateVirus(beneficiary);
        }
        // transfer ownership    
        b.owner = msg.sender;
    }
    function getBoosterData(uint256 idx) public view returns (address _owner,uint256 _boostRate, uint256 _basePrice)
    {
        require(idx < numberOfBoosts);
        BoostData memory b = boostData[idx];
        _owner = b.owner;
        _boostRate = b.boostRate; 
        _basePrice = b.basePrice;
    }
    function hasBooster(address addr) public view returns (uint256 _boostIdx)
    {         
        _boostIdx = 999;
        for(uint256 i = 0; i < numberOfBoosts; i++){
            uint256 revert_i = numberOfBoosts - i - 1;
            if(boostData[revert_i].owner == addr){
                _boostIdx = revert_i;
                break;
            }
        }
    }
    //--------------------------------------------------------------------------
    // GAME SPONSOR
    //--------------------------------------------------------------------------
    /**
    */
    function becomeGameSponsor() public payable disableContract
    {
        uint256 gameSponsorPriceFee = SafeMath.div(SafeMath.mul(gameSponsorPrice, 150), 100);
        require(msg.value >= gameSponsorPriceFee);
        require(msg.sender != gameSponsor);
        // 
        uint256 repayPrice = SafeMath.div(SafeMath.mul(gameSponsorPrice, 110), 100);
        gameSponsor.send(repayPrice);
        
        // add to prize pool
        addPrizePool(SafeMath.sub(msg.value, repayPrice));
        // update game sponsor info
        gameSponsor = msg.sender;
        gameSponsorPrice = gameSponsorPriceFee;
    }
    /**
    * @dev add virus for player
    * @param _addr player address
    * @param _value number of virus
    */
    function addVirus(address _addr, uint256 _value) public onlyContractsMiniGame
    {
        PlayerData storage p = players[_addr];
        uint256 additionalVirus = SafeMath.mul(_value,VIRUS_MINING_PERIOD);
        p.virusNumber = SafeMath.add(p.virusNumber, additionalVirus);
    }
    /**
    * @dev subtract virus of player
    * @param _addr player address 
    * @param _value number virus subtract 
    */
    function subVirus(address _addr, uint256 _value) public onlyContractsMiniGame
    {
        updateVirus(_addr);
        PlayerData storage p = players[_addr];
        uint256 subtractVirus = SafeMath.mul(_value,VIRUS_MINING_PERIOD);
        if ( p.virusNumber < subtractVirus ) { revert(); }

        p.virusNumber = SafeMath.sub(p.virusNumber, subtractVirus);
    }
    /**
    * @dev additional time unequalled defence 
    * @param _addr player address 
    */
    function setAtkNowForPlayer(address _addr) public onlyContractsMiniGame
    {
        PlayerData storage p = players[_addr];
        p.nextTimeAtk = now;
    }
    function addTimeUnequalledDefence(address _addr, uint256 _value) public onlyContractsMiniGame
    {
        PlayerData storage p = players[_addr];
        uint256 currentTimeUnequalled = p.endTimeUnequalledDef;
        if (currentTimeUnequalled < now) {
            currentTimeUnequalled = now;
        }
        p.endTimeUnequalledDef = SafeMath.add(currentTimeUnequalled, _value);
    }
    /**
    * @dev claim price pool to next new game
    * @param _addr mini game contract address
    * @param _value eth claim;
    */
    function claimPrizePool(address _addr, uint256 _value) public onlyContractsMiniGame 
    {
        require(prizePool > _value);

        prizePool = SafeMath.sub(prizePool, _value);
        MiniGameInterface MiniGame = MiniGameInterface( _addr );
        MiniGame.fallback.value(_value)();
    }
    //--------------------------------------------------------------------------
    // WARS
    //--------------------------------------------------------------------------
    function setVirusInfo(uint256 _atk, uint256 _def) public isAdministrator
    {
        VirusData storage v = virus[VIRUS_NORMAL];
        v.atk = _atk;
        v.def = _def;
    }
    /**
    * @dev add virus defence 
    * @param _value number of virus defence
    */
    function addVirusDefence(uint256 _value) public disableContract 
    {        
        updateVirus(msg.sender);
        PlayerData storage p = players[msg.sender];
        uint256 _virus = SafeMath.mul(_value,VIRUS_MINING_PERIOD);

        if ( p.virusNumber < _virus ) { revert(); }

        p.virusDefence = SafeMath.add(p.virusDefence, _virus);
        p.virusNumber  = SafeMath.sub(p.virusNumber, _virus);
    }
    /**
    * @dev atk and def ramdom from 50% to 150%
    * @param _defAddress player address to attack
    * @param _value number of virus send to attack
    */
    function attack( address _defAddress, uint256 _value) public disableContract
    {
        require(canAttack(msg.sender, _defAddress) == true);

        updateVirus(msg.sender);

        PlayerData storage pAtk = players[msg.sender];
        PlayerData storage pDef = players[_defAddress];
        uint256 virusAtk = SafeMath.mul(_value,VIRUS_MINING_PERIOD);

        if (pAtk.virusNumber < virusAtk) { revert(); }
        // current crystals of defence geater 5000 crystals
        if (calCurrentCrystals(_defAddress) < 5000) { revert(); }

        // virus normal info
        VirusData memory v = virus[VIRUS_NORMAL];
        // ramdom attack and defence for players from 50% to 150%
        uint256 rateAtk = 50 + randomNumber(msg.sender, 100);
        uint256 rateDef = 50 + randomNumber(_defAddress, 100);
        // calculate attack of player attack and defence of player defence
        uint256 atk = SafeMath.div(SafeMath.mul(SafeMath.mul(virusAtk, v.atk), rateAtk), 100);
        uint256 def = SafeMath.div(SafeMath.mul(SafeMath.mul(pDef.virusDefence, v.def), rateDef), 100);
        bool isWin = false;
        uint256 virusPlayerAtkDead = 0;
        uint256 virusPlayerDefDead = 0;
        /**
        * @dev calculate virus dead in war 
        */
        // if attack > defense, sub virus of player atk and player def.
        // number virus for kin
        if (atk > def) {
            virusPlayerAtkDead = SafeMath.min(virusAtk, SafeMath.div(SafeMath.mul(def, 100), SafeMath.mul(v.atk, rateAtk)));
            virusPlayerDefDead = pDef.virusDefence;
            isWin = true;
        }
        /**
        * @dev update result of war and call end attack
        */
        pAtk.virusNumber = SafeMath.sub(pAtk.virusNumber, virusPlayerAtkDead);
        pDef.virusDefence = SafeMath.sub(pDef.virusDefence, virusPlayerDefDead);
        //update player attack
        pAtk.nextTimeAtk = now + HALF_TIME_ATK;

        endAttack(msg.sender,_defAddress,isWin, virusPlayerAtkDead, virusPlayerDefDead, atk, def);
    }
    /**
    * @dev check player can atk or not
    * @param _atkAddress player address attack
    * @param _defAddress player address defence
    */
    function canAttack(address _atkAddress, address _defAddress) public view returns(bool _canAtk)
    {
        if ( 
            _atkAddress != _defAddress &&
            players[_atkAddress].nextTimeAtk <= now &&
            players[_defAddress].endTimeUnequalledDef < now
        ) 
        {
            _canAtk = true;
        }
    }
    /**
    * @dev result of war
    * @param _atkAddress player address attack
    * @param _defAddress player address defence
    */
    function endAttack(
        address _atkAddress, 
        address _defAddress, 
        bool _isWin, 
        uint256 _virusPlayerAtkDead, 
        uint256 _virusPlayerDefDead, 
        uint256 _atk,
        uint256 _def
    ) private
    {
        uint256 winCrystals;
        if ( _isWin == true ) {
            uint256 pDefCrystals = calCurrentCrystals(_defAddress);
            // subtract random 10% to 50% current crystals of player defence
            uint256 rate =10 + randomNumber(_defAddress, 40);
            winCrystals = SafeMath.div(SafeMath.mul(pDefCrystals,rate),100);

            if (winCrystals > 0) {
                MiningWarContract.subCrystal(_defAddress, winCrystals);    
                MiningWarContract.addCrystal(_atkAddress, winCrystals);
            }
        }
        emit eventEndAttack(_atkAddress, _defAddress, _isWin, winCrystals, _virusPlayerAtkDead, _virusPlayerDefDead, now, engineerRoundNumber, _atk, _def);
    }
    //--------------------------------------------------------------------------
    // PLAYERS
    //--------------------------------------------------------------------------
    /**
    */
    function buyEngineer(uint256[] engineerNumbers) public payable disableContract
    {
        require(engineerNumbers.length == numberOfEngineer);
        
        updateVirus(msg.sender);
        PlayerData storage p = players[msg.sender];
        
        uint256 priceCrystals = 0;
        uint256 priceEth = 0;
        uint256 research = 0;
        for (uint256 engineerIdx = 0; engineerIdx < numberOfEngineer; engineerIdx++) {
            uint256 engineerNumber = engineerNumbers[engineerIdx];
            EngineerData memory e = engineers[engineerIdx];
            // require for engineerNumber 
            if(engineerNumber > e.limit || engineerNumber < 0) {
                revert();
            }
            // engineer you want buy
            if (engineerNumber > 0) {
                uint256 currentEngineerCount = p.engineersCount[engineerIdx];
                // update player data
                p.engineersCount[engineerIdx] = SafeMath.min(e.limit, SafeMath.add(p.engineersCount[engineerIdx], engineerNumber));
                // calculate no research you want buy
                research = SafeMath.add(research, SafeMath.mul(SafeMath.sub(p.engineersCount[engineerIdx],currentEngineerCount), e.baseResearch));
                // calculate price crystals and eth you will pay
                priceCrystals = SafeMath.add(priceCrystals, SafeMath.mul(e.basePrice, engineerNumber));
                priceEth = SafeMath.add(priceEth, SafeMath.mul(e.baseETH, engineerNumber));
            }
        }
        // check price eth
        if (priceEth < msg.value) {
            revert();
        }

        uint256 devFeePrize = devFee(priceEth);
        distributedToOwner(devFeePrize);
        addMiningWarPrizePool(devFeePrize);
        addPrizePool(SafeMath.sub(msg.value, SafeMath.mul(devFeePrize,3)));        

        // pay and update
        MiningWarContract.subCrystal(msg.sender, priceCrystals);
        updateResearch(msg.sender, research);
    }
     /**
    * @dev update virus for player 
    * @param _addr player address
    */
    function updateVirus(address _addr) private
    {
        if (players[_addr].engineerRoundNumber != engineerRoundNumber) {
            return resetPlayer(_addr);
        }
        PlayerData storage p = players[_addr]; 
        p.virusNumber = calculateCurrentVirus(_addr);
        p.lastUpdateTime = now;
    }
    function calculateCurrentVirus(address _addr) public view returns(uint256 _currentVirus)
    {
        PlayerData memory p = players[_addr]; 
        uint256 secondsPassed = SafeMath.sub(now, p.lastUpdateTime);
        uint256 researchPerDay = getResearchPerDay(_addr);   
        _currentVirus = p.virusNumber;
        if (researchPerDay > 0) {
            _currentVirus = SafeMath.add(_currentVirus, SafeMath.mul(researchPerDay, secondsPassed));
        }   
    }
    /**
    * @dev reset player data
    * @param _addr player address
    */
    function resetPlayer(address _addr) private
    {
        require(players[_addr].engineerRoundNumber != engineerRoundNumber);

        PlayerData storage p = players[_addr];
        p.engineerRoundNumber = engineerRoundNumber;
        p.virusNumber = 0;
        p.virusDefence = 0;
        p.research = 0;        
        p.lastUpdateTime = now;
        p.nextTimeAtk = now;
        p.endTimeUnequalledDef = now;
        // reset player engineer data
        for ( uint256 idx = 0; idx < numberOfEngineer; idx++ ) {
            p.engineersCount[idx] = 0;
        }   
    }
    /**
    * @dev update research for player
    * @param _addr player address
    * @param _research number research want to add
    */
    function updateResearch(address _addr, uint256 _research) private 
    {
        PlayerData storage p = players[_addr];
        p.research = SafeMath.add(p.research, _research);
    }
    function getResearchPerDay(address _addr) public view returns( uint256 _researchPerDay)
    {
        PlayerData memory p = players[_addr];
        _researchPerDay =  p.research;
        uint256 boosterIdx = hasBooster(_addr);
        if (boosterIdx != 999) {
            BoostData memory b = boostData[boosterIdx];
            _researchPerDay = SafeMath.div(SafeMath.mul(_researchPerDay, b.boostRate), 100);
        } 
    }
    /**
    * @dev get player data
    * @param _addr player address
    */
    function getPlayerData(address _addr) 
    public 
    view 
    returns(
        uint256 _engineerRoundNumber, 
        uint256 _virusNumber, 
        uint256 _virusDefence, 
        uint256 _research, 
        uint256 _researchPerDay, 
        uint256 _lastUpdateTime, 
        uint256[8] _engineersCount, 
        uint256 _nextTimeAtk,
        uint256 _endTimeUnequalledDef
    )
    {
        PlayerData storage p = players[_addr];
        for ( uint256 idx = 0; idx < numberOfEngineer; idx++ ) {
            _engineersCount[idx] = p.engineersCount[idx];
        }
        _engineerRoundNumber = p.engineerRoundNumber;
        _virusNumber = SafeMath.div(p.virusNumber, VIRUS_MINING_PERIOD);
        _virusDefence = SafeMath.div(p.virusDefence, VIRUS_MINING_PERIOD);
        _nextTimeAtk = p.nextTimeAtk;
        _lastUpdateTime = p.lastUpdateTime;
        _endTimeUnequalledDef = p.endTimeUnequalledDef;
        _research = p.research;
        _researchPerDay = getResearchPerDay(_addr);
    }
    //--------------------------------------------------------------------------
    // INTERNAL 
    //--------------------------------------------------------------------------
    function addPrizePool(uint256 _value) private 
    {
        prizePool = SafeMath.add(prizePool, _value);
    }
    /**
    * @dev add 5% value of transaction payable
    */
    function addMiningWarPrizePool(uint256 _value) private
    {
        MiningWarContract.fallback.value(_value)();
    }
    /**
    * @dev calculate current crystals of player
    * @param _addr player address
    */
    function calCurrentCrystals(address _addr) public view returns(uint256 _currentCrystals)
    {
        uint256 lastUpdateTime;
        (,, _currentCrystals, lastUpdateTime) = getMiningWarPlayerData(_addr);
        uint256 hashratePerDay = getHashratePerDay(_addr);     
        uint256 secondsPassed = SafeMath.sub(now, lastUpdateTime);      
        if (hashratePerDay > 0) {
            _currentCrystals = SafeMath.add(_currentCrystals, SafeMath.mul(hashratePerDay, secondsPassed));
        }
        _currentCrystals = SafeMath.div(_currentCrystals, CRTSTAL_MINING_PERIOD);
    }
    function devFee(uint256 _amount) private pure returns(uint256)
    {
        return SafeMath.div(SafeMath.mul(_amount, 5), 100);
    }
    /**
    * @dev with transaction payable send 5% value for admin and sponsor
    * @param _value fee 
    */
    function distributedToOwner(uint256 _value) private
    {
        gameSponsor.send(_value);
        miningWarAdministrator.send(_value);
    }
    function randomNumber(address _addr, uint256 _maxNumber) private returns(uint256)
    {
        randNonce = randNonce + 1;
        return uint256(keccak256(abi.encodePacked(now, _addr, randNonce))) % _maxNumber;
    }
    function getMiningWarPlayerData(address _addr) private view returns(uint256 _roundNumber, uint256 _hashrate, uint256 _crytals, uint256 _lastUpdateTime)
    {
        (_roundNumber,_hashrate,_crytals,_lastUpdateTime,,)= MiningWarContract.players(_addr);
    }
    function getHashratePerDay(address _addr) private view returns(uint256)
    {
        return MiningWarContract.getHashratePerDay(_addr);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"totalPayments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"calculateCurrentVirus","outputs":[{"name":"_currentVirus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"getResearchPerDay","outputs":[{"name":"_researchPerDay","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"engineerRoundNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"getPlayerData","outputs":[{"name":"_engineerRoundNumber","type":"uint256"},{"name":"_virusNumber","type":"uint256"},{"name":"_virusDefence","type":"uint256"},{"name":"_research","type":"uint256"},{"name":"_researchPerDay","type":"uint256"},{"name":"_lastUpdateTime","type":"uint256"},{"name":"_engineersCount","type":"uint256[8]"},{"name":"_nextTimeAtk","type":"uint256"},{"name":"_endTimeUnequalledDef","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isContractMiniGame","outputs":[{"name":"_isContractMiniGame","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"idx","type":"uint256"}],"name":"getBoosterData","outputs":[{"name":"_owner","type":"address"},{"name":"_boostRate","type":"uint256"},{"name":"_basePrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"engineers","outputs":[{"name":"basePrice","type":"uint256"},{"name":"baseETH","type":"uint256"},{"name":"baseResearch","type":"uint256"},{"name":"limit","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"engineerNumbers","type":"uint256[]"}],"name":"buyEngineer","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_atk","type":"uint256"},{"name":"_def","type":"uint256"}],"name":"setVirusInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"miningWarAdministrator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_atkAddress","type":"address"},{"name":"_defAddress","type":"address"}],"name":"canAttack","outputs":[{"name":"_canAtk","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_defAddress","type":"address"},{"name":"_value","type":"uint256"}],"name":"attack","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"addVirusDefence","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"miningWarContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawPayments","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"numberOfEngineer","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"prizePool","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gameSponsorPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"name":"claimPrizePool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setAtkNowForPlayer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_contractMiniGameAddress","type":"address"}],"name":"setContractsMiniGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"name":"subVirus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"calCurrentCrystals","outputs":[{"name":"_currentCrystals","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"virus","outputs":[{"name":"atk","type":"uint256"},{"name":"def","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contractMiniGameAddress","type":"address"}],"name":"removeContractMiniGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"boostData","outputs":[{"name":"owner","type":"address"},{"name":"boostRate","type":"uint256"},{"name":"basePrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"hasBooster","outputs":[{"name":"_boostIdx","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"miniGames","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gameSponsor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"setupMiniGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MiningWarContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CRTSTAL_MINING_PERIOD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"idx","type":"uint256"}],"name":"buyBooster","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"becomeGameSponsor","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"VIRUS_MINING_PERIOD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"payments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"players","outputs":[{"name":"engineerRoundNumber","type":"uint256"},{"name":"virusNumber","type":"uint256"},{"name":"virusDefence","type":"uint256"},{"name":"research","type":"uint256"},{"name":"lastUpdateTime","type":"uint256"},{"name":"nextTimeAtk","type":"uint256"},{"name":"endTimeUnequalledDef","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numberOfBoosts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"name":"addVirus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"name":"addTimeUnequalledDefence","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"administrator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HALF_TIME_ATK","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BASE_PRICE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VIRUS_NORMAL","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAtk","type":"address"},{"indexed":false,"name":"playerDef","type":"address"},{"indexed":false,"name":"isWin","type":"bool"},{"indexed":false,"name":"winCrystals","type":"uint256"},{"indexed":false,"name":"virusPlayerAtkDead","type":"uint256"},{"indexed":false,"name":"virusPlayerDefDead","type":"uint256"},{"indexed":false,"name":"timeAtk","type":"uint256"},{"indexed":false,"name":"engineerRoundNumber","type":"uint256"},{"indexed":false,"name":"atk","type":"uint256"},{"indexed":false,"name":"def","type":"uint256"}],"name":"eventEndAttack","type":"event"}]

6080604052600060035560006004553480156200001b57600080fd5b5060028054600160a060020a0319908116331791829055600780548216600160a060020a03938416179055670470de4df8200000600855600a8054821673f84c61bb982041c030b8580d1634f00fffb890591790819055600c80549092169083161790819055604080517ff53d0a8e0000000000000000000000000000000000000000000000000000000081529051919092169163f53d0a8e9160048083019260209291908290030181600087803b158015620000d757600080fd5b505af1158015620000ec573d6000803e3d6000fd5b505050506040513d60208110156200010357600080fd5b5051600b8054600160a060020a031916600160a060020a03909216919091179055600860058181556006818155604080518082018252600180825260208083018281526000808052601080845294517f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb015590517f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb0255845160808082018752600a8083528285018481528389018281526060808601938452868052600f80895295517ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec3755591517ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37655517ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec3775590517ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec378558751808301895260328152662386f26fc1000081870190815260c8828b0181815260028486018181529a8952878a5293517f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f5591517f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f8905590517f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f8915596517f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f8925588518084018a5296875266470de4df820000878701908152610320888b0181815260048a8601818152948952878a5299517fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead5591517fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeeae5590517fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeeaf5590517fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeeb05588518084018a52908152668e1bc9bf040000818701908152610c80828b018181528385019e8f526003885286895292517f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc82968285590517f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc82968295590517f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc829682a559a517f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc829682b55875180830189529a8b5267011c37937e0800008b86019081526125808c8a019081528c83019889529685528386529a517f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd5599517f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4ede5593517f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edf5593517f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4ee0558451808401865261320081526702386f26fc100000818401908152619600828801908152828b0185815299845286855291517f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f361620455517f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f361620555517f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f36162065595517f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f36162075583518083018552620190008152670470de4df820000081830190815262032000828701908152828a0187815297895285845291517fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff61855517fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff61955517fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff61a5593517fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff61b5582519081018352620c80008082526708e1bc9bf0400000828601908152938201908152620100009682019687526007909552925290517f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb4025455517f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb4025555517f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb4025655517f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb40257556200079d640100000000620007a3810204565b62000ad4565b6040805160608082018352600080835260966020808501918252662386f26fc10000858701908152838052600e80835295517fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c8054600160a060020a0319908116600160a060020a039384161790915593517fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881d5590517fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881e558651808601885284815260af81840190815266470de4df820000828a019081526001875288855291517fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be95820780548716918516919091179055517fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be95820855517fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be958209558651808601885284815260c8818401908152668e1bc9bf040000828a019081526002875288855291517f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f048180548716918516919091179055517f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f048255517f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f0483558651808601885284815260e181840190815267011c37937e080000828a019081526003875288855291517fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c90814480548716918516919091179055517fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c90814555517fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c908146558651948501875283855260fa8583019081526702386f26fc100000978601978852600490945294905291517fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a80549093169316929092179055517fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685b55517fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685c55565b611fd58062000ae46000396000f3006080604052600436106102155763ffffffff60e060020a6000350416625b448781146102205780630900f01014610247578063207a6c33146102685780632326faf914610289578063246bb555146102aa5780632aa531d9146102bf5780633281d5761461035357806339901be81461037c5780633dc20fff146103bc5780634b9c78e5146103fa5780634bbb58b2146104425780634cb60bc51461045d5780635166cf3d1461048e57806352fba25c146104b557806358eafc37146104d957806359a02652146104f15780636103d70b14610506578063691b65831461051b578063719ce73e14610530578063742609ce146105455780637baf71f91461055a5780637f3e4d1b1461057e57806384ffcb5d1461059f578063920775d4146105c057806395360a02146105e45780639c744d17146106055780639ff12bba14610636578063ac5b876c14610657578063ad5b71891461066f578063b239dac614610690578063b3140ac3146106b1578063be7ccd7e146106c6578063ca2cef51146106e1578063cee0b4fe146106f6578063d223926f1461070b578063da4a76c014610716578063e12936d0146106f6578063e2982c211461071e578063e2eb41ff1461073f578063eafddc4114610798578063ec6f772d146107ad578063f0af0844146107d1578063f53d0a8e146107f5578063f85033ac1461080a578063f86325ed1461081f578063f94b965f14610834575b61021e34610849565b005b34801561022c57600080fd5b5061023561085b565b60408051918252519081900360200190f35b34801561025357600080fd5b5061021e600160a060020a0360043516610861565b34801561027457600080fd5b50610235600160a060020a0360043516610884565b34801561029557600080fd5b50610235600160a060020a0360043516610953565b3480156102b657600080fd5b50610235610a41565b3480156102cb57600080fd5b506102e0600160a060020a0360043516610a47565b604051808a815260200189815260200188815260200187815260200186815260200185815260200184600860200280838360005b8381101561032c578181015183820152602001610314565b50505050905001838152602001828152602001995050505050505050505060405180910390f35b34801561035f57600080fd5b50610368610b0b565b604080519115158252519081900360200190f35b34801561038857600080fd5b50610394600435610b10565b60408051600160a060020a039094168452602084019290925282820152519081900360600190f35b3480156103c857600080fd5b506103d4600435610b73565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6040805160206004803580820135838102808601850190965280855261021e95369593946024949385019291829185019084908082843750949750610b9a9650505050505050565b34801561044e57600080fd5b5061021e600435602435610de9565b34801561046957600080fd5b50610472610e56565b60408051600160a060020a039092168252519081900360200190f35b34801561049a57600080fd5b50610368600160a060020a0360043581169060243516610e65565b3480156104c157600080fd5b5061021e600160a060020a0360043516602435610ed9565b3480156104e557600080fd5b5061021e6004356110f4565b3480156104fd57600080fd5b5061047261116c565b34801561051257600080fd5b5061021e61117b565b34801561052757600080fd5b50610235611204565b34801561053c57600080fd5b5061023561120a565b34801561055157600080fd5b50610235611210565b34801561056657600080fd5b5061021e600160a060020a0360043516602435611216565b34801561058a57600080fd5b5061021e600160a060020a03600435166112b6565b3480156105ab57600080fd5b5061021e600160a060020a03600435166112f8565b3480156105cc57600080fd5b5061021e600160a060020a03600435166024356113af565b3480156105f057600080fd5b50610235600160a060020a0360043516611431565b34801561061157600080fd5b5061061d600435611487565b6040805192835260208301919091528051918290030190f35b34801561064257600080fd5b5061021e600160a060020a03600435166114a0565b34801561066357600080fd5b506103946004356114d8565b34801561067b57600080fd5b50610235600160a060020a0360043516611503565b34801561069c57600080fd5b50610368600160a060020a036004351661155b565b3480156106bd57600080fd5b50610472611570565b3480156106d257600080fd5b5061021e60043560243561157f565b3480156106ed57600080fd5b50610472611583565b34801561070257600080fd5b50610235611592565b61021e600435611599565b61021e61166a565b34801561072a57600080fd5b50610235600160a060020a036004351661171d565b34801561074b57600080fd5b50610760600160a060020a036004351661172f565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b3480156107a457600080fd5b5061023561176c565b3480156107b957600080fd5b5061021e600160a060020a0360043516602435611772565b3480156107dd57600080fd5b5061021e600160a060020a03600435166024356117cc565b34801561080157600080fd5b50610472611831565b34801561081657600080fd5b50610235611840565b34801561082b57600080fd5b50610235611846565b34801561084057600080fd5b50610235611851565b61085560035482611856565b60035550565b60015481565b600254600160a060020a0316331461087857600080fd5b80600160a060020a0316ff5b600061088e611ee0565b600080600d600086600160a060020a0316600160a060020a0316815260200190815260200160002060e060405190810160405290816000820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815250509250610918428460800151611870565b915061092385610953565b905082602001519350600081111561094b57610948846109438385611882565b611856565b93505b505050919050565b600061095d611ee0565b6000610967611f1e565b600160a060020a0385166000908152600d6020908152604091829020825160e0810184528154815260028201549281019290925260038101549282019290925260048201546060820181905260058301546080830152600683015460a083015260079092015460c082015290945092506109e085611503565b91506103e7821461094b57506000818152600e602090815260409182902082516060810184528154600160a060020a0316815260018201549281018390526002909101549281019290925261094890610a3a908690611882565b60646118ad565b60045481565b600080600080600080610a58611f49565b600160a060020a0388166000908152600d602052604081208190815b600554811015610aa8576000818152600183016020526040902054858260088110610a9b57fe5b6020020152600101610a74565b81600001549a50610ac08260020154620151806118ad565b9950610ad38260030154620151806118ad565b985081600601549350816005015495508160070154925081600401549750610afa8c610953565b965050509193959799909294969850565b600190565b6000806000610b1d611f1e565b6006548510610b2b57600080fd5b505050600091825250600e602090815260409182902082516060810184528154600160a060020a03168082526001830154938201849052600290920154930183905292909190565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b600080600080600080610bab611f69565b600080323314610bba57600080fd5b6005548a5114610bc957600080fd5b610bd2336118c4565b336000908152600d60205260408120995097508796508695508594505b600554851015610d09578985815181101515610c0757fe5b60209081029091018101516000878152600f83526040908190208151608081018352815481526001820154948101949094526002810154918401919091526003015460608301819052909550909350841180610c635750600084105b15610c6d57600080fd5b6000841115610cfe57600085815260018a0160205260409020546060840151909250610ca290610c9d8487611856565b611926565b600086815260018b0160205260409020819055610cd390879061094390610cc99086611870565b8660400151611882565b9550610ce788610943856000015187611882565b9750610cfb87610943856020015187611882565b96505b600190940193610bef565b34871015610d1657600080fd5b610d1f8761193e565b9050610d2a8161194e565b610d33816119a3565b610d4f610d4a34610d45846003611882565b611870565b610849565b600c54604080517fb04eb639000000000000000000000000000000000000000000000000000000008152336004820152602481018b90529051600160a060020a039092169163b04eb6399160448082019260009290919082900301818387803b158015610dbb57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b50505050610ddd3387611a12565b50505050505050505050565b600254600090600160a060020a03163314610e0357600080fd5b506000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01919091557f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb0255565b600b54600160a060020a031681565b600081600160a060020a031683600160a060020a031614158015610ea45750600160a060020a0383166000908152600d60205260409020600601544210155b8015610eca5750600160a060020a0382166000908152600d602052604090206007015442115b15610ed3575060015b92915050565b6000806000610ee6611f92565b6000808080808080323314610efa57600080fd5b610f04338e610e65565b1515600114610f1257600080fd5b610f1b336118c4565b600d600033600160a060020a0316600160a060020a031681526020019081526020016000209a50600d60008e600160a060020a0316600160a060020a031681526020019081526020016000209950610f768c62015180611882565b9850888b600201541015610f8957600080fd5b611388610f958e611431565b1015610fa057600080fd5b6000805260106020908152604080518082019091527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb015481527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb025491810191909152975061100f336064611a43565b603201965061101f8d6064611a43565b603201955061103e610a3a6110388b8b60000151611882565b89611882565b945061105e610a3a6110588c600301548b60200151611882565b88611882565b9350600092506000915060009050838511156110a55761109789610c9d611086876064611882565b8b51611092908c611882565b6118ad565b915089600301549050600192505b6110b38b6002015483611870565b60028c015560038a01546110c79082611870565b60038b0155426103840160068c01556110e5338e8585858a8a611b12565b50505050505050505050505050565b60008032331461110357600080fd5b61110c336118c4565b336000908152600d60205260409020915061112a8362015180611882565b9050808260020154101561113d57600080fd5b61114b826003015482611856565b6003830155600282015461115f9082611870565b8260020181905550505050565b600a54600160a060020a031681565b3360008181526020819052604090205480151561119757600080fd5b30318111156111a557600080fd5b6001546111b8908263ffffffff61187016565b600155600160a060020a0382166000818152602081905260408082208290555183156108fc0291849190818181858888f193505050501580156111ff573d6000803e3d6000fd5b505050565b60055481565b60035481565b60085481565b3360009081526011602052604081205460ff16151560011461123757600080fd5b600354821061124557600080fd5b61125160035483611870565b60038190555082905080600160a060020a031663552079dc836040518263ffffffff1660e060020a0281526004016000604051808303818588803b15801561129857600080fd5b505af11580156112ac573d6000803e3d6000fd5b5050505050505050565b3360009081526011602052604081205460ff1615156001146112d757600080fd5b50600160a060020a03166000908152600d6020526040902042600690910155565b600254600090600160a060020a0316331461131257600080fd5b81905080600160a060020a0316633281d5766040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561135357600080fd5b505af1158015611367573d6000803e3d6000fd5b505050506040513d602081101561137d57600080fd5b5051151561138a57600080fd5b50600160a060020a03166000908152601160205260409020805460ff19166001179055565b33600090815260116020526040812054819060ff1615156001146113d257600080fd5b6113db846118c4565b600160a060020a0384166000908152600d6020526040902091506114028362015180611882565b9050808260020154101561141557600080fd5b611423826002015482611870565b826002018190555050505050565b60008060008061144085611cee565b90965094506114529150869050611daa565b915061145e4284611870565b9050600082111561147a57611477846109438484611882565b93505b61094884620151806118ad565b6010602052600090815260409020805460019091015482565b600254600160a060020a031633146114b757600080fd5b600160a060020a03166000908152601160205260409020805460ff19169055565b600e60205260009081526040902080546001820154600290920154600160a060020a03909116919083565b6103e76000805b6006548210156115545750600654819003600019016000818152600e6020526040902054600160a060020a038581169116141561154957809250611554565b60019091019061150a565b5050919050565b60116020526000908152604090205460ff1681565b600754600160a060020a031681565b5050565b600c54600160a060020a031681565b6201518081565b6000806000600654841015156115ae57600080fd5b6000848152600e6020526040902060028101549093503410806115da57508254600160a060020a031633145b156115e457600080fd5b82546002840154600160a060020a0390911692506116019061193e565b905061160c8161194e565b611615816119a3565b611627610d4a34610d45846003611882565b611630336118c4565b600160a060020a0382161561164857611648826118c4565b5050805473ffffffffffffffffffffffffffffffffffffffff19163317905550565b60008032331461167957600080fd5b611689610a3a6008546096611882565b91503482111561169857600080fd5b600754600160a060020a03163314156116b057600080fd5b6116c0610a3a600854606e611882565b600754604051919250600160a060020a03169082156108fc029083906000818181858888f19350505050506116f8610d4a3483611870565b506007805473ffffffffffffffffffffffffffffffffffffffff191633179055600855565b60006020819052908152604090205481565b600d602052600090815260409020805460028201546003830154600484015460058501546006860154600790960154949593949293919290919087565b60065481565b33600090815260116020526040812054819060ff16151560011461179557600080fd5b600160a060020a0384166000908152600d6020526040902091506117bc8362015180611882565b9050611423826002015482611856565b33600090815260116020526040812054819060ff1615156001146117ef57600080fd5b5050600160a060020a0382166000908152600d602052604090206007810154428110156118195750425b6118238184611856565b826007018190555050505050565b600254600160a060020a031681565b61038481565b662386f26fc1000081565b600081565b60008282018381101561186557fe5b8091505b5092915050565b60008282111561187c57fe5b50900390565b6000808315156118955760009150611869565b508282028284828115156118a557fe5b041461186557fe5b60008082848115156118bb57fe5b04949350505050565b600454600160a060020a0382166000908152600d60205260408120549091146118f5576118f082611e47565b61157f565b50600160a060020a0381166000908152600d6020526040902061191782610884565b60028201554260058201555050565b60008183106119355781611937565b825b9392505050565b6000610ed3610a3a836005611882565b600754604051600160a060020a039091169082156108fc029083906000818181858888f15050600b54604051600160a060020a03909116935084156108fc0292508491506000818181858888f1505050505050565b600c60009054906101000a9004600160a060020a0316600160a060020a031663552079dc826040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156119f657600080fd5b505af1158015611a0a573d6000803e3d6000fd5b505050505050565b600160a060020a0382166000908152600d602052604090206004810154611a399083611856565b6004909101555050565b60006009546001016009819055508142846009546040516020018084815260200183600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310611ad45780518252601f199092019160209182019101611ab5565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912092505050811515611b0a57fe5b069392505050565b6000808060018815151415611c6157611b2a89611431565b9150611b37896028611a43565b600a019050611b49610a3a8383611882565b92506000831115611c6157600c54604080517fb04eb639000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163b04eb63991604480830192600092919082900301818387803b158015611bc257600080fd5b505af1158015611bd6573d6000803e3d6000fd5b5050600c54604080517ff6e212ea000000000000000000000000000000000000000000000000000000008152600160a060020a038f8116600483015260248201899052915191909216935063f6e212ea9250604480830192600092919082900301818387803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b505050505b60045460408051600160a060020a03808e1682528c1660208201528a15158183015260608101869052608081018a905260a081018990524260c082015260e081019290925261010082018790526101208201869052517f36c6d46925dde3169726ae25f960a7d13b0e117e452f43673ba3529c27cd5899918190036101400190a150505050505050505050565b600c54604080517fe2eb41ff000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151600093849384938493919092169163e2eb41ff9160248083019260c092919082900301818787803b158015611d5e57600080fd5b505af1158015611d72573d6000803e3d6000fd5b505050506040513d60c0811015611d8857600080fd5b5080516020820151604083015160609093015191989097509195509350915050565b600c54604080517f2243fb15000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691632243fb159160248082019260209290919082900301818787803b158015611e1557600080fd5b505af1158015611e29573d6000803e3d6000fd5b505050506040513d6020811015611e3f57600080fd5b505192915050565b600454600160a060020a0382166000908152600d6020526040812054909182911415611e7257600080fd5b5050600160a060020a0381166000908152600d60205260408120600480548255600282018390556003820183905581018290554260058201819055600682018190556007820155905b6005548110156111ff5760008181526001808401602052604082209190915501611ebb565b60e060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6060604051908101604052806000600160a060020a0316815260200160008152602001600081525090565b610100604051908101604052806008906020820280388339509192915050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b6040805180820190915260008082526020820152905600a165627a7a72305820a64ce8b681b3b7ef5c3dacf2430a77d102547c666093c10c4346e5ca65d28b4d0029

Deployed Bytecode

0x6080604052600436106102155763ffffffff60e060020a6000350416625b448781146102205780630900f01014610247578063207a6c33146102685780632326faf914610289578063246bb555146102aa5780632aa531d9146102bf5780633281d5761461035357806339901be81461037c5780633dc20fff146103bc5780634b9c78e5146103fa5780634bbb58b2146104425780634cb60bc51461045d5780635166cf3d1461048e57806352fba25c146104b557806358eafc37146104d957806359a02652146104f15780636103d70b14610506578063691b65831461051b578063719ce73e14610530578063742609ce146105455780637baf71f91461055a5780637f3e4d1b1461057e57806384ffcb5d1461059f578063920775d4146105c057806395360a02146105e45780639c744d17146106055780639ff12bba14610636578063ac5b876c14610657578063ad5b71891461066f578063b239dac614610690578063b3140ac3146106b1578063be7ccd7e146106c6578063ca2cef51146106e1578063cee0b4fe146106f6578063d223926f1461070b578063da4a76c014610716578063e12936d0146106f6578063e2982c211461071e578063e2eb41ff1461073f578063eafddc4114610798578063ec6f772d146107ad578063f0af0844146107d1578063f53d0a8e146107f5578063f85033ac1461080a578063f86325ed1461081f578063f94b965f14610834575b61021e34610849565b005b34801561022c57600080fd5b5061023561085b565b60408051918252519081900360200190f35b34801561025357600080fd5b5061021e600160a060020a0360043516610861565b34801561027457600080fd5b50610235600160a060020a0360043516610884565b34801561029557600080fd5b50610235600160a060020a0360043516610953565b3480156102b657600080fd5b50610235610a41565b3480156102cb57600080fd5b506102e0600160a060020a0360043516610a47565b604051808a815260200189815260200188815260200187815260200186815260200185815260200184600860200280838360005b8381101561032c578181015183820152602001610314565b50505050905001838152602001828152602001995050505050505050505060405180910390f35b34801561035f57600080fd5b50610368610b0b565b604080519115158252519081900360200190f35b34801561038857600080fd5b50610394600435610b10565b60408051600160a060020a039094168452602084019290925282820152519081900360600190f35b3480156103c857600080fd5b506103d4600435610b73565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6040805160206004803580820135838102808601850190965280855261021e95369593946024949385019291829185019084908082843750949750610b9a9650505050505050565b34801561044e57600080fd5b5061021e600435602435610de9565b34801561046957600080fd5b50610472610e56565b60408051600160a060020a039092168252519081900360200190f35b34801561049a57600080fd5b50610368600160a060020a0360043581169060243516610e65565b3480156104c157600080fd5b5061021e600160a060020a0360043516602435610ed9565b3480156104e557600080fd5b5061021e6004356110f4565b3480156104fd57600080fd5b5061047261116c565b34801561051257600080fd5b5061021e61117b565b34801561052757600080fd5b50610235611204565b34801561053c57600080fd5b5061023561120a565b34801561055157600080fd5b50610235611210565b34801561056657600080fd5b5061021e600160a060020a0360043516602435611216565b34801561058a57600080fd5b5061021e600160a060020a03600435166112b6565b3480156105ab57600080fd5b5061021e600160a060020a03600435166112f8565b3480156105cc57600080fd5b5061021e600160a060020a03600435166024356113af565b3480156105f057600080fd5b50610235600160a060020a0360043516611431565b34801561061157600080fd5b5061061d600435611487565b6040805192835260208301919091528051918290030190f35b34801561064257600080fd5b5061021e600160a060020a03600435166114a0565b34801561066357600080fd5b506103946004356114d8565b34801561067b57600080fd5b50610235600160a060020a0360043516611503565b34801561069c57600080fd5b50610368600160a060020a036004351661155b565b3480156106bd57600080fd5b50610472611570565b3480156106d257600080fd5b5061021e60043560243561157f565b3480156106ed57600080fd5b50610472611583565b34801561070257600080fd5b50610235611592565b61021e600435611599565b61021e61166a565b34801561072a57600080fd5b50610235600160a060020a036004351661171d565b34801561074b57600080fd5b50610760600160a060020a036004351661172f565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b3480156107a457600080fd5b5061023561176c565b3480156107b957600080fd5b5061021e600160a060020a0360043516602435611772565b3480156107dd57600080fd5b5061021e600160a060020a03600435166024356117cc565b34801561080157600080fd5b50610472611831565b34801561081657600080fd5b50610235611840565b34801561082b57600080fd5b50610235611846565b34801561084057600080fd5b50610235611851565b61085560035482611856565b60035550565b60015481565b600254600160a060020a0316331461087857600080fd5b80600160a060020a0316ff5b600061088e611ee0565b600080600d600086600160a060020a0316600160a060020a0316815260200190815260200160002060e060405190810160405290816000820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820154815250509250610918428460800151611870565b915061092385610953565b905082602001519350600081111561094b57610948846109438385611882565b611856565b93505b505050919050565b600061095d611ee0565b6000610967611f1e565b600160a060020a0385166000908152600d6020908152604091829020825160e0810184528154815260028201549281019290925260038101549282019290925260048201546060820181905260058301546080830152600683015460a083015260079092015460c082015290945092506109e085611503565b91506103e7821461094b57506000818152600e602090815260409182902082516060810184528154600160a060020a0316815260018201549281018390526002909101549281019290925261094890610a3a908690611882565b60646118ad565b60045481565b600080600080600080610a58611f49565b600160a060020a0388166000908152600d602052604081208190815b600554811015610aa8576000818152600183016020526040902054858260088110610a9b57fe5b6020020152600101610a74565b81600001549a50610ac08260020154620151806118ad565b9950610ad38260030154620151806118ad565b985081600601549350816005015495508160070154925081600401549750610afa8c610953565b965050509193959799909294969850565b600190565b6000806000610b1d611f1e565b6006548510610b2b57600080fd5b505050600091825250600e602090815260409182902082516060810184528154600160a060020a03168082526001830154938201849052600290920154930183905292909190565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b600080600080600080610bab611f69565b600080323314610bba57600080fd5b6005548a5114610bc957600080fd5b610bd2336118c4565b336000908152600d60205260408120995097508796508695508594505b600554851015610d09578985815181101515610c0757fe5b60209081029091018101516000878152600f83526040908190208151608081018352815481526001820154948101949094526002810154918401919091526003015460608301819052909550909350841180610c635750600084105b15610c6d57600080fd5b6000841115610cfe57600085815260018a0160205260409020546060840151909250610ca290610c9d8487611856565b611926565b600086815260018b0160205260409020819055610cd390879061094390610cc99086611870565b8660400151611882565b9550610ce788610943856000015187611882565b9750610cfb87610943856020015187611882565b96505b600190940193610bef565b34871015610d1657600080fd5b610d1f8761193e565b9050610d2a8161194e565b610d33816119a3565b610d4f610d4a34610d45846003611882565b611870565b610849565b600c54604080517fb04eb639000000000000000000000000000000000000000000000000000000008152336004820152602481018b90529051600160a060020a039092169163b04eb6399160448082019260009290919082900301818387803b158015610dbb57600080fd5b505af1158015610dcf573d6000803e3d6000fd5b50505050610ddd3387611a12565b50505050505050505050565b600254600090600160a060020a03163314610e0357600080fd5b506000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01919091557f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb0255565b600b54600160a060020a031681565b600081600160a060020a031683600160a060020a031614158015610ea45750600160a060020a0383166000908152600d60205260409020600601544210155b8015610eca5750600160a060020a0382166000908152600d602052604090206007015442115b15610ed3575060015b92915050565b6000806000610ee6611f92565b6000808080808080323314610efa57600080fd5b610f04338e610e65565b1515600114610f1257600080fd5b610f1b336118c4565b600d600033600160a060020a0316600160a060020a031681526020019081526020016000209a50600d60008e600160a060020a0316600160a060020a031681526020019081526020016000209950610f768c62015180611882565b9850888b600201541015610f8957600080fd5b611388610f958e611431565b1015610fa057600080fd5b6000805260106020908152604080518082019091527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb015481527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb025491810191909152975061100f336064611a43565b603201965061101f8d6064611a43565b603201955061103e610a3a6110388b8b60000151611882565b89611882565b945061105e610a3a6110588c600301548b60200151611882565b88611882565b9350600092506000915060009050838511156110a55761109789610c9d611086876064611882565b8b51611092908c611882565b6118ad565b915089600301549050600192505b6110b38b6002015483611870565b60028c015560038a01546110c79082611870565b60038b0155426103840160068c01556110e5338e8585858a8a611b12565b50505050505050505050505050565b60008032331461110357600080fd5b61110c336118c4565b336000908152600d60205260409020915061112a8362015180611882565b9050808260020154101561113d57600080fd5b61114b826003015482611856565b6003830155600282015461115f9082611870565b8260020181905550505050565b600a54600160a060020a031681565b3360008181526020819052604090205480151561119757600080fd5b30318111156111a557600080fd5b6001546111b8908263ffffffff61187016565b600155600160a060020a0382166000818152602081905260408082208290555183156108fc0291849190818181858888f193505050501580156111ff573d6000803e3d6000fd5b505050565b60055481565b60035481565b60085481565b3360009081526011602052604081205460ff16151560011461123757600080fd5b600354821061124557600080fd5b61125160035483611870565b60038190555082905080600160a060020a031663552079dc836040518263ffffffff1660e060020a0281526004016000604051808303818588803b15801561129857600080fd5b505af11580156112ac573d6000803e3d6000fd5b5050505050505050565b3360009081526011602052604081205460ff1615156001146112d757600080fd5b50600160a060020a03166000908152600d6020526040902042600690910155565b600254600090600160a060020a0316331461131257600080fd5b81905080600160a060020a0316633281d5766040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561135357600080fd5b505af1158015611367573d6000803e3d6000fd5b505050506040513d602081101561137d57600080fd5b5051151561138a57600080fd5b50600160a060020a03166000908152601160205260409020805460ff19166001179055565b33600090815260116020526040812054819060ff1615156001146113d257600080fd5b6113db846118c4565b600160a060020a0384166000908152600d6020526040902091506114028362015180611882565b9050808260020154101561141557600080fd5b611423826002015482611870565b826002018190555050505050565b60008060008061144085611cee565b90965094506114529150869050611daa565b915061145e4284611870565b9050600082111561147a57611477846109438484611882565b93505b61094884620151806118ad565b6010602052600090815260409020805460019091015482565b600254600160a060020a031633146114b757600080fd5b600160a060020a03166000908152601160205260409020805460ff19169055565b600e60205260009081526040902080546001820154600290920154600160a060020a03909116919083565b6103e76000805b6006548210156115545750600654819003600019016000818152600e6020526040902054600160a060020a038581169116141561154957809250611554565b60019091019061150a565b5050919050565b60116020526000908152604090205460ff1681565b600754600160a060020a031681565b5050565b600c54600160a060020a031681565b6201518081565b6000806000600654841015156115ae57600080fd5b6000848152600e6020526040902060028101549093503410806115da57508254600160a060020a031633145b156115e457600080fd5b82546002840154600160a060020a0390911692506116019061193e565b905061160c8161194e565b611615816119a3565b611627610d4a34610d45846003611882565b611630336118c4565b600160a060020a0382161561164857611648826118c4565b5050805473ffffffffffffffffffffffffffffffffffffffff19163317905550565b60008032331461167957600080fd5b611689610a3a6008546096611882565b91503482111561169857600080fd5b600754600160a060020a03163314156116b057600080fd5b6116c0610a3a600854606e611882565b600754604051919250600160a060020a03169082156108fc029083906000818181858888f19350505050506116f8610d4a3483611870565b506007805473ffffffffffffffffffffffffffffffffffffffff191633179055600855565b60006020819052908152604090205481565b600d602052600090815260409020805460028201546003830154600484015460058501546006860154600790960154949593949293919290919087565b60065481565b33600090815260116020526040812054819060ff16151560011461179557600080fd5b600160a060020a0384166000908152600d6020526040902091506117bc8362015180611882565b9050611423826002015482611856565b33600090815260116020526040812054819060ff1615156001146117ef57600080fd5b5050600160a060020a0382166000908152600d602052604090206007810154428110156118195750425b6118238184611856565b826007018190555050505050565b600254600160a060020a031681565b61038481565b662386f26fc1000081565b600081565b60008282018381101561186557fe5b8091505b5092915050565b60008282111561187c57fe5b50900390565b6000808315156118955760009150611869565b508282028284828115156118a557fe5b041461186557fe5b60008082848115156118bb57fe5b04949350505050565b600454600160a060020a0382166000908152600d60205260408120549091146118f5576118f082611e47565b61157f565b50600160a060020a0381166000908152600d6020526040902061191782610884565b60028201554260058201555050565b60008183106119355781611937565b825b9392505050565b6000610ed3610a3a836005611882565b600754604051600160a060020a039091169082156108fc029083906000818181858888f15050600b54604051600160a060020a03909116935084156108fc0292508491506000818181858888f1505050505050565b600c60009054906101000a9004600160a060020a0316600160a060020a031663552079dc826040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156119f657600080fd5b505af1158015611a0a573d6000803e3d6000fd5b505050505050565b600160a060020a0382166000908152600d602052604090206004810154611a399083611856565b6004909101555050565b60006009546001016009819055508142846009546040516020018084815260200183600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310611ad45780518252601f199092019160209182019101611ab5565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912092505050811515611b0a57fe5b069392505050565b6000808060018815151415611c6157611b2a89611431565b9150611b37896028611a43565b600a019050611b49610a3a8383611882565b92506000831115611c6157600c54604080517fb04eb639000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163b04eb63991604480830192600092919082900301818387803b158015611bc257600080fd5b505af1158015611bd6573d6000803e3d6000fd5b5050600c54604080517ff6e212ea000000000000000000000000000000000000000000000000000000008152600160a060020a038f8116600483015260248201899052915191909216935063f6e212ea9250604480830192600092919082900301818387803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b505050505b60045460408051600160a060020a03808e1682528c1660208201528a15158183015260608101869052608081018a905260a081018990524260c082015260e081019290925261010082018790526101208201869052517f36c6d46925dde3169726ae25f960a7d13b0e117e452f43673ba3529c27cd5899918190036101400190a150505050505050505050565b600c54604080517fe2eb41ff000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151600093849384938493919092169163e2eb41ff9160248083019260c092919082900301818787803b158015611d5e57600080fd5b505af1158015611d72573d6000803e3d6000fd5b505050506040513d60c0811015611d8857600080fd5b5080516020820151604083015160609093015191989097509195509350915050565b600c54604080517f2243fb15000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691632243fb159160248082019260209290919082900301818787803b158015611e1557600080fd5b505af1158015611e29573d6000803e3d6000fd5b505050506040513d6020811015611e3f57600080fd5b505192915050565b600454600160a060020a0382166000908152600d6020526040812054909182911415611e7257600080fd5b5050600160a060020a0381166000908152600d60205260408120600480548255600282018390556003820183905581018290554260058201819055600682018190556007820155905b6005548110156111ff5760008181526001808401602052604082209190915501611ebb565b60e060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6060604051908101604052806000600160a060020a0316815260200160008152602001600081525090565b610100604051908101604052806008906020820280388339509192915050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b6040805180820190915260008082526020820152905600a165627a7a72305820a64ce8b681b3b7ef5c3dacf2430a77d102547c666093c10c4346e5ca65d28b4d0029

Swarm Source

bzzr://a64ce8b681b3b7ef5c3dacf2430a77d102547c666093c10c4346e5ca65d28b4d

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.