Contract 0x0163F2AeCc6263dfb2B9b01e9E76F93D4cc9862e

 
 
Txn Hash
Method
Block
From
To
Value
0xb18d8204d36c751c8aa5b25b8c77349c37a08b351bd851e6ca69f30712d8be68Transfer Ownersh...67903282018-11-28 21:03:451356 days 22 hrs agoDragonereum Egg: Deployer IN  Dragonereum: Dragon Genetics0 Ether0.‍001521450
0x23462a591468fbc18802906a80fd6a3a32f2011a8f849076867c77cd4ba6682bSet External Dep...67903172018-11-28 21:00:411356 days 22 hrs agoDragonereum Egg: Deployer IN  Dragonereum: Dragon Genetics0 Ether0.‍0042622550
0xdee08cc54db0ac7fb18205204a6c2b541c843eb082441016248eb726c4a9e442Set Internal Dep...67903172018-11-28 21:00:411356 days 22 hrs agoDragonereum Egg: Deployer IN  Dragonereum: Dragon Genetics0 Ether0.‍0042694550
0x7e748d7134ca28670a01d2ea4d4a0257d59885aa6730fc2f5d7feb6baec5d4830x6080604067902462018-11-28 20:43:261356 days 22 hrs agoDragonereum Egg: Deployer IN  Create: DragonGenetics0 Ether0.‍128711650
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DragonGenetics

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-11-29
*/

pragma solidity 0.4.25;

library SafeMath8 {

    function mul(uint8 a, uint8 b) internal pure returns (uint8) {
        if (a == 0) {
            return 0;
        }
        uint8 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint8 a, uint8 b) internal pure returns (uint8) {
        return a / b;
    }

    function sub(uint8 a, uint8 b) internal pure returns (uint8) {
        assert(b <= a);
        return a - b;
    }

    function add(uint8 a, uint8 b) internal pure returns (uint8) {
        uint8 c = a + b;
        assert(c >= a);
        return c;
    }

    function pow(uint8 a, uint8 b) internal pure returns (uint8) {
        if (a == 0) return 0;
        if (b == 0) return 1;

        uint8 c = a ** b;
        assert(c / (a ** (b - 1)) == a);
        return c;
    }
}

library SafeMath16 {

    function mul(uint16 a, uint16 b) internal pure returns (uint16) {
        if (a == 0) {
            return 0;
        }
        uint16 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint16 a, uint16 b) internal pure returns (uint16) {
        return a / b;
    }

    function sub(uint16 a, uint16 b) internal pure returns (uint16) {
        assert(b <= a);
        return a - b;
    }

    function add(uint16 a, uint16 b) internal pure returns (uint16) {
        uint16 c = a + b;
        assert(c >= a);
        return c;
    }

    function pow(uint16 a, uint16 b) internal pure returns (uint16) {
        if (a == 0) return 0;
        if (b == 0) return 1;

        uint16 c = a ** b;
        assert(c / (a ** (b - 1)) == a);
        return c;
    }
}

library SafeMath256 {

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }

    function pow(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        if (b == 0) return 1;

        uint256 c = a ** b;
        assert(c / (a ** (b - 1)) == a);
        return c;
    }
}

library SafeConvert {

    function toUint8(uint256 _value) internal pure returns (uint8) {
        assert(_value <= 255);
        return uint8(_value);
    }

    function toUint16(uint256 _value) internal pure returns (uint16) {
        assert(_value <= 2**16 - 1);
        return uint16(_value);
    }

    function toUint32(uint256 _value) internal pure returns (uint32) {
        assert(_value <= 2**32 - 1);
        return uint32(_value);
    }
}

contract Ownable {
    address public owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function _validateAddress(address _addr) internal pure {
        require(_addr != address(0), "invalid address");
    }

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

    modifier onlyOwner() {
        require(msg.sender == owner, "not a contract owner");
        _;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _validateAddress(newOwner);
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

}

contract Controllable is Ownable {
    mapping(address => bool) controllers;

    modifier onlyController {
        require(_isController(msg.sender), "no controller rights");
        _;
    }

    function _isController(address _controller) internal view returns (bool) {
        return controllers[_controller];
    }

    function _setControllers(address[] _controllers) internal {
        for (uint256 i = 0; i < _controllers.length; i++) {
            _validateAddress(_controllers[i]);
            controllers[_controllers[i]] = true;
        }
    }
}

contract Upgradable is Controllable {
    address[] internalDependencies;
    address[] externalDependencies;

    function getInternalDependencies() public view returns(address[]) {
        return internalDependencies;
    }

    function getExternalDependencies() public view returns(address[]) {
        return externalDependencies;
    }

    function setInternalDependencies(address[] _newDependencies) public onlyOwner {
        for (uint256 i = 0; i < _newDependencies.length; i++) {
            _validateAddress(_newDependencies[i]);
        }
        internalDependencies = _newDependencies;
    }

    function setExternalDependencies(address[] _newDependencies) public onlyOwner {
        externalDependencies = _newDependencies;
        _setControllers(_newDependencies);
    }
}

contract Getter {
    function getDragonParents(uint256) external view returns (uint256[2]) {}
}




//////////////CONTRACT//////////////




contract DragonUtils {
    using SafeMath8 for uint8;
    using SafeMath256 for uint256;

    using SafeConvert for uint256;


    function _getActiveGene(uint8[16] _gene) internal pure returns (uint8[3] gene) {
        uint8 _index = _getActiveGeneIndex(_gene); // find active gene
        for (uint8 i = 0; i < 3; i++) {
            gene[i] = _gene[i + (_index * 4)]; // get all data for this gene
        }
    }

    function _getActiveGeneIndex(uint8[16] _gene) internal pure returns (uint8) {
        return _gene[3] >= _gene[7] ? 0 : 1;
    }

    // returns 10 active genes (one for each part of the body) with the next structure:
    // each gene is an array of 3 elements:
    // 0 - type of dragon
    // 1 - gene type
    // 2 - gene level
    function _getActiveGenes(uint8[16][10] _genome) internal pure returns (uint8[30] genome) {
        uint8[3] memory _activeGene;
        for (uint8 i = 0; i < 10; i++) {
            _activeGene = _getActiveGene(_genome[i]);
            genome[i * 3] = _activeGene[0];
            genome[i * 3 + 1] = _activeGene[1];
            genome[i * 3 + 2] = _activeGene[2];
        }
    }

    function _getIndexAndFactor(uint8 _counter) internal pure returns (uint8 index, uint8 factor) {
        if (_counter < 44) index = 0;
        else if (_counter < 88) index = 1;
        else if (_counter < 132) index = 2;
        else index = 3;
        factor = _counter.add(1) % 4 == 0 ? 10 : 100;
    }

    function _parseGenome(uint256[4] _composed) internal pure returns (uint8[16][10] parsed) {
        uint8 counter = 160; // 40 genes with 4 values in each one
        uint8 _factor;
        uint8 _index;

        for (uint8 i = 0; i < 10; i++) {
            for (uint8 j = 0; j < 16; j++) {
                counter = counter.sub(1);
                // _index - index of value in genome array where current gene is stored
                // _factor - denominator that determines the number of digits
                (_index, _factor) = _getIndexAndFactor(counter);
                parsed[9 - i][15 - j] = (_composed[_index] % _factor).toUint8();
                _composed[_index] /= _factor;
            }
        }
    }

    function _composeGenome(uint8[16][10] _parsed) internal pure returns (uint256[4] composed) {
        uint8 counter = 0;
        uint8 _index;
        uint8 _factor;

        for (uint8 i = 0; i < 10; i++) {
            for (uint8 j = 0; j < 16; j++) {
                (_index, _factor) = _getIndexAndFactor(counter);
                composed[_index] = composed[_index].mul(_factor);
                composed[_index] = composed[_index].add(_parsed[i][j]);
                counter = counter.add(1);
            }
        }
    }
}

contract DragonGenetics is Upgradable, DragonUtils {
    using SafeMath16 for uint16;
    using SafeMath256 for uint256;

    Getter getter;

    uint8 constant MUTATION_CHANCE = 1; // 10%
    uint16[7] genesWeights = [300, 240, 220, 190, 25, 15, 10];

    // choose pair
    function _chooseGen(uint8 _random, uint8[16] _array1, uint8[16] _array2) internal pure returns (uint8[16] gen) {
        uint8 x = _random.div(2);
        uint8 y = _random % 2;
        for (uint8 j = 0; j < 2; j++) {
            for (uint8 k = 0; k < 4; k++) {
                gen[k.add(j.mul(8))] = _array1[k.add(j.mul(4)).add(x.mul(8))];
                gen[k.add(j.mul(2).add(1).mul(4))] = _array2[k.add(j.mul(4)).add(y.mul(8))];
            }
        }
    }

    function _getParents(uint256 _id) internal view returns (uint256[2]) {
        if (_id != 0) {
            return getter.getDragonParents(_id);
        }
        return [uint256(0), uint256(0)];
    }

    function _checkInbreeding(uint256[2] memory _parents) internal view returns (uint8 chance) {
        uint8 _relatives;
        uint8 i;
        uint256[2] memory _parents_1_1 = _getParents(_parents[0]);
        uint256[2] memory _parents_1_2 = _getParents(_parents[1]);
        // check grandparents
        if (_parents_1_1[0] != 0 && (_parents_1_1[0] == _parents_1_2[0] || _parents_1_1[0] == _parents_1_2[1])) {
            _relatives = _relatives.add(1);
        }
        if (_parents_1_1[1] != 0 && (_parents_1_1[1] == _parents_1_2[0] || _parents_1_1[1] == _parents_1_2[1])) {
            _relatives = _relatives.add(1);
        }
        // check parents and grandparents
        if (_parents[0] == _parents_1_2[0] || _parents[0] == _parents_1_2[1]) {
            _relatives = _relatives.add(1);
        }
        if (_parents[1] == _parents_1_1[0] || _parents[1] == _parents_1_1[1]) {
            _relatives = _relatives.add(1);
        }
        if (_relatives >= 2) return 8; // 80% chance of a bad mutation
        if (_relatives == 1) chance = 7; // 70% chance
        // check grandparents and great-grandparents
        uint256[12] memory _ancestors;
        uint256[2] memory _parents_2_1 = _getParents(_parents_1_1[0]);
        uint256[2] memory _parents_2_2 = _getParents(_parents_1_1[1]);
        uint256[2] memory _parents_2_3 = _getParents(_parents_1_2[0]);
        uint256[2] memory _parents_2_4 = _getParents(_parents_1_2[1]);
        for (i = 0; i < 2; i++) {
            _ancestors[i.mul(6).add(0)] = _parents_1_1[i];
            _ancestors[i.mul(6).add(1)] = _parents_1_2[i];
            _ancestors[i.mul(6).add(2)] = _parents_2_1[i];
            _ancestors[i.mul(6).add(3)] = _parents_2_2[i];
            _ancestors[i.mul(6).add(4)] = _parents_2_3[i];
            _ancestors[i.mul(6).add(5)] = _parents_2_4[i];
        }
        for (i = 0; i < 12; i++) {
            for (uint8 j = i.add(1); j < 12; j++) {
                if (_ancestors[i] != 0 && _ancestors[i] == _ancestors[j]) {
                    _relatives = _relatives.add(1);
                    _ancestors[j] = 0;
                }
                if (_relatives > 2 || (_relatives == 2 && chance == 0)) return 8; // 80% chance
            }
        }
        if (_relatives == 1 && chance == 0) return 5; // 50% chance
    }

    function _mutateGene(uint8[16] _gene, uint8 _genType) internal pure returns (uint8[16]) {
        uint8 _index = _getActiveGeneIndex(_gene);
        _gene[_index.mul(4).add(1)] = _genType; // new gene type
        _gene[_index.mul(4).add(2)] = 1; // reset level
        return _gene;
    }

    // select one of 16 variations
    function _calculateGen(
        uint8[16] _momGen,
        uint8[16] _dadGen,
        uint8 _random
    ) internal pure returns (uint8[16] gen) {
        if (_random < 4) {
            return _chooseGen(_random, _momGen, _momGen);
        } else if (_random < 8) {
            return _chooseGen(_random.sub(4), _momGen, _dadGen);
        } else if (_random < 12) {
            return _chooseGen(_random.sub(8), _dadGen, _dadGen);
        } else {
            return _chooseGen(_random.sub(12), _dadGen, _momGen);
        }
    }

    function _calculateGenome(
        uint8[16][10] memory _momGenome,
        uint8[16][10] memory _dadGenome,
        uint8 _uglinessChance,
        uint256 _seed_
    ) internal pure returns (uint8[16][10] genome) {
        uint256 _seed = _seed_;
        uint256 _random;
        uint8 _mutationChance = _uglinessChance == 0 ? MUTATION_CHANCE : _uglinessChance;
        uint8 _geneType;
        for (uint8 i = 0; i < 10; i++) {
            (_random, _seed) = _getSpecialRandom(_seed, 4);
            genome[i] = _calculateGen(_momGenome[i], _dadGenome[i], (_random % 16).toUint8());
            (_random, _seed) = _getSpecialRandom(_seed, 1);
            if (_random < _mutationChance) {
                _geneType = 0;
                if (_uglinessChance == 0) {
                    (_random, _seed) = _getSpecialRandom(_seed, 2);
                    _geneType = (_random % 9).add(1).toUint8(); // [1..9]
                }
                genome[i] = _mutateGene(genome[i], _geneType);
            }
        }
    }

    // 40 points in sum
    function _calculateDragonTypes(uint8[16][10] _genome) internal pure returns (uint8[11] dragonTypesArray) {
        uint8 _dragonType;
        for (uint8 i = 0; i < 10; i++) {
            for (uint8 j = 0; j < 4; j++) {
                _dragonType = _genome[i][j.mul(4)];
                dragonTypesArray[_dragonType] = dragonTypesArray[_dragonType].add(1);
            }
        }
    }

    function createGenome(
        uint256[2] _parents,
        uint256[4] _momGenome,
        uint256[4] _dadGenome,
        uint256 _seed
    ) external view returns (
        uint256[4] genome,
        uint8[11] dragonTypes
    ) {
        uint8 _uglinessChance = _checkInbreeding(_parents);
        uint8[16][10] memory _parsedGenome = _calculateGenome(
            _parseGenome(_momGenome),
            _parseGenome(_dadGenome),
            _uglinessChance,
            _seed
        );
        genome = _composeGenome(_parsedGenome);
        dragonTypes = _calculateDragonTypes(_parsedGenome);
    }

    function _getWeightedRandom(uint256 _random) internal view returns (uint8) {
        uint16 _weight;
        for (uint8 i = 1; i < 7; i++) {
            _weight = _weight.add(genesWeights[i.sub(1)]);
            if (_random < _weight) return i;
        }
        return 7;
    }

    function _generateGen(uint8 _dragonType, uint256 _random) internal view returns (uint8[16]) {
        uint8 _geneType = _getWeightedRandom(_random); // [1..7]
        return [
            _dragonType, _geneType, 1, 1,
            _dragonType, _geneType, 1, 0,
            _dragonType, _geneType, 1, 0,
            _dragonType, _geneType, 1, 0
        ];
    }

    // max 4 digits
    function _getSpecialRandom(
        uint256 _seed_,
        uint8 _digits
    ) internal pure returns (uint256, uint256) {
        uint256 _base = 10;
        uint256 _seed = _seed_;
        uint256 _random = _seed % _base.pow(_digits);
        _seed = _seed.div(_base.pow(_digits));
        return (_random, _seed);
    }

    function createGenomeForGenesis(uint8 _dragonType, uint256 _seed_) external view returns (uint256[4]) {
        uint256 _seed = _seed_;
        uint8[16][10] memory _genome;
        uint256 _random;
        for (uint8 i = 0; i < 10; i++) {
            (_random, _seed) = _getSpecialRandom(_seed, 3);
            _genome[i] = _generateGen(_dragonType, _random);
        }
        return _composeGenome(_genome);
    }

    function setInternalDependencies(address[] _newDependencies) public onlyOwner {
        super.setInternalDependencies(_newDependencies);

        getter = Getter(_newDependencies[0]);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_parents","type":"uint256[2]"},{"name":"_momGenome","type":"uint256[4]"},{"name":"_dadGenome","type":"uint256[4]"},{"name":"_seed","type":"uint256"}],"name":"createGenome","outputs":[{"name":"genome","type":"uint256[4]"},{"name":"dragonTypes","type":"uint8[11]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_dragonType","type":"uint8"},{"name":"_seed_","type":"uint256"}],"name":"createGenomeForGenesis","outputs":[{"name":"","type":"uint256[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDependencies","type":"address[]"}],"name":"setExternalDependencies","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newDependencies","type":"address[]"}],"name":"setInternalDependencies","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInternalDependencies","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getExternalDependencies","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405260e06040519081016040528061012c61ffff16815260200160f061ffff16815260200160dc61ffff16815260200160be61ffff168152602001601961ffff168152602001600f61ffff168152602001600a61ffff1681525060059060076200006e929190620000b5565b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200018d565b826007600f01601090048101928215620001465791602002820160005b838211156200011457835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620000d2565b8015620001445782816101000a81549061ffff021916905560020160208160010104928301926001030262000114565b505b50905062000155919062000159565b5090565b6200018a91905b808211156200018657600081816101000a81549061ffff02191690555060010162000160565b5090565b90565b6122f5806200019d6000396000f30060806040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806329e3ebe414610093578063574f00051461014957806365fc1253146101bf57806369c0ad93146102255780638da5cb5b1461028b578063b75c4f80146102e2578063e6458f6e1461034e578063f2fde38b146103ba575b600080fd5b34801561009f57600080fd5b506100dc600480360381019080806040019091929192908060800190919291929080608001909192919290803590602001909291905050506103fd565b6040518083600460200280838360005b838110156101075780820151818401526020810190506100ec565b5050505090500182600b60200280838360005b8381101561013557808201518184015260208101905061011a565b505050509050019250505060405180910390f35b34801561015557600080fd5b50610181600480360381019080803560ff169060200190929190803590602001909291905050506104d0565b6040518082600460200280838360005b838110156101ac578082015181840152602081019050610191565b5050505090500191505060405180910390f35b3480156101cb57600080fd5b5061022360048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610551565b005b34801561023157600080fd5b5061028960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610638565b005b34801561029757600080fd5b506102a0610761565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102ee57600080fd5b506102f7610786565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561033a57808201518184015260208101905061031f565b505050509050019250505060405180910390f35b34801561035a57600080fd5b50610363610814565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156103a657808201518184015260208101905061038b565b505050509050019250505060405180910390f35b3480156103c657600080fd5b506103fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108a2565b005b6104056120f8565b61040d61211b565b600061041761213f565b6104458860028060200260405190810160405280929190826002602002808284378201915050505050610a2d565b91506104ad61047888600480602002604051908101604052809291908260046020028082843782019150505050506110ee565b6104a688600480602002604051908101604052809291908260046020028082843782019150505050506110ee565b8488611208565b90506104b881611376565b93506104c3816114ad565b9250505094509492505050565b6104d86120f8565b60006104e261213f565b600080859350600090505b600a8160ff16101561053c5761050484600361158e565b809550819350505061051687836115fa565b838260ff16600a8110151561052757fe5b602002018190525080806001019150506104ed565b61054583611376565b94505050505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610615576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74206120636f6e7472616374206f776e657200000000000000000000000081525060200191505060405180910390fd5b806003908051906020019061062b92919061216e565b50610635816116d3565b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74206120636f6e7472616374206f776e657200000000000000000000000081525060200191505060405180910390fd5b61070581611781565b80600081518110151561071457fe5b90602001906020020151600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600280548060200260200160405190810160405280929190818152602001828054801561080a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116107c0575b5050505050905090565b6060600380548060200260200160405190810160405280929190818152602001828054801561089857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161084e575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610966576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74206120636f6e7472616374206f776e657200000000000000000000000081525060200191505060405180910390fd5b61096f8161189d565b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000610a3a6121f8565b610a426121f8565b610a4a61221a565b610a526121f8565b610a5a6121f8565b610a626121f8565b610a6a6121f8565b6000610a888c6000600281101515610a7e57fe5b6020020151611945565b9750610aa68c6001600281101515610a9c57fe5b6020020151611945565b96506000886000600281101515610ab957fe5b602002015114158015610b215750866000600281101515610ad657fe5b6020020151886000600281101515610aea57fe5b60200201511480610b205750866001600281101515610b0557fe5b6020020151886000600281101515610b1957fe5b6020020151145b5b15610b4057610b3d60018b60ff16611a4e90919063ffffffff16565b99505b6000886001600281101515610b5157fe5b602002015114158015610bb95750866000600281101515610b6e57fe5b6020020151886001600281101515610b8257fe5b60200201511480610bb85750866001600281101515610b9d57fe5b6020020151886001600281101515610bb157fe5b6020020151145b5b15610bd857610bd560018b60ff16611a4e90919063ffffffff16565b99505b866000600281101515610be757fe5b60200201518c6000600281101515610bfb57fe5b60200201511480610c315750866001600281101515610c1657fe5b60200201518c6000600281101515610c2a57fe5b6020020151145b15610c5057610c4d60018b60ff16611a4e90919063ffffffff16565b99505b876000600281101515610c5f57fe5b60200201518c6001600281101515610c7357fe5b60200201511480610ca95750876001600281101515610c8e57fe5b60200201518c6001600281101515610ca257fe5b6020020151145b15610cc857610cc560018b60ff16611a4e90919063ffffffff16565b99505b60028a60ff16101515610cde5760089a506110df565b60018a60ff161415610cef5760079a505b610d0b886000600281101515610d0157fe5b6020020151611945565b9450610d29886001600281101515610d1f57fe5b6020020151611945565b9350610d47876000600281101515610d3d57fe5b6020020151611945565b9250610d65876001600281101515610d5b57fe5b6020020151611945565b9150600098505b60028960ff161015610fad57878960ff16600281101515610d8957fe5b602002015186610dbc6000610dab60068e60ff16611a7290919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16600c81101515610dcb57fe5b602002018181525050868960ff16600281101515610de557fe5b602002015186610e186001610e0760068e60ff16611a7290919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16600c81101515610e2757fe5b602002018181525050848960ff16600281101515610e4157fe5b602002015186610e746002610e6360068e60ff16611a7290919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16600c81101515610e8357fe5b602002018181525050838960ff16600281101515610e9d57fe5b602002015186610ed06003610ebf60068e60ff16611a7290919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16600c81101515610edf57fe5b602002018181525050828960ff16600281101515610ef957fe5b602002015186610f2c6004610f1b60068e60ff16611a7290919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16600c81101515610f3b57fe5b602002018181525050818960ff16600281101515610f5557fe5b602002015186610f886005610f7760068e60ff16611a7290919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16600c81101515610f9757fe5b6020020181815250508880600101995050610d6c565b600098505b600c8960ff1610156110ba57610fd560018a60ff16611a4e90919063ffffffff16565b90505b600c8160ff1610156110ad576000868a60ff16600c81101515610ff757fe5b6020020151141580156110335750858160ff16600c8110151561101657fe5b6020020151868a60ff16600c8110151561102c57fe5b6020020151145b1561106e5761104f60018b60ff16611a4e90919063ffffffff16565b99506000868260ff16600c8110151561106457fe5b6020020181815250505b60028a60ff161180611092575060028a60ff16148015611091575060008b60ff16145b5b156110a05760089a506110df565b8080600101915050610fd8565b8880600101995050610fb2565b60018a60ff161480156110d0575060008b60ff16145b156110de5760059a506110df565b5b50505050505050505050919050565b6110f661213f565b600080600080600060a09450600091505b600a8260ff1610156111fe57600090505b60108160ff1610156111f15761113b60018660ff16611abc90919063ffffffff16565b945061114685611adb565b809550819450505061117a8460ff16888560ff1660048110151561116657fe5b602002015181151561117457fe5b06611b65565b868360090360ff16600a8110151561118e57fe5b602002015182600f0360ff166010811015156111a657fe5b602002019060ff16908160ff16815250508360ff16878460ff166004811015156111cc57fe5b602002018181518115156111dc57fe5b04915081815250508080600101915050611118565b8180600101925050611107565b5050505050919050565b61121061213f565b600080600080600086945060008860ff161461122c578761122f565b60015b9250600090505b600a8160ff1610156113695761124d85600461158e565b809650819550505061129e8a8260ff16600a8110151561126957fe5b60200201518a8360ff16600a8110151561127f57fe5b602002015161129960108881151561129357fe5b06611b65565b611b7c565b868260ff16600a811015156112af57fe5b60200201819052506112c285600161158e565b80965081955050508260ff1684101561135c576000915060008860ff161415611323576112f085600261158e565b809650819550505061132061131b600160098781151561130c57fe5b06611c3590919063ffffffff16565b611b65565b91505b611342868260ff16600a8110151561133757fe5b602002015183611c53565b868260ff16600a8110151561135357fe5b60200201819052505b8080600101915050611236565b5050505050949350505050565b61137e6120f8565b6000806000806000809450600091505b600a8260ff1610156114a357600090505b60108160ff161015611496576113b485611adb565b80945081955050506113e78360ff16878660ff166004811015156113d457fe5b6020020151611d1190919063ffffffff16565b868560ff166004811015156113f857fe5b602002018181525050611456878360ff16600a8110151561141557fe5b60200201518260ff1660108110151561142a57fe5b602002015160ff16878660ff1660048110151561144357fe5b6020020151611c3590919063ffffffff16565b868560ff1660048110151561146757fe5b60200201818152505061148760018660ff16611a4e90919063ffffffff16565b9450808060010191505061139f565b818060010192505061138e565b5050505050919050565b6114b561211b565b60008060008091505b600a8260ff16101561158657600090505b60048160ff16101561157957848260ff16600a811015156114ec57fe5b602002015161150860048360ff16611a7290919063ffffffff16565b60ff1660108110151561151757fe5b6020020151925061154a6001858560ff16600b8110151561153457fe5b602002015160ff16611a4e90919063ffffffff16565b848460ff16600b8110151561155b57fe5b602002019060ff16908160ff168152505080806001019150506114cf565b81806001019250506114be565b505050919050565b6000806000806000600a92508691506115b38660ff1684611d4c90919063ffffffff16565b828115156115bd57fe5b0690506115e86115d98760ff1685611d4c90919063ffffffff16565b83611d9e90919063ffffffff16565b91508082945094505050509250929050565b61160261223e565b600061160d83611db4565b9050610200604051908101604052808560ff1660ff1681526020018260ff1660ff168152602001600160ff168152602001600160ff1681526020018560ff1660ff1681526020018260ff1660ff168152602001600160ff168152602001600060ff1681526020018560ff1660ff1681526020018260ff1660ff168152602001600160ff168152602001600060ff1681526020018560ff1660ff1681526020018260ff1660ff168152602001600160ff168152602001600060ff1681525091505092915050565b60008090505b815181101561177d5761170282828151811015156116f357fe5b9060200190602002015161189d565b6001806000848481518110151561171557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806001019150506116d9565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611847576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74206120636f6e7472616374206f776e657200000000000000000000000081525060200191505060405180910390fd5b600090505b815181101561188257611875828281518110151561186657fe5b9060200190602002015161189d565b808060010191505061184c565b816002908051906020019061189892919061216e565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f696e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b50565b61194d6121f8565b600082141515611a2f57600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663515f1843836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506040805180830381600087803b1580156119e757600080fd5b505af11580156119fb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506040811015611a2057600080fd5b81019080919050509050611a49565b604080519081016040528060008152602001600081525090505b919050565b60008082840190508360ff168160ff1610151515611a6857fe5b8091505092915050565b60008060008460ff161415611a8a5760009150611ab5565b82840290508260ff168460ff168260ff16811515611aa457fe5b0460ff16141515611ab157fe5b8091505b5092915050565b60008260ff168260ff1611151515611ad057fe5b818303905092915050565b600080602c8360ff161015611af35760009150611b24565b60588360ff161015611b085760019150611b23565b60848360ff161015611b1d5760029150611b22565b600391505b5b5b60006004611b3f60018660ff16611a4e90919063ffffffff16565b60ff16811515611b4b57fe5b0660ff1614611b5b576064611b5e565b600a5b9050915091565b600060ff8211151515611b7457fe5b819050919050565b611b8461223e565b60048260ff161015611ba257611b9b828586611e51565b9050611c2e565b60088260ff161015611bd657611bcf611bc860048460ff16611abc90919063ffffffff16565b8585611e51565b9050611c2e565b600c8260ff161015611c0a57611c03611bfc60088460ff16611abc90919063ffffffff16565b8485611e51565b9050611c2e565b611c2b611c24600c8460ff16611abc90919063ffffffff16565b8486611e51565b90505b9392505050565b6000808284019050838110151515611c4957fe5b8091505092915050565b611c5b61223e565b6000611c668461206f565b90508284611c976001611c8660048660ff16611a7290919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16601081101515611ca657fe5b602002019060ff16908160ff1681525050600184611ce76002611cd660048660ff16611a7290919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16601081101515611cf657fe5b602002019060ff16908160ff16815250508391505092915050565b6000806000841415611d265760009150611d45565b8284029050828482811515611d3757fe5b04141515611d4157fe5b8091505b5092915050565b6000806000841415611d615760009150611d97565b6000831415611d735760019150611d97565b82840a90508360018403850a82811515611d8957fe5b04141515611d9357fe5b8091505b5092915050565b60008183811515611dab57fe5b04905092915050565b6000806000600190505b60078160ff161015611e4557611e226005611de660018460ff16611abc90919063ffffffff16565b60ff16600781101515611df557fe5b601091828204019190066002029054906101000a900461ffff168361ffff166120b690919063ffffffff16565b91508161ffff16841015611e3857809250611e4a565b8080600101915050611dbe565b600792505b5050919050565b611e5961223e565b600080600080611e7660028960ff166120dc90919063ffffffff16565b935060028860ff16811515611e8757fe5b069250600091505b60028260ff16101561206457600090505b60048160ff1610156120575786611f04611ec760088760ff16611a7290919063ffffffff16565b611ef3611ee160048760ff16611a7290919063ffffffff16565b8560ff16611a4e90919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16601081101515611f1357fe5b602002015185611f45611f3360088660ff16611a7290919063ffffffff16565b8460ff16611a4e90919063ffffffff16565b60ff16601081101515611f5457fe5b602002019060ff16908160ff168152505085611fbd611f8060088660ff16611a7290919063ffffffff16565b611fac611f9a60048760ff16611a7290919063ffffffff16565b8560ff16611a4e90919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16601081101515611fcc57fe5b60200201518561202a61201860046120076001611ff660028a60ff16611a7290919063ffffffff16565b60ff16611a4e90919063ffffffff16565b60ff16611a7290919063ffffffff16565b8460ff16611a4e90919063ffffffff16565b60ff1660108110151561203957fe5b602002019060ff16908160ff16815250508080600101915050611ea0565b8180600101925050611e8f565b505050509392505050565b600081600760108110151561208057fe5b602002015160ff1682600360108110151561209757fe5b602002015160ff1610156120ac5760016120af565b60005b9050919050565b60008082840190508361ffff168161ffff16101515156120d257fe5b8091505092915050565b60008160ff168360ff168115156120ef57fe5b04905092915050565b608060405190810160405280600490602082028038833980820191505090505090565b61016060405190810160405280600b90602082028038833980820191505090505090565b61140060405190810160405280600a905b612158612262565b8152602001906001900390816121505790505090565b8280548282559060005260206000209081019282156121e7579160200282015b828111156121e65782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061218e565b5b5090506121f49190612286565b5090565b6040805190810160405280600290602082028038833980820191505090505090565b61018060405190810160405280600c90602082028038833980820191505090505090565b61020060405190810160405280601090602082028038833980820191505090505090565b61020060405190810160405280601090602082028038833980820191505090505090565b6122c691905b808211156122c257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161228c565b5090565b905600a165627a7a72305820af6b427757548232cf809372b5d42285cbaa36261bf20a0f2a5239be94f547950029

Swarm Source

bzzr://af6b427757548232cf809372b5d42285cbaa36261bf20a0f2a5239be94f54795
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.