ETH Price: $3,413.70 (-1.80%)
Gas: 5 Gwei

Contract

0xcaEF67F72114B4D2B4f43E7407455285b7dE8De5
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Start Training127506572021-07-02 21:31:431110 days ago1625261503IN
Etheremon: Gym
0.001 ETH0.001103194
Start Training78927652019-06-04 12:11:301870 days ago1559650290IN
Etheremon: Gym
0.001 ETH0.000202631
Start Training78927452019-06-04 12:07:461870 days ago1559650066IN
Etheremon: Gym
0.001 ETH0.000396272
Withdraw Ether77877182019-05-19 1:54:461886 days ago1558230886IN
Etheremon: Gym
0 ETH0.001324541
Start Training73471362019-03-11 9:46:011955 days ago1552297561IN
Etheremon: Gym
0.001 ETH0.000585873
Start Training73076892019-03-05 6:14:011961 days ago1551766441IN
Etheremon: Gym
0.001 ETH0.00065033
Start Training73067882019-03-05 2:49:261961 days ago1551754166IN
Etheremon: Gym
0.001 ETH0.001141425
Start Training73067092019-03-05 2:28:391961 days ago1551752919IN
Etheremon: Gym
0.001 ETH0.000748044.2
Start Training73067072019-03-05 2:27:031961 days ago1551752823IN
Etheremon: Gym
0.001 ETH0.00057823
Start Training73067042019-03-05 2:26:451961 days ago1551752805IN
Etheremon: Gym
0.001 ETH0.000799294.2
Start Training73067022019-03-05 2:26:011961 days ago1551752761IN
Etheremon: Gym
0.001 ETH0.000741684.2
Start Training73066982019-03-05 2:25:381961 days ago1551752738IN
Etheremon: Gym
0.001 ETH0.000579283
Start Training73063422019-03-05 1:11:351961 days ago1551748295IN
Etheremon: Gym
0.001 ETH0.000571993
Start Training73054012019-03-04 21:44:051961 days ago1551735845IN
Etheremon: Gym
0.001 ETH0.000538443
Start Training73052512019-03-04 21:11:001961 days ago1551733860IN
Etheremon: Gym
0.001 ETH0.000366772
Start Training73052452019-03-04 21:09:381961 days ago1551733778IN
Etheremon: Gym
0.001 ETH0.000372542
Start Training73052032019-03-04 21:00:241961 days ago1551733224IN
Etheremon: Gym
0.001 ETH0.000361562
Start Training73046922019-03-04 19:04:411962 days ago1551726281IN
Etheremon: Gym
0.001 ETH0.000902635
Start Training73045802019-03-04 18:41:321962 days ago1551724892IN
Etheremon: Gym
0.001 ETH0.001108715
Start Training73044222019-03-04 18:06:181962 days ago1551722778IN
Etheremon: Gym
0.001 ETH0.000558023
Start Training73041862019-03-04 17:09:441962 days ago1551719384IN
Etheremon: Gym
0.001 ETH0.000568133
Start Training73032752019-03-04 13:43:461962 days ago1551707026IN
Etheremon: Gym
0.001 ETH0.000873744
Start Training73026512019-03-04 11:25:251962 days ago1551698725IN
Etheremon: Gym
0.001 ETH0.001331656.9
Start Training73026352019-03-04 11:23:071962 days ago1551698587IN
Etheremon: Gym
0.001 ETH0.000421292
Start Training73025092019-03-04 10:52:491962 days ago1551696769IN
Etheremon: Gym
0.001 ETH0.001221276.9
View all transactions

Latest 5 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
77877182019-05-19 1:54:461886 days ago1558230886
Etheremon: Gym
0.614 ETH
72057952019-02-11 7:16:171983 days ago1549869377
Etheremon: Gym
5.382 ETH
64682292018-10-07 4:26:292110 days ago1538886389
Etheremon: Gym
3.824 ETH
60727112018-08-02 3:26:082176 days ago1533180368
Etheremon: Gym
7.047 ETH
53543022018-03-31 10:25:392300 days ago1522491939
Etheremon: Gym
14.505 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EtheremonGym

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-01-13
*/

pragma solidity ^0.4.16;

// copyright [email protected]

contract SafeMath {

    /* function assert(bool assertion) internal { */
    /*   if (!assertion) { */
    /*     throw; */
    /*   } */
    /* }      // assert no longer needed once solidity is on 0.4.10 */

    function safeAdd(uint256 x, uint256 y) pure internal returns(uint256) {
      uint256 z = x + y;
      assert((z >= x) && (z >= y));
      return z;
    }

    function safeSubtract(uint256 x, uint256 y) pure internal returns(uint256) {
      assert(x >= y);
      uint256 z = x - y;
      return z;
    }

    function safeMult(uint256 x, uint256 y) pure internal returns(uint256) {
      uint256 z = x * y;
      assert((x == 0)||(z/x == y));
      return z;
    }

}

contract BasicAccessControl {
    address public owner;
    // address[] public moderators;
    uint16 public totalModerators = 0;
    mapping (address => bool) public moderators;
    bool public isMaintaining = true;

    function BasicAccessControl() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    modifier onlyModerators() {
        require(msg.sender == owner || moderators[msg.sender] == true);
        _;
    }

    modifier isActive {
        require(!isMaintaining);
        _;
    }

    function ChangeOwner(address _newOwner) onlyOwner public {
        if (_newOwner != address(0)) {
            owner = _newOwner;
        }
    }


    function AddModerator(address _newModerator) onlyOwner public {
        if (moderators[_newModerator] == false) {
            moderators[_newModerator] = true;
            totalModerators += 1;
        }
    }
    
    function RemoveModerator(address _oldModerator) onlyOwner public {
        if (moderators[_oldModerator] == true) {
            moderators[_oldModerator] = false;
            totalModerators -= 1;
        }
    }

    function UpdateMaintaining(bool _isMaintaining) onlyOwner public {
        isMaintaining = _isMaintaining;
    }
}

contract EtheremonEnum {

    enum ResultCode {
        SUCCESS,
        ERROR_CLASS_NOT_FOUND,
        ERROR_LOW_BALANCE,
        ERROR_SEND_FAIL,
        ERROR_NOT_TRAINER,
        ERROR_NOT_ENOUGH_MONEY,
        ERROR_INVALID_AMOUNT,
        ERROR_OBJ_NOT_FOUND,
        ERROR_OBJ_INVALID_OWNERSHIP
    }
    
    enum ArrayType {
        CLASS_TYPE,
        STAT_STEP,
        STAT_START,
        STAT_BASE,
        OBJ_SKILL
    }

    enum PropertyType {
        ANCESTOR,
        XFACTOR
    }
    
    enum BattleResult {
        CASTLE_WIN,
        CASTLE_LOSE,
        CASTLE_DESTROYED
    }
    
    enum CacheClassInfoType {
        CLASS_TYPE,
        CLASS_STEP,
        CLASS_ANCESTOR
    }
}

contract EtheremonDataBase is EtheremonEnum, BasicAccessControl, SafeMath {
    
    uint64 public totalMonster;
    uint32 public totalClass;
    
    // read
    function getSizeArrayType(ArrayType _type, uint64 _id) constant public returns(uint);
    function getElementInArrayType(ArrayType _type, uint64 _id, uint _index) constant public returns(uint8);
    function getMonsterClass(uint32 _classId) constant public returns(uint32 classId, uint256 price, uint256 returnPrice, uint32 total, bool catchable);
    function getMonsterObj(uint64 _objId) constant public returns(uint64 objId, uint32 classId, address trainer, uint32 exp, uint32 createIndex, uint32 lastClaimIndex, uint createTime);
    function getMonsterName(uint64 _objId) constant public returns(string name);
    function getExtraBalance(address _trainer) constant public returns(uint256);
    function getMonsterDexSize(address _trainer) constant public returns(uint);
    function getMonsterObjId(address _trainer, uint index) constant public returns(uint64);
    function getExpectedBalance(address _trainer) constant public returns(uint256);
    function getMonsterReturn(uint64 _objId) constant public returns(uint256 current, uint256 total);
}

contract EtheremonGateway is EtheremonEnum, BasicAccessControl {
    // using for battle contract later
    function increaseMonsterExp(uint64 _objId, uint32 amount) onlyModerators public;
    function decreaseMonsterExp(uint64 _objId, uint32 amount) onlyModerators public;
    
    // read 
    function isGason(uint64 _objId) constant external returns(bool);
    function getObjBattleInfo(uint64 _objId) constant external returns(uint32 classId, uint32 exp, bool isGason, 
        uint ancestorLength, uint xfactorsLength);
    function getClassPropertySize(uint32 _classId, PropertyType _type) constant external returns(uint);
    function getClassPropertyValue(uint32 _classId, PropertyType _type, uint index) constant external returns(uint32);
}

contract EtheremonGym is EtheremonEnum, BasicAccessControl, SafeMath {
    uint8 constant public STAT_COUNT = 6;
    
    struct MonsterObjAcc {
        uint64 monsterId;
        uint32 classId;
        address trainer;
        string name;
        uint32 exp;
        uint32 createIndex;
        uint32 lastClaimIndex;
        uint createTime;
    }
    
    struct AttackData {
        uint32 objClassId;
        address trainee;
        uint8 objLevel;
        uint8 winCount;
        uint32 winExp;
        uint32 loseExp;
    }
    
    struct HpData {
        uint16 aHpAttack;
        uint16 aHpAttackCritical;
        uint16 bHpAttack;
        uint16 bHpAttackCritical;        
    }
    
    struct GymTrainer {
        uint32 classId;
        uint8[6] statBases;
    }
    
    struct TrainingLog {
        uint8[3] trainers;
        uint8 trainerLevel;
        uint64 objId;
        uint8 objLevel;
        uint8 ran;
    }
    
    struct CacheClassInfo {
        uint8[] types;
        uint8[] steps;
        uint32[] ancestors;
    }
    
    mapping(uint8 => GymTrainer) public gymTrainers;
    mapping(address => TrainingLog) public trainees;
    mapping(uint8 => uint8) typeAdvantages;
    mapping(uint32 => CacheClassInfo) cacheClasses;
    mapping(uint8 => uint32) levelExps;
    mapping(uint8 => uint32) levelExpGains;
    uint256 public gymFee = 0.001 ether;
    uint8 public maxTrainerLevel = 5;
    uint8 public totalTrainer = 0;
    uint8 public maxRandomRound = 4;
    uint8 public typeBuffPercentage = 20;
    uint8 public minHpDeducted = 10;
    uint8 public expPercentage = 70;
    
    // contract
    address public worldContract;
    address public dataContract;

   // modifier
    modifier requireDataContract {
        require(dataContract != address(0));
        _;
    }
    
    modifier requireWorldContract {
        require(worldContract != address(0));
        _;
    }
    
    // constructor
    function EtheremonGym(address _dataContract, address _worldContract) public {
        dataContract = _dataContract;
        worldContract = _worldContract;
    }
    
    
     // admin & moderators
    function setTypeAdvantages() onlyModerators external {
        typeAdvantages[1] = 14;
        typeAdvantages[2] = 16;
        typeAdvantages[3] = 8;
        typeAdvantages[4] = 9;
        typeAdvantages[5] = 2;
        typeAdvantages[6] = 11;
        typeAdvantages[7] = 3;
        typeAdvantages[8] = 5;
        typeAdvantages[9] = 15;
        typeAdvantages[11] = 18;
        // skipp 10
        typeAdvantages[12] = 7;
        typeAdvantages[13] = 6;
        typeAdvantages[14] = 17;
        typeAdvantages[15] = 13;
        typeAdvantages[16] = 12;
        typeAdvantages[17] = 1;
        typeAdvantages[18] = 4;
    }
    
    function setTypeAdvantage(uint8 _type1, uint8 _type2) onlyModerators external {
        typeAdvantages[_type1] = _type2;
    }
    
    function setCacheClassInfo(uint32 _classId) onlyModerators requireDataContract requireWorldContract public {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
         EtheremonGateway gateway = EtheremonGateway(worldContract);
        uint i = 0;
        CacheClassInfo storage classInfo = cacheClasses[_classId];

        // add type
        i = data.getSizeArrayType(ArrayType.CLASS_TYPE, uint64(_classId));
        uint8[] memory aTypes = new uint8[](i);
        for(; i > 0 ; i--) {
            aTypes[i-1] = data.getElementInArrayType(ArrayType.CLASS_TYPE, uint64(_classId), i-1);
        }
        classInfo.types = aTypes;

        // add steps
        i = data.getSizeArrayType(ArrayType.STAT_STEP, uint64(_classId));
        uint8[] memory steps = new uint8[](i);
        for(; i > 0 ; i--) {
            steps[i-1] = data.getElementInArrayType(ArrayType.STAT_STEP, uint64(_classId), i-1);
        }
        classInfo.steps = steps;
        
        // add ancestor
        i = gateway.getClassPropertySize(_classId, PropertyType.ANCESTOR);
        uint32[] memory ancestors = new uint32[](i);
        for(; i > 0 ; i--) {
            ancestors[i-1] = gateway.getClassPropertyValue(_classId, PropertyType.ANCESTOR, i-1);
        }
        classInfo.ancestors = ancestors;
    }
    
    function fastSetCacheClassInfo(uint32 _classId1, uint32 _classId2, uint32 _classId3, uint32 _classId4) onlyModerators requireDataContract requireWorldContract external {
        setCacheClassInfo(_classId1);
        setCacheClassInfo(_classId2);
        setCacheClassInfo(_classId3);
        setCacheClassInfo(_classId4);
    }
    
    function presetGymTrainer() onlyModerators external {
        GymTrainer storage trainer1 = gymTrainers[1];
        trainer1.classId = 12;
        trainer1.statBases[0] = 85;
        trainer1.statBases[1] = 95;
        trainer1.statBases[2] = 65;
        trainer1.statBases[3] = 50;
        trainer1.statBases[4] = 50;
        trainer1.statBases[5] = 50;
        GymTrainer storage trainer2 = gymTrainers[2];
        trainer2.classId = 15;
        trainer2.statBases[0] = 50;
        trainer2.statBases[1] = 55;
        trainer2.statBases[2] = 85;
        trainer2.statBases[3] = 85;
        trainer2.statBases[4] = 40;
        trainer2.statBases[5] = 75;
        GymTrainer storage trainer3 = gymTrainers[3];
        trainer3.classId = 8;
        trainer3.statBases[0] = 110;
        trainer3.statBases[1] = 60;
        trainer3.statBases[2] = 40;
        trainer3.statBases[3] = 60;
        trainer3.statBases[4] = 40;
        trainer3.statBases[5] = 40;
        GymTrainer storage trainer4 = gymTrainers[4];
        trainer4.classId = 4;
        trainer4.statBases[0] = 54;
        trainer4.statBases[1] = 69;
        trainer4.statBases[2] = 58;
        trainer4.statBases[3] = 75;
        trainer4.statBases[4] = 75;
        trainer4.statBases[5] = 70;
        GymTrainer storage trainer5 = gymTrainers[5];
        trainer5.classId = 6;
        trainer5.statBases[0] = 50;
        trainer5.statBases[1] = 50;
        trainer5.statBases[2] = 50;
        trainer5.statBases[3] = 105;
        trainer5.statBases[4] = 55;
        trainer5.statBases[5] = 95;
        GymTrainer storage trainer6 = gymTrainers[6];
        trainer6.classId = 13;
        trainer6.statBases[0] = 55;
        trainer6.statBases[1] = 90;
        trainer6.statBases[2] = 95;
        trainer6.statBases[3] = 45;
        trainer6.statBases[4] = 35;
        trainer6.statBases[5] = 35;
        GymTrainer storage trainer7 = gymTrainers[7];
        trainer7.classId = 7;
        trainer7.statBases[0] = 85;
        trainer7.statBases[1] = 60;
        trainer7.statBases[2] = 73;
        trainer7.statBases[3] = 75;
        trainer7.statBases[4] = 80;
        trainer7.statBases[5] = 50;
        GymTrainer storage trainer8 = gymTrainers[8];
        trainer8.classId = 24;
        trainer8.statBases[0] = 140;
        trainer8.statBases[1] = 135;
        trainer8.statBases[2] = 70;
        trainer8.statBases[3] = 77;
        trainer8.statBases[4] = 90;
        trainer8.statBases[5] = 50;
        GymTrainer storage trainer9 = gymTrainers[9];
        trainer9.classId = 16;
        trainer9.statBases[0] = 70;
        trainer9.statBases[1] = 105;
        trainer9.statBases[2] = 80;
        trainer9.statBases[3] = 60;
        trainer9.statBases[4] = 80;
        trainer9.statBases[5] = 90;
        totalTrainer = 9;
    }
    
    function setGymTrainer(uint8 _trainerId, uint32 _classId, uint8 _s0, uint8 _s1, uint8 _s2, uint8 _s3, uint8 _s4, uint8 _s5) onlyModerators external {
        GymTrainer storage trainer = gymTrainers[_trainerId];
        if (trainer.classId == 0)
            totalTrainer += 1;
        trainer.classId = _classId;
        trainer.statBases[0] = _s0;
        trainer.statBases[1] = _s1;
        trainer.statBases[2] = _s2;
        trainer.statBases[3] = _s3;
        trainer.statBases[4] = _s4;
        trainer.statBases[5] = _s5;
    }
    
    function setContract(address _dataContract, address _worldContract) onlyModerators external {
        dataContract = _dataContract;
        worldContract = _worldContract;
    }
    
    function setConfig(uint256 _gymFee, uint8 _maxTrainerLevel, uint8 _maxRandomRound, uint8 _typeBuffPercentage, 
        uint8 _minHpDeducted, uint8 _expPercentage) onlyModerators external {
        gymFee = _gymFee;
        maxTrainerLevel = _maxTrainerLevel;
        maxRandomRound = _maxRandomRound;
        typeBuffPercentage = _typeBuffPercentage;
        minHpDeducted = _minHpDeducted;
        expPercentage = _expPercentage;
    }
    
    function genLevelExp() onlyModerators external {
        uint8 level = 1;
        uint32 requirement = 100;
        uint32 sum = requirement;
        while(level <= 100) {
            levelExps[level] = sum;
            level += 1;
            requirement = (requirement * 11) / 10 + 5;
            sum += requirement;
        }
    }
    
    function genLevelExpGain() onlyModerators external {
        levelExpGains[1] = 31;
        levelExpGains[2] = 33;
        levelExpGains[3] = 34;
        levelExpGains[4] = 36;
        levelExpGains[5] = 38;
        levelExpGains[6] = 40;
        levelExpGains[7] = 42;
        levelExpGains[8] = 44;
        levelExpGains[9] = 46;
        levelExpGains[10] = 48;
    }
    
    function setLevelExpGain(uint8 _level, uint32 _exp) onlyModerators external {
        levelExpGains[_level] = _exp;
    }
    
    function withdrawEther(address _sendTo, uint _amount) onlyModerators external {
        if (_amount > this.balance) {
            revert();
        }
        _sendTo.transfer(_amount);
    }
    
    // public
    function getCacheClassSize(uint32 _classId) constant public returns(uint, uint, uint) {
        CacheClassInfo storage classInfo = cacheClasses[_classId];
        return (classInfo.types.length, classInfo.steps.length, classInfo.ancestors.length);
    }
    
    function getTrainerInfo(uint8 _trainerId) constant external returns(uint32, uint8, uint8, uint8, uint8, uint8, uint8) {
        GymTrainer memory trainer = gymTrainers[_trainerId];
        return (trainer.classId, trainer.statBases[0], trainer.statBases[1], trainer.statBases[2], trainer.statBases[3],
            trainer.statBases[4], trainer.statBases[5]);
    }
    
    function getRandom(uint8 maxRan, uint8 index) constant public returns(uint8) {
        uint256 genNum = uint256(block.blockhash(block.number-1));
        for (uint8 i = 0; i < index && i < 6; i ++) {
            genNum /= 256;
        }
        return uint8(genNum % maxRan);
    }
    
    function getLevel(uint32 exp) view public returns (uint8) {
        uint8 minIndex = 1;
        uint8 maxIndex = 100;
        uint8 currentIndex;
     
        while (minIndex < maxIndex) {
            currentIndex = (minIndex + maxIndex) / 2;
            if (exp < levelExps[currentIndex])
                maxIndex = currentIndex;
            else
                minIndex = currentIndex + 1;
        }
        return minIndex;
    }
    
    function getGainExp(uint8 xLevel, uint8 yLevel) constant public returns(uint32 winExp, uint32 loseExp){
        winExp = levelExpGains[yLevel] * expPercentage / 100;
        if (xLevel > yLevel) {
            if (xLevel > yLevel + 10) {
                winExp = 5;
            } else {
                winExp /= uint32(3) ** (xLevel - yLevel) / uint32(2) ** (xLevel - yLevel);
                if (winExp < 5)
                    winExp = 5;
            }
        }
        loseExp = winExp / 3;
    }
    
    function safeDeduct(uint16 a, uint16 b) pure private returns(uint16){
        if (a > b) {
            return a - b;
        }
        return 0;
    }
    
    function getTypeSupport(uint32 _aClassId, uint32 _bClassId) constant private returns (bool aHasAdvantage, bool bHasAdvantage) {
        // check types 
        for (uint i = 0; i < cacheClasses[_aClassId].types.length; i++) {
            for (uint j = 0; j < cacheClasses[_bClassId].types.length; j++) {
                if (typeAdvantages[cacheClasses[_aClassId].types[i]] == cacheClasses[_bClassId].types[j]) {
                    aHasAdvantage = true;
                }
                if (typeAdvantages[cacheClasses[_bClassId].types[j]] == cacheClasses[_aClassId].types[i]) {
                    bHasAdvantage = true;
                }
            }
        }
    }
    
    function calHpDeducted(uint16 _attack, uint16 _specialAttack, uint16 _defense, uint16 _specialDefense, bool _lucky) view public returns(uint16){
        if (_lucky) {
            _attack = _attack * 13 / 10;
            _specialAttack = _specialAttack * 13 / 10;
        }
        uint16 hpDeducted = safeDeduct(_attack, _defense * 3 /4);
        uint16 hpSpecialDeducted = safeDeduct(_specialAttack, _specialDefense* 3 / 4);
        if (hpDeducted < minHpDeducted && hpSpecialDeducted < minHpDeducted)
            return minHpDeducted;
        if (hpDeducted > hpSpecialDeducted)
            return hpDeducted;
        return hpSpecialDeducted;
    }
    
    function attack(uint8 _index, uint8 _ran, uint16[6] _aStats, uint16[6] _bStats) constant public returns(bool win) {
        if (_ran < _index * maxRandomRound)
            _ran = maxRandomRound;
        else
            _ran = _ran - _index * maxRandomRound;
            
        uint16 round = 0;
        uint16 aHp = _aStats[0];
        uint16 bHp = _bStats[0];
        if (_aStats[5] > _bStats[5]) {
            while (round < maxRandomRound && aHp > 0 && bHp > 0) {
                if (round % 2 == 0) {
                    // a attack 
                    bHp = safeDeduct(bHp, calHpDeducted(_aStats[1], _aStats[3], _bStats[2], _bStats[4], round==_ran));
                } else {
                    aHp = safeDeduct(aHp, calHpDeducted(_bStats[1], _bStats[3], _aStats[2], _aStats[4], round==_ran));
                }
                round++;
            }
        } else {
            while (round < maxRandomRound && aHp > 0 && bHp > 0) {
                if (round % 2 != 0) {
                    bHp = safeDeduct(bHp, calHpDeducted(_aStats[1], _aStats[3], _bStats[2], _bStats[4], round==_ran));
                } else {
                    aHp = safeDeduct(aHp, calHpDeducted(_bStats[1], _bStats[3], _aStats[2], _aStats[4], round==_ran));
                }
                round++;
            }
        }
        
        win = aHp >= bHp;
    }
    
    function attackTrainer(uint8 _index, uint8 _ran, uint8 _trainerId, uint8 _trainerLevel, uint32 _objClassId, uint16[6] _objStats) constant public returns(bool result) {
        GymTrainer memory trainer = gymTrainers[_trainerId];
        uint16[6] memory trainerStats;
        uint i = 0;
        for (i=0; i < STAT_COUNT; i+=1) {
            trainerStats[i] = trainer.statBases[i];
        }
        for (i=0; i < cacheClasses[trainer.classId].steps.length; i++) {
            trainerStats[i] += uint16(safeMult(cacheClasses[trainer.classId].steps[i], _trainerLevel*3));
        }
        
        bool objHasAdvantage;
        bool trainerHasAdvantage;
        (objHasAdvantage, trainerHasAdvantage) = getTypeSupport(_objClassId, trainer.classId);
        uint16 originAttack = _objStats[1];
        uint16 originAttackSpecial = _objStats[3];
        if (objHasAdvantage) {
            _objStats[1] += _objStats[1] * typeBuffPercentage / 100;
            _objStats[3] += _objStats[3] * typeBuffPercentage / 100;
        }
        if (trainerHasAdvantage) {
            trainerStats[1] += trainerStats[1] * typeBuffPercentage / 100;
            trainerStats[3] += trainerStats[3] * typeBuffPercentage / 100;
        }
        result = attack(_index, _ran, _objStats, trainerStats);
        _objStats[1] = originAttack;
        _objStats[3] = originAttackSpecial;
    }
    
    function getObjInfo(uint64 _objId) constant public returns(uint32 classId, address trainee, uint8 level) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, classId, trainee, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(_objId);
        level = getLevel(obj.exp);
    }
    
    function startTraining(uint64 _objId, uint8 _trainerLevel, uint8 _t1, uint8 _t2, uint8 _t3) isActive requireDataContract requireWorldContract payable external {
        if (_trainerLevel > maxTrainerLevel)
            revert();
        if (msg.value != gymFee)
            revert();
        if (_t1 == _t2 || _t1 == _t3 || _t2 == _t3)
            revert();
        if (_t1 == 0 || _t2 == 0 || _t3 == 0 || _t1 > totalTrainer || _t2 > totalTrainer || _t3 > totalTrainer)
            revert();

        AttackData memory att;
        (att.objClassId, att.trainee, att.objLevel) = getObjInfo(_objId);
        if (msg.sender != att.trainee)
            revert();

        uint i = 0;
        uint16[6] memory objStats;
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        for (i=0; i < STAT_COUNT; i+=1) {
            objStats[i] = data.getElementInArrayType(ArrayType.STAT_BASE, _objId, i);
        }
        for (i=0; i < cacheClasses[att.objClassId].steps.length; i++) {
            objStats[i] += uint16(safeMult(cacheClasses[att.objClassId].steps[i], att.objLevel*3));
        }
        
        att.winCount = 0;
        uint8 ran = getRandom(maxRandomRound*3, 0);
        if (attackTrainer(0, ran, _t1, _trainerLevel, att.objClassId, objStats))
            att.winCount += 1;
        if (attackTrainer(1, ran, _t2, _trainerLevel, att.objClassId, objStats))
            att.winCount += 1;
        if (attackTrainer(2, ran, _t3, _trainerLevel, att.objClassId, objStats))
            att.winCount += 1;

        (att.winExp, att.loseExp) = getGainExp(att.objLevel, _trainerLevel);
        EtheremonGateway gateway = EtheremonGateway(worldContract);
        gateway.increaseMonsterExp(_objId, att.winCount * att.winExp + (3 - att.winCount) * att.loseExp);
        
        TrainingLog storage trainingLog = trainees[msg.sender];
        trainingLog.trainers[0] = _t1;
        trainingLog.trainers[1] = _t2;
        trainingLog.trainers[2] = _t3;
        trainingLog.trainerLevel = _trainerLevel;
        trainingLog.objId = _objId;
        trainingLog.objLevel = att.objLevel;
        trainingLog.ran = ran;
    }
    
    function getTrainingLog(address _trainee) constant external returns(uint8, uint8, uint8, uint64, uint8, uint8, uint8) {
        TrainingLog memory trainingLog = trainees[_trainee];
        return (trainingLog.trainers[0], trainingLog.trainers[1], trainingLog.trainers[2], 
            trainingLog.objId, trainingLog.trainerLevel, trainingLog.objLevel, trainingLog.ran);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"dataContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"moderators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_gymFee","type":"uint256"},{"name":"_maxTrainerLevel","type":"uint8"},{"name":"_maxRandomRound","type":"uint8"},{"name":"_typeBuffPercentage","type":"uint8"},{"name":"_minHpDeducted","type":"uint8"},{"name":"_expPercentage","type":"uint8"}],"name":"setConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"worldContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_attack","type":"uint16"},{"name":"_specialAttack","type":"uint16"},{"name":"_defense","type":"uint16"},{"name":"_specialDefense","type":"uint16"},{"name":"_lucky","type":"bool"}],"name":"calHpDeducted","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_classId1","type":"uint32"},{"name":"_classId2","type":"uint32"},{"name":"_classId3","type":"uint32"},{"name":"_classId4","type":"uint32"}],"name":"fastSetCacheClassInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_trainerId","type":"uint8"},{"name":"_classId","type":"uint32"},{"name":"_s0","type":"uint8"},{"name":"_s1","type":"uint8"},{"name":"_s2","type":"uint8"},{"name":"_s3","type":"uint8"},{"name":"_s4","type":"uint8"},{"name":"_s5","type":"uint8"}],"name":"setGymTrainer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"genLevelExpGain","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_dataContract","type":"address"},{"name":"_worldContract","type":"address"}],"name":"setContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"expPercentage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_type1","type":"uint8"},{"name":"_type2","type":"uint8"}],"name":"setTypeAdvantage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"genLevelExp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setTypeAdvantages","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_level","type":"uint8"},{"name":"_exp","type":"uint32"}],"name":"setLevelExpGain","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_objId","type":"uint64"}],"name":"getObjInfo","outputs":[{"name":"classId","type":"uint32"},{"name":"trainee","type":"address"},{"name":"level","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_trainerId","type":"uint8"}],"name":"getTrainerInfo","outputs":[{"name":"","type":"uint32"},{"name":"","type":"uint8"},{"name":"","type":"uint8"},{"name":"","type":"uint8"},{"name":"","type":"uint8"},{"name":"","type":"uint8"},{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_isMaintaining","type":"bool"}],"name":"UpdateMaintaining","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint8"},{"name":"_ran","type":"uint8"},{"name":"_aStats","type":"uint16[6]"},{"name":"_bStats","type":"uint16[6]"}],"name":"attack","outputs":[{"name":"win","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalModerators","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_classId","type":"uint32"}],"name":"getCacheClassSize","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sendTo","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newModerator","type":"address"}],"name":"AddModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalTrainer","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"gymTrainers","outputs":[{"name":"classId","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gymFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"typeBuffPercentage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_classId","type":"uint32"}],"name":"setCacheClassInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"exp","type":"uint32"}],"name":"getLevel","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldModerator","type":"address"}],"name":"RemoveModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_trainee","type":"address"}],"name":"getTrainingLog","outputs":[{"name":"","type":"uint8"},{"name":"","type":"uint8"},{"name":"","type":"uint8"},{"name":"","type":"uint64"},{"name":"","type":"uint8"},{"name":"","type":"uint8"},{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"xLevel","type":"uint8"},{"name":"yLevel","type":"uint8"}],"name":"getGainExp","outputs":[{"name":"winExp","type":"uint32"},{"name":"loseExp","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"trainees","outputs":[{"name":"trainerLevel","type":"uint8"},{"name":"objId","type":"uint64"},{"name":"objLevel","type":"uint8"},{"name":"ran","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_objId","type":"uint64"},{"name":"_trainerLevel","type":"uint8"},{"name":"_t1","type":"uint8"},{"name":"_t2","type":"uint8"},{"name":"_t3","type":"uint8"}],"name":"startTraining","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"minHpDeducted","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint8"},{"name":"_ran","type":"uint8"},{"name":"_trainerId","type":"uint8"},{"name":"_trainerLevel","type":"uint8"},{"name":"_objClassId","type":"uint32"},{"name":"_objStats","type":"uint16[6]"}],"name":"attackTrainer","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxTrainerLevel","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STAT_COUNT","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxRandomRound","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"maxRan","type":"uint8"},{"name":"index","type":"uint8"}],"name":"getRandom","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isMaintaining","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"ChangeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"presetGymTrainer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_dataContract","type":"address"},{"name":"_worldContract","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]

60606040526000805460a060020a61ffff02191690556002805460ff1990811660011790915566038d7ea4c68000600955600a8054600592169190911762ffff001916620400001763ff000000191663140000001764ff000000001916640a000000001765ff0000000000191665460000000000179055341561008157600080fd5b60405160408061390e833981016040528080519190602001805160008054600160a060020a03338116600160a060020a031992831617909255600b80549683169690911695909517909455600a805494909116660100000000000002603060020a60d060020a031990941693909317909255505061380a806101046000396000f3006060604052600436106101f55763ffffffff60e060020a6000350416630d66881881146101fa57806314d0f1ba146102295780631576fc551461025c578063187584801461029257806320046e91146102a557806325ae9c97146102ed578063278f9f6e1461031b57806327979b35146103625780632bf6e0a5146103755780632c2da3cf1461039a5780633171cec4146103c357806333ced321146103e257806333d24dc4146103f55780633d5dbaed146104085780634538bc951461042a57806348e889ed1461048057806348ef5aa8146104e757806349d165f6146104ff5780634efb023e1461056e578063500e429714610581578063522f6815146105c15780636c81fd6d146105e35780637216ee0014610602578063830146cf14610615578063838985d714610647578063891fe1031461066c5780638da5cb5b1461067f5780638fd8f78314610692578063b2cad9b7146106ae578063b85d6275146106ca578063b952bb30146106e9578063bb9ea07c14610758578063bda7b1cb14610798578063bfcece9f146107f0578063cfa830791461081d578063d60ef60214610830578063d8819e0a1461088d578063d98e14bd146108a0578063ebfa3c1b146108b3578063ed30e558146108c6578063ee4e4416146108e5578063f2853292146108f8578063fb214f4c14610917575b600080fd5b341561020557600080fd5b61020d61092a565b604051600160a060020a03909116815260200160405180910390f35b341561023457600080fd5b610248600160a060020a0360043516610939565b604051901515815260200160405180910390f35b341561026757600080fd5b61029060043560ff60243581169060443581169060643581169060843581169060a4351661094e565b005b341561029d57600080fd5b61020d610a0a565b34156102b057600080fd5b6102d661ffff600435811690602435811690604435811690606435166084351515610a23565b60405161ffff909116815260200160405180910390f35b34156102f857600080fd5b61029063ffffffff60043581169060243581169060443581169060643516610ae7565b341561032657600080fd5b61029060ff60043581169063ffffffff602435169060443581169060643581169060843581169060a43581169060c43581169060e43516610b8f565b341561036d57600080fd5b610290610cd1565b341561038057600080fd5b610290600160a060020a0360043581169060243516610ed0565b34156103a557600080fd5b6103ad610f76565b60405160ff909116815260200160405180910390f35b34156103ce57600080fd5b61029060ff60043581169060243516610f88565b34156103ed57600080fd5b610290610ff0565b341561040057600080fd5b61029061109e565b341561041357600080fd5b61029060ff6004351663ffffffff602435166113c4565b341561043557600080fd5b61044a67ffffffffffffffff60043516611437565b60405163ffffffff9093168352600160a060020a03909116602083015260ff166040808301919091526060909101905180910390f35b341561048b57600080fd5b61049960ff60043516611529565b60405163ffffffff909716875260ff958616602088015293851660408088019190915292851660608701529084166080860152831660a0850152911660c083015260e0909101905180910390f35b34156104f257600080fd5b6102906004351515611613565b341561050a57600080fd5b61024860ff6004803582169160243516906101046044600660c06040519081016040529190828260c080828437820191505050505091908060c001906006806020026040519081016040529190828260c08082843750939550611641945050505050565b341561057957600080fd5b6102d66117fe565b341561058c57600080fd5b61059d63ffffffff60043516611820565b60405180848152602001838152602001828152602001935050505060405180910390f35b34156105cc57600080fd5b610290600160a060020a0360043516602435611845565b34156105ee57600080fd5b610290600160a060020a03600435166118d7565b341561060d57600080fd5b6103ad611981565b341561062057600080fd5b61062e60ff6004351661198f565b60405163ffffffff909116815260200160405180910390f35b341561065257600080fd5b61065a6119a7565b60405190815260200160405180910390f35b341561067757600080fd5b6103ad6119ad565b341561068a57600080fd5b61020d6119bd565b341561069d57600080fd5b61029063ffffffff600435166119cc565b34156106b957600080fd5b6103ad63ffffffff60043516611f9f565b34156106d557600080fd5b610290600160a060020a0360043516612002565b34156106f457600080fd5b610708600160a060020a03600435166120ac565b60405160ff9788168152958716602087015293861660408087019190915267ffffffffffffffff90931660608601529085166080850152841660a0840152921660c082015260e001905180910390f35b341561076357600080fd5b61077760ff600435811690602435166121c5565b60405163ffffffff9283168152911660208201526040908101905180910390f35b34156107a357600080fd5b6107b7600160a060020a0360043516612283565b60405160ff948516815267ffffffffffffffff909316602084015290831660408084019190915292166060820152608001905180910390f35b61029067ffffffffffffffff6004351660ff602435811690604435811690606435811690608435166122cd565b341561082857600080fd5b6103ad61282e565b341561083b57600080fd5b61024860ff60048035821691602435811691604435821691606435169063ffffffff608435169061016460a4600660c06040519081016040529190828260c0808284375093955061283f945050505050565b341561089857600080fd5b6103ad612b06565b34156108ab57600080fd5b6103ad612b0f565b34156108be57600080fd5b6103ad612b14565b34156108d157600080fd5b6103ad60ff60043581169060243516612b23565b34156108f057600080fd5b610248612b71565b341561090357600080fd5b610290600160a060020a0360043516612b7a565b341561092257600080fd5b610290612bd1565b600b54600160a060020a031681565b60016020526000908152604090205460ff1681565b60005433600160a060020a03908116911614806109895750600160a060020a03331660009081526001602081905260409091205460ff161515145b151561099457600080fd5b600995909555600a805460ff191660ff9586161762ff0000191662010000948616949094029390931763ff00000019166301000000928516929092029190911764ff000000001916640100000000918416919091021765ff00000000001916650100000000009290931691909102919091179055565b600a5466010000000000009004600160a060020a031681565b60008060008315610a4957600a61ffff600d8a0216049750600a61ffff600d8902160496505b610a5e88600461ffff60038a02165b04613360565b9150610a7387600461ffff6003890216610a58565b600a54909150640100000000900460ff1661ffff8316108015610aa65750600a54640100000000900460ff1661ffff8216105b15610ac057600a54640100000000900460ff169250610adc565b8061ffff168261ffff161115610ad857819250610adc565b8092505b505095945050505050565b60005433600160a060020a0390811691161480610b225750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610b2d57600080fd5b600b54600160a060020a03161515610b4457600080fd5b600a5466010000000000009004600160a060020a03161515610b6557600080fd5b610b6e846119cc565b610b77836119cc565b610b80826119cc565b610b89816119cc565b50505050565b6000805433600160a060020a0390811691161480610bcb5750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610bd657600080fd5b5060ff88166000908152600360205260409020805463ffffffff161515610c1757600a805460ff61010080830482166001019091160261ff00199091161790555b805463ffffffff191663ffffffff891617815560018101805460ff191660ff8981169190911761ff001916610100898316021762ff0000191662010000888316021763ff000000191663010000009187169190910217815583906004602091828204019190066101000a81548160ff021916908360ff16021790555081816001016005600681101515610ca657fe5b602091828204019190066101000a81548160ff021916908360ff160217905550505050505050505050565b60005433600160a060020a0390811691161480610d0c5750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610d1757600080fd5b60086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f805463ffffffff19908116601f179091557f6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea90418054821660211790557f625b35f5e76f098dd7c3a05b10e2e5e78a4a01228d60c3b143426cdf36d264558054821660221790557f9321edea6e3be4df59a344b401fab4f888b556fda1f954244cff9204bad624b88054821660241790557f91238f30f286c9a1c6e901c4eda3b214c381c846e3dbe48df95c21488e8e1fdb8054821660261790557f13acf3fc7bed94759963f076d5d3443d88732026bffc8253bdf4a6e65f21ecc58054821660281790557f24cd397636bedc6cf9b490d0edd57c769c19b367fb7d5c2344ae1ddc7d21c14480548216602a1790557fe4c2e8be66af8dd2d277000f4f830a10546f8b14e45cd850b875c98ba0f0d2cd80548216602c1790557f82c9e868e45873bb5a4f47c09e14a12f6a6314e13aabd611e4374762bb4e8b3680548216602e179055600a6000527f586689db7536874b78a6eac0f58556a56a106985743f7c16a699b27bb02f88bd80549091166030179055565b60005433600160a060020a0390811691161480610f0b5750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610f1657600080fd5b600b8054600160a060020a0393841673ffffffffffffffffffffffffffffffffffffffff19909116179055600a80549190921666010000000000000279ffffffffffffffffffffffffffffffffffffffff00000000000019909116179055565b600a5465010000000000900460ff1681565b60005433600160a060020a0390811691161480610fc35750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610fce57600080fd5b60ff9182166000908152600560205260409020805460ff191691909216179055565b600080548190819033600160a060020a03908116911614806110305750600160a060020a03331660009081526001602081905260409091205460ff161515145b151561103b57600080fd5b506001915060649050805b606460ff8416116110995760ff83166000908152600760205260409020805463ffffffff191663ffffffff83811691909117909155600190930192600a90600b8402160460050191508181019050611046565b505050565b60005433600160a060020a03908116911614806110d95750600160a060020a03331660009081526001602081905260409091205460ff161515145b15156110e457600080fd5b600560208190527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b805460ff19908116600e179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a8054821660101790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054821660081790557f3eec716f11ba9e820c81ca75eb978ffb45831ef8b7a53e5e422c26008e1ca6d58054821660091790557f458b30c2d72bfd2c6317304a4594ecbafe5f729d3111b65fdc3a33bd48e5432d8054821660021790557f069400f22b28c6c362558d92f66163cec5671cba50b61abd2eecfcd0eaeac51880548216600b1790557feddb6698d7c569ff62ff64f1f1492bf14a54594835ba0faac91f84b4f5d814608054821660031790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805482169092179091557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe180548216600f1790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054821660129081179091557ff907e7e6656fa73566b18c1215272fe9fca2c55c552e62c923e21e000ac4b4e68054831660071790557f03145c75015e7a856ecd94c41432ef3cb669d6360af23433588937fefdfac8258054831660061790557f783638979e3582b3ffd6d53fc06c949ac31d1ac75a5e2c3531fbe1f91045eb538054831660111790557f58f00e8ecc6f5419941dd0bafec65a4cc188d31713fb1fe224257460930df8af80548316600d1790557f8b32256db898364c465749decac34aee435952ffe1739257aa5b0235e266d9c580548316600c1790557fb4e18992ad424cdedc46668609f2bafcf665a8d99577618d5923c69264d9cf5f8054831660011790556000527fd1ccbf1f9f869f51cd81e6f099f905636b057f682c706fe990614b112051692880549091166004179055565b60005433600160a060020a03908116911614806113ff5750600160a060020a03331660009081526001602081905260409091205460ff161515145b151561140a57600080fd5b60ff919091166000908152600860205260409020805463ffffffff191663ffffffff909216919091179055565b600080600080611445613542565b600b54600160a060020a0316915081630720246087600060405160e0015260405160e060020a63ffffffff841602815267ffffffffffffffff909116600482015260240160e060405180830381600087803b15156114a257600080fd5b6102c65a03f115156114b357600080fd5b505050604051805190602001805190602001805190602001805190602001805190602001805190602001805160e08901525063ffffffff90811660c088015290811660a0870152166080850190815267ffffffffffffffff9093168452909650945061151f9051611f9f565b9496939550505050565b600080600080600080600061153c61358e565b60ff8916600090815260036020526040908190209080519081016040908152825463ffffffff1682529091906020830190600183019060069060c09051908101604052919060c08301826000855b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161158a57905050505050508152505090508060000151816020015151826020015160200151836020015160400151846020015160600151856020015160800151866020015160a00151959f949e50929c50909a509850965090945092505050565b60005433600160a060020a0390811691161461162e57600080fd5b6002805460ff1916911515919091179055565b600080600080600a60029054906101000a900460ff16880260ff168760ff16101561167957600a5462010000900460ff16965061168c565b600a5462010000900460ff168802909603955b60009250855191508451905060a085015161ffff1660a087015161ffff16111561176f575b600a5462010000900460ff1661ffff84161080156116d3575060008261ffff16115b80156116e3575060008161ffff16115b1561176a57600261ffff84160661ffff166000141561173a576117338161172e8860015b602002015160608a015160408a01518a60045b60200201518d60ff168a61ffff1614610a23565b613360565b905061175f565b61175c8261172e8760015b6020020151606089015160408b01518b600461171a565b91505b6001909201916116b1565b6117ea565b600a5462010000900460ff1661ffff8416108015611791575060008261ffff16115b80156117a1575060008161ffff16115b156117ea57600261ffff84160661ffff16156117cd576117c68161172e886001611707565b90506117df565b6117dc8261172e876001611745565b91505b60019092019161176f565b61ffff908116911610159695505050505050565b60005474010000000000000000000000000000000000000000900461ffff1681565b63ffffffff166000908152600660205260409020805460018201546002909201549092565b60005433600160a060020a03908116911614806118805750600160a060020a03331660009081526001602081905260409091205460ff161515145b151561188b57600080fd5b30600160a060020a0316318111156118a257600080fd5b600160a060020a03821681156108fc0282604051600060405180830381858888f1935050505015156118d357600080fd5b5050565b60005433600160a060020a039081169116146118f257600080fd5b600160a060020a03811660009081526001602052604090205460ff16151561197e57600160a060020a03811660009081526001602081905260408220805460ff191682179055815461ffff7401000000000000000000000000000000000000000080830482169093011690910275ffff0000000000000000000000000000000000000000199091161790555b50565b600a54610100900460ff1681565b60036020526000908152604090205463ffffffff1681565b60095481565b600a546301000000900460ff1681565b600054600160a060020a031681565b6000806000806119da6135ae565b6119e26135ae565b6119ea6135ae565b60005433600160a060020a0390811691161480611a255750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515611a3057600080fd5b600b54600160a060020a03161515611a4757600080fd5b600a5466010000000000009004600160a060020a03161515611a6857600080fd5b600b54600a5463ffffffff8a16600081815260066020526040808220600160a060020a039586169c5066010000000000009094049094169950975090955088916341b0eb53918891829051602001526040518363ffffffff1660e060020a02815260040180836004811115611ad957fe5b60ff1681526020018267ffffffffffffffff1667ffffffffffffffff16815260200192505050602060405180830381600087803b1515611b1857600080fd5b6102c65a03f11515611b2957600080fd5b50505060405180519050945084604051805910611b435750595b908082528060200260200182016040525092505b6000851115611c345786600160a060020a03166362b21ad760008a63ffffffff16600189036000604051602001526040518463ffffffff1660e060020a02815260040180846004811115611ba757fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515611bed57600080fd5b6102c65a03f11515611bfe57600080fd5b50505060405180519050836001870381518110611c1757fe5b60ff90921660209283029091019091015260001990940193611b57565b83838051611c469291602001906135c0565b5086600160a060020a03166341b0eb5360018a63ffffffff166000604051602001526040518363ffffffff1660e060020a02815260040180836004811115611c8a57fe5b60ff1681526020018267ffffffffffffffff1667ffffffffffffffff16815260200192505050602060405180830381600087803b1515611cc957600080fd5b6102c65a03f11515611cda57600080fd5b50505060405180519050945084604051805910611cf45750595b908082528060200260200182016040525091505b6000851115611de55786600160a060020a03166362b21ad760018a63ffffffff16600189036000604051602001526040518463ffffffff1660e060020a02815260040180846004811115611d5857fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515611d9e57600080fd5b6102c65a03f11515611daf57600080fd5b50505060405180519050826001870381518110611dc857fe5b60ff90921660209283029091019091015260001990940193611d08565b60018401828051611dfa9291602001906135c0565b5085600160a060020a03166388e9abb689600080604051602001526040518363ffffffff1660e060020a028152600401808363ffffffff1663ffffffff168152602001826001811115611e4957fe5b60ff16815260200192505050602060405180830381600087803b1515611e6e57600080fd5b6102c65a03f11515611e7f57600080fd5b50505060405180519050945084604051805910611e995750595b908082528060200260200182016040525090505b6000851115611f7f5785600160a060020a0316635b626339896000600189036000604051602001526040518463ffffffff1660e060020a028152600401808463ffffffff1663ffffffff168152602001836001811115611f0957fe5b60ff1681526020018281526020019350505050602060405180830381600087803b1515611f3557600080fd5b6102c65a03f11515611f4657600080fd5b50505060405180519050816001870381518110611f5f57fe5b63ffffffff90921660209283029091019091015260001990940193611ead565b60028401818051611f94929160200190613666565b505050505050505050565b600060016064825b8160ff168360ff161015611ff957600260ff848401160460ff811660009081526007602052604090205490915063ffffffff9081169086161015611fed57809150611ff4565b8060010192505b611fa7565b50909392505050565b60005433600160a060020a0390811691161461201d57600080fd5b600160a060020a03811660009081526001602081905260409091205460ff161515141561197e57600160a060020a03166000908152600160205260408120805460ff19169055805475ffff0000000000000000000000000000000000000000198116740100000000000000000000000000000000000000009182900461ffff9081166000190116909102179055565b60008060008060008060006120bf613711565b600160a060020a038916600090815260046020526040908190209060a09051908101604052908160008201600380602002604051908101604052919060608301826000855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411612104575050509284525050506001919091015460ff8082166020840152610100820467ffffffffffffffff16604084015269010000000000000000008204811660608401526a01000000000000000000009091041660809091015290508051518151602001518251604001518360400151846020015185606001518660800151959f949e50929c50909a509850965090945092505050565b600a5460ff828116600081815260086020526040812054606465010000000000909504841663ffffffff9182160216939093049291851611156122715782600a0160ff168460ff16111561221c5760059150612271565b82840360ff1660020a63ffffffff1683850360ff1660030a63ffffffff1681151561224357fe5b0463ffffffff168263ffffffff1681151561225a57fe5b04915060058263ffffffff16101561227157600591505b5092600363ffffffff85160492509050565b60046020526000908152604090206001015460ff8082169167ffffffffffffffff61010082041691690100000000000000000082048116916a010000000000000000000090041684565b6122d5613725565b60006122df61375a565b60025460009081908190819060ff16156122f857600080fd5b600b54600160a060020a0316151561230f57600080fd5b600a5466010000000000009004600160a060020a0316151561233057600080fd5b600a5460ff908116908c16111561234657600080fd5b600954341461235457600080fd5b8860ff168a60ff16148061236d57508760ff168a60ff16145b8061237d57508760ff168960ff16145b1561238757600080fd5b60ff8a161580612398575060ff8916155b806123a4575060ff8816155b806123bc5750600a5460ff6101009091048116908b16115b806123d45750600a5460ff6101009091048116908a16115b806123ec5750600a5460ff6101009091048116908916115b156123f657600080fd5b6123ff8c611437565b60ff1660408a0152600160a060020a03166020890190815263ffffffff909116885251600160a060020a031633600160a060020a031614151561244157600080fd5b600b5460009650600160a060020a031693505b60068610156125255783600160a060020a03166362b21ad760038e896000604051602001526040518463ffffffff1660e060020a0281526004018084600481111561249b57fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15156124e157600080fd5b6102c65a03f115156124f257600080fd5b505050604051805160ff16905085876006811061250b57fe5b61ffff909216602092909202015260019590950194612454565b600095505b60066000885163ffffffff1681526020810191909152604001600020600101548610156125d2576125ab60066000895163ffffffff168152602081019190915260400160002060010180548890811061257f57fe5b600091825260209182902082820401549190066101000a900460ff16604089015160030260ff16613385565b8587600681106125b757fe5b6020020181815161ffff91011690525060019095019461252a565b600060608801819052600a546125f89160036201000090920460ff169190910290612b23565b925061260a6000848c8e8b518a61283f565b15612620576001876060018181510160ff169052505b6126306001848b8e8b518a61283f565b15612646576001876060018181510160ff169052505b6126566002848a8e8b518a61283f565b1561266c576001876060018181510160ff169052505b61267a87604001518c6121c5565b63ffffffff90811660a08a0190815291166080890152600a5466010000000000009004600160a060020a031692508290635643a711908e90518a6060015160030360ff16028a608001518b6060015160ff16020160405163ffffffff84811660e060020a02825267ffffffffffffffff93909316600482015291166024820152604401600060405180830381600087803b151561271657600080fd5b6102c65a03f1151561272757600080fd5b50505033600160a060020a03166000908152600460205260409020805460ff8b81166101000261ff0019918e1660ff199093169290921716178155905087816002602091828204019190066101000a81548160ff021916908360ff1602179055508a8160010160006101000a81548160ff021916908360ff1602179055508b8160010160016101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508660400151600191909101805469ff0000000000000000001916690100000000000000000060ff93841602176aff0000000000000000000019166a010000000000000000000094909216939093021790915550505050505050505050565b600a54640100000000900460ff1681565b600061284961358e565b61285161375a565b60ff871660009081526003602052604080822082918291829182919080519081016040908152825463ffffffff1682529091906020830190600183019060069060c09051908101604052919060c08301826000855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116128a6575050509290935250929950600097505050505b600685101561292c57866020015185600681106128fe57fe5b602002015160ff1686866006811061291257fe5b61ffff9092166020929092020152600194909401936128e5565b600094505b60066000885163ffffffff1681526020810191909152604001600020600101548510156129d6576129af60066000895163ffffffff168152602081019190915260400160002060010180548790811061298657fe5b6000918252602091829020828204015460ff929091066101000a900481169060038e0216613385565b8686600681106129bb57fe5b6020020181815161ffff910116905250600190940193612931565b6129e18a88516133b0565b909450925060208901519150606089015190508315612a6457600a546064906301000000900460ff1660208b01510261ffff16811515612a1d57fe5b0460208a018181510161ffff16905250600a546064906301000000900460ff168a600360200201510261ffff16811515612a5357fe5b0460608a018181510161ffff169052505b8215612ad457600a546064906301000000900460ff1660208801510261ffff16811515612a8d57fe5b04602087018181510161ffff16905250600a546064906301000000900460ff1687600360200201510261ffff16811515612ac357fe5b04606087018181510161ffff169052505b612ae08e8e8b89611641565b61ffff92831660208b0152911660609098019790975250949a9950505050505050505050565b600a5460ff1681565b600681565b600a5462010000900460ff1681565b6000600019430140815b8360ff168160ff16108015612b45575060068160ff16105b15612b595761010082049150600101612b2d565b8460ff1682811515612b6757fe5b0695945050505050565b60025460ff1681565b60005433600160a060020a03908116911614612b9557600080fd5b600160a060020a0381161561197e5760008054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b60008060008060008060008060008060009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a03161480612c315750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515612c3c57600080fd5b600160005260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c8054600c63ffffffff199091161781557fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054d805460ff191660551761ff001916615f001762ff00001916624100001763ff000000191663320000001764ff0000000019166432000000001781559099506032906005602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556002600052600390527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d805463ffffffff1916600f1781557fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4e8054603260ff199091161761ff0019166137001762ff00001916625500001763ff000000191663550000001764ff000000001916642800000000178155909850604b906005602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556003600081905290527fcbc4e5fb02c3d1de23a9f1e014b4d2ee5aeaea9505df5e855c9210bf472495af805463ffffffff191660081781557fcbc4e5fb02c3d1de23a9f1e014b4d2ee5aeaea9505df5e855c9210bf472495b08054606e60ff199091161761ff001916613c001762ff00001916622800001763ff0000001916633c0000001764ff00000000191664280000000017815590975060289060056020808204929092018054918390066101000a60ff818102199093169490921691909102929092179091556004600081905260039091527f83ec6a1f0257b830b5e016457c9cf1435391bf56cc98f369a58a54fe93772465805463ffffffff191690911781557f83ec6a1f0257b830b5e016457c9cf1435391bf56cc98f369a58a54fe93772466805460ff191660361761ff0019166145001762ff00001916623a00001763ff0000001916634b0000001764ff000000001916644b000000001781559096506046906005602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556005600081905260039091527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b465942250805463ffffffff191660061781557f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b4659422518054603260ff199091161761ff0019166132001762ff00001916623200001763ff000000191663690000001764ff000000001916643700000000178155909650605f91602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556006600052600390527fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f3805463ffffffff1916600d1781557fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f48054603760ff199091161761ff001916615a001762ff00001916625f00001763ff0000001916632d0000001764ff00000000191664230000000017815590945060239060056020808204929092018054918390066101000a60ff818102199093169490921691909102929092179091556007600081905260039091527ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd2805463ffffffff191690911781557ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd3805460ff191660551761ff001916613c001762ff00001916624900001763ff0000001916634b0000001764ff0000000019166450000000001781559093506032906005602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556008600052600390527f85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbe805463ffffffff191660181781557f85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbf8054608c60ff199091161761ff0019166187001762ff00001916624600001763ff0000001916634d0000001764ff000000001916645a000000001781559092506032906005602080820492909201805460ff948516928490066101000a928302949092021990911692909217909155600960005260039052507f8a8dc4e5242ea8b1ab1d60606dae757e6c2cca9f92a2cced9f72c19960bcb458805463ffffffff191660101781557f8a8dc4e5242ea8b1ab1d60606dae757e6c2cca9f92a2cced9f72c19960bcb4598054604660ff199091161761ff0019166169001762ff00001916625000001763ff0000001916633c0000001764ff000000001916645000000000178155605a9060056020808204909201805460ff948516939092066101000a9283029390920219169190911790555050600a805461090061ff001990911617905550505050505050565b60008161ffff168361ffff16111561337b575080820361337f565b5060005b92915050565b60008282028315806133a1575082848281151561339e57fe5b04145b15156133a957fe5b9392505050565b60008080805b63ffffffff8616600090815260066020526040902054821015613539575060005b63ffffffff851660009081526006602052604090205481101561352e5763ffffffff8516600090815260066020526040902080548290811061341557fe5b60009182526020808320818304015463ffffffff8a16845260068252604084208054929093066101000a900460ff169260059290918690811061345457fe5b60009182526020808320818304015460ff928290066101000a900482168452830193909352604090910190205416141561348d57600193505b63ffffffff861660009081526006602052604090208054839081106134ae57fe5b60009182526020808320818304015463ffffffff8916845260068252604084208054929093066101000a900460ff16926005929091859081106134ed57fe5b60009182526020808320818304015460ff928290066101000a900482168452830193909352604090910190205416141561352657600192505b6001016133d7565b6001909101906133b6565b50509250929050565b6101006040519081016040908152600080835260208301819052908201526060810161356c6135ae565b8152600060208201819052604082018190526060820181905260809091015290565b60e060405190810160405260008152602081016135a961375a565b905290565b60206040519081016040526000815290565b82805482825590600052602060002090601f016020900481019282156136565791602002820160005b8382111561362757835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026135e9565b80156136545782816101000a81549060ff0219169055600101602081600001049283019260010302613627565b505b50613662929150613782565b5090565b828054828255906000526020600020906007016008900481019282156137055791602002820160005b838211156136d357835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261368f565b80156137035782816101000a81549063ffffffff02191690556004016020816003010492830192600103026136d3565b505b506136629291506137a3565b60e06040519081016040528061356c6137c4565b60c06040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a082015290565b60c06040519081016040526006815b6000815260001990910190602001816137695790505090565b6137a091905b8082111561366257805460ff19168155600101613788565b90565b6137a091905b8082111561366257805463ffffffff191681556001016137a9565b6060604051908101604052600081526002602082016137695600a165627a7a72305820aa58eb55d185b351c219eabf73ca8ffb70e5a24083eea4cdb0a2b1b4642160aa0029000000000000000000000000abc1c404424bdf24c19a5cc5ef8f47781d18eb3e0000000000000000000000001fc7bd85293f3982f40d52698df8d26be89360d6

Deployed Bytecode

0x6060604052600436106101f55763ffffffff60e060020a6000350416630d66881881146101fa57806314d0f1ba146102295780631576fc551461025c578063187584801461029257806320046e91146102a557806325ae9c97146102ed578063278f9f6e1461031b57806327979b35146103625780632bf6e0a5146103755780632c2da3cf1461039a5780633171cec4146103c357806333ced321146103e257806333d24dc4146103f55780633d5dbaed146104085780634538bc951461042a57806348e889ed1461048057806348ef5aa8146104e757806349d165f6146104ff5780634efb023e1461056e578063500e429714610581578063522f6815146105c15780636c81fd6d146105e35780637216ee0014610602578063830146cf14610615578063838985d714610647578063891fe1031461066c5780638da5cb5b1461067f5780638fd8f78314610692578063b2cad9b7146106ae578063b85d6275146106ca578063b952bb30146106e9578063bb9ea07c14610758578063bda7b1cb14610798578063bfcece9f146107f0578063cfa830791461081d578063d60ef60214610830578063d8819e0a1461088d578063d98e14bd146108a0578063ebfa3c1b146108b3578063ed30e558146108c6578063ee4e4416146108e5578063f2853292146108f8578063fb214f4c14610917575b600080fd5b341561020557600080fd5b61020d61092a565b604051600160a060020a03909116815260200160405180910390f35b341561023457600080fd5b610248600160a060020a0360043516610939565b604051901515815260200160405180910390f35b341561026757600080fd5b61029060043560ff60243581169060443581169060643581169060843581169060a4351661094e565b005b341561029d57600080fd5b61020d610a0a565b34156102b057600080fd5b6102d661ffff600435811690602435811690604435811690606435166084351515610a23565b60405161ffff909116815260200160405180910390f35b34156102f857600080fd5b61029063ffffffff60043581169060243581169060443581169060643516610ae7565b341561032657600080fd5b61029060ff60043581169063ffffffff602435169060443581169060643581169060843581169060a43581169060c43581169060e43516610b8f565b341561036d57600080fd5b610290610cd1565b341561038057600080fd5b610290600160a060020a0360043581169060243516610ed0565b34156103a557600080fd5b6103ad610f76565b60405160ff909116815260200160405180910390f35b34156103ce57600080fd5b61029060ff60043581169060243516610f88565b34156103ed57600080fd5b610290610ff0565b341561040057600080fd5b61029061109e565b341561041357600080fd5b61029060ff6004351663ffffffff602435166113c4565b341561043557600080fd5b61044a67ffffffffffffffff60043516611437565b60405163ffffffff9093168352600160a060020a03909116602083015260ff166040808301919091526060909101905180910390f35b341561048b57600080fd5b61049960ff60043516611529565b60405163ffffffff909716875260ff958616602088015293851660408088019190915292851660608701529084166080860152831660a0850152911660c083015260e0909101905180910390f35b34156104f257600080fd5b6102906004351515611613565b341561050a57600080fd5b61024860ff6004803582169160243516906101046044600660c06040519081016040529190828260c080828437820191505050505091908060c001906006806020026040519081016040529190828260c08082843750939550611641945050505050565b341561057957600080fd5b6102d66117fe565b341561058c57600080fd5b61059d63ffffffff60043516611820565b60405180848152602001838152602001828152602001935050505060405180910390f35b34156105cc57600080fd5b610290600160a060020a0360043516602435611845565b34156105ee57600080fd5b610290600160a060020a03600435166118d7565b341561060d57600080fd5b6103ad611981565b341561062057600080fd5b61062e60ff6004351661198f565b60405163ffffffff909116815260200160405180910390f35b341561065257600080fd5b61065a6119a7565b60405190815260200160405180910390f35b341561067757600080fd5b6103ad6119ad565b341561068a57600080fd5b61020d6119bd565b341561069d57600080fd5b61029063ffffffff600435166119cc565b34156106b957600080fd5b6103ad63ffffffff60043516611f9f565b34156106d557600080fd5b610290600160a060020a0360043516612002565b34156106f457600080fd5b610708600160a060020a03600435166120ac565b60405160ff9788168152958716602087015293861660408087019190915267ffffffffffffffff90931660608601529085166080850152841660a0840152921660c082015260e001905180910390f35b341561076357600080fd5b61077760ff600435811690602435166121c5565b60405163ffffffff9283168152911660208201526040908101905180910390f35b34156107a357600080fd5b6107b7600160a060020a0360043516612283565b60405160ff948516815267ffffffffffffffff909316602084015290831660408084019190915292166060820152608001905180910390f35b61029067ffffffffffffffff6004351660ff602435811690604435811690606435811690608435166122cd565b341561082857600080fd5b6103ad61282e565b341561083b57600080fd5b61024860ff60048035821691602435811691604435821691606435169063ffffffff608435169061016460a4600660c06040519081016040529190828260c0808284375093955061283f945050505050565b341561089857600080fd5b6103ad612b06565b34156108ab57600080fd5b6103ad612b0f565b34156108be57600080fd5b6103ad612b14565b34156108d157600080fd5b6103ad60ff60043581169060243516612b23565b34156108f057600080fd5b610248612b71565b341561090357600080fd5b610290600160a060020a0360043516612b7a565b341561092257600080fd5b610290612bd1565b600b54600160a060020a031681565b60016020526000908152604090205460ff1681565b60005433600160a060020a03908116911614806109895750600160a060020a03331660009081526001602081905260409091205460ff161515145b151561099457600080fd5b600995909555600a805460ff191660ff9586161762ff0000191662010000948616949094029390931763ff00000019166301000000928516929092029190911764ff000000001916640100000000918416919091021765ff00000000001916650100000000009290931691909102919091179055565b600a5466010000000000009004600160a060020a031681565b60008060008315610a4957600a61ffff600d8a0216049750600a61ffff600d8902160496505b610a5e88600461ffff60038a02165b04613360565b9150610a7387600461ffff6003890216610a58565b600a54909150640100000000900460ff1661ffff8316108015610aa65750600a54640100000000900460ff1661ffff8216105b15610ac057600a54640100000000900460ff169250610adc565b8061ffff168261ffff161115610ad857819250610adc565b8092505b505095945050505050565b60005433600160a060020a0390811691161480610b225750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610b2d57600080fd5b600b54600160a060020a03161515610b4457600080fd5b600a5466010000000000009004600160a060020a03161515610b6557600080fd5b610b6e846119cc565b610b77836119cc565b610b80826119cc565b610b89816119cc565b50505050565b6000805433600160a060020a0390811691161480610bcb5750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610bd657600080fd5b5060ff88166000908152600360205260409020805463ffffffff161515610c1757600a805460ff61010080830482166001019091160261ff00199091161790555b805463ffffffff191663ffffffff891617815560018101805460ff191660ff8981169190911761ff001916610100898316021762ff0000191662010000888316021763ff000000191663010000009187169190910217815583906004602091828204019190066101000a81548160ff021916908360ff16021790555081816001016005600681101515610ca657fe5b602091828204019190066101000a81548160ff021916908360ff160217905550505050505050505050565b60005433600160a060020a0390811691161480610d0c5750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610d1757600080fd5b60086020527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f805463ffffffff19908116601f179091557f6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea90418054821660211790557f625b35f5e76f098dd7c3a05b10e2e5e78a4a01228d60c3b143426cdf36d264558054821660221790557f9321edea6e3be4df59a344b401fab4f888b556fda1f954244cff9204bad624b88054821660241790557f91238f30f286c9a1c6e901c4eda3b214c381c846e3dbe48df95c21488e8e1fdb8054821660261790557f13acf3fc7bed94759963f076d5d3443d88732026bffc8253bdf4a6e65f21ecc58054821660281790557f24cd397636bedc6cf9b490d0edd57c769c19b367fb7d5c2344ae1ddc7d21c14480548216602a1790557fe4c2e8be66af8dd2d277000f4f830a10546f8b14e45cd850b875c98ba0f0d2cd80548216602c1790557f82c9e868e45873bb5a4f47c09e14a12f6a6314e13aabd611e4374762bb4e8b3680548216602e179055600a6000527f586689db7536874b78a6eac0f58556a56a106985743f7c16a699b27bb02f88bd80549091166030179055565b60005433600160a060020a0390811691161480610f0b5750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610f1657600080fd5b600b8054600160a060020a0393841673ffffffffffffffffffffffffffffffffffffffff19909116179055600a80549190921666010000000000000279ffffffffffffffffffffffffffffffffffffffff00000000000019909116179055565b600a5465010000000000900460ff1681565b60005433600160a060020a0390811691161480610fc35750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515610fce57600080fd5b60ff9182166000908152600560205260409020805460ff191691909216179055565b600080548190819033600160a060020a03908116911614806110305750600160a060020a03331660009081526001602081905260409091205460ff161515145b151561103b57600080fd5b506001915060649050805b606460ff8416116110995760ff83166000908152600760205260409020805463ffffffff191663ffffffff83811691909117909155600190930192600a90600b8402160460050191508181019050611046565b505050565b60005433600160a060020a03908116911614806110d95750600160a060020a03331660009081526001602081905260409091205460ff161515145b15156110e457600080fd5b600560208190527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b805460ff19908116600e179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a8054821660101790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054821660081790557f3eec716f11ba9e820c81ca75eb978ffb45831ef8b7a53e5e422c26008e1ca6d58054821660091790557f458b30c2d72bfd2c6317304a4594ecbafe5f729d3111b65fdc3a33bd48e5432d8054821660021790557f069400f22b28c6c362558d92f66163cec5671cba50b61abd2eecfcd0eaeac51880548216600b1790557feddb6698d7c569ff62ff64f1f1492bf14a54594835ba0faac91f84b4f5d814608054821660031790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805482169092179091557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe180548216600f1790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054821660129081179091557ff907e7e6656fa73566b18c1215272fe9fca2c55c552e62c923e21e000ac4b4e68054831660071790557f03145c75015e7a856ecd94c41432ef3cb669d6360af23433588937fefdfac8258054831660061790557f783638979e3582b3ffd6d53fc06c949ac31d1ac75a5e2c3531fbe1f91045eb538054831660111790557f58f00e8ecc6f5419941dd0bafec65a4cc188d31713fb1fe224257460930df8af80548316600d1790557f8b32256db898364c465749decac34aee435952ffe1739257aa5b0235e266d9c580548316600c1790557fb4e18992ad424cdedc46668609f2bafcf665a8d99577618d5923c69264d9cf5f8054831660011790556000527fd1ccbf1f9f869f51cd81e6f099f905636b057f682c706fe990614b112051692880549091166004179055565b60005433600160a060020a03908116911614806113ff5750600160a060020a03331660009081526001602081905260409091205460ff161515145b151561140a57600080fd5b60ff919091166000908152600860205260409020805463ffffffff191663ffffffff909216919091179055565b600080600080611445613542565b600b54600160a060020a0316915081630720246087600060405160e0015260405160e060020a63ffffffff841602815267ffffffffffffffff909116600482015260240160e060405180830381600087803b15156114a257600080fd5b6102c65a03f115156114b357600080fd5b505050604051805190602001805190602001805190602001805190602001805190602001805190602001805160e08901525063ffffffff90811660c088015290811660a0870152166080850190815267ffffffffffffffff9093168452909650945061151f9051611f9f565b9496939550505050565b600080600080600080600061153c61358e565b60ff8916600090815260036020526040908190209080519081016040908152825463ffffffff1682529091906020830190600183019060069060c09051908101604052919060c08301826000855b825461010083900a900460ff1681526020600192830181810494850194909303909202910180841161158a57905050505050508152505090508060000151816020015151826020015160200151836020015160400151846020015160600151856020015160800151866020015160a00151959f949e50929c50909a509850965090945092505050565b60005433600160a060020a0390811691161461162e57600080fd5b6002805460ff1916911515919091179055565b600080600080600a60029054906101000a900460ff16880260ff168760ff16101561167957600a5462010000900460ff16965061168c565b600a5462010000900460ff168802909603955b60009250855191508451905060a085015161ffff1660a087015161ffff16111561176f575b600a5462010000900460ff1661ffff84161080156116d3575060008261ffff16115b80156116e3575060008161ffff16115b1561176a57600261ffff84160661ffff166000141561173a576117338161172e8860015b602002015160608a015160408a01518a60045b60200201518d60ff168a61ffff1614610a23565b613360565b905061175f565b61175c8261172e8760015b6020020151606089015160408b01518b600461171a565b91505b6001909201916116b1565b6117ea565b600a5462010000900460ff1661ffff8416108015611791575060008261ffff16115b80156117a1575060008161ffff16115b156117ea57600261ffff84160661ffff16156117cd576117c68161172e886001611707565b90506117df565b6117dc8261172e876001611745565b91505b60019092019161176f565b61ffff908116911610159695505050505050565b60005474010000000000000000000000000000000000000000900461ffff1681565b63ffffffff166000908152600660205260409020805460018201546002909201549092565b60005433600160a060020a03908116911614806118805750600160a060020a03331660009081526001602081905260409091205460ff161515145b151561188b57600080fd5b30600160a060020a0316318111156118a257600080fd5b600160a060020a03821681156108fc0282604051600060405180830381858888f1935050505015156118d357600080fd5b5050565b60005433600160a060020a039081169116146118f257600080fd5b600160a060020a03811660009081526001602052604090205460ff16151561197e57600160a060020a03811660009081526001602081905260408220805460ff191682179055815461ffff7401000000000000000000000000000000000000000080830482169093011690910275ffff0000000000000000000000000000000000000000199091161790555b50565b600a54610100900460ff1681565b60036020526000908152604090205463ffffffff1681565b60095481565b600a546301000000900460ff1681565b600054600160a060020a031681565b6000806000806119da6135ae565b6119e26135ae565b6119ea6135ae565b60005433600160a060020a0390811691161480611a255750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515611a3057600080fd5b600b54600160a060020a03161515611a4757600080fd5b600a5466010000000000009004600160a060020a03161515611a6857600080fd5b600b54600a5463ffffffff8a16600081815260066020526040808220600160a060020a039586169c5066010000000000009094049094169950975090955088916341b0eb53918891829051602001526040518363ffffffff1660e060020a02815260040180836004811115611ad957fe5b60ff1681526020018267ffffffffffffffff1667ffffffffffffffff16815260200192505050602060405180830381600087803b1515611b1857600080fd5b6102c65a03f11515611b2957600080fd5b50505060405180519050945084604051805910611b435750595b908082528060200260200182016040525092505b6000851115611c345786600160a060020a03166362b21ad760008a63ffffffff16600189036000604051602001526040518463ffffffff1660e060020a02815260040180846004811115611ba757fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515611bed57600080fd5b6102c65a03f11515611bfe57600080fd5b50505060405180519050836001870381518110611c1757fe5b60ff90921660209283029091019091015260001990940193611b57565b83838051611c469291602001906135c0565b5086600160a060020a03166341b0eb5360018a63ffffffff166000604051602001526040518363ffffffff1660e060020a02815260040180836004811115611c8a57fe5b60ff1681526020018267ffffffffffffffff1667ffffffffffffffff16815260200192505050602060405180830381600087803b1515611cc957600080fd5b6102c65a03f11515611cda57600080fd5b50505060405180519050945084604051805910611cf45750595b908082528060200260200182016040525091505b6000851115611de55786600160a060020a03166362b21ad760018a63ffffffff16600189036000604051602001526040518463ffffffff1660e060020a02815260040180846004811115611d5857fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515611d9e57600080fd5b6102c65a03f11515611daf57600080fd5b50505060405180519050826001870381518110611dc857fe5b60ff90921660209283029091019091015260001990940193611d08565b60018401828051611dfa9291602001906135c0565b5085600160a060020a03166388e9abb689600080604051602001526040518363ffffffff1660e060020a028152600401808363ffffffff1663ffffffff168152602001826001811115611e4957fe5b60ff16815260200192505050602060405180830381600087803b1515611e6e57600080fd5b6102c65a03f11515611e7f57600080fd5b50505060405180519050945084604051805910611e995750595b908082528060200260200182016040525090505b6000851115611f7f5785600160a060020a0316635b626339896000600189036000604051602001526040518463ffffffff1660e060020a028152600401808463ffffffff1663ffffffff168152602001836001811115611f0957fe5b60ff1681526020018281526020019350505050602060405180830381600087803b1515611f3557600080fd5b6102c65a03f11515611f4657600080fd5b50505060405180519050816001870381518110611f5f57fe5b63ffffffff90921660209283029091019091015260001990940193611ead565b60028401818051611f94929160200190613666565b505050505050505050565b600060016064825b8160ff168360ff161015611ff957600260ff848401160460ff811660009081526007602052604090205490915063ffffffff9081169086161015611fed57809150611ff4565b8060010192505b611fa7565b50909392505050565b60005433600160a060020a0390811691161461201d57600080fd5b600160a060020a03811660009081526001602081905260409091205460ff161515141561197e57600160a060020a03166000908152600160205260408120805460ff19169055805475ffff0000000000000000000000000000000000000000198116740100000000000000000000000000000000000000009182900461ffff9081166000190116909102179055565b60008060008060008060006120bf613711565b600160a060020a038916600090815260046020526040908190209060a09051908101604052908160008201600380602002604051908101604052919060608301826000855b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411612104575050509284525050506001919091015460ff8082166020840152610100820467ffffffffffffffff16604084015269010000000000000000008204811660608401526a01000000000000000000009091041660809091015290508051518151602001518251604001518360400151846020015185606001518660800151959f949e50929c50909a509850965090945092505050565b600a5460ff828116600081815260086020526040812054606465010000000000909504841663ffffffff9182160216939093049291851611156122715782600a0160ff168460ff16111561221c5760059150612271565b82840360ff1660020a63ffffffff1683850360ff1660030a63ffffffff1681151561224357fe5b0463ffffffff168263ffffffff1681151561225a57fe5b04915060058263ffffffff16101561227157600591505b5092600363ffffffff85160492509050565b60046020526000908152604090206001015460ff8082169167ffffffffffffffff61010082041691690100000000000000000082048116916a010000000000000000000090041684565b6122d5613725565b60006122df61375a565b60025460009081908190819060ff16156122f857600080fd5b600b54600160a060020a0316151561230f57600080fd5b600a5466010000000000009004600160a060020a0316151561233057600080fd5b600a5460ff908116908c16111561234657600080fd5b600954341461235457600080fd5b8860ff168a60ff16148061236d57508760ff168a60ff16145b8061237d57508760ff168960ff16145b1561238757600080fd5b60ff8a161580612398575060ff8916155b806123a4575060ff8816155b806123bc5750600a5460ff6101009091048116908b16115b806123d45750600a5460ff6101009091048116908a16115b806123ec5750600a5460ff6101009091048116908916115b156123f657600080fd5b6123ff8c611437565b60ff1660408a0152600160a060020a03166020890190815263ffffffff909116885251600160a060020a031633600160a060020a031614151561244157600080fd5b600b5460009650600160a060020a031693505b60068610156125255783600160a060020a03166362b21ad760038e896000604051602001526040518463ffffffff1660e060020a0281526004018084600481111561249b57fe5b60ff1681526020018367ffffffffffffffff1667ffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15156124e157600080fd5b6102c65a03f115156124f257600080fd5b505050604051805160ff16905085876006811061250b57fe5b61ffff909216602092909202015260019590950194612454565b600095505b60066000885163ffffffff1681526020810191909152604001600020600101548610156125d2576125ab60066000895163ffffffff168152602081019190915260400160002060010180548890811061257f57fe5b600091825260209182902082820401549190066101000a900460ff16604089015160030260ff16613385565b8587600681106125b757fe5b6020020181815161ffff91011690525060019095019461252a565b600060608801819052600a546125f89160036201000090920460ff169190910290612b23565b925061260a6000848c8e8b518a61283f565b15612620576001876060018181510160ff169052505b6126306001848b8e8b518a61283f565b15612646576001876060018181510160ff169052505b6126566002848a8e8b518a61283f565b1561266c576001876060018181510160ff169052505b61267a87604001518c6121c5565b63ffffffff90811660a08a0190815291166080890152600a5466010000000000009004600160a060020a031692508290635643a711908e90518a6060015160030360ff16028a608001518b6060015160ff16020160405163ffffffff84811660e060020a02825267ffffffffffffffff93909316600482015291166024820152604401600060405180830381600087803b151561271657600080fd5b6102c65a03f1151561272757600080fd5b50505033600160a060020a03166000908152600460205260409020805460ff8b81166101000261ff0019918e1660ff199093169290921716178155905087816002602091828204019190066101000a81548160ff021916908360ff1602179055508a8160010160006101000a81548160ff021916908360ff1602179055508b8160010160016101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508660400151600191909101805469ff0000000000000000001916690100000000000000000060ff93841602176aff0000000000000000000019166a010000000000000000000094909216939093021790915550505050505050505050565b600a54640100000000900460ff1681565b600061284961358e565b61285161375a565b60ff871660009081526003602052604080822082918291829182919080519081016040908152825463ffffffff1682529091906020830190600183019060069060c09051908101604052919060c08301826000855b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116128a6575050509290935250929950600097505050505b600685101561292c57866020015185600681106128fe57fe5b602002015160ff1686866006811061291257fe5b61ffff9092166020929092020152600194909401936128e5565b600094505b60066000885163ffffffff1681526020810191909152604001600020600101548510156129d6576129af60066000895163ffffffff168152602081019190915260400160002060010180548790811061298657fe5b6000918252602091829020828204015460ff929091066101000a900481169060038e0216613385565b8686600681106129bb57fe5b6020020181815161ffff910116905250600190940193612931565b6129e18a88516133b0565b909450925060208901519150606089015190508315612a6457600a546064906301000000900460ff1660208b01510261ffff16811515612a1d57fe5b0460208a018181510161ffff16905250600a546064906301000000900460ff168a600360200201510261ffff16811515612a5357fe5b0460608a018181510161ffff169052505b8215612ad457600a546064906301000000900460ff1660208801510261ffff16811515612a8d57fe5b04602087018181510161ffff16905250600a546064906301000000900460ff1687600360200201510261ffff16811515612ac357fe5b04606087018181510161ffff169052505b612ae08e8e8b89611641565b61ffff92831660208b0152911660609098019790975250949a9950505050505050505050565b600a5460ff1681565b600681565b600a5462010000900460ff1681565b6000600019430140815b8360ff168160ff16108015612b45575060068160ff16105b15612b595761010082049150600101612b2d565b8460ff1682811515612b6757fe5b0695945050505050565b60025460ff1681565b60005433600160a060020a03908116911614612b9557600080fd5b600160a060020a0381161561197e5760008054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff1990911617905550565b60008060008060008060008060008060009054906101000a9004600160a060020a0316600160a060020a031633600160a060020a03161480612c315750600160a060020a03331660009081526001602081905260409091205460ff161515145b1515612c3c57600080fd5b600160005260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c8054600c63ffffffff199091161781557fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054d805460ff191660551761ff001916615f001762ff00001916624100001763ff000000191663320000001764ff0000000019166432000000001781559099506032906005602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556002600052600390527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d805463ffffffff1916600f1781557fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4e8054603260ff199091161761ff0019166137001762ff00001916625500001763ff000000191663550000001764ff000000001916642800000000178155909850604b906005602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556003600081905290527fcbc4e5fb02c3d1de23a9f1e014b4d2ee5aeaea9505df5e855c9210bf472495af805463ffffffff191660081781557fcbc4e5fb02c3d1de23a9f1e014b4d2ee5aeaea9505df5e855c9210bf472495b08054606e60ff199091161761ff001916613c001762ff00001916622800001763ff0000001916633c0000001764ff00000000191664280000000017815590975060289060056020808204929092018054918390066101000a60ff818102199093169490921691909102929092179091556004600081905260039091527f83ec6a1f0257b830b5e016457c9cf1435391bf56cc98f369a58a54fe93772465805463ffffffff191690911781557f83ec6a1f0257b830b5e016457c9cf1435391bf56cc98f369a58a54fe93772466805460ff191660361761ff0019166145001762ff00001916623a00001763ff0000001916634b0000001764ff000000001916644b000000001781559096506046906005602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556005600081905260039091527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b465942250805463ffffffff191660061781557f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b4659422518054603260ff199091161761ff0019166132001762ff00001916623200001763ff000000191663690000001764ff000000001916643700000000178155909650605f91602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556006600052600390527fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f3805463ffffffff1916600d1781557fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f48054603760ff199091161761ff001916615a001762ff00001916625f00001763ff0000001916632d0000001764ff00000000191664230000000017815590945060239060056020808204929092018054918390066101000a60ff818102199093169490921691909102929092179091556007600081905260039091527ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd2805463ffffffff191690911781557ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd3805460ff191660551761ff001916613c001762ff00001916624900001763ff0000001916634b0000001764ff0000000019166450000000001781559093506032906005602080820492909201805460ff948516928490066101000a9283029490920219909116929092179091556008600052600390527f85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbe805463ffffffff191660181781557f85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbf8054608c60ff199091161761ff0019166187001762ff00001916624600001763ff0000001916634d0000001764ff000000001916645a000000001781559092506032906005602080820492909201805460ff948516928490066101000a928302949092021990911692909217909155600960005260039052507f8a8dc4e5242ea8b1ab1d60606dae757e6c2cca9f92a2cced9f72c19960bcb458805463ffffffff191660101781557f8a8dc4e5242ea8b1ab1d60606dae757e6c2cca9f92a2cced9f72c19960bcb4598054604660ff199091161761ff0019166169001762ff00001916625000001763ff0000001916633c0000001764ff000000001916645000000000178155605a9060056020808204909201805460ff948516939092066101000a9283029390920219169190911790555050600a805461090061ff001990911617905550505050505050565b60008161ffff168361ffff16111561337b575080820361337f565b5060005b92915050565b60008282028315806133a1575082848281151561339e57fe5b04145b15156133a957fe5b9392505050565b60008080805b63ffffffff8616600090815260066020526040902054821015613539575060005b63ffffffff851660009081526006602052604090205481101561352e5763ffffffff8516600090815260066020526040902080548290811061341557fe5b60009182526020808320818304015463ffffffff8a16845260068252604084208054929093066101000a900460ff169260059290918690811061345457fe5b60009182526020808320818304015460ff928290066101000a900482168452830193909352604090910190205416141561348d57600193505b63ffffffff861660009081526006602052604090208054839081106134ae57fe5b60009182526020808320818304015463ffffffff8916845260068252604084208054929093066101000a900460ff16926005929091859081106134ed57fe5b60009182526020808320818304015460ff928290066101000a900482168452830193909352604090910190205416141561352657600192505b6001016133d7565b6001909101906133b6565b50509250929050565b6101006040519081016040908152600080835260208301819052908201526060810161356c6135ae565b8152600060208201819052604082018190526060820181905260809091015290565b60e060405190810160405260008152602081016135a961375a565b905290565b60206040519081016040526000815290565b82805482825590600052602060002090601f016020900481019282156136565791602002820160005b8382111561362757835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026135e9565b80156136545782816101000a81549060ff0219169055600101602081600001049283019260010302613627565b505b50613662929150613782565b5090565b828054828255906000526020600020906007016008900481019282156137055791602002820160005b838211156136d357835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261368f565b80156137035782816101000a81549063ffffffff02191690556004016020816003010492830192600103026136d3565b505b506136629291506137a3565b60e06040519081016040528061356c6137c4565b60c06040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a082015290565b60c06040519081016040526006815b6000815260001990910190602001816137695790505090565b6137a091905b8082111561366257805460ff19168155600101613788565b90565b6137a091905b8082111561366257805463ffffffff191681556001016137a9565b6060604051908101604052600081526002602082016137695600a165627a7a72305820aa58eb55d185b351c219eabf73ca8ffb70e5a24083eea4cdb0a2b1b4642160aa0029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000abc1c404424bdf24c19a5cc5ef8f47781d18eb3e0000000000000000000000001fc7bd85293f3982f40d52698df8d26be89360d6

-----Decoded View---------------
Arg [0] : _dataContract (address): 0xABC1c404424BDF24C19A5cC5EF8F47781D18Eb3E
Arg [1] : _worldContract (address): 0x1fC7bD85293f3982f40D52698DF8D26be89360d6

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000abc1c404424bdf24c19a5cc5ef8f47781d18eb3e
Arg [1] : 0000000000000000000000001fc7bd85293f3982f40d52698df8d26be89360d6


Swarm Source

bzzr://aa58eb55d185b351c219eabf73ca8ffb70e5a24083eea4cdb0a2b1b4642160aa

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  ]
[ 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.