Contract 0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d

 

TxHash Block Age From To Value [TxFee]
0x9688cf8a1f3e84ccc91fd8ffb99d981f660bced3bc46d5ce6159c12637798a48710229127 days 32 mins ago0xe9fa375cc144e91698476172195f0544db2cb3cd  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.0014818752
0x59bf9e74e113d47597d8c4f17be2c1d75887da6099262d555d42e5a11b6416f4710217827 days 1 hr ago0xfc1ab1ee5b163879a850477fbfeb35eaec52abc8  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.002604408
0x15da36b1a48ef142026c09749496eef1f366ecee98d8a6feb93c17ee1da878fd705271335 days 21 hrs ago0xd768daff5aeffc055d334b5f4db1bf401a84d12e  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.00309357
0xb925ae807fae50688df27ffe4935f704ee8dec478ca5d79eb3476797d2e3eb4e705268435 days 21 hrs ago0xd768daff5aeffc055d334b5f4db1bf401a84d12e  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.000619008
0x6c72ffea2c750a97f62f30b4d462166f786d66c1fe678217a984fd348e931f83701181643 days 5 hrs ago0x7ec915b8d3ffee3deaae5aa90def8ad826d2e110  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.01498768
0x87f96747302f3c75ce67b05c498c09ddec4a52b27208063931176c3d6caaef18681730375 days 22 hrs ago0x3cf628d49ae46b49b210f0521fbd9f82b461a9e1  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.01576038
0x9cc642d9e8f44363ee4c3a59c36993ee96f3e3e8cb8087c5dc12c2315eb652d2676873583 days 22 hrs ago0xfc1ab1ee5b163879a850477fbfeb35eaec52abc8  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.0025272744
0x6afdd421a5cc423cd32b7b7075b5b71126efdc0db55be121af48665ca1522171676871683 days 23 hrs ago0xfc1ab1ee5b163879a850477fbfeb35eaec52abc8  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.0025060368
0xe2a6a053b502155013e4695007c00899a414c565b7c69f629e9f2640dd53232e6575015115 days 16 hrs ago0xec610f53d0a191b17d7984c6d31598b2181ace15  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.0099908004
0x0d556fcc7b9d150fbbf463d739ad9cf583dc624122ecd2d07351d0786bdba1406555416118 days 21 hrs ago0x088e25e6027816c753d01d7f243c367710f20497  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.002899148
0xa302ce9fcac90f5f3ed3b83e97072b9d927e1f7e4a223d686b7bd25da77a0e336478663131 days 9 hrs ago0xec610f53d0a191b17d7984c6d31598b2181ace15  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.00706081
0x289ea006cb6ba67399ccdd9f6a743fe7e6f361673fe0e532576266529f23f0c76465602133 days 12 hrs ago0x0aa6920041e5111c464d9aa5cd736d1867342813  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.00291501
0x4bcd015770c3975d56fddc79b9ba98cc66559c21ec3f0f9f59420e4a640838846465014133 days 14 hrs ago0x7da08fba7a69c67c0d06fd433af0c53f9c75cee8  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.0024427095
0x42c02056593a438e570b08975a351f324130e8e65502824f823352b611f25a436463237133 days 21 hrs ago0x8c5fc43ad00cc53e11f61bece329ddc5e3ea0929  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.008012851
0x63e29dedfc9aa68855168830f42270477e305e0bcd29589c26b1fc24d05352106463174133 days 21 hrs ago0x8c5fc43ad00cc53e11f61bece329ddc5e3ea0929  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.01138776
0xcf1755037700b6bb9951578eea21e622f414c0ea8bc037900f6e61bb7ec691f26463118133 days 21 hrs ago0x8c5fc43ad00cc53e11f61bece329ddc5e3ea0929  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.01450026
0x614b91a7cdcd96316e107a7e08d1ac7cea797582121d61d37a3aa642ab9da73f6463107133 days 21 hrs ago0x8c5fc43ad00cc53e11f61bece329ddc5e3ea0929  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.01418528
0x4e3e985bc574f756f41d9b8ee4aa275adca622d8ee8f23a5d604f424ecbc292b6456964134 days 21 hrs ago0x003cc017e32ca02e9657baf5a3a8c30a21700fd0  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.018475825
0xbc8d1606085b5697468037681f7ff3584eac76647d1a59762d6c75a33f1b0b206456963134 days 21 hrs ago0x8e5d30f161ba3ebb09dc3c1f06515656af34baa1  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.0028953945
0x45012188c75ac117e70b0eef155fcd32d26169a3d00aa835bd19f5228f521f6d6456895134 days 21 hrs ago0x003cc017e32ca02e9657baf5a3a8c30a21700fd0  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.018832225
0x2b1dcb27475653acc5e8b25a24ed2fc3b4b7534c8a80c1facfbe825423efd0926456868134 days 21 hrs ago0x003cc017e32ca02e9657baf5a3a8c30a21700fd0  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.018434025
0xb3b9d74b3a560f413424eb102c225fc7950baf332765273ad0b68ef3b77ac84d6456858134 days 21 hrs ago0x003cc017e32ca02e9657baf5a3a8c30a21700fd0  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.018409675
0xdb748f68d010758629bb1d85fc3a4efdbe7324ccb96156bace74ee12d57d4d036456851134 days 22 hrs ago0x8e5d30f161ba3ebb09dc3c1f06515656af34baa1  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.0033400588
0x9e32d7de1df386be1adea88399deeb0c38ecbf374396607dccf2ac11f61929c16456851134 days 22 hrs ago0x003cc017e32ca02e9657baf5a3a8c30a21700fd0  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.01839215
0x71ca5394c82de376894fba78e5658afc85162ebf562e530f4bfca4426ac38bf86456840134 days 22 hrs ago0x003cc017e32ca02e9657baf5a3a8c30a21700fd0  IN   0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0 Ether0.020240037
[ Download CSV Export 

Latest 25 Internal Transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x9688cf8a1f3e84ccc91fd8ffb99d981f660bced3bc46d5ce6159c12637798a48710229127 days 32 mins ago0x9ae49c0d7f8f9ef4b864e004fe86ac8294e209500xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.03174 Ether
0x59bf9e74e113d47597d8c4f17be2c1d75887da6099262d555d42e5a11b6416f4710217827 days 1 hr ago0x9ae49c0d7f8f9ef4b864e004fe86ac8294e209500xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.03174 Ether
0x15da36b1a48ef142026c09749496eef1f366ecee98d8a6feb93c17ee1da878fd705271335 days 21 hrs ago0x9ae49c0d7f8f9ef4b864e004fe86ac8294e209500xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.03345 Ether
0xb925ae807fae50688df27ffe4935f704ee8dec478ca5d79eb3476797d2e3eb4e705268435 days 21 hrs ago0x9ae49c0d7f8f9ef4b864e004fe86ac8294e209500xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.03345 Ether
0x6c72ffea2c750a97f62f30b4d462166f786d66c1fe678217a984fd348e931f83701181643 days 5 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.031440000000000004 Ether
0x6c72ffea2c750a97f62f30b4d462166f786d66c1fe678217a984fd348e931f83701181643 days 5 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.031440000000000004 Ether
0xe2a6a053b502155013e4695007c00899a414c565b7c69f629e9f2640dd53232e6575015115 days 16 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.0312 Ether
0xe2a6a053b502155013e4695007c00899a414c565b7c69f629e9f2640dd53232e6575015115 days 16 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.0312 Ether
0x0d556fcc7b9d150fbbf463d739ad9cf583dc624122ecd2d07351d0786bdba1406555416118 days 21 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.03144 Ether
0x0d556fcc7b9d150fbbf463d739ad9cf583dc624122ecd2d07351d0786bdba1406555416118 days 21 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.03144 Ether
0xa302ce9fcac90f5f3ed3b83e97072b9d927e1f7e4a223d686b7bd25da77a0e336478663131 days 9 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.03111 Ether
0xa302ce9fcac90f5f3ed3b83e97072b9d927e1f7e4a223d686b7bd25da77a0e336478663131 days 9 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.03111 Ether
0x289ea006cb6ba67399ccdd9f6a743fe7e6f361673fe0e532576266529f23f0c76465602133 days 12 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.3369 Ether
0x289ea006cb6ba67399ccdd9f6a743fe7e6f361673fe0e532576266529f23f0c76465602133 days 12 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.3369 Ether
0x4bcd015770c3975d56fddc79b9ba98cc66559c21ec3f0f9f59420e4a640838846465014133 days 14 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.3363 Ether
0x4bcd015770c3975d56fddc79b9ba98cc66559c21ec3f0f9f59420e4a640838846465014133 days 14 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.3363 Ether
0x42c02056593a438e570b08975a351f324130e8e65502824f823352b611f25a436463237133 days 21 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.03237 Ether
0x42c02056593a438e570b08975a351f324130e8e65502824f823352b611f25a436463237133 days 21 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.03237 Ether
0x63e29dedfc9aa68855168830f42270477e305e0bcd29589c26b1fc24d05352106463174133 days 21 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.336 Ether
0x63e29dedfc9aa68855168830f42270477e305e0bcd29589c26b1fc24d05352106463174133 days 21 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.336 Ether
0xcf1755037700b6bb9951578eea21e622f414c0ea8bc037900f6e61bb7ec691f26463118133 days 21 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.3357 Ether
0xcf1755037700b6bb9951578eea21e622f414c0ea8bc037900f6e61bb7ec691f26463118133 days 21 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.3357 Ether
0x614b91a7cdcd96316e107a7e08d1ac7cea797582121d61d37a3aa642ab9da73f6463107133 days 21 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.3354 Ether
0x614b91a7cdcd96316e107a7e08d1ac7cea797582121d61d37a3aa642ab9da73f6463107133 days 21 hrs ago0x91a502c678605fbce581eae053319747482276b90xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0.3354 Ether
0x4e3e985bc574f756f41d9b8ee4aa275adca622d8ee8f23a5d604f424ecbc292b6456964134 days 21 hrs ago0xffa4bee0b9cd2c2e4eacb8d8f11096baa3e6c55d0x5f480ca354304aae88d7dd66cd4735c59d543af00.3324 Ether
[ Download CSV Export 
Contract Source Code Verified (Exact Match)
Contract Name: WrapEtheremon
Compiler Version: v0.4.25+commit.59dbf8f1
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.24;

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

    constructor() 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) public onlyOwner {
        if (_newOwner != address(0)) {
            owner = _newOwner;
        }
    }


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

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

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

interface ERC20 {
    function totalSupply() public view returns (uint supply);
    function balanceOf(address _owner) public view returns (uint balance);
    function transfer(address _to, uint _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint _value) public returns (bool success);
    function approve(address _spender, uint _value) public returns (bool success);
    function allowance(address _owner, address _spender) public view returns (uint remaining);
    function decimals() public view returns(uint digits);
    event Approval(address indexed _owner, address indexed _spender, uint _value);
}

contract EtheremonDataBase {
    uint64 public totalMonster;
    uint32 public totalClass;

    // write
    function addElementToArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint8 _value) external returns(uint);
    function addMonsterObj(uint32 _classId, address _trainer, string _name) external returns(uint64);
    function removeMonsterIdMapping(address _trainer, uint64 _monsterId) external;

    // read
    function getElementInArrayType(EtheremonEnum.ArrayType _type, uint64 _id, uint _index) external constant returns(uint8);
    function getMonsterClass(uint32 _classId) external constant returns(uint32 classId, uint256 price, uint256 returnPrice, uint32 total, bool catchable);
    function getMonsterObj(uint64 _objId) external constant returns(uint64 objId, uint32 classId, address trainer, uint32 exp, uint32 createIndex, uint32 lastClaimIndex, uint createTime);
}

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
    }

    enum ArrayType {
        CLASS_TYPE,
        STAT_STEP,
        STAT_START,
        STAT_BASE,
        OBJ_SKILL
    }

    enum PropertyType {
        ANCESTOR,
        XFACTOR
    }
}

interface EtheremonMonsterNFTInterface {
   function triggerTransferEvent(address _from, address _to, uint _tokenId) external;
   function getMonsterCP(uint64 _monsterId) constant external returns(uint cp);
}

contract EtheremonWorldNFT is BasicAccessControl {
    uint8 constant public STAT_COUNT = 6;
    uint8 constant public STAT_MAX = 32;

    struct MonsterClassAcc {
        uint32 classId;
        uint256 price;
        uint256 returnPrice;
        uint32 total;
        bool catchable;
    }

    struct MonsterObjAcc {
        uint64 monsterId;
        uint32 classId;
        address trainer;
        string name;
        uint32 exp;
        uint32 createIndex;
        uint32 lastClaimIndex;
        uint createTime;
    }

    address public dataContract;
    address public monsterNFT;

    mapping(uint32 => bool) public classWhitelist;
    mapping(address => bool) public addressWhitelist;

    uint public gapFactor = 5;
    uint public priceIncreasingRatio = 1000;

    function setContract(address _dataContract, address _monsterNFT) external onlyModerators {
        dataContract = _dataContract;
        monsterNFT = _monsterNFT;
    }

    function setConfig(uint _gapFactor, uint _priceIncreasingRatio) external onlyModerators {
        gapFactor = _gapFactor;
        priceIncreasingRatio = _priceIncreasingRatio;
    }

    function setClassWhitelist(uint32 _classId, bool _status) external onlyModerators {
        classWhitelist[_classId] = _status;
    }

    function setAddressWhitelist(address _smartcontract, bool _status) external onlyModerators {
        addressWhitelist[_smartcontract] = _status;
    }

    function mintMonster(uint32 _classId, address _trainer, string _name) external onlyModerators returns(uint) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        // add monster
        uint64 objId = data.addMonsterObj(_classId, _trainer, _name);
        uint8 value;
        uint seed = getRandom(_trainer, block.number-1, objId);
        // generate base stat for the previous one
        for (uint i=0; i < STAT_COUNT; i += 1) {
            seed /= 100;
            value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
            data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
        }

        EtheremonMonsterNFTInterface(monsterNFT).triggerTransferEvent(address(0), _trainer, objId);
        return objId;
    }

    function burnMonster(uint64 _tokenId) external onlyModerators {
        // need to check condition before calling this function
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterObjAcc memory obj;
        (obj.monsterId, obj.classId, obj.trainer, obj.exp, obj.createIndex, obj.lastClaimIndex, obj.createTime) = data.getMonsterObj(_tokenId);
        require(obj.trainer != address(0));
        data.removeMonsterIdMapping(obj.trainer, _tokenId);
        EtheremonMonsterNFTInterface(monsterNFT).triggerTransferEvent(obj.trainer, address(0), _tokenId);
    }

    function catchMonsterNFT(uint32 _classId, string _name) external isActive payable {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
        if (class.classId == 0 || class.catchable == false) {
            revert();
        }

        uint price = class.price;
        if (class.total > 0)
            price += class.price*(class.total-1)/priceIncreasingRatio;
        if (msg.value < price) {
            revert();
        }

        // add new monster
        uint64 objId = data.addMonsterObj(_classId, msg.sender, _name);
        uint8 value;
        uint seed = getRandom(msg.sender, block.number-1, objId);
        // generate base stat for the previous one
        for (uint i=0; i < STAT_COUNT; i += 1) {
            seed /= 100;
            value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
            data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
        }

        EtheremonMonsterNFTInterface(monsterNFT).triggerTransferEvent(address(0), msg.sender, objId);
        // refund extra
        if (msg.value > price) {
            msg.sender.transfer((msg.value - price));
        }
    }

    // for whitelist contracts, no refund extra
    function catchMonster(address _player, uint32 _classId, string _name) external isActive payable returns(uint tokenId) {
        if (addressWhitelist[msg.sender] == false) {
            revert();
        }

        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
        if (class.classId == 0) {
            revert();
        }

        if (class.catchable == false && classWhitelist[_classId] == false) {
            revert();
        }

        uint price = class.price;
        if (class.total > gapFactor) {
            price += class.price*(class.total - gapFactor)/priceIncreasingRatio;
        }
        if (msg.value < price) {
            revert();
        }

        // add new monster
        uint64 objId = data.addMonsterObj(_classId, _player, _name);
        uint8 value;
        uint seed = getRandom(_player, block.number-1, objId);
        // generate base stat for the previous one
        for (uint i=0; i < STAT_COUNT; i += 1) {
            seed /= 100;
            value = uint8(seed % STAT_MAX) + data.getElementInArrayType(EtheremonEnum.ArrayType.STAT_START, uint64(_classId), i);
            data.addElementToArrayType(EtheremonEnum.ArrayType.STAT_BASE, objId, value);
        }

        EtheremonMonsterNFTInterface(monsterNFT).triggerTransferEvent(address(0), _player, objId);
        return objId;
    }

    function getMonsterClassBasic(uint32 _classId) external constant returns(uint256, uint256, uint256, bool) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);
        return (class.price, class.returnPrice, class.total, class.catchable);
    }

    function getPrice(uint32 _classId) external constant returns(bool catchable, uint price) {
        EtheremonDataBase data = EtheremonDataBase(dataContract);
        MonsterClassAcc memory class;
        (class.classId, class.price, class.returnPrice, class.total, class.catchable) = data.getMonsterClass(_classId);

        price = class.price;
        if (class.total > 0)
            price += class.price*(class.total-1)/priceIncreasingRatio;

        if (class.catchable == false) {
            return (classWhitelist[_classId], price);
        } else {
            return (true, price);
        }
    }

    // public api
    function getRandom(address _player, uint _block, uint _count) public view returns(uint) {
        return uint(keccak256(abi.encodePacked(blockhash(_block), _player, _count)));
    }

    function withdrawEther(address _sendTo, uint _amount) public onlyOwner {
        if (_amount > address(this).balance) {
            revert();
        }
        _sendTo.transfer(_amount);
    }
}

interface KyberNetworkProxyInterface {
    function maxGasPrice() public view returns(uint);
    function getUserCapInWei(address user) public view returns(uint);
    function getUserCapInTokenWei(address user, ERC20 token) public view returns(uint);
    function enabled() public view returns(bool);
    function info(bytes32 id) public view returns(uint);

    function getExpectedRate(ERC20 src, ERC20 dest, uint srcQty) public view
        returns (uint expectedRate, uint slippageRate);

    function tradeWithHint(ERC20 src, uint srcAmount, ERC20 dest, address destAddress, uint maxDestAmount,
        uint minConversionRate, address walletId, bytes hint) public payable returns(uint);
}

contract Utils {

    ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
    uint  constant internal PRECISION = (10**18);
    uint  constant internal MAX_QTY   = (10**28); // 10B tokens
    uint  constant internal MAX_RATE  = (PRECISION * 10**6); // up to 1M tokens per ETH
    uint  constant internal MAX_DECIMALS = 18;
    uint  constant internal ETH_DECIMALS = 18;
    mapping(address=>uint) internal decimals;

    function setDecimals(ERC20 token) internal {
        if (token == ETH_TOKEN_ADDRESS) decimals[token] = ETH_DECIMALS;
        else decimals[token] = token.decimals();
    }

    function getDecimals(ERC20 token) internal view returns(uint) {
        if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
        uint tokenDecimals = decimals[token];
        // technically, there might be token with decimals 0
        // moreover, very possible that old tokens have decimals 0
        // these tokens will just have higher gas fees.
        if(tokenDecimals == 0) return token.decimals();

        return tokenDecimals;
    }

    function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
        require(srcQty <= MAX_QTY);
        require(rate <= MAX_RATE);

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
        }
    }

    function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
        require(dstQty <= MAX_QTY);
        require(rate <= MAX_RATE);
        
        //source quantity is rounded up. to avoid dest quantity being too low.
        uint numerator;
        uint denominator;
        if (srcDecimals >= dstDecimals) {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
            denominator = rate;
        } else {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty);
            denominator = (rate * (10**(dstDecimals - srcDecimals)));
        }
        return (numerator + denominator - 1) / denominator; //avoid rounding down errors
    }
}

contract Utils2 is Utils {

    /// @dev get the balance of a user.
    /// @param token The token type
    /// @return The balance
    function getBalance(ERC20 token, address user) public view returns(uint) {
        if (token == ETH_TOKEN_ADDRESS)
            return user.balance;
        else
            return token.balanceOf(user);
    }

    function getDecimalsSafe(ERC20 token) internal returns(uint) {

        if (decimals[token] == 0) {
            setDecimals(token);
        }

        return decimals[token];
    }

    function calcDestAmount(ERC20 src, ERC20 dest, uint srcAmount, uint rate) internal view returns(uint) {
        return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal view returns(uint) {
        return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcRateFromQty(uint srcAmount, uint destAmount, uint srcDecimals, uint dstDecimals)
        internal pure returns(uint)
    {
        require(srcAmount <= MAX_QTY);
        require(destAmount <= MAX_QTY);

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            return (destAmount * PRECISION / ((10 ** (dstDecimals - srcDecimals)) * srcAmount));
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            return (destAmount * PRECISION * (10 ** (srcDecimals - dstDecimals)) / srcAmount);
        }
    }
}

interface WrapEtheremonInterface {
    /// @notice Can only be called by operators
    /// @dev Sets the KyberNetwork address
    /// @param _KyberNetwork KyberNetwork contract address
    function setKyberNetwork(address _KyberNetwork) public;

    /// @dev Get the ETH price of the Etheremon monster and if it is catchable
    /// @param _etheremon EtheremonWorldNFT address
    /// @param _classId Class ID of monster
    /// @param _payPrice Price of monster passed from Etheremon server
    /// @return catchable, monsterInETH
    function getMonsterPriceInETH(
        EtheremonWorldNFT _etheremon,
        uint32 _classId,
        uint _payPrice
    )
        public
        view
        returns (
            bool catchable,
            uint monsterInETH
        );

    /// @dev Get the rates of the Etheremon monster
    /// @param _kyberProxy KyberNetworkProxyInterface address
    /// @param token ERC20 token address
    /// @param monsterInETH Price of the monster in ETH
    /// @return expectedRate, slippageRate
    function getMonsterRates(
        KyberNetworkProxyInterface _kyberProxy,
        ERC20 token,
        uint monsterInETH
    )
        public
        view
        returns (
            uint expectedRate,
            uint slippageRate
        );

    /// @dev Get the token price and rates of the Etheremon monster
    /// @param token ERC20 token address
    /// @param expectedRate Expected rate of ETH to token
    /// @param monsterInETH Price of the monster in ETH
    /// @return monsterInTokens
    function getMonsterPriceInTokens(
        ERC20 token,
        uint expectedRate,
        uint monsterInETH
    )
        public
        view
        returns (uint monsterInTokens);

    /// @dev Acquires the monster from Etheremon using tokens
    /// @param _kyberProxy KyberNetworkProxyInterface address
    /// @param _etheremon EtheremonWorldNFT address
    /// @param _classId Class ID of monster
    /// @param _name Name of the monster
    /// @param token ERC20 token address
    /// @param tokenQty Amount of tokens to be transferred by user
    /// @param maxDestQty Actual amount of ETH needed to purchase the monster
    /// @param minRate The minimum rate or slippage rate.
    /// @param walletId Wallet ID where Kyber referral fees will be sent to
    /// @return monsterId
    function catchMonster(
        KyberNetworkProxyInterface _kyberProxy,
        EtheremonWorldNFT _etheremon,
        uint32 _classId,
        string _name,
        ERC20 token,
        uint tokenQty,
        uint maxDestQty,
        uint minRate,
        address walletId
    )
        public
        returns (uint monsterId);
}

contract WrapEtheremonPermissions {
    event TransferAdmin(address newAdmin);
    event OperatorAdded(address newOperator, bool isAdd);

    address public admin;
    address[] public operatorsGroup;
    mapping(address=>bool) internal operators;
    uint constant internal MAX_GROUP_SIZE = 50;

    constructor () public {
        admin = msg.sender;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin);
        _;
    }

    modifier onlyOperator() {
        require(operators[msg.sender]);
        _;
    }

    function transferAdmin(address newAdmin) public onlyAdmin {
        require(newAdmin != address(0));
        emit TransferAdmin(newAdmin);
        admin = newAdmin;
    }

    function addOperator(address newOperator) public onlyAdmin {
        require(!operators[newOperator]);
        require(operatorsGroup.length < MAX_GROUP_SIZE);

        emit OperatorAdded(newOperator, true);
        operators[newOperator] = true;
        operatorsGroup.push(newOperator);
    }

    function removeOperator (address operator) public onlyAdmin {
        require(operators[operator]);
        operators[operator] = false;

        for (uint i = 0; i < operatorsGroup.length; ++i) {
            if (operatorsGroup[i] == operator) {
                operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1];
                operatorsGroup.length -= 1;
                emit OperatorAdded(operator, false);
                break;
            }
        }
    }
}

contract WrapEtheremon is WrapEtheremonInterface, WrapEtheremonPermissions, Utils2 {
    event SwapTokenChange(uint startTokenBalance, uint change);
    event CaughtWithToken(address indexed sender, uint monsterId, ERC20 token, uint amount);
    event ETHReceived(address indexed sender, uint amount);

    address public KyberNetwork;
    ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);

    /// @dev Contract contstructor
    /// @param _KyberNetwork KyberNetwork main contract address
    constructor (address _KyberNetwork) public {
        KyberNetwork = _KyberNetwork;
    }

    /// @dev Return the ETH to user that was taken back by the network
    function() public payable {
        // Only receive ETH from KyberNetwork main contract
        require(msg.sender == KyberNetwork);
        emit ETHReceived(msg.sender, msg.value);
    }

    /// @notice Can only be called by operators
    /// @dev Sets the KyberNetwork address
    /// @param _KyberNetwork KyberNetwork contract address
    function setKyberNetwork(address _KyberNetwork) public onlyOperator {
      KyberNetwork = _KyberNetwork;
    }

    /// @dev Get the ETH price of the Etheremon monster and if it is catchable
    /// @param _etheremon EtheremonWorldNFT address
    /// @param _classId Class ID of monster
    /// @param _payPrice Price of monster passed from Etheremon server
    /// @return catchable, monsterInETH
    function getMonsterPriceInETH(
        EtheremonWorldNFT _etheremon,
        uint32 _classId,
        uint _payPrice
    )
        public
        view
        returns (
            bool catchable,
            uint monsterInETH
        )
    {
        // Get monster details from Etheremon contract
        (catchable, monsterInETH) = _etheremon.getPrice(_classId);

        // Get the highest price from contract pricing or offchain pricing
        monsterInETH = max(monsterInETH, _payPrice);

        return (catchable, monsterInETH);
    }

    /// @dev Get the rates of the Etheremon monster
    /// @param _kyberProxy KyberNetworkProxyInterface address
    /// @param token ERC20 token address
    /// @param monsterInETH Price of the monster in ETH
    /// @return expectedRate, slippageRate
    function getMonsterRates(
        KyberNetworkProxyInterface _kyberProxy,
        ERC20 token,
        uint monsterInETH
    )
        public
        view
        returns (
            uint expectedRate,
            uint slippageRate
        )
    {
        // Get the expected and slippage rates of the token to ETH
        (expectedRate, slippageRate) = _kyberProxy.getExpectedRate(token, ETH_TOKEN_ADDRESS, monsterInETH);

        return (expectedRate, slippageRate);
    }

    /// @dev Get the token price and rates of the Etheremon monster
    /// @param token ERC20 token address
    /// @param expectedRate Expected rate of ETH to token
    /// @param monsterInETH Price of the monster in ETH
    /// @return monsterInTokens
    function getMonsterPriceInTokens(
        ERC20 token,
        uint expectedRate,
        uint monsterInETH
    )
        public
        view
        returns (uint monsterInTokens)
    {
        // If expectedRate is 0, return 0 for monster price in tokens
        if (expectedRate == 0) {
            return 0;
        }

        // Calculate monster price in tokens
        monsterInTokens = calcSrcAmount(ETH_TOKEN_ADDRESS, token, monsterInETH, expectedRate);

        return monsterInTokens;
    }

    /// @dev Acquires the monster from Etheremon using tokens
    /// @param _kyberProxy KyberNetworkProxyInterface address
    /// @param _etheremon EtheremonWorldNFT address
    /// @param _classId Class ID of monster
    /// @param _name Name of the monster
    /// @param token ERC20 token address
    /// @param tokenQty Amount of tokens to be transferred by user
    /// @param maxDestQty Actual amount of ETH needed to purchase the monster
    /// @param minRate The minimum rate or slippage rate.
    /// @param walletId Wallet ID where Kyber referral fees will be sent to
    /// @return monsterId
    function catchMonster(
        KyberNetworkProxyInterface _kyberProxy,
        EtheremonWorldNFT _etheremon,
        uint32 _classId,
        string _name,
        ERC20 token,
        uint tokenQty,
        uint maxDestQty,
        uint minRate,
        address walletId
    )
        public
        returns (uint monsterId)
    {
        // Check that the player has transferred the token to this contract
        require(token.transferFrom(msg.sender, this, tokenQty));

        // Get the starting token balance of the player's wallet
        uint startTokenBalance = token.balanceOf(this);

        // Mitigate ERC20 Approve front-running attack, by initially setting
        // allowance to 0
        require(token.approve(_kyberProxy, 0));

        // Verify that the token balance has not decreased from front-running
        require(token.balanceOf(this) == startTokenBalance);

        // Once verified, set the token allowance to tokenQty
        require(token.approve(_kyberProxy, tokenQty));

        // Swap player's token to ETH to send to Etheremon payments contract
        uint userETH = _kyberProxy.tradeWithHint(
            token,
            tokenQty,
            ETH_TOKEN_ADDRESS,
            address(this),
            maxDestQty,
            minRate,
            walletId,
            ""
        );

        // Acquire the monster and send to player
        monsterId = _etheremon.catchMonster.value(userETH)(msg.sender, _classId, _name);

        // Log event that monster was caught using tokens
        emit CaughtWithToken(msg.sender, monsterId, token, tokenQty);

        // Return change to player if any
        calcPlayerChange(token, startTokenBalance);

        return monsterId;
    }

    /// @dev Calculates token change and returns to player
    /// @param token ERC20 token address
    /// @param startTokenBalance Starting token balance of the player's wallet
    function calcPlayerChange(ERC20 token, uint startTokenBalance) private {
        // Calculate change of player
        uint change = token.balanceOf(this);

        // Send back change if change is > 0
        if (change > 0) {
            // Log the exchange event
            emit SwapTokenChange(startTokenBalance, change);

            // Transfer change back to player
            token.transfer(msg.sender, change);
        }
    }

    /// @dev Gets the max between two uint params
    /// @param a Param A
    /// @param b Param B
    /// @return result
    function max(uint a, uint b) private pure returns (uint result) {
        return a > b ? a : b;
    }
}

Contract ABI
[{"constant":true,"inputs":[{"name":"_kyberProxy","type":"address"},{"name":"token","type":"address"},{"name":"monsterInETH","type":"uint256"}],"name":"getMonsterRates","outputs":[{"name":"expectedRate","type":"uint256"},{"name":"slippageRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_KyberNetwork","type":"address"}],"name":"setKyberNetwork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"expectedRate","type":"uint256"},{"name":"monsterInETH","type":"uint256"}],"name":"getMonsterPriceInTokens","outputs":[{"name":"monsterInTokens","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_etheremon","type":"address"},{"name":"_classId","type":"uint32"},{"name":"_payPrice","type":"uint256"}],"name":"getMonsterPriceInETH","outputs":[{"name":"catchable","type":"bool"},{"name":"monsterInETH","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"KyberNetwork","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_kyberProxy","type":"address"},{"name":"_etheremon","type":"address"},{"name":"_classId","type":"uint32"},{"name":"_name","type":"string"},{"name":"token","type":"address"},{"name":"tokenQty","type":"uint256"},{"name":"maxDestQty","type":"uint256"},{"name":"minRate","type":"uint256"},{"name":"walletId","type":"address"}],"name":"catchMonster","outputs":[{"name":"monsterId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"operatorsGroup","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_KyberNetwork","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"startTokenBalance","type":"uint256"},{"indexed":false,"name":"change","type":"uint256"}],"name":"SwapTokenChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"monsterId","type":"uint256"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"CaughtWithToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"ETHReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAdmin","type":"address"}],"name":"TransferAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOperator","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"}]

Contract Creation Code
608060405234801561001057600080fd5b506040516020806112c1833981016040525160008054600160a060020a0319908116331790915560048054600160a060020a03909316929091169190911790556112628061005f6000396000f3006080604052600436106100a05763ffffffff60e060020a6000350416634c9c786c81146100ef57806354a325a61461013257806366e18bc21461015557806375829def1461018e57806376a4b76a146101af5780639870d7fe146101f75780639c7399ea14610218578063ac8a584a14610249578063b05d6e801461026a578063d4fac45d14610303578063f851a4401461032a578063fc5bf0f21461033f575b600454600160a060020a031633146100b757600080fd5b60408051348152905133917fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a919081900360200190a2005b3480156100fb57600080fd5b50610119600160a060020a0360043581169060243516604435610357565b6040805192835260208301919091528051918290030190f35b34801561013e57600080fd5b50610153600160a060020a036004351661041b565b005b34801561016157600080fd5b5061017c600160a060020a0360043516602435604435610468565b60408051918252519081900360200190f35b34801561019a57600080fd5b50610153600160a060020a03600435166104a3565b3480156101bb57600080fd5b506101dc600160a060020a036004351663ffffffff6024351660443561053a565b60408051921515835260208301919091528051918290030190f35b34801561020357600080fd5b50610153600160a060020a03600435166105dd565b34801561022457600080fd5b5061022d6106dd565b60408051600160a060020a039092168252519081900360200190f35b34801561025557600080fd5b50610153600160a060020a03600435166106ec565b34801561027657600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261017c94600160a060020a038135811695602480359092169563ffffffff604435169536956084940191819084018382808284375094975050600160a060020a038535811696506020860135956040810135955060608101359450608001351691506108629050565b34801561030f57600080fd5b5061017c600160a060020a0360043581169060243516610dd6565b34801561033657600080fd5b5061022d610e9e565b34801561034b57600080fd5b5061022d600435610ead565b604080517f809a9e55000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee602483015260448201849052825160009384939288169263809a9e55926064808301939282900301818787803b1580156103dc57600080fd5b505af11580156103f0573d6000803e3d6000fd5b505050506040513d604081101561040657600080fd5b50805160209091015190969095509350505050565b3360009081526002602052604090205460ff16151561043957600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008215156104795750600061049c565b61049973eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858486610ed5565b90505b9392505050565b600054600160a060020a031633146104ba57600080fd5b600160a060020a03811615156104cf57600080fd5b60408051600160a060020a038316815290517fda7b0a7bc965abdec8a1a995575a891838264c2968e14bd456c5391827b7aa309181900360200190a16000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008084600160a060020a031663da26663a856040518263ffffffff1660e060020a028152600401808263ffffffff1663ffffffff1681526020019150506040805180830381600087803b15801561059157600080fd5b505af11580156105a5573d6000803e3d6000fd5b505050506040513d60408110156105bb57600080fd5b50805160209091015190925090506105d38184610efc565b9050935093915050565b600054600160a060020a031633146105f457600080fd5b600160a060020a03811660009081526002602052604090205460ff161561061a57600080fd5b60015460321161062957600080fd5b60408051600160a060020a03831681526001602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a1600160a060020a03166000818152600260205260408120805460ff191660019081179091558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b600454600160a060020a031681565b60008054600160a060020a0316331461070457600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561072b57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b60015481101561085e5781600160a060020a031660018281548110151561077057fe5b600091825260209091200154600160a060020a031614156108565760018054600019810190811061079d57fe5b60009182526020909120015460018054600160a060020a0390921691839081106107c357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560018054600019019061080c90826111f6565b5060408051600160a060020a03841681526000602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a161085e565b60010161074d565b5050565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052905160009182918291600160a060020a038a16916323b872dd9160648082019260209290919082900301818787803b1580156108d757600080fd5b505af11580156108eb573d6000803e3d6000fd5b505050506040513d602081101561090157600080fd5b5051151561090e57600080fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038a16916370a082319160248083019260209291908290030181600087803b15801561096f57600080fd5b505af1158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b5051604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038f8116600483015260006024830181905292519395508b169263095ea7b392604480840193602093929083900390910190829087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d6020811015610a3657600080fd5b50511515610a4357600080fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518391600160a060020a038b16916370a08231916024808201926020929091908290030181600087803b158015610aa757600080fd5b505af1158015610abb573d6000803e3d6000fd5b505050506040513d6020811015610ad157600080fd5b505114610add57600080fd5b87600160a060020a031663095ea7b38d896040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610b4057600080fd5b505af1158015610b54573d6000803e3d6000fd5b505050506040513d6020811015610b6a57600080fd5b50511515610b7757600080fd5b604080517f29589f61000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018a905273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60448301523060648301526084820189905260a4820188905286811660c483015261010060e4830152600061010483018190529251908f16926329589f619261014480820193602093909283900390910190829087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b810190808051906020019092919050505090508a600160a060020a031663c0845e8a82338d8d6040518563ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018363ffffffff1663ffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610cf6578181015183820152602001610cde565b50505050905090810190601f168015610d235780820380516001836020036101000a031916815260200191505b509450505050506020604051808303818588803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b50505050506040513d6020811015610d6e57600080fd5b505160408051828152600160a060020a038b1660208201528082018a9052905191945033917f292c998861a6c93f87fd689ba3b6efaf15ed97454f96924beba6835d3cb22e239181900360600190a2610dc78883610f12565b50509998505050505050505050565b6000600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610e0e5750600160a060020a03811631610e98565b82600160a060020a03166370a08231836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610e6957600080fd5b505af1158015610e7d573d6000803e3d6000fd5b505050506040513d6020811015610e9357600080fd5b505190505b92915050565b600054600160a060020a031681565b6001805482908110610ebb57fe5b600091825260209091200154600160a060020a0316905081565b6000610ef383610ee487611082565b610eed87611082565b8561114f565b95945050505050565b6000818311610f0b578161049c565b5090919050565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038516916370a082319160248082019260209290919082900301818787803b158015610f7657600080fd5b505af1158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b50519050600081111561107d57604080518381526020810183905281517f728dff6f9ccda5c4b34aef50e8476d414ed0873362ca60c9bd2e85b7d7140e26929181900390910190a1604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561105057600080fd5b505af1158015611064573d6000803e3d6000fd5b505050506040513d602081101561107a57600080fd5b50505b505050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156110b35760129150611149565b50600160a060020a0382166000908152600360205260409020548015156111455782600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b505050506040513d602081101561113c57600080fd5b50519150611149565b8091505b50919050565b600080806b204fce5e3e2502611000000087111561116c57600080fd5b69d3c21bcecceda100000084111561118357600080fd5b8486106111b4576012858703111561119a57600080fd5b5050828403600a0a8502670de0b6b3a764000002826111da565b601286860311156111c457600080fd5b5050670de0b6b3a76400008502848403600a0a83025b806001828401038115156111ea57fe5b04979650505050505050565b81548183558181111561107d5760008381526020902061107d91810190830161123391905b8082111561122f576000815560010161121b565b5090565b905600a165627a7a72305820a5e367443a0284a7713f7678ad8f31763c5566a913d91b8ffa7b0d1852261bb00029


   Swarm Source:
bzzr://a5e367443a0284a7713f7678ad8f31763c5566a913d91b8ffa7b0d1852261bb0
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.