Token blockimmo

 

Overview [ERC-20]

Max Total Supply:
1,000,000 IMMO

Holders:
19 (0.00%)

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Blockimmo is a blockchain powered platform, our ecosystem enables shared property investments and ownership.

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenizedProperty

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Multiple files format)

File 13 of 13: TokenizedProperty.sol
/**
 * Copyright (c) 2019 blockimmo AG [email protected]
 * No license
 */

pragma solidity 0.5.7;

import "./Ownable.sol";
import "./ERC20Detailed.sol";

import "./DividendDistributingToken.sol";

contract LandRegistryInterface {
  function getProperty(string memory _eGrid) public view returns (address property);
}

contract LandRegistryProxyInterface {
  function owner() public view returns (address);
  function landRegistry() public view returns (LandRegistryInterface);
}

contract WhitelistInterface {
  function checkRole(address _operator, string memory _permission) public view;
}

contract WhitelistProxyInterface {
  function whitelist() public view returns (WhitelistInterface);
}

/**
 * @title TokenizedProperty
 * @dev An asset-backed security token (a property as identified by its E-GRID (a UUID) in the (Swiss) land registry).
 *
 * Ownership of `this` must be transferred to `ShareholderDAO` before blockimmo will verify `this` as legitimate in `LandRegistry`.
 * Until verified legitimate, transferring tokens is not possible (locked).
 *
 * Tokens can be freely listed on exchanges (especially decentralized / 0x).
 *
 * `this.owner` can make two suggestions that blockimmo will always (try) to take: `setManagementCompany` and `untokenize`.
 * `this.owner` can also transfer or rescind ownership.
 * See `ShareholderDAO` documentation for more information...
 *
 * Our legal framework requires a `TokenizedProperty` must be possible to `untokenize`.
 * Un-tokenizing is also the first step to upgrading or an outright sale of `this`.
 *
 * For both:
 *   1. `owner` emits an `UntokenizeRequest`
 *   2. blockimmo removes `this` from the `LandRegistry`
 *
 * Upgrading:
 *   3. blockimmo migrates `this` to the new `TokenizedProperty` (ie perfectly preserving `this.balances`)
 *   4. blockimmo attaches `owner` to the property (1)
 *   5. blockimmo adds the property to `LandRegistry`
 *
 * Outright sale:
 *   3. blockimmo deploys a new `TokenizedProperty` and adds it to the `LandRegistry`
 *   4. blockimmo configures and deploys a `TokenSale` for the property with `TokenSale.wallet == address(this)`
 *      (raised Ether distributed to current token holders as a dividend payout)
 *        - if the sale is unsuccessful, the new property is removed from the `LandRegistry`, and `this` is added back
 */
contract TokenizedProperty is DividendDistributingToken, ERC20Detailed, Ownable {
  LandRegistryProxyInterface public registryProxy = LandRegistryProxyInterface(0xe72AD2A335AE18e6C7cdb6dAEB64b0330883CD56);  // 0x0f5Ea0A652E851678Ebf77B69484bFcD31F9459B;
  WhitelistProxyInterface public whitelistProxy = WhitelistProxyInterface(0x7223b032180CDb06Be7a3D634B1E10032111F367);  // 0xEC8bE1A5630364292E56D01129E8ee8A9578d7D8;

  uint256 public constant NUM_TOKENS = 1000000;

  modifier isValid() {
    LandRegistryInterface registry = LandRegistryInterface(registryProxy.landRegistry());
    require(registry.getProperty(name()) == address(this), "invalid TokenizedProperty");
    _;
  }

  modifier onlyBlockimmo() {
    require(msg.sender == blockimmo(), "onlyBlockimmo");
    _;
  }

  constructor(string memory _eGrid, string memory _grundstuck) public ERC20Detailed(_eGrid, _grundstuck, 18) {
    uint256 totalSupply = NUM_TOKENS.mul(uint256(10) ** decimals());
    _mint(msg.sender, totalSupply);

    _approve(address(this), blockimmo(), ~uint256(0));  // enable blockimmo to issue `unissued` tokens in the future
  }

  function blockimmo() public view returns (address) {
    return registryProxy.owner();
  }

  function burn(uint256 _value) public isValid {  // buyback
    creditAccount(msg.sender);
    _burn(msg.sender, _value);
  }

  function mint(address _to, uint256 _value) public isValid onlyBlockimmo returns (bool) {  // equity dilution
    creditAccount(_to);
    _mint(_to, _value);
    return true;
  }

  function _transfer(address _from, address _to, uint256 _value) internal isValid {
    whitelistProxy.whitelist().checkRole(_to, "authorized");

    creditAccount(_from);  // required for dividends...
    creditAccount(_to);

    super._transfer(_from, _to, _value);
  }
}

File 1 of 13: Address.sol
pragma solidity ^0.5.2;

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

File 2 of 13: DividendDistributingToken.sol
pragma solidity 0.5.7;

import "./SafeMath.sol";
import "./ERC20.sol";

import "./LoanEscrow.sol";

/**
 * @title DividendDistributingToken
 * @dev An ERC20-compliant token that distributes any Dai it receives to its token holders proportionate to their share.
 *
 * Implementation based on: https://blog.pennyether.com/posts/realtime-dividend-token.html#the-token
 *
 * The user is responsible for when they transact tokens (transacting before a dividend payout is probably not ideal).
 *
 * `TokenizedProperty` inherits from `this` and is the front-facing contract representing the rights / ownership to a property.
 *
 * NOTE: if the owner(s) of a `TokenizedProperty` wish to update `LoanEscrow` behavior (i.e. changing the ERC20 token funds are raised in, or changing loan behavior),
 * some options are: (a) `untokenize` and re-deploy the updated `TokenizedProperty`, or (b) deploy an independent contract acting as the updated dividend distribution vehicle.
 */
contract DividendDistributingToken is ERC20, LoanEscrow {
  using SafeMath for uint256;

  uint256 public constant POINTS_PER_DAI = uint256(10) ** 32;

  uint256 public pointsPerToken = 0;
  mapping(address => uint256) public credits;
  mapping(address => uint256) public lastPointsPerToken;

  event DividendsCollected(address indexed collector, uint256 amount);
  event DividendsDeposited(address indexed depositor, uint256 amount);

  function collectOwedDividends(address _account) public {
    creditAccount(_account);

    uint256 _dai = credits[_account].div(POINTS_PER_DAI);
    credits[_account] = 0;

    pull(_account, _dai, false);
    emit DividendsCollected(_account, _dai);
  }

  function depositDividends() public {  // dividends
    uint256 amount = dai.allowance(msg.sender, address(this));

    uint256 fee = amount.div(100);
    dai.safeTransferFrom(msg.sender, blockimmo(), fee);

    deposit(msg.sender, amount.sub(fee));

    // partially tokenized properties store the "non-tokenized" part in `this` contract, dividends not disrupted
    uint256 issued = totalSupply().sub(unissued());
    pointsPerToken = pointsPerToken.add(amount.sub(fee).mul(POINTS_PER_DAI).div(issued));

    emit DividendsDeposited(msg.sender, amount);
  }

  function unissued() public view returns (uint256) {
    return balanceOf(address(this));
  }

  function creditAccount(address _account) internal {
    uint256 amount = balanceOf(_account).mul(pointsPerToken.sub(lastPointsPerToken[_account]));

    uint256 _credits = credits[_account].add(amount);
    if (credits[_account] != _credits)
      credits[_account] = _credits;

    if (lastPointsPerToken[_account] != pointsPerToken)
      lastPointsPerToken[_account] = pointsPerToken;
  }
}

File 3 of 13: ERC20.sol
pragma solidity ^0.5.2;

import "./IERC20.sol";
import "./SafeMath.sol";

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://eips.ethereum.org/EIPS/eip-20
 * Originally based on code by FirstBlood:
 * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 *
 * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for
 * all accounts just by listening to said events. Note that this isn't required by the specification, and other
 * compliant implementations may not do it.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowed;

    uint256 private _totalSupply;

    /**
     * @dev Total number of tokens in existence
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner The address to query the balance of.
     * @return A uint256 representing the amount owned by the passed address.
     */
    function balanceOf(address owner) public view returns (uint256) {
        return _balances[owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowed[owner][spender];
    }

    /**
     * @dev Transfer token to a specified address
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     */
    function transfer(address to, uint256 value) public returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        _transfer(from, to, value);
        _approve(from, msg.sender, _allowed[from][msg.sender].sub(value));
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when _allowed[msg.sender][spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowed[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when _allowed[msg.sender][spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowed[msg.sender][spender].sub(subtractedValue));
        return true;
    }

    /**
     * @dev Transfer token for a specified addresses
     * @param from The address to transfer from.
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     */
    function _transfer(address from, address to, uint256 value) internal {
        require(to != address(0));

        _balances[from] = _balances[from].sub(value);
        _balances[to] = _balances[to].add(value);
        emit Transfer(from, to, value);
    }

    /**
     * @dev Internal function that mints an amount of the token and assigns it to
     * an account. This encapsulates the modification of balances such that the
     * proper events are emitted.
     * @param account The account that will receive the created tokens.
     * @param value The amount that will be created.
     */
    function _mint(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply.add(value);
        _balances[account] = _balances[account].add(value);
        emit Transfer(address(0), account, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account.
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function _burn(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Approve an address to spend another addresses' tokens.
     * @param owner The address that owns the tokens.
     * @param spender The address that will spend the tokens.
     * @param value The number of tokens that can be spent.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        require(spender != address(0));
        require(owner != address(0));

        _allowed[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account, deducting from the sender's allowance for said account. Uses the
     * internal burn function.
     * Emits an Approval event (reflecting the reduced allowance).
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function _burnFrom(address account, uint256 value) internal {
        _burn(account, value);
        _approve(account, msg.sender, _allowed[account][msg.sender].sub(value));
    }
}

File 4 of 13: ERC20Detailed.sol
pragma solidity ^0.5.2;

import "./IERC20.sol";

/**
 * @title ERC20Detailed token
 * @dev The decimals are only for visualization purposes.
 * All the operations are done using the smallest and indivisible token unit,
 * just as on Ethereum all the operations are done in wei.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @return the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @return the symbol of the token.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @return the number of decimals of the token.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

File 5 of 13: IERC20.sol
pragma solidity ^0.5.2;

/**
 * @title ERC20 interface
 * @dev see https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 6 of 13: LoanEscrow.sol
pragma solidity 0.5.7;

import "./Pausable.sol";
import "./SafeMath.sol";
import "./SafeERC20.sol";

contract MoneyMarketInterface {
  function getSupplyBalance(address account, address asset) public view returns (uint);
  function supply(address asset, uint amount) public returns (uint);
  function withdraw(address asset, uint requestedAmount) public returns (uint);
}

contract LoanEscrow is Pausable {
  using SafeERC20 for IERC20;
  using SafeMath for uint256;

  // configurable to any ERC20 (i.e. xCHF)
  IERC20 public dai = IERC20(0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359);  // 0x9Ad61E35f8309aF944136283157FABCc5AD371E5  // 0xB4272071eCAdd69d933AdcD19cA99fe80664fc08
  MoneyMarketInterface public moneyMarket = MoneyMarketInterface(0x3FDA67f7583380E67ef93072294a7fAc882FD7E7);  // 0x6732c278C58FC90542cce498981844A073D693d7

  event Deposited(address indexed from, uint256 daiAmount);
  event InterestWithdrawn(address indexed to, uint256 daiAmount);
  event Pulled(address indexed to, uint256 daiAmount);

  mapping(address => uint256) public deposits;
  mapping(address => uint256) public pulls;
  uint256 public deposited;
  uint256 public pulled;

  modifier onlyBlockimmo() {
    require(msg.sender == blockimmo(), "onlyBlockimmo");
    _;
  }

  function blockimmo() public view returns (address);

  function withdrawInterest() public onlyBlockimmo {
    uint256 amountInterest = moneyMarket.getSupplyBalance(address(this), address(dai)).add(dai.balanceOf(address(this))).add(pulled).sub(deposited);
    require(amountInterest > 0, "no interest");

    uint256 errorCode = (amountInterest > dai.balanceOf(address(this))) ? moneyMarket.withdraw(address(dai), amountInterest.sub(dai.balanceOf(address(this)))) : 0;
    require(errorCode == 0, "withdraw failed");

    dai.safeTransfer(msg.sender, amountInterest);
    emit InterestWithdrawn(msg.sender, amountInterest);
  }

  function withdrawMoneyMarket(uint256 _amountDai) public onlyBlockimmo {
    uint256 errorCode = moneyMarket.withdraw(address(dai), _amountDai);
    require(errorCode == 0, "withdraw failed");
  }

  function deposit(address _from, uint256 _amountDai) internal {
    require(_from != address(0) && _amountDai > 0, "invalid parameter(s)");

    dai.safeTransferFrom(msg.sender, address(this), _amountDai);

    if (!paused()) {
      dai.safeApprove(address(moneyMarket), _amountDai);

      uint256 errorCode = moneyMarket.supply(address(dai), _amountDai);
      require(errorCode == 0, "supply failed");
      require(dai.allowance(address(this), address(moneyMarket)) == 0, "allowance not fully consumed by moneyMarket");
    }

    deposits[_from] = deposits[_from].add(_amountDai);
    deposited = deposited.add(_amountDai);
    emit Deposited(_from, _amountDai);
  }

  function pull(address _to, uint256 _amountDai, bool _refund) internal {
    require(_to != address(0) && _amountDai > 0, "invalid parameter(s)");

    uint256 errorCode = (_amountDai > dai.balanceOf(address(this))) ? moneyMarket.withdraw(address(dai), _amountDai.sub(dai.balanceOf(address(this)))) : 0;
    require(errorCode == 0, "withdraw failed");

    if (_refund) {
      deposits[_to] = deposits[_to].sub(_amountDai);
      deposited = deposited.sub(_amountDai);
    } else {
      pulls[_to] = pulls[_to].add(_amountDai);
      pulled = pulled.add(_amountDai);
    }

    dai.safeTransfer(_to, _amountDai);
    emit Pulled(_to, _amountDai);
  }
}

File 7 of 13: Ownable.sol
pragma solidity ^0.5.2;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    /**
     * @return the address of the owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     * @notice Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 8 of 13: Pausable.sol
pragma solidity ^0.5.2;

import "./PauserRole.sol";

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is PauserRole {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () internal {
        _paused = false;
    }

    /**
     * @return true if the contract is paused, false otherwise.
     */
    function paused() public view returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier whenNotPaused() {
        require(!_paused);
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier whenPaused() {
        require(_paused);
        _;
    }

    /**
     * @dev called by the owner to pause, triggers stopped state
     */
    function pause() public onlyPauser whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     */
    function unpause() public onlyPauser whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

File 9 of 13: PauserRole.sol
pragma solidity ^0.5.2;

import "./Roles.sol";

contract PauserRole {
    using Roles for Roles.Role;

    event PauserAdded(address indexed account);
    event PauserRemoved(address indexed account);

    Roles.Role private _pausers;

    constructor () internal {
        _addPauser(msg.sender);
    }

    modifier onlyPauser() {
        require(isPauser(msg.sender));
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyPauser {
        _addPauser(account);
    }

    function renouncePauser() public {
        _removePauser(msg.sender);
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account);
    }
}

File 10 of 13: Roles.sol
pragma solidity ^0.5.2;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev give an account access to this role
     */
    function add(Role storage role, address account) internal {
        require(account != address(0));
        require(!has(role, account));

        role.bearer[account] = true;
    }

    /**
     * @dev remove an account's access to this role
     */
    function remove(Role storage role, address account) internal {
        require(account != address(0));
        require(has(role, account));

        role.bearer[account] = false;
    }

    /**
     * @dev check if an account has this role
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0));
        return role.bearer[account];
    }
}

File 11 of 13: SafeERC20.sol
pragma solidity ^0.5.2;

import "./IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require((value == 0) || (token.allowance(address(this), spender) == 0));
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must equal true).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.

        require(address(token).isContract());

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success);

        if (returndata.length > 0) { // Return data is optional
            require(abi.decode(returndata, (bool)));
        }
    }
}

File 12 of 13: SafeMath.sol
pragma solidity ^0.5.2;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"withdrawInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"registryProxy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"whitelistProxy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"NUM_TOKENS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"POINTS_PER_DAI","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pointsPerToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pulls","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amountDai","type":"uint256"}],"name":"withdrawMoneyMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"unissued","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"collectOwedDividends","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":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lastPointsPerToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"moneyMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"depositDividends","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"deposited","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pulled","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"blockimmo","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"},{"constant":true,"inputs":[],"name":"dai","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"deposits","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"credits","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_eGrid","type":"string"},{"name":"_grundstuck","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"collector","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DividendsCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"depositor","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DividendsDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"daiAmount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"daiAmount","type":"uint256"}],"name":"InterestWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"daiAmount","type":"uint256"}],"name":"Pulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

6080604052600480547489d24a6b4ccb1b6faa2625fe562bdd9a232603590061010060a860020a031990911617905560058054600160a060020a0319908116733fda67f7583380e67ef93072294a7fac882fd7e7179091556000600a5560108054821673e72ad2a335ae18e6c7cdb6daeb64b0330883cd5617905560118054909116737223b032180cdb06be7a3d634b1e10032111f367179055348015620000a657600080fd5b50604051620032183803806200321883398101806040526040811015620000cc57600080fd5b810190808051640100000000811115620000e557600080fd5b82016020810184811115620000f957600080fd5b81516401000000008111828201871017156200011457600080fd5b505092919060200180516401000000008111156200013157600080fd5b820160208101848111156200014557600080fd5b81516401000000008111828201871017156200016057600080fd5b5050929190505050818160126200018633620002a4640100000000026401000000009004565b6004805460ff191690558251620001a590600d906020860190620005af565b508151620001bb90600e906020850190620005af565b50600f805460ff191660ff929092169190911761010060a860020a0319166101003381029190911791829055604051600160a060020a0391909204169250600091507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360006200025a6200023b640100000000620002f6810204565b620f42409060ff16600a0a6401000000006200272f6200030082021704565b905062000271338264010000000062000334810204565b6200029b3062000289640100000000620003f1810204565b60001964010000000062000483810204565b50505062000651565b620002bf600382640100000000620029e66200050d82021704565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b600f5460ff165b90565b60008262000311575060006200032e565b828202828482816200031f57fe5b04146200032b57600080fd5b90505b92915050565b600160a060020a0382166200034857600080fd5b6002546200036590826401000000006200187a6200056682021704565b600255600160a060020a0382166000908152602081905260409020546200039b90826401000000006200187a6200056682021704565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b601054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691638da5cb5b916004808301926020929190829003018186803b1580156200045057600080fd5b505afa15801562000465573d6000803e3d6000fd5b505050506040513d60208110156200047c57600080fd5b5051905090565b600160a060020a0382166200049757600080fd5b600160a060020a038316620004ab57600080fd5b600160a060020a03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600160a060020a0381166200052157600080fd5b62000536828264010000000062000579810204565b156200054157600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b6000828201838110156200032b57600080fd5b6000600160a060020a0382166200058f57600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620005f257805160ff191683800117855562000622565b8280016001018555821562000622579182015b828111156200062257825182559160200191906001019062000605565b506200063092915062000634565b5090565b620002fd91905b808211156200063057600081556001016200063b565b612bb780620006616000396000f3fe608060405234801561001057600080fd5b50600436106102615760003560e060020a90048063812bb2a31161014a578063b53dfd4d116100c7578063ef8b71511161008b578063ef8b71511461063b578063f280d77b14610643578063f2fde38b1461064b578063f4b9fa7514610671578063fc7e286d14610679578063fe5ff4681461069f57610261565b8063b53dfd4d146105cf578063d6d75f51146105f5578063dd62ed3e146105fd578063defa92ee1461062b578063eef49ee31461063357610261565b80638da5cb5b1161010e5780638da5cb5b1461055f5780638f32d59b1461056757806395d89b411461056f578063a457c2d714610577578063a9059cbb146105a357610261565b8063812bb2a3146104e657806382dc1ec4146105035780638456cb591461052957806387b95404146105315780638c15f82c1461053957610261565b806340c10f19116101e35780634fcb6f3a116101a75780634fcb6f3a1461047a5780635c975abb14610482578063664c35ab1461048a5780636ef8d66d146104b057806370a08231146104b8578063715018a6146104de57610261565b806340c10f19146103fb5780634149db481461042757806342966c681461042f57806346fbf68e1461044c5780634c4295921461047257610261565b806323b872dd1161022a57806323b872dd1461036b57806327cdf22e146103a1578063313ce567146103a957806339509351146103c75780633f4ba83a146103f357610261565b806263750c1461026657806306fdde0314610270578063095ea7b3146102ed57806318160ddd1461032d578063218d984b14610347575b600080fd5b61026e6106c5565b005b610278610b5a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b257818101518382015260200161029a565b50505050905090810190601f1680156102df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103196004803603604081101561030357600080fd5b50600160a060020a038135169060200135610bf0565b604080519115158252519081900360200190f35b610335610c07565b60408051918252519081900360200190f35b61034f610c0d565b60408051600160a060020a039092168252519081900360200190f35b6103196004803603606081101561038157600080fd5b50600160a060020a03813581169160208101359091169060400135610c1c565b61034f610c73565b6103b1610c82565b6040805160ff9092168252519081900360200190f35b610319600480360360408110156103dd57600080fd5b50600160a060020a038135169060200135610c8b565b61026e610cc7565b6103196004803603604081101561041157600080fd5b50600160a060020a038135169060200135610d27565b610335610f67565b61026e6004803603602081101561044557600080fd5b5035610f6e565b6103196004803603602081101561046257600080fd5b5035600160a060020a031661114c565b61033561115f565b610335611171565b610319611177565b610335600480360360208110156104a057600080fd5b5035600160a060020a0316611180565b61026e611192565b610335600480360360208110156104ce57600080fd5b5035600160a060020a031661119d565b61026e6111b8565b61026e600480360360208110156104fc57600080fd5b5035611226565b61026e6004803603602081101561051957600080fd5b5035600160a060020a0316611395565b61026e6113b3565b610335611417565b61026e6004803603602081101561054f57600080fd5b5035600160a060020a0316611427565b61034f6114d5565b6103196114e9565b6102786114ff565b6103196004803603604081101561058d57600080fd5b50600160a060020a038135169060200135611560565b610319600480360360408110156105b957600080fd5b50600160a060020a03813516906020013561159c565b610335600480360360208110156105e557600080fd5b5035600160a060020a03166115a9565b61034f6115bb565b6103356004803603604081101561061357600080fd5b50600160a060020a03813581169160200135166115ca565b61026e6115f5565b61033561178d565b610335611793565b61034f611799565b61026e6004803603602081101561066157600080fd5b5035600160a060020a0316611828565b61034f611842565b6103356004803603602081101561068f57600080fd5b5035600160a060020a0316611856565b610335600480360360208110156106b557600080fd5b5035600160a060020a0316611868565b6106cd611799565b600160a060020a031633600160a060020a031614610735576040805160e560020a62461bcd02815260206004820152600d60248201527f6f6e6c79426c6f636b696d6d6f00000000000000000000000000000000000000604482015290519081900360640190fd5b60006108a560085461089960095461088d600460019054906101000a9004600160a060020a0316600160a060020a03166370a08231306040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a0316815260200191505060206040518083038186803b1580156107b457600080fd5b505afa1580156107c8573d6000803e3d6000fd5b505050506040513d60208110156107de57600080fd5b505160055460048054604080517fba3777310000000000000000000000000000000000000000000000000000000081523093810193909352600160a060020a03610100909204821660248401525192169163ba37773191604480820192602092909190829003018186803b15801561085557600080fd5b505afa158015610869573d6000803e3d6000fd5b505050506040513d602081101561087f57600080fd5b50519063ffffffff61187a16565b9063ffffffff61187a16565b9063ffffffff61189316565b9050600081116108ff576040805160e560020a62461bcd02815260206004820152600b60248201527f6e6f20696e746572657374000000000000000000000000000000000000000000604482015290519081900360640190fd5b600480546040805160e060020a6370a08231028152309381019390935251600092610100909204600160a060020a0316916370a08231916024808301926020929190829003018186803b15801561095557600080fd5b505afa158015610969573d6000803e3d6000fd5b505050506040513d602081101561097f57600080fd5b5051821161098e576000610aac565b600554600480546040805160e060020a6370a08231028152309381019390935251600160a060020a039384169363f3fef3a3936101009093041691610a2d9183916370a08231916024808301926020929190829003018186803b1580156109f457600080fd5b505afa158015610a08573d6000803e3d6000fd5b505050506040513d6020811015610a1e57600080fd5b5051869063ffffffff61189316565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a7f57600080fd5b505af1158015610a93573d6000803e3d6000fd5b505050506040513d6020811015610aa957600080fd5b50515b90508015610b04576040805160e560020a62461bcd02815260206004820152600f60248201527f7769746864726177206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b600454610b20906101009004600160a060020a031633846118a8565b60408051838152905133917f0fb2ffd41401cdebe76e1a7cdcaed20ad31cf8d215f8209b73ec00525cb8d686919081900360200190a25050565b600d8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be65780601f10610bbb57610100808354040283529160200191610be6565b820191906000526020600020905b815481529060010190602001808311610bc957829003601f168201915b5050505050905090565b6000610bfd33848461192d565b5060015b92915050565b60025490565b601054600160a060020a031681565b6000610c298484846119b5565b600160a060020a038416600090815260016020908152604080832033808552925290912054610c69918691610c64908663ffffffff61189316565b61192d565b5060019392505050565b601154600160a060020a031681565b600f5460ff1690565b336000818152600160209081526040808320600160a060020a03871684529091528120549091610bfd918590610c64908663ffffffff61187a16565b610cd03361114c565b610cd957600080fd5b60045460ff16610ce857600080fd5b6004805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b600080601060009054906101000a9004600160a060020a0316600160a060020a031663bd4dc0246040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610d7b57600080fd5b505afa158015610d8f573d6000803e3d6000fd5b505050506040513d6020811015610da557600080fd5b5051905030600160a060020a03821663ab331a34610dc1610b5a565b6040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610e10578181015183820152602001610df8565b50505050905090810190601f168015610e3d5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015610e5a57600080fd5b505afa158015610e6e573d6000803e3d6000fd5b505050506040513d6020811015610e8457600080fd5b5051600160a060020a031614610ee4576040805160e560020a62461bcd02815260206004820152601960248201527f696e76616c696420546f6b656e697a656450726f706572747900000000000000604482015290519081900360640190fd5b610eec611799565b600160a060020a031633600160a060020a031614610f54576040805160e560020a62461bcd02815260206004820152600d60248201527f6f6e6c79426c6f636b696d6d6f00000000000000000000000000000000000000604482015290519081900360640190fd5b610f5d84611ccb565b610c698484611db1565b620f424081565b601054604080517fbd4dc0240000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163bd4dc024916004808301926020929190829003018186803b158015610fcc57600080fd5b505afa158015610fe0573d6000803e3d6000fd5b505050506040513d6020811015610ff657600080fd5b5051905030600160a060020a03821663ab331a34611012610b5a565b6040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611061578181015183820152602001611049565b50505050905090810190601f16801561108e5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b1580156110ab57600080fd5b505afa1580156110bf573d6000803e3d6000fd5b505050506040513d60208110156110d557600080fd5b5051600160a060020a031614611135576040805160e560020a62461bcd02815260206004820152601960248201527f696e76616c696420546f6b656e697a656450726f706572747900000000000000604482015290519081900360640190fd5b61113e33611ccb565b6111483383611e59565b5050565b6000610c0160038363ffffffff611f0016565b6d04ee2d6d415b85acef810000000081565b600a5481565b60045460ff1690565b60076020526000908152604090205481565b61119b33611f35565b565b600160a060020a031660009081526020819052604090205490565b6111c06114e9565b6111c957600080fd5b600f546040516000916101009004600160a060020a0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600f805474ffffffffffffffffffffffffffffffffffffffff0019169055565b61122e611799565b600160a060020a031633600160a060020a031614611296576040805160e560020a62461bcd02815260206004820152600d60248201527f6f6e6c79426c6f636b696d6d6f00000000000000000000000000000000000000604482015290519081900360640190fd5b60055460048054604080517ff3fef3a3000000000000000000000000000000000000000000000000000000008152600160a060020a036101009093048316938101939093526024830185905251600093919091169163f3fef3a391604480830192602092919082900301818787803b15801561131157600080fd5b505af1158015611325573d6000803e3d6000fd5b505050506040513d602081101561133b57600080fd5b505190508015611148576040805160e560020a62461bcd02815260206004820152600f60248201527f7769746864726177206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b61139e3361114c565b6113a757600080fd5b6113b081611f7d565b50565b6113bc3361114c565b6113c557600080fd5b60045460ff16156113d557600080fd5b6004805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b60006114223061119d565b905090565b61143081611ccb565b600160a060020a0381166000908152600b6020526040812054611467906d04ee2d6d415b85acef810000000063ffffffff611fc516565b600160a060020a0383166000908152600b602052604081208190559091506114929083908390611fe7565b604080518281529051600160a060020a038416917f97e6e78d2df94abb37cadd04b8120a3ff229c90b3495b36dadc97ce7b49542c4919081900360200190a25050565b600f546101009004600160a060020a031690565b600f546101009004600160a060020a0316331490565b600e8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610be65780601f10610bbb57610100808354040283529160200191610be6565b336000818152600160209081526040808320600160a060020a03871684529091528120549091610bfd918590610c64908663ffffffff61189316565b6000610bfd3384846119b5565b600c6020526000908152604090205481565b600554600160a060020a031681565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b60048054604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152339381019390935230602484015251600092610100909204600160a060020a03169163dd62ed3e916044808301926020929190829003018186803b15801561166757600080fd5b505afa15801561167b573d6000803e3d6000fd5b505050506040513d602081101561169157600080fd5b5051905060006116a882606463ffffffff611fc516565b90506116cf336116b6611799565b6004546101009004600160a060020a0316919084612375565b6116e8336116e3848463ffffffff61189316565b6123fd565b60006116fd6116f5611417565b610899610c07565b905061174f611740826117346d04ee2d6d415b85acef8100000000611728888863ffffffff61189316565b9063ffffffff61272f16565b9063ffffffff611fc516565b600a549063ffffffff61187a16565b600a5560408051848152905133917f630819c75b5dd0ad6507f10e821c0d57f89fa4d9005de30999ec5380475c190e919081900360200190a2505050565b60085481565b60095481565b601054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691638da5cb5b916004808301926020929190829003018186803b1580156117f757600080fd5b505afa15801561180b573d6000803e3d6000fd5b505050506040513d602081101561182157600080fd5b5051905090565b6118306114e9565b61183957600080fd5b6113b081612756565b6004546101009004600160a060020a031681565b60066020526000908152604090205481565b600b6020526000908152604090205481565b60008282018381101561188c57600080fd5b9392505050565b6000828211156118a257600080fd5b50900390565b60408051600160a060020a038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526119289084906127dd565b505050565b600160a060020a03821661194057600080fd5b600160a060020a03831661195357600080fd5b600160a060020a03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b601054604080517fbd4dc0240000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163bd4dc024916004808301926020929190829003018186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d6020811015611a3d57600080fd5b5051905030600160a060020a03821663ab331a34611a59610b5a565b6040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611aa8578181015183820152602001611a90565b50505050905090810190601f168015611ad55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611af257600080fd5b505afa158015611b06573d6000803e3d6000fd5b505050506040513d6020811015611b1c57600080fd5b5051600160a060020a031614611b7c576040805160e560020a62461bcd02815260206004820152601960248201527f696e76616c696420546f6b656e697a656450726f706572747900000000000000604482015290519081900360640190fd5b601160009054906101000a9004600160a060020a0316600160a060020a03166393e59dc16040518163ffffffff1660e060020a02815260040160206040518083038186803b158015611bcd57600080fd5b505afa158015611be1573d6000803e3d6000fd5b505050506040513d6020811015611bf757600080fd5b5051604080517f0988ca8c000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015260248201839052600a60448301527f617574686f72697a656400000000000000000000000000000000000000000000606483015291519190921691630988ca8c916084808301926000929190829003018186803b158015611c9057600080fd5b505afa158015611ca4573d6000803e3d6000fd5b50505050611cb184611ccb565b611cba83611ccb565b611cc58484846128d3565b50505050565b600160a060020a0381166000908152600c6020526040812054600a54611d0491611cfb919063ffffffff61189316565b6117288461119d565b600160a060020a0383166000908152600b602052604081205491925090611d31908363ffffffff61187a16565b600160a060020a0384166000908152600b60205260409020549091508114611d6f57600160a060020a0383166000908152600b602052604090208190555b600a54600160a060020a0384166000908152600c60205260409020541461192857600a54600160a060020a0384166000908152600c6020526040902055505050565b600160a060020a038216611dc457600080fd5b600254611dd7908263ffffffff61187a16565b600255600160a060020a038216600090815260208190526040902054611e03908263ffffffff61187a16565b600160a060020a0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600160a060020a038216611e6c57600080fd5b600254611e7f908263ffffffff61189316565b600255600160a060020a038216600090815260208190526040902054611eab908263ffffffff61189316565b600160a060020a038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b6000600160a060020a038216611f1557600080fd5b50600160a060020a03166000908152602091909152604090205460ff1690565b611f4660038263ffffffff61299e16565b604051600160a060020a038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b611f8e60038263ffffffff6129e616565b604051600160a060020a038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6000808211611fd357600080fd5b6000828481611fde57fe5b04949350505050565b600160a060020a03831615801590611fff5750600082115b612053576040805160e560020a62461bcd02815260206004820152601460248201527f696e76616c696420706172616d65746572287329000000000000000000000000604482015290519081900360640190fd5b600480546040805160e060020a6370a08231028152309381019390935251600092610100909204600160a060020a0316916370a08231916024808301926020929190829003018186803b1580156120a957600080fd5b505afa1580156120bd573d6000803e3d6000fd5b505050506040513d60208110156120d357600080fd5b505183116120e2576000612200565b600554600480546040805160e060020a6370a08231028152309381019390935251600160a060020a039384169363f3fef3a39361010090930416916121819183916370a08231916024808301926020929190829003018186803b15801561214857600080fd5b505afa15801561215c573d6000803e3d6000fd5b505050506040513d602081101561217257600080fd5b5051879063ffffffff61189316565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156121d357600080fd5b505af11580156121e7573d6000803e3d6000fd5b505050506040513d60208110156121fd57600080fd5b50515b90508015612258576040805160e560020a62461bcd02815260206004820152600f60248201527f7769746864726177206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b81156122bb57600160a060020a038416600090815260066020526040902054612287908463ffffffff61189316565b600160a060020a0385166000908152600660205260409020556008546122b3908463ffffffff61189316565b600855612314565b600160a060020a0384166000908152600760205260409020546122e4908463ffffffff61187a16565b600160a060020a038516600090815260076020526040902055600954612310908463ffffffff61187a16565b6009555b600454612330906101009004600160a060020a031685856118a8565b604080518481529051600160a060020a038616917f8f6dc746d2ddfc02adada7fa1b00410b478496d5fed7a2b9020322b3959fe9ee919081900360200190a250505050565b60408051600160a060020a0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611cc59085906127dd565b600160a060020a038216158015906124155750600081115b612469576040805160e560020a62461bcd02815260206004820152601460248201527f696e76616c696420706172616d65746572287329000000000000000000000000604482015290519081900360640190fd5b600454612486906101009004600160a060020a0316333084612375565b61248e611177565b612694576005546004546124b491600160a060020a036101009092048216911683612a32565b60055460048054604080517ff2b9fdb8000000000000000000000000000000000000000000000000000000008152600160a060020a036101009093048316938101939093526024830185905251600093919091169163f2b9fdb891604480830192602092919082900301818787803b15801561252f57600080fd5b505af1158015612543573d6000803e3d6000fd5b505050506040513d602081101561255957600080fd5b5051905080156125b3576040805160e560020a62461bcd02815260206004820152600d60248201527f737570706c79206661696c656400000000000000000000000000000000000000604482015290519081900360640190fd5b60048054600554604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523094810194909452600160a060020a03918216602485015251610100909204169163dd62ed3e916044808301926020929190829003018186803b15801561262757600080fd5b505afa15801561263b573d6000803e3d6000fd5b505050506040513d602081101561265157600080fd5b5051156126925760405160e560020a62461bcd02815260040180806020018281038252602b815260200180612b61602b913960400191505060405180910390fd5b505b600160a060020a0382166000908152600660205260409020546126bd908263ffffffff61187a16565b600160a060020a0383166000908152600660205260409020556008546126e9908263ffffffff61187a16565b600855604080518281529051600160a060020a038416917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4919081900360200190a25050565b60008261273e57506000610c01565b8282028284828161274b57fe5b041461188c57600080fd5b600160a060020a03811661276957600080fd5b600f54604051600160a060020a0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600f8054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b6127ef82600160a060020a0316612b5a565b6127f857600080fd5b6000606083600160a060020a0316836040518082805190602001908083835b602083106128365780518252601f199092019160209182019101612817565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612898576040519150601f19603f3d011682016040523d82523d6000602084013e61289d565b606091505b5091509150816128ac57600080fd5b805115611cc5578080602001905160208110156128c857600080fd5b5051611cc557600080fd5b600160a060020a0382166128e657600080fd5b600160a060020a03831660009081526020819052604090205461290f908263ffffffff61189316565b600160a060020a038085166000908152602081905260408082209390935590841681522054612944908263ffffffff61187a16565b600160a060020a038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600160a060020a0381166129b157600080fd5b6129bb8282611f00565b6129c457600080fd5b600160a060020a0316600090815260209190915260409020805460ff19169055565b600160a060020a0381166129f957600080fd5b612a038282611f00565b15612a0d57600080fd5b600160a060020a0316600090815260209190915260409020805460ff19166001179055565b801580612ad15750604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612aa357600080fd5b505afa158015612ab7573d6000803e3d6000fd5b505050506040513d6020811015612acd57600080fd5b5051155b612ada57600080fd5b60408051600160a060020a038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526119289084906127dd565b3b15159056fe616c6c6f77616e6365206e6f742066756c6c7920636f6e73756d6564206279206d6f6e65794d61726b6574a165627a7a72305820b03fec26e1e52556c5975c211b85964ec329256867e672ba4802f54d98b305f00029000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009626c6f636b696d6d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004494d4d4f00000000000000000000000000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009626c6f636b696d6d6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004494d4d4f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _eGrid (string): blockimmo
Arg [1] : _grundstuck (string): IMMO

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 626c6f636b696d6d6f0000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 494d4d4f00000000000000000000000000000000000000000000000000000000


Swarm Source

bzzr://b03fec26e1e52556c5975c211b85964ec329256867e672ba4802f54d98b305f0

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.