ETH Price: $2,035.61 (+3.66%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Catch Monster71022912019-01-21 5:38:222597 days ago1548049102IN
0xFFA4bee0...aa3e6c55d
0 ETH0.001481873.9
Catch Monster71021782019-01-21 5:09:232597 days ago1548047363IN
0xFFA4bee0...aa3e6c55d
0 ETH0.00260448
Catch Monster70527132019-01-12 8:51:132606 days ago1547283073IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0030935710
Catch Monster70526842019-01-12 8:45:062606 days ago1547282706IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0006192
Catch Monster70118162019-01-05 1:10:082613 days ago1546650608IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0149876820
Catch Monster68173032018-12-03 7:44:282646 days ago1543823068IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0157603820
Catch Monster67687352018-11-25 7:16:592654 days ago1543130219IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0025272723.8
Catch Monster67687162018-11-25 7:10:312654 days ago1543129831IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0025060323.6
Catch Monster65750152018-10-24 13:38:182686 days ago1540388298IN
0xFFA4bee0...aa3e6c55d
0 ETH0.009990813.3
Catch Monster65554162018-10-21 8:43:522689 days ago1540111432IN
0xFFA4bee0...aa3e6c55d
0 ETH0.002899144
Catch Monster64786632018-10-08 20:43:452702 days ago1539031425IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0070608110
Catch Monster64656022018-10-06 18:08:102704 days ago1538849290IN
0xFFA4bee0...aa3e6c55d
0 ETH0.002915015
Catch Monster64650142018-10-06 15:58:462704 days ago1538841526IN
0xFFA4bee0...aa3e6c55d
0 ETH0.00244273.5
Catch Monster64632372018-10-06 9:04:552704 days ago1538816695IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0080128511
Catch Monster64631742018-10-06 8:51:092704 days ago1538815869IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0113877616
Catch Monster64631182018-10-06 8:37:472704 days ago1538815067IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0145002620
Catch Monster64631072018-10-06 8:35:182704 days ago1538814918IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0141852820
Catch Monster64569642018-10-05 8:35:532705 days ago1538728553IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0184758225
Catch Monster64569632018-10-05 8:35:182705 days ago1538728518IN
0xFFA4bee0...aa3e6c55d
0 ETH0.002895394.5
Catch Monster64568952018-10-05 8:19:312705 days ago1538727571IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0188322225
Catch Monster64568682018-10-05 8:12:462705 days ago1538727166IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0184340225
Catch Monster64568582018-10-05 8:11:302705 days ago1538727090IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0184096725
Catch Monster64568512018-10-05 8:09:332705 days ago1538726973IN
0xFFA4bee0...aa3e6c55d
0 ETH0.003340055.2
Catch Monster64568512018-10-05 8:09:332705 days ago1538726973IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0183921525
Catch Monster64568402018-10-05 8:08:072705 days ago1538726887IN
0xFFA4bee0...aa3e6c55d
0 ETH0.0202400327
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-71022912019-01-21 5:38:222597 days ago1548049102
0xFFA4bee0...aa3e6c55d
0.03174 ETH
-71021782019-01-21 5:09:232597 days ago1548047363
0xFFA4bee0...aa3e6c55d
0.03174 ETH
-70527132019-01-12 8:51:132606 days ago1547283073
0xFFA4bee0...aa3e6c55d
0.03345 ETH
-70526842019-01-12 8:45:062606 days ago1547282706
0xFFA4bee0...aa3e6c55d
0.03345 ETH
-70118162019-01-05 1:10:082613 days ago1546650608
0xFFA4bee0...aa3e6c55d
0.03144 ETH
-70118162019-01-05 1:10:082613 days ago1546650608
0xFFA4bee0...aa3e6c55d
0.03144 ETH
Transfer65750152018-10-24 13:38:182686 days ago1540388298
0xFFA4bee0...aa3e6c55d
0.0312 ETH
Transfer65750152018-10-24 13:38:182686 days ago1540388298
0xFFA4bee0...aa3e6c55d
0.0312 ETH
Transfer65554162018-10-21 8:43:522689 days ago1540111432
0xFFA4bee0...aa3e6c55d
0.03144 ETH
Transfer65554162018-10-21 8:43:522689 days ago1540111432
0xFFA4bee0...aa3e6c55d
0.03144 ETH
Transfer64786632018-10-08 20:43:452702 days ago1539031425
0xFFA4bee0...aa3e6c55d
0.03111 ETH
Transfer64786632018-10-08 20:43:452702 days ago1539031425
0xFFA4bee0...aa3e6c55d
0.03111 ETH
Transfer64656022018-10-06 18:08:102704 days ago1538849290
0xFFA4bee0...aa3e6c55d
0.3369 ETH
Transfer64656022018-10-06 18:08:102704 days ago1538849290
0xFFA4bee0...aa3e6c55d
0.3369 ETH
Transfer64650142018-10-06 15:58:462704 days ago1538841526
0xFFA4bee0...aa3e6c55d
0.3363 ETH
Transfer64650142018-10-06 15:58:462704 days ago1538841526
0xFFA4bee0...aa3e6c55d
0.3363 ETH
Transfer64632372018-10-06 9:04:552704 days ago1538816695
0xFFA4bee0...aa3e6c55d
0.03237 ETH
Transfer64632372018-10-06 9:04:552704 days ago1538816695
0xFFA4bee0...aa3e6c55d
0.03237 ETH
Transfer64631742018-10-06 8:51:092704 days ago1538815869
0xFFA4bee0...aa3e6c55d
0.336 ETH
Transfer64631742018-10-06 8:51:092704 days ago1538815869
0xFFA4bee0...aa3e6c55d
0.336 ETH
Transfer64631182018-10-06 8:37:472704 days ago1538815067
0xFFA4bee0...aa3e6c55d
0.3357 ETH
Transfer64631182018-10-06 8:37:472704 days ago1538815067
0xFFA4bee0...aa3e6c55d
0.3357 ETH
Transfer64631072018-10-06 8:35:182704 days ago1538814918
0xFFA4bee0...aa3e6c55d
0.3354 ETH
Transfer64631072018-10-06 8:35:182704 days ago1538814918
0xFFA4bee0...aa3e6c55d
0.3354 ETH
Transfer64569642018-10-05 8:35:532705 days ago1538728553
0xFFA4bee0...aa3e6c55d
0.3324 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WrapEtheremon

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-09-16
*/

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 Security Audit

Contract ABI

API
[{"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"}]

608060405234801561001057600080fd5b506040516020806112c1833981016040525160008054600160a060020a0319908116331790915560048054600160a060020a03909316929091169190911790556112628061005f6000396000f3006080604052600436106100a05763ffffffff60e060020a6000350416634c9c786c81146100ef57806354a325a61461013257806366e18bc21461015557806375829def1461018e57806376a4b76a146101af5780639870d7fe146101f75780639c7399ea14610218578063ac8a584a14610249578063b05d6e801461026a578063d4fac45d14610303578063f851a4401461032a578063fc5bf0f21461033f575b600454600160a060020a031633146100b757600080fd5b60408051348152905133917fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a919081900360200190a2005b3480156100fb57600080fd5b50610119600160a060020a0360043581169060243516604435610357565b6040805192835260208301919091528051918290030190f35b34801561013e57600080fd5b50610153600160a060020a036004351661041b565b005b34801561016157600080fd5b5061017c600160a060020a0360043516602435604435610468565b60408051918252519081900360200190f35b34801561019a57600080fd5b50610153600160a060020a03600435166104a3565b3480156101bb57600080fd5b506101dc600160a060020a036004351663ffffffff6024351660443561053a565b60408051921515835260208301919091528051918290030190f35b34801561020357600080fd5b50610153600160a060020a03600435166105dd565b34801561022457600080fd5b5061022d6106dd565b60408051600160a060020a039092168252519081900360200190f35b34801561025557600080fd5b50610153600160a060020a03600435166106ec565b34801561027657600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261017c94600160a060020a038135811695602480359092169563ffffffff604435169536956084940191819084018382808284375094975050600160a060020a038535811696506020860135956040810135955060608101359450608001351691506108629050565b34801561030f57600080fd5b5061017c600160a060020a0360043581169060243516610dd6565b34801561033657600080fd5b5061022d610e9e565b34801561034b57600080fd5b5061022d600435610ead565b604080517f809a9e55000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee602483015260448201849052825160009384939288169263809a9e55926064808301939282900301818787803b1580156103dc57600080fd5b505af11580156103f0573d6000803e3d6000fd5b505050506040513d604081101561040657600080fd5b50805160209091015190969095509350505050565b3360009081526002602052604090205460ff16151561043957600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008215156104795750600061049c565b61049973eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858486610ed5565b90505b9392505050565b600054600160a060020a031633146104ba57600080fd5b600160a060020a03811615156104cf57600080fd5b60408051600160a060020a038316815290517fda7b0a7bc965abdec8a1a995575a891838264c2968e14bd456c5391827b7aa309181900360200190a16000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008084600160a060020a031663da26663a856040518263ffffffff1660e060020a028152600401808263ffffffff1663ffffffff1681526020019150506040805180830381600087803b15801561059157600080fd5b505af11580156105a5573d6000803e3d6000fd5b505050506040513d60408110156105bb57600080fd5b50805160209091015190925090506105d38184610efc565b9050935093915050565b600054600160a060020a031633146105f457600080fd5b600160a060020a03811660009081526002602052604090205460ff161561061a57600080fd5b60015460321161062957600080fd5b60408051600160a060020a03831681526001602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a1600160a060020a03166000818152600260205260408120805460ff191660019081179091558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b600454600160a060020a031681565b60008054600160a060020a0316331461070457600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561072b57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b60015481101561085e5781600160a060020a031660018281548110151561077057fe5b600091825260209091200154600160a060020a031614156108565760018054600019810190811061079d57fe5b60009182526020909120015460018054600160a060020a0390921691839081106107c357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560018054600019019061080c90826111f6565b5060408051600160a060020a03841681526000602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a161085e565b60010161074d565b5050565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052905160009182918291600160a060020a038a16916323b872dd9160648082019260209290919082900301818787803b1580156108d757600080fd5b505af11580156108eb573d6000803e3d6000fd5b505050506040513d602081101561090157600080fd5b5051151561090e57600080fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038a16916370a082319160248083019260209291908290030181600087803b15801561096f57600080fd5b505af1158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b5051604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038f8116600483015260006024830181905292519395508b169263095ea7b392604480840193602093929083900390910190829087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d6020811015610a3657600080fd5b50511515610a4357600080fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518391600160a060020a038b16916370a08231916024808201926020929091908290030181600087803b158015610aa757600080fd5b505af1158015610abb573d6000803e3d6000fd5b505050506040513d6020811015610ad157600080fd5b505114610add57600080fd5b87600160a060020a031663095ea7b38d896040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610b4057600080fd5b505af1158015610b54573d6000803e3d6000fd5b505050506040513d6020811015610b6a57600080fd5b50511515610b7757600080fd5b604080517f29589f61000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018a905273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60448301523060648301526084820189905260a4820188905286811660c483015261010060e4830152600061010483018190529251908f16926329589f619261014480820193602093909283900390910190829087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b810190808051906020019092919050505090508a600160a060020a031663c0845e8a82338d8d6040518563ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018363ffffffff1663ffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610cf6578181015183820152602001610cde565b50505050905090810190601f168015610d235780820380516001836020036101000a031916815260200191505b509450505050506020604051808303818588803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b50505050506040513d6020811015610d6e57600080fd5b505160408051828152600160a060020a038b1660208201528082018a9052905191945033917f292c998861a6c93f87fd689ba3b6efaf15ed97454f96924beba6835d3cb22e239181900360600190a2610dc78883610f12565b50509998505050505050505050565b6000600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610e0e5750600160a060020a03811631610e98565b82600160a060020a03166370a08231836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610e6957600080fd5b505af1158015610e7d573d6000803e3d6000fd5b505050506040513d6020811015610e9357600080fd5b505190505b92915050565b600054600160a060020a031681565b6001805482908110610ebb57fe5b600091825260209091200154600160a060020a0316905081565b6000610ef383610ee487611082565b610eed87611082565b8561114f565b95945050505050565b6000818311610f0b578161049c565b5090919050565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038516916370a082319160248082019260209290919082900301818787803b158015610f7657600080fd5b505af1158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b50519050600081111561107d57604080518381526020810183905281517f728dff6f9ccda5c4b34aef50e8476d414ed0873362ca60c9bd2e85b7d7140e26929181900390910190a1604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561105057600080fd5b505af1158015611064573d6000803e3d6000fd5b505050506040513d602081101561107a57600080fd5b50505b505050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156110b35760129150611149565b50600160a060020a0382166000908152600360205260409020548015156111455782600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b505050506040513d602081101561113c57600080fd5b50519150611149565b8091505b50919050565b600080806b204fce5e3e2502611000000087111561116c57600080fd5b69d3c21bcecceda100000084111561118357600080fd5b8486106111b4576012858703111561119a57600080fd5b5050828403600a0a8502670de0b6b3a764000002826111da565b601286860311156111c457600080fd5b5050670de0b6b3a76400008502848403600a0a83025b806001828401038115156111ea57fe5b04979650505050505050565b81548183558181111561107d5760008381526020902061107d91810190830161123391905b8082111561122f576000815560010161121b565b5090565b905600a165627a7a72305820a5e367443a0284a7713f7678ad8f31763c5566a913d91b8ffa7b0d1852261bb00029

Deployed Bytecode

0x6080604052600436106100a05763ffffffff60e060020a6000350416634c9c786c81146100ef57806354a325a61461013257806366e18bc21461015557806375829def1461018e57806376a4b76a146101af5780639870d7fe146101f75780639c7399ea14610218578063ac8a584a14610249578063b05d6e801461026a578063d4fac45d14610303578063f851a4401461032a578063fc5bf0f21461033f575b600454600160a060020a031633146100b757600080fd5b60408051348152905133917fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a919081900360200190a2005b3480156100fb57600080fd5b50610119600160a060020a0360043581169060243516604435610357565b6040805192835260208301919091528051918290030190f35b34801561013e57600080fd5b50610153600160a060020a036004351661041b565b005b34801561016157600080fd5b5061017c600160a060020a0360043516602435604435610468565b60408051918252519081900360200190f35b34801561019a57600080fd5b50610153600160a060020a03600435166104a3565b3480156101bb57600080fd5b506101dc600160a060020a036004351663ffffffff6024351660443561053a565b60408051921515835260208301919091528051918290030190f35b34801561020357600080fd5b50610153600160a060020a03600435166105dd565b34801561022457600080fd5b5061022d6106dd565b60408051600160a060020a039092168252519081900360200190f35b34801561025557600080fd5b50610153600160a060020a03600435166106ec565b34801561027657600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261017c94600160a060020a038135811695602480359092169563ffffffff604435169536956084940191819084018382808284375094975050600160a060020a038535811696506020860135956040810135955060608101359450608001351691506108629050565b34801561030f57600080fd5b5061017c600160a060020a0360043581169060243516610dd6565b34801561033657600080fd5b5061022d610e9e565b34801561034b57600080fd5b5061022d600435610ead565b604080517f809a9e55000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee602483015260448201849052825160009384939288169263809a9e55926064808301939282900301818787803b1580156103dc57600080fd5b505af11580156103f0573d6000803e3d6000fd5b505050506040513d604081101561040657600080fd5b50805160209091015190969095509350505050565b3360009081526002602052604090205460ff16151561043957600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008215156104795750600061049c565b61049973eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee858486610ed5565b90505b9392505050565b600054600160a060020a031633146104ba57600080fd5b600160a060020a03811615156104cf57600080fd5b60408051600160a060020a038316815290517fda7b0a7bc965abdec8a1a995575a891838264c2968e14bd456c5391827b7aa309181900360200190a16000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008084600160a060020a031663da26663a856040518263ffffffff1660e060020a028152600401808263ffffffff1663ffffffff1681526020019150506040805180830381600087803b15801561059157600080fd5b505af11580156105a5573d6000803e3d6000fd5b505050506040513d60408110156105bb57600080fd5b50805160209091015190925090506105d38184610efc565b9050935093915050565b600054600160a060020a031633146105f457600080fd5b600160a060020a03811660009081526002602052604090205460ff161561061a57600080fd5b60015460321161062957600080fd5b60408051600160a060020a03831681526001602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a1600160a060020a03166000818152600260205260408120805460ff191660019081179091558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b600454600160a060020a031681565b60008054600160a060020a0316331461070457600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561072b57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b60015481101561085e5781600160a060020a031660018281548110151561077057fe5b600091825260209091200154600160a060020a031614156108565760018054600019810190811061079d57fe5b60009182526020909120015460018054600160a060020a0390921691839081106107c357fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560018054600019019061080c90826111f6565b5060408051600160a060020a03841681526000602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a161085e565b60010161074d565b5050565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052905160009182918291600160a060020a038a16916323b872dd9160648082019260209290919082900301818787803b1580156108d757600080fd5b505af11580156108eb573d6000803e3d6000fd5b505050506040513d602081101561090157600080fd5b5051151561090e57600080fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038a16916370a082319160248083019260209291908290030181600087803b15801561096f57600080fd5b505af1158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b5051604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038f8116600483015260006024830181905292519395508b169263095ea7b392604480840193602093929083900390910190829087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d6020811015610a3657600080fd5b50511515610a4357600080fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518391600160a060020a038b16916370a08231916024808201926020929091908290030181600087803b158015610aa757600080fd5b505af1158015610abb573d6000803e3d6000fd5b505050506040513d6020811015610ad157600080fd5b505114610add57600080fd5b87600160a060020a031663095ea7b38d896040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610b4057600080fd5b505af1158015610b54573d6000803e3d6000fd5b505050506040513d6020811015610b6a57600080fd5b50511515610b7757600080fd5b604080517f29589f61000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018a905273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60448301523060648301526084820189905260a4820188905286811660c483015261010060e4830152600061010483018190529251908f16926329589f619261014480820193602093909283900390910190829087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050506040513d6020811015610c5757600080fd5b810190808051906020019092919050505090508a600160a060020a031663c0845e8a82338d8d6040518563ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018363ffffffff1663ffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610cf6578181015183820152602001610cde565b50505050905090810190601f168015610d235780820380516001836020036101000a031916815260200191505b509450505050506020604051808303818588803b158015610d4357600080fd5b505af1158015610d57573d6000803e3d6000fd5b50505050506040513d6020811015610d6e57600080fd5b505160408051828152600160a060020a038b1660208201528082018a9052905191945033917f292c998861a6c93f87fd689ba3b6efaf15ed97454f96924beba6835d3cb22e239181900360600190a2610dc78883610f12565b50509998505050505050505050565b6000600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610e0e5750600160a060020a03811631610e98565b82600160a060020a03166370a08231836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610e6957600080fd5b505af1158015610e7d573d6000803e3d6000fd5b505050506040513d6020811015610e9357600080fd5b505190505b92915050565b600054600160a060020a031681565b6001805482908110610ebb57fe5b600091825260209091200154600160a060020a0316905081565b6000610ef383610ee487611082565b610eed87611082565b8561114f565b95945050505050565b6000818311610f0b578161049c565b5090919050565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600091600160a060020a038516916370a082319160248082019260209290919082900301818787803b158015610f7657600080fd5b505af1158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b50519050600081111561107d57604080518381526020810183905281517f728dff6f9ccda5c4b34aef50e8476d414ed0873362ca60c9bd2e85b7d7140e26929181900390910190a1604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561105057600080fd5b505af1158015611064573d6000803e3d6000fd5b505050506040513d602081101561107a57600080fd5b50505b505050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156110b35760129150611149565b50600160a060020a0382166000908152600360205260409020548015156111455782600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561111257600080fd5b505af1158015611126573d6000803e3d6000fd5b505050506040513d602081101561113c57600080fd5b50519150611149565b8091505b50919050565b600080806b204fce5e3e2502611000000087111561116c57600080fd5b69d3c21bcecceda100000084111561118357600080fd5b8486106111b4576012858703111561119a57600080fd5b5050828403600a0a8502670de0b6b3a764000002826111da565b601286860311156111c457600080fd5b5050670de0b6b3a76400008502848403600a0a83025b806001828401038115156111ea57fe5b04979650505050505050565b81548183558181111561107d5760008381526020902061107d91810190830161123391905b8082111561122f576000815560010161121b565b5090565b905600a165627a7a72305820a5e367443a0284a7713f7678ad8f31763c5566a913d91b8ffa7b0d1852261bb00029

Swarm Source

bzzr://a5e367443a0284a7713f7678ad8f31763c5566a913d91b8ffa7b0d1852261bb0

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.