contract UnicornDividendToken is StandardToken, hasHolders {
    using SafeMath for uint256;

    string public constant name = "Unicorn Dividend Token";
    string public constant symbol = "UDT";
    // уменьшил до 3, т.к. при распределении выплат деление эфира в wei на количество токенов (10**deciamls) происходит с одинаковым количеством знаков
    // что в результате дает всегда 0, если пришло меньше 100 эфира
    uint8 public constant decimals = 3;
    uint256 public constant INITIAL_SUPPLY = 100  * (10 ** uint256(decimals));

    function UnicornDividendToken() public {
        totalSupply_ = INITIAL_SUPPLY;
        balances[msg.sender] = INITIAL_SUPPLY;
        _addHolder(msg.sender);
    }

    //проверяет, является ли адресс контрактом или аккаунтом
    function isAccount(address addr) private view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(addr) }
        return size == 0;
    }

    function _transfer(address _from, address _to, uint256 _value) internal returns (bool) {
        require(_to != address(0));
        require(_value <= balances[_from]);

        // SafeMath.sub will throw if there is not enough balance.
        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        // проверим, является ли владелец аккаунтом
        if (isAccount(_to)) {
            _addHolder(_to);
        }
        if (balances[_from] == 0) {
            _delHolder(_from);
        }
        Transfer(_from, _to, _value);
        return true;
    }

    function transfer(address _to, uint256 _value) public returns (bool) {
        return _transfer(msg.sender, _to, _value);
    }

    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_value <= allowed[_from][msg.sender]);
        _transfer(_from, _to, _value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        return true;
    }

}
function isAccount(address addr) private view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(addr) }
        return size == 0;
    }
//проверяет, является ли адресс контрактом или аккаунтом