ETH Price: $2,450.54 (-2.41%)

Contract

0x033B186321fA88603E3ecc98821FB0932B2c0760
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Burn187546742023-12-10 8:39:59328 days ago1702197599IN
0x033B1863...32B2c0760
0 ETH0.0007640225.57422389
Burn187546712023-12-10 8:39:23328 days ago1702197563IN
0x033B1863...32B2c0760
0 ETH0.0008486926.07904533
Mint180764452023-09-06 9:13:23423 days ago1693991603IN
0x033B1863...32B2c0760
0 ETH0.0004219211.37202055
Burn180762972023-09-06 8:43:47423 days ago1693989827IN
0x033B1863...32B2c0760
0 ETH0.0003775211.60505648
Burn180761662023-09-06 8:16:59423 days ago1693988219IN
0x033B1863...32B2c0760
0 ETH0.0003825411.75945918
Burn180761302023-09-06 8:09:47423 days ago1693987787IN
0x033B1863...32B2c0760
0 ETH0.0003564110.95615162
Burn180761052023-09-06 8:04:47423 days ago1693987487IN
0x033B1863...32B2c0760
0 ETH0.0003725711.4530305
Burn180761012023-09-06 8:03:59423 days ago1693987439IN
0x033B1863...32B2c0760
0 ETH0.0003612711.10571374
Burn180760822023-09-06 8:00:11423 days ago1693987211IN
0x033B1863...32B2c0760
0 ETH0.0004015712.3442975
Burn180759762023-09-06 7:38:47424 days ago1693985927IN
0x033B1863...32B2c0760
0 ETH0.0003685511.32925799
Burn180758572023-09-06 7:14:11424 days ago1693984451IN
0x033B1863...32B2c0760
0 ETH0.000367211.28776879
Burn180758082023-09-06 7:04:23424 days ago1693983863IN
0x033B1863...32B2c0760
0 ETH0.0003759711.55741874
Burn180758022023-09-06 7:03:11424 days ago1693983791IN
0x033B1863...32B2c0760
0 ETH0.0003667211.27314996
Burn180757902023-09-06 7:00:47424 days ago1693983647IN
0x033B1863...32B2c0760
0 ETH0.0003873611.90759208
Burn180757792023-09-06 6:58:35424 days ago1693983515IN
0x033B1863...32B2c0760
0 ETH0.0003891211.96154254
Burn180757362023-09-06 6:49:59424 days ago1693982999IN
0x033B1863...32B2c0760
0 ETH0.000375811.55234137
Burn180757192023-09-06 6:46:35424 days ago1693982795IN
0x033B1863...32B2c0760
0 ETH0.0003981412.23896306
Burn180757182023-09-06 6:46:23424 days ago1693982783IN
0x033B1863...32B2c0760
0 ETH0.0003738511.49240398
Burn180757012023-09-06 6:42:23424 days ago1693982543IN
0x033B1863...32B2c0760
0 ETH0.0003675511.29866621
Mint162773742022-12-27 16:48:11676 days ago1672159691IN
0x033B1863...32B2c0760
0 ETH0.0007035818.96348431
Burn162771412022-12-27 16:01:23676 days ago1672156883IN
0x033B1863...32B2c0760
0 ETH0.0005022215.43846878
Burn162771272022-12-27 15:58:35676 days ago1672156715IN
0x033B1863...32B2c0760
0 ETH0.0004321413.27917156
Burn162771252022-12-27 15:58:11676 days ago1672156691IN
0x033B1863...32B2c0760
0 ETH0.0004284713.1713555
Burn162771122022-12-27 15:55:35676 days ago1672156535IN
0x033B1863...32B2c0760
0 ETH0.000521516.02523096
Transfer161817272022-12-14 8:25:11689 days ago1671006311IN
0x033B1863...32B2c0760
0 ETH0.0007188214.21886439
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x273A160e...f65bf94cb
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
RealToken

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 11 runs

Other Settings:
byzantium EvmVersion
File 1 of 3 : RealToken.sol
pragma solidity ^0.5.0;

import '../node_modules/openzeppelin-solidity/contracts/math/SafeMath.sol';
import '../node_modules/openzeppelin-solidity/contracts/token/ERC20/IERC20.sol';

/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 *
 * Real Token Smart Contract Features.
 *
 * - Contract owner can transfer ownership to a different ethereun address.
 * - Contract owner can mint and burn tokens to and from an address.
 * - Contract owner can set addresses in the whitelist and remove from the whitelist.
 * - 3rd Party access to set allowances for transfer by token owner only if whitelisted and timelock cleared.
 * - Whitelisted investors who can transact with other investors who are whitelisted.
 * - Token Vesting. Investor purchase date must meet one year timestamp for token owner to allow transfer token(s).
 * - If an investor is cleared from (whitelist, timelock), investor can send tokens to whitelisted investor who is not vested.
 *
 * @author [email protected]
 */
contract RealToken is IERC20 {

  using SafeMath for uint256;

  string private _name;
  string private _symbol;
  uint8 private _decimals;
  uint8 public constant DECIMALS = 18;
  uint256 private _totalSupply;
  address private _owner;

  /**
   * @dev Investor Struct
   * - investor must be whitelisted to allow transfers
   * - investor timestamp must exceed one year from transfer date
   */
  struct Investor {
    // eth wallet address
    address wallet; 
    // whitelisted property
    bool whitelisted; 
    // flag indicating vesting period completed
    bool vested;  
    // timestamp for token release
    uint256 releaseTime;
    // unreleased tokens 
    uint256 unreleasedTokens;
    // vested tokens
    uint256 vestedTokens; 
  }
  /**
   * @dev Investors mapping contains all token holders info object.
   */
  mapping (address => Investor) private _investors;

  /**
   * @dev Balances for the token holders stored by wallet address.
   */
  mapping (address => uint256) private _balances;

  /**
   * @dev Allowances for 3rd Party transfers.
   */
  mapping (address => mapping (address => uint256)) private _allowances;

  /**
   * @dev Whitelist
   */
  mapping (address => bool) private _whitelist;

  /**
   * @dev Emitted when an investor is created.
   */
  event InvestorCreated(address investor, uint256 unreleasedTokens);

  /**
   * @dev Emitted when investor data is requested.
   */
  event InvestorRequested(address wallet, bool whitelisted, bool vested, uint256 releaseTime, uint256 unreleasedTokens, uint256 vestedTokens);

  /**
   * @dev Emitted when the investor has vested.
   */
  event InvestorVested(address investor, bool vested, uint256 vestedTokens);

  /**
   * @dev Emitted when the investor vestment releaseTime has been updated.
   */
  event InvestorVestmentUpdated(address investor, uint256 releaseTime);

  /**
   * @dev Emitted when the investor has had tokens revoked.
   */
  event InvestorRevoked(address investor, uint256 refundedTokens);

  /**
   * @dev Emitted when the investor has had a failed token release.
   */
  event InvestorFailedRelease(address investor, uint256 amount);

  /**
   * @dev Emitted when the investor has had tokens revoked.
   */
  event InvestorInsufficientBalance(address investor, uint256 balance, uint256 refund);

  /**
   * @dev Emitted when the investor is added to the whitelist.
   */
  event WhitelistStatus(address investor, bool whitelisted);

  /**
   * @dev Emitted when the investor is added to the whitelist.
   */
  event WhitelistAdded(address investor, bool whitelisted);

  /**
   * @dev Emitted when the investor is removed from the whitelist.
   */
  event WhitelistRemoved(address investor, bool whitelisted);

  /**
   * @dev Ownership transfer.
   */
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
   * these values are immutable: they can only be set once during
   * construction.
   */
  constructor (string memory name, string memory symbol, uint256 initialSupply) public {
    // set the smart contract properties
    _name = name;
    _symbol = symbol;
    _decimals = DECIMALS;
    // set the smart contract owner
    _owner = msg.sender;
    // mint the asset backed tokens
    uint256 calculatedSupply = initialSupply * (10 ** uint256(DECIMALS));
    _mint(_owner, calculatedSupply);
    // transfer ownership to contract owner
    emit OwnershipTransferred(address(0), _owner);
  }


  /**
   * @dev `RealToken`.
   */

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

  /**
   * @dev Returns the symbol of the token, usually a shorter version of the name.
   */
  function symbol() public view returns (string memory) {
    return _symbol;
  }

  /**
   * @dev Returns the number of decimals used to get its user representation.
   * For example, if `decimals` equals `2`, a balance of `505` tokens should
   * be displayed to a user as `5,05` (`505 / 10 ** 2`).
   *
   * Tokens usually opt for a value of 18, imitating the relationship between
   * Ether and Wei.
   *
   * > Note that this information is only used for _display_ purposes: it in
   * no way affects any of the arithmetic of the contract, including
   * `IERC20.balanceOf` and `IERC20.transfer`.
   */
  function decimals() public view returns (uint8) {
    return _decimals;
  }

  /**
   * @dev See `IERC20.totalSupply`.
   */
  function totalSupply() public view returns (uint256) {
    return _totalSupply;
  }

  /**
   * @dev See `IERC20.balanceOf`.
   */
  function balanceOf(address account) public view returns (uint256) {
    return _balances[account];
  }

  /**
   * @dev See `IERC20.transfer`.
   *
   * Requirements:
   *
   * - `recipient` must be whitelisted to allow transfer.
   * - `recipient` cannot be the zero address.
   * - the caller must have a balance of at least `amount`.
   */
  function transfer(address recipient, uint256 amount) public returns (bool) {
    if(isWhitelisted(recipient) != true) {
      return false;
    }
    if(isVested(recipient) != true) {
      return false;
    }
    _transfer(msg.sender, recipient, amount);
    return true;
  }

  /**
   * @dev See `IERC20.allowance`.
   */
  function allowance(address owner, address spender) public view returns (uint256) {
    return _allowances[owner][spender];
  }

  /**
   * @dev See `IERC20.approve`.
   *
   * Requirements:
   *
   * - `spender` cannot be the zero address.
   */
  function approve(address spender, uint256 value) public returns (bool) {
    _approve(msg.sender, spender, value);
    return true;
  }

  /**
   * @dev See `IERC20.transferFrom`.
   *
   * Emits an `Approval` event indicating the updated allowance. This is not
   * required by the EIP. See the note at the beginning of `ERC20`;
   *
   * Requirements:
   * - `sender` and `recipient` cannot be the zero address.
   * - `sender` must have a balance of at least `value`.
   * - the caller must have allowance for `sender`'s tokens of at least
   * `amount`.
   */
  function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
    // sender check
    if(isWhitelisted(sender) != true) {
      return false;
    }
    if(isVested(sender) != true) {
      return false;
    }
    // recipient check
    if(isWhitelisted(recipient) != true) {
      return false;
    }
    if(isVested(recipient) != true) {
      return false;
    }
    _transfer(sender, recipient, amount);
    _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
    return true;
  }

  /**
   * @dev Atomically increases the allowance granted to `spender` by the caller.
   *
   * This is an alternative to `approve` that can be used as a mitigation for
   * problems described in `IERC20.approve`.
   *
   * Emits an `Approval` event indicating the updated allowance.
   *
   * Requirements:
   *
   * - `spender` cannot be the zero address.
   */
  function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
    _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
    return true;
  }

  /**
   * @dev Atomically decreases the allowance granted to `spender` by the caller.
   *
   * This is an alternative to `approve` that can be used as a mitigation for
   * problems described in `IERC20.approve`.
   *
   * Emits an `Approval` event indicating the updated allowance.
   *
   * Requirements:
   *
   * - `spender` cannot be the zero address.
   * - `spender` must have allowance for the caller of at least
   * `subtractedValue`.
   */
  function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
    _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
    return true;
  }

  /**
   * @dev Moves tokens `amount` from `sender` to `recipient`.
   *
   * This is internal function is equivalent to `transfer`, and can be used to
   * e.g. implement automatic token fees, slashing mechanisms, etc.
   *
   * Emits a `Transfer` event.
   *
   * Requirements:
   *
   * - `sender` cannot be the zero address.
   * - `recipient` cannot be the zero address.
   * - `sender` must have a balance of at least `amount`.
   */
  function _transfer(address sender, address recipient, uint256 amount) internal {
    require(sender != address(0), "ERC20: transfer from the zero address");
    require(recipient != address(0), "ERC20: transfer to the zero address");

    bool senderWhitelisted = isWhitelisted(recipient);
    bool senderVested = isVested(recipient);

    // sender check
    require(senderWhitelisted == true, "RealToken: sender not whitelisted");
    require(senderVested == true, "RealToken: sender not vested");

    // recipient check
    bool recipientWhitelisted = isWhitelisted(recipient);
    bool recipientVested = isVested(recipient);

    require(recipientWhitelisted == true, "RealToken: recipient not whitelisted");
    require(recipientVested == true, "RealToken: recipient not vested");

    // apply transfer
    _balances[sender] = _balances[sender].sub(amount);
    _balances[recipient] = _balances[recipient].add(amount);
    emit Transfer(sender, recipient, amount);
  }

  /** 
   * @dev Creates `amount` tokens and assigns them to `account`, increasing the total supply.
   *
   * Emits a `Transfer` event with `from` set to the zero address.
   *
   * Requirements
   *
   * - `to` cannot be the zero address.
   */
  function _mint(address account, uint256 amount) internal {
    require(account != address(0), "ERC20: mint to the zero address");

    _totalSupply = _totalSupply.add(amount);
    _balances[account] = _balances[account].add(amount);
    emit Transfer(address(0), account, amount);
  }
  function mint(address account, uint256 amount) public onlyOwner returns (bool) {
    require(account != address(0), "ERC20: mint from the zero address");

    _mint(account, amount);
    return true;
  }

  /**
   * @dev Destoys `amount` tokens from `account`, reducing the
   * total supply.
   *
   * Emits a `Transfer` event with `to` set to the zero address.
   *
   * Requirements
   *
   * - `account` cannot be the zero address.
   * - `account` must have at least `amount` tokens.
   */
  function _burn(address account, uint256 value) internal {
    require(account != address(0), "ERC20: burn from the zero address");

    _totalSupply = _totalSupply.sub(value);
    _balances[account] = _balances[account].sub(value);
    emit Transfer(account, address(0), value);
  }
  /**
   * @dev Public `burn` method. 
   */
  function burn(address account, uint256 value) public onlyOwner returns (bool) {
    require(account != address(0), "ERC20: burn from the zero address");
    _burn(account, value);
    return true;
  }

  /**
   * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
   *
   * This is internal function is equivalent to `approve`, and can be used to
   * e.g. set automatic allowances for certain subsystems, etc.
   *
   * Emits an `Approval` event.
   *
   * Requirements:
   *
   * - `owner` cannot be the zero address.
   * - `spender` cannot be the zero address.
   */
  function _approve(address owner, address spender, uint256 value) internal {
    require(owner != address(0), "ERC20: approve from the zero address");
    require(spender != address(0), "ERC20: approve to the zero address");

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


  /**
   * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
   * from the caller's allowance.
   *
   * See `_burn` and `_approve`.
   */
  function _burnFrom(address account, uint256 amount) internal {
    _burn(account, amount);
    _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
  }
  /**
   * @dev Public `burnFrom` method. 
   */
  function burnFrom(address account, uint256 value) public onlyOwner returns (bool) {
    require(account != address(0), "ERC20: burnFrom from the zero address");
    _burnFrom(account, value);
    return true;
  }

  /**
   * Ownership
   */

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

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(isOwner(), "Ownable: caller is not the owner");
    _;
  }

  /**
   * @dev Returns true if the caller is the current owner.
   */
  function isOwner() public view returns (bool) {
    return msg.sender == _owner;
  }

  /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    _transferOwnership(newOwner);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   */
  function _transferOwnership(address newOwner) internal {
    require(newOwner != address(0), "Ownable: new owner is the zero address");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }

  /**
   * Whitelist
   */

  function isWhitelisted(address investor) public returns (bool) {
    require(investor != address(0), "RealToken: isWhitelisted from the zero address");

    // return whitelist status
    Investor memory inv = _investors[investor];
    bool status = inv.whitelisted;
    emit WhitelistStatus(investor, status);
    return status;
  }

  function addWhitelist(address investor) public onlyOwner returns (bool) {
    require(investor != address(0), "RealToken: addWhitelist from the zero address");

    Investor memory inv = _investors[investor];

    // set investor as whitelisted
    inv.whitelisted = true;

    // update investor
    _investors[investor] = inv;

    emit WhitelistAdded(investor, inv.whitelisted);
    return true;
  }

  function removeWhitelist(address investor) public onlyOwner returns (bool) {
    require(investor != address(0), "RealToken: removeWhitelist from the zero address");

    Investor memory inv = _investors[investor];

    // set investor to false in whitelist to remove
    inv.whitelisted = false;

    // update investor
    _investors[investor] = inv;

    emit WhitelistRemoved(investor, inv.whitelisted);
    return true;
  }

  /**
   * Investor
   */

  function createInvestor(address investor, bool _isWhitelisted, bool _vested, uint256 tokens) public onlyOwner returns (bool) {
    require(investor != address(0), "RealToken: createInvestor from the zero address");

    // calculate period based on vested flag
    uint256 vestingPeriod = block.timestamp; 
    uint256 unreleasedTokens = 0;
    uint256 vestedTokens = 0;
    if(_vested == false) {
      vestingPeriod = calculateVestingPeriod(); // calculate one year if not vested
      unreleasedTokens = tokens;
      vestedTokens = 0;
    } else {
      // incoming vested account all tokens released
      unreleasedTokens = 0;
      vestedTokens = tokens;
    }

    // create investor
    Investor memory inv = Investor({wallet:investor, whitelisted: _isWhitelisted, vested: _vested, releaseTime: vestingPeriod, unreleasedTokens: unreleasedTokens, vestedTokens: vestedTokens});
    // add to investors
    _investors[investor] = inv;
    // emit investor created 
    emit InvestorCreated(investor, tokens);
    // emit whitelist added
    emit WhitelistAdded(investor, _isWhitelisted);
    
    return true;
  }

  function getInvestor(address investor) public onlyOwner returns (bool) { 
    require(investor != address(0), "RealToken: getInvestor from the zero address");

    Investor memory inv = _investors[investor];

    require(inv.wallet != address(0));

    // emit requested investor data
    emit InvestorRequested(inv.wallet, inv.whitelisted, inv.vested, inv.releaseTime, inv.unreleasedTokens, inv.vestedTokens);
    return true;
  }

  function vestedTokenBalanceOf(address investor) public view returns(uint256) {
    require(investor != address(0), "RealToken: vestedTokenBalanceOf from the zero address");

    Investor memory inv = _investors[investor];

    require(inv.wallet != address(0));
    
    return inv.vestedTokens;
  }
  
  function unreleasedTokenBalanceOf(address investor) public view returns(uint256) {
    require(investor != address(0), "RealToken: unreleasedTokenBalanceOf from the zero address");

    Investor memory inv = _investors[investor];

    require(inv.wallet != address(0));

    return inv.unreleasedTokens;
  }
  

  /**
   * Bulk Investor Whitelist / Whitelist-Transfer
   * Bulk ERC20 token transfer to multiple addresses
   * Bulk Address Whitelisting
   */
  function whitelistTransfer(address investor, uint256 vestedTokens, uint256 tokens) public onlyOwner {
    require(createInvestor(investor, true, true, vestedTokens));
    require(transfer(investor, tokens));
  }

  /**
   * @dev Bulk whitelist a collection of investors
   */
  function bulkWhitelist(address[] memory investors, uint256[] memory tokens) public onlyOwner {
    for (uint256 i = 0; i < investors.length; i++)
      require(createInvestor(investors[i], true, true, tokens[i]));
  }

  /**
   * @dev Bulk whitelist transfer to a collection of recipients
   */
  function bulkWhitelistTransfer(address[] memory investors, uint256[] memory vestedTokens, uint256[] memory tokens) public onlyOwner {
    for (uint256 i = 0; i < investors.length; i++) {
      require(createInvestor(investors[i], true, true, vestedTokens[i]));// vested tokens
      require(transfer(investors[i], tokens[i]));  // paid tokens
    }
  }

  /**
   * Investor Vestments
   */

  /**
   * @dev Timelock
   * 
   * Time Units
   * Suffixes like seconds, minutes, hours, days and weeks after literal numbers can be used to specify units of time where seconds are the base unit and units are considered naively in the following way:
   * 1 == 1 seconds
   * 1 minutes == 60 seconds
   * 1 hours == 60 minutes
   * 1 days == 24 hours
   * 1 weeks == 7 days
   *
   * Take care if you perform calendar calculations using these units, 
   * because not every year equals 365 days and not even every day has 24 hours because of leap seconds. 
   * Due to the fact that leap seconds cannot be predicted, an exact calendar library has to be updated by an external oracle.
   */
  function calculateVestingPeriod() public view onlyOwner returns (uint256) {
    return (now + 365 days); // does not account for leap year or leap seconds, we may need to have oracle set time
  }

  /**
   * @dev Returns the timelock vested flag an investor address.
   */
  function isVested(address investor) public view returns (bool) {
    require(investor != address(0), "RealToken: isVested from the zero address");

    Investor memory inv = _investors[investor];

    require(inv.wallet != address(0));

    return inv.vested;
  }

  /**
   * @dev onlyOwner
   * @notice Set the investor timelock vested flag to true and timelock to now.
   */
  function setVested(address investor) public onlyOwner returns (bool) {
    require(investor != address(0), "RealToken: setVested from the zero address");

    Investor memory inv = _investors[investor];

    require(inv.wallet != address(0));

    // solhint-disable-next-line not-rely-on-time
    inv.releaseTime = now;  // now
    inv.vested = true;

    _investors[investor] = inv;

    emit InvestorVestmentUpdated(inv.wallet, inv.releaseTime);
    
    return inv.vested;
  }

  /**
   * @dev onlyOwner
   * @notice Transfers tokens held by timelock from unreleasedTokens to vestedTokens.
   * @param investor Address to release tokens from vestment.
   */
  function release(address investor, uint256 amount) public onlyOwner returns (bool) {
    require(investor != address(0), "RealToken: release from the zero address");
    assert(amount > 0);

    Investor memory inv = _investors[investor];

    require(inv.wallet != address(0));

    uint256 _releaseTime = inv.releaseTime;

    // solhint-disable-next-line not-rely-on-time
    require(block.timestamp >= _releaseTime, "RealToken: current time is before release time");

    // update vestment check
    if(isVested(investor) && isWhitelisted(investor)) {

      if(inv.unreleasedTokens >= amount) {
        inv.unreleasedTokens = inv.unreleasedTokens.sub(amount);
      }
      inv.vestedTokens = inv.vestedTokens.add(amount);
        
      // update 
      _investors[investor] = inv;

      emit InvestorVested(investor, inv.vested, inv.vestedTokens);
      return true;

    } else {
      // failed to release dispatch InvestorFailedRelease
      emit InvestorFailedRelease(investor, amount);
      return false;
    }

  }


  /**
   * @dev onlyOwner
   * @notice Allows the owner to revoke tokens from an investor account.
   * @param investor Ethereum address.
   * @param refund Amount of tokens to revoke from investor.
   */
  function revoke(address investor, uint256 refund) public onlyOwner returns (bool) {
    require(investor != address(0), "RealToken: revoke from the zero address");
    require(refund > 0, "RealToken: revoke with a zero refund");

    Investor memory inv = _investors[investor];

    require(inv.wallet != address(0));
    
    uint256 balance = balanceOf(investor);

    // check funds available for refund 
    assert(balance >= refund);
    
    // For revoke check unreleasedTokens, vestedTokens, current balance
    // (a) when we call revoke and not vested, take from unreleased tokens
    // (b) when we call revoke and is vested, take from vested tokens    
    // get refund and subtract from vested or unreleased tokens

    // check refunded availability 
    if(inv.vested == true) {

      // do we have enough vested tokens to provide a refund?
      // update internally 
      if(inv.vestedTokens >= refund) {
        // update vested token balances
        inv.vestedTokens = inv.vestedTokens.sub(refund);
      } else {
        // insufficient balance 
        emit InvestorInsufficientBalance(investor, balance, refund);
        return false;
      }

    } else {
            // do we have enough unreleased tokens to provide a refund?
      if(inv.unreleasedTokens >= refund) {
        // update unreleased token balances
        inv.unreleasedTokens = inv.unreleasedTokens.sub(refund);
      } else {
        // insufficient balance 
        emit InvestorInsufficientBalance(investor, balance, refund);
        return false;
      }

    }

    _investors[investor] = inv;

    // did we have enough tokens available to provide a refund
    // burn tokens from investor 
    _burn(investor, refund);
    // mint new token for the _owner
    _mint(_owner, refund); 
    // emit investor revoked
    emit InvestorRevoked(investor, refund);
    return true;

  }


}

File 2 of 3 : IERC20.sol
pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through `transferFrom`. This is
     * zero by default.
     *
     * This value changes when `approve` or `transferFrom` are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * > 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
     *
     * Emits an `Approval` event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to `approve`. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 3 of 3 : SafeMath.sol
pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot 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, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 11
  },
  "evmVersion": "byzantium",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"uint256","name":"unreleasedTokens","type":"uint256"}],"name":"InvestorCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"InvestorFailedRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refund","type":"uint256"}],"name":"InvestorInsufficientBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"whitelisted","type":"bool"},{"indexed":false,"internalType":"bool","name":"vested","type":"bool"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unreleasedTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestedTokens","type":"uint256"}],"name":"InvestorRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"uint256","name":"refundedTokens","type":"uint256"}],"name":"InvestorRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"bool","name":"vested","type":"bool"},{"indexed":false,"internalType":"uint256","name":"vestedTokens","type":"uint256"}],"name":"InvestorVested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"InvestorVestmentUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"WhitelistAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"WhitelistRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"investor","type":"address"},{"indexed":false,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"WhitelistStatus","type":"event"},{"constant":true,"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"addWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"investors","type":"address[]"},{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"bulkWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"investors","type":"address[]"},{"internalType":"uint256[]","name":"vestedTokens","type":"uint256[]"},{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"bulkWhitelistTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"calculateVestingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"bool","name":"_isWhitelisted","type":"bool"},{"internalType":"bool","name":"_vested","type":"bool"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"createInvestor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"getInvestor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"isVested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"release","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"removeWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint256","name":"refund","type":"uint256"}],"name":"revoke","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"setVested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"unreleasedTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"investor","type":"address"}],"name":"vestedTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investor","type":"address"},{"internalType":"uint256","name":"vestedTokens","type":"uint256"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"whitelistTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760e060020a60003504630357371d811461019357806306fdde03146101d3578063071c294b14610250578063095ea7b31461027657806318160ddd146102a25780631e60bd05146102bc57806323b872dd146102f85780632c426e491461032e5780632e0f2625146103545780632f34db6214610372578063313ce567146103a657806339509351146103ae5780633af32abf146103da57806340c10f19146104005780634b274f771461042c5780635b88d5111461043457806370a0823114610557578063760a2e8a1461057d57806378c8cda7146105a357806379cc6790146105c957806389a1fc84146105f55780638da5cb5b1461061b5780638f32d59b1461063f5780638f35a75e1461064757806395d89b411461066d5780639dc29fac14610675578063a457c2d7146106a1578063a9059cbb146106cd578063dd62ed3e146106f9578063eac449d914610727578063ec98fcd414610753578063f2fde38b146108f8578063f80f5dd51461091e575b600080fd5b6101bf600480360360408110156101a957600080fd5b50600160a060020a038135169060200135610944565b604080519115158252519081900360200190f35b6101db610c3a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102155781810151838201526020016101fd565b50505050905090810190601f1680156102425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101bf6004803603602081101561026657600080fd5b5035600160a060020a0316610cd0565b6101bf6004803603604081101561028c57600080fd5b50600160a060020a038135169060200135610eca565b6102aa610ee0565b60408051918252519081900360200190f35b6101bf600480360360808110156102d257600080fd5b50600160a060020a03813516906020810135151590604081013515159060600135610ee6565b6101bf6004803603606081101561030e57600080fd5b50600160a060020a038135811691602081013590911690604001356110d6565b6102aa6004803603602081101561034457600080fd5b5035600160a060020a0316611196565b61035c611271565b6040805160ff9092168252519081900360200190f35b6103a46004803603606081101561038857600080fd5b50600160a060020a038135169060208101359060400135611276565b005b61035c6112ee565b6101bf600480360360408110156103c457600080fd5b50600160a060020a0381351690602001356112f7565b6101bf600480360360208110156103f057600080fd5b5035600160a060020a0316611333565b6101bf6004803603604081101561041657600080fd5b50600160a060020a038135169060200135611433565b6102aa6114d1565b6103a46004803603604081101561044a57600080fd5b810190602081018135602060020a81111561046457600080fd5b82018360208201111561047657600080fd5b803590602001918460208302840111602060020a8311171561049757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050602060020a8111156104e657600080fd5b8201836020820111156104f857600080fd5b803590602001918460208302840111602060020a8311171561051957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611528945050505050565b6102aa6004803603602081101561056d57600080fd5b5035600160a060020a03166115c2565b6101bf6004803603602081101561059357600080fd5b5035600160a060020a03166115dd565b6101bf600480360360208110156105b957600080fd5b5035600160a060020a03166116b8565b6101bf600480360360408110156105df57600080fd5b50600160a060020a038135169060200135611930565b6102aa6004803603602081101561060b57600080fd5b5035600160a060020a03166119ce565b610623611aa9565b60408051600160a060020a039092168252519081900360200190f35b6101bf611ab8565b6101bf6004803603602081101561065d57600080fd5b5035600160a060020a0316611ac9565b6101db611c63565b6101bf6004803603604081101561068b57600080fd5b50600160a060020a038135169060200135611cc3565b6101bf600480360360408110156106b757600080fd5b50600160a060020a038135169060200135611d61565b6101bf600480360360408110156106e357600080fd5b50600160a060020a038135169060200135611d9d565b6102aa6004803603604081101561070f57600080fd5b50600160a060020a0381358116916020013516611dde565b6101bf6004803603604081101561073d57600080fd5b50600160a060020a038135169060200135611e09565b6103a46004803603606081101561076957600080fd5b810190602081018135602060020a81111561078357600080fd5b82018360208201111561079557600080fd5b803590602001918460208302840111602060020a831117156107b657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050602060020a81111561080557600080fd5b82018360208201111561081757600080fd5b803590602001918460208302840111602060020a8311171561083857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050602060020a81111561088757600080fd5b82018360208201111561089957600080fd5b803590602001918460208302840111602060020a831117156108ba57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061212f945050505050565b6103a46004803603602081101561090e57600080fd5b5035600160a060020a03166121fb565b6101bf6004803603602081101561093457600080fd5b5035600160a060020a0316612251565b600061094e611ab8565b610990576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a0383166109d85760405160e560020a62461bcd028152600401808060200182810382526028815260200180612eb16028913960400191505060405180910390fd5b600082116109e257fe5b6109ea612bae565b50600160a060020a03808416600090815260056020908152604091829020825160c081018452815494851680825260ff60a060020a8704811615159483019490945260a860020a909504909216151592820192909252600182015460608201526002820154608082015260039091015460a082015290610a6957600080fd5b606081015142811115610ab05760405160e560020a62461bcd02815260040180806020018281038252602e815260200180612efd602e913960400191505060405180910390fd5b610ab9856115dd565b8015610ac95750610ac985611333565b15610be95783826080015110610af4576080820151610aee908563ffffffff6124b716565b60808301525b60a0820151610b09908563ffffffff61251716565b60a08301908152600160a060020a0386811660008181526005602090815260409182902087518154838a0151858b0151600160a060020a0319909216929097169190911760a060020a60ff02191660a060020a961515969096029590951760a860020a60ff02191660a860020a951515958602178155606080890151600183015560808901516002830155955160039091018190558251938452908301939093528181019290925290517fe224e102057fd6d47cf21941ea20899b4309ccea82e35f312d81b71580ffc0c0929181900390910190a1600192505050610c34565b60408051600160a060020a03871681526020810186905281517f709814c7e39b7fcedda317fad7f30b01ac8e746e2f4c77fa35c41fc239cc8ad7929181900390910190a16000925050505b92915050565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cc65780601f10610c9b57610100808354040283529160200191610cc6565b820191906000526020600020905b815481529060010190602001808311610ca957829003601f168201915b5050505050905090565b6000610cda611ab8565b610d1c576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a038216610d645760405160e560020a62461bcd02815260040180806020018281038252602a815260200180612cde602a913960400191505060405180910390fd5b610d6c612bae565b50600160a060020a03808316600090815260056020908152604091829020825160c081018452815494851680825260ff60a060020a8704811615159483019490945260a860020a909504909216151592820192909252600182015460608201526002820154608082015260039091015460a082015290610deb57600080fd5b426060820190815260016040808401828152600160a060020a038781166000908152600560209081529084902087518154838a01519551600160a060020a03199091169190941690811760a060020a60ff02191660a060020a951515959095029490941760a860020a60ff02191660a860020a9315159390930292909217825594519381018490556080860151600282015560a086015160039091015581519081529283019190915280517f99d161e4d576d15e0b26dc5ba0321b61a4a1a6bbd4cda0a674e19e73884e38319281900390910190a16040015192915050565b6000610ed7338484612574565b50600192915050565b60035490565b6000610ef0611ab8565b610f32576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a038516610f7a5760405160e560020a62461bcd02815260040180806020018281038252602f815260200180612fcb602f913960400191505060405180910390fd5b4260008085610f9957610f8b6114d1565b925084915060009050610fa0565b5060009050835b610fa8612bae565b506040805160c081018252600160a060020a03808b168083528a151560208085019182528b1515858701908152606086018a8152608087018a815260a088018a81526000878152600586528a90208951815497519551151560a860020a0260a860020a60ff021996151560a060020a0260a060020a60ff021992909b16600160a060020a0319909916989098171698909817939093169490941786555160018601559151600285015590516003909301929092558351908152908101889052825191927f5e41cfbf9891dbcbdc5b83d2e4543379284685fd5116e361c237c6f69e747ceb92918290030190a160408051600160a060020a038b16815289151560208201528151600080516020612e4b833981519152929181900390910190a150600198975050505050505050565b60006110e184611333565b15156001146110f25750600061118f565b6110fb846115dd565b151560011461110c5750600061118f565b61111583611333565b15156001146111265750600061118f565b61112f836115dd565b15156001146111405750600061118f565b61114b848484612666565b600160a060020a03841660009081526007602090815260408083203380855292529091205461118b918691611186908663ffffffff6124b716565b612574565b5060015b9392505050565b6000600160a060020a0382166111e05760405160e560020a62461bcd028152600401808060200182810382526035815260200180612dad6035913960400191505060405180910390fd5b6111e8612bae565b50600160a060020a03808316600090815260056020908152604091829020825160c081018452815494851680825260ff60a060020a8704811615159483019490945260a860020a909504909216151592820192909252600182015460608201526002820154608082015260039091015460a08201529061126757600080fd5b60a0015192915050565b601281565b61127e611ab8565b6112c0576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b6112cd8360018085610ee6565b6112d657600080fd5b6112e08382611d9d565b6112e957600080fd5b505050565b60025460ff1690565b336000818152600760209081526040808320600160a060020a03871684529091528120549091610ed7918590611186908663ffffffff61251716565b6000600160a060020a03821661137d5760405160e560020a62461bcd02815260040180806020018281038252602e815260200180612f58602e913960400191505060405180910390fd5b611385612bae565b50600160a060020a03808316600081815260056020908152604091829020825160c0810184528154958616815260ff60a060020a87048116151582850181905260a860020a90970416151581850152600182015460608201526002820154608082015260039091015460a0820152825193845290830184905281519093927fcb3169c4c60f8a90f7ce39caf59c74a3bbe0b04a7684a8810f86ef8a1b8abef392908290030190a19392505050565b600061143d611ab8565b61147f576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a0383166114c75760405160e560020a62461bcd028152600401808060200182810382526021815260200180612d086021913960400191505060405180910390fd5b610ed78383612912565b60006114db611ab8565b61151d576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b506301e13380420190565b611530611ab8565b611572576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b60005b82518110156112e9576115b183828151811061158d57fe5b60200260200101516001808585815181106115a457fe5b6020026020010151610ee6565b6115ba57600080fd5b600101611575565b600160a060020a031660009081526006602052604090205490565b6000600160a060020a0382166116275760405160e560020a62461bcd028152600401808060200182810382526029815260200180612e026029913960400191505060405180910390fd5b61162f612bae565b50600160a060020a03808316600090815260056020908152604091829020825160c081018452815494851680825260ff60a060020a8704811615159483019490945260a860020a909504909216151592820192909252600182015460608201526002820154608082015260039091015460a0820152906116ae57600080fd5b6040015192915050565b60006116c2611ab8565b611704576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a03821661174c5760405160e560020a62461bcd028152600401808060200182810382526030815260200180612c3a6030913960400191505060405180910390fd5b611754612bae565b6005600084600160a060020a0316600160a060020a031681526020019081526020016000206040518060c00160405290816000820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020016000820160149054906101000a900460ff161515151581526020016000820160159054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152505090506000816020019015159081151581525050806005600085600160a060020a0316600160a060020a0316815260200190815260200160002060008201518160000160006101000a815481600160a060020a030219169083600160a060020a0316021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160000160156101000a81548160ff021916908315150217905550606082015181600101556080820151816002015560a082015181600301559050507fb88384a00aa53526c019bf48112fdf1063607ea33e42170680d26a7a6923d11d8382602001516040518083600160a060020a0316600160a060020a03168152602001821515151581526020019250505060405180910390a150600192915050565b600061193a611ab8565b61197c576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a0383166119c45760405160e560020a62461bcd028152600401808060200182810382526025815260200180612bf26025913960400191505060405180910390fd5b610ed783836129f5565b6000600160a060020a038216611a185760405160e560020a62461bcd028152600401808060200182810382526039815260200180612d506039913960400191505060405180910390fd5b611a20612bae565b50600160a060020a03808316600090815260056020908152604091829020825160c081018452815494851680825260ff60a060020a8704811615159483019490945260a860020a909504909216151592820192909252600182015460608201526002820154608082015260039091015460a082015290611a9f57600080fd5b6080015192915050565b600454600160a060020a031690565b600454600160a060020a0316331490565b6000611ad3611ab8565b611b15576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a038216611b5d5760405160e560020a62461bcd02815260040180806020018281038252602c815260200180612cb2602c913960400191505060405180910390fd5b611b65612bae565b50600160a060020a03808316600090815260056020908152604091829020825160c081018452815494851680825260ff60a060020a8704811615159483019490945260a860020a909504909216151592820192909252600182015460608201526002820154608082015260039091015460a082015290611be457600080fd5b805160208083015160408085015160608087015160808089015160a0808b01518751600160a060020a03909b168b52971515988a0198909852931515888601529187015285015291830152517f6178c7824483679abdb8b0de755fb4a4cdd892932e85926bcf6878ca00438f5d9181900360c00190a150600192915050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cc65780601f10610c9b57610100808354040283529160200191610cc6565b6000611ccd611ab8565b611d0f576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a038316611d575760405160e560020a62461bcd028152600401808060200182810382526021815260200180612e6b6021913960400191505060405180910390fd5b610ed78383612a3e565b336000818152600760209081526040808320600160a060020a03871684529091528120549091610ed7918590611186908663ffffffff6124b716565b6000611da883611333565b1515600114611db957506000610c34565b611dc2836115dd565b1515600114611dd357506000610c34565b610ed7338484612666565b600160a060020a03918216600090815260076020908152604080832093909416825291909152205490565b6000611e13611ab8565b611e55576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a038316611e9d5760405160e560020a62461bcd028152600401808060200182810382526027815260200180612d296027913960400191505060405180910390fd5b60008211611edf5760405160e560020a62461bcd028152600401808060200182810382526024815260200180612fa76024913960400191505060405180910390fd5b611ee7612bae565b50600160a060020a03808416600090815260056020908152604091829020825160c081018452815494851680825260ff60a060020a8704811615159483019490945260a860020a909504909216151592820192909252600182015460608201526002820154608082015260039091015460a082015290611f6657600080fd5b6000611f71856115c2565b905083811015611f7d57fe5b604082015115156001141561200f57838260a0015110611fb65760a0820151611fac908563ffffffff6124b716565b60a083015261200a565b60408051600160a060020a03871681526020810183905280820186905290517f5eecf953ea840bef46d48cd8f33c7a30729258ebd58713bc47344d22135bc49c9181900360600190a1600092505050610c34565b612035565b83826080015110611fb657608082015161202f908563ffffffff6124b716565b60808301525b600160a060020a03808616600090815260056020908152604091829020855181549287015193870151151560a860020a0260a860020a60ff021994151560a060020a0260a060020a60ff021992909616600160a060020a031990941693909317169390931791909116178155606083015160018201556080830151600282015560a08301516003909101556120ca8585612a3e565b6004546120e090600160a060020a031685612912565b60408051600160a060020a03871681526020810186905281517fd7a432b44f4c21e81c1b7df5b192e3f9e2da5beda8cd1f671cc825ee4d387bfd929181900390910190a1506001949350505050565b612137611ab8565b612179576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b60005b83518110156121f5576121ab84828151811061219457fe5b60200260200101516001808685815181106115a457fe5b6121b457600080fd5b6121e48482815181106121c357fe5b60200260200101518383815181106121d757fe5b6020026020010151611d9d565b6121ed57600080fd5b60010161217c565b50505050565b612203611ab8565b612245576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b61224e81612b0a565b50565b600061225b611ab8565b61229d576040805160e560020a62461bcd0281526020600482018190526024820152600080516020612de2833981519152604482015290519081900360640190fd5b600160a060020a0382166122e55760405160e560020a62461bcd02815260040180806020018281038252602d815260200180612f2b602d913960400191505060405180910390fd5b6122ed612bae565b6005600084600160a060020a0316600160a060020a031681526020019081526020016000206040518060c00160405290816000820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020016000820160149054906101000a900460ff161515151581526020016000820160159054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152505090506001816020019015159081151581525050806005600085600160a060020a0316600160a060020a0316815260200190815260200160002060008201518160000160006101000a815481600160a060020a030219169083600160a060020a0316021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160000160156101000a81548160ff021916908315150217905550606082015181600101556080820151816002015560a08201518160030155905050600080516020612e4b8339815191528382602001516040518083600160a060020a0316600160a060020a03168152602001821515151581526020019250505060405180910390a150600192915050565b600082821115612511576040805160e560020a62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561118f576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600160a060020a0383166125bc5760405160e560020a62461bcd028152600401808060200182810382526024815260200180612ed96024913960400191505060405180910390fd5b600160a060020a0382166126045760405160e560020a62461bcd028152600401808060200182810382526022815260200180612c906022913960400191505060405180910390fd5b600160a060020a03808416600081815260076020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600160a060020a0383166126ae5760405160e560020a62461bcd028152600401808060200182810382526025815260200180612e8c6025913960400191505060405180910390fd5b600160a060020a0382166126f65760405160e560020a62461bcd028152600401808060200182810382526023815260200180612c176023913960400191505060405180910390fd5b600061270183611333565b9050600061270e846115dd565b90506001821515146127545760405160e560020a62461bcd028152600401808060200182810382526021815260200180612f866021913960400191505060405180910390fd5b6001811515146127ae576040805160e560020a62461bcd02815260206004820152601c60248201527f5265616c546f6b656e3a2073656e646572206e6f742076657374656400000000604482015290519081900360640190fd5b60006127b985611333565b905060006127c6866115dd565b905060018215151461280c5760405160e560020a62461bcd028152600401808060200182810382526024815260200180612d896024913960400191505060405180910390fd5b600181151514612866576040805160e560020a62461bcd02815260206004820152601f60248201527f5265616c546f6b656e3a20726563697069656e74206e6f742076657374656400604482015290519081900360640190fd5b600160a060020a03871660009081526006602052604090205461288f908663ffffffff6124b716565b600160a060020a0380891660009081526006602052604080822093909355908816815220546128c4908663ffffffff61251716565b600160a060020a0380881660008181526006602090815260409182902094909455805189815290519193928b1692600080516020612e2b83398151915292918290030190a350505050505050565b600160a060020a038216612970576040805160e560020a62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600354612983908263ffffffff61251716565b600355600160a060020a0382166000908152600660205260409020546129af908263ffffffff61251716565b600160a060020a0383166000818152600660209081526040808320949094558351858152935192939192600080516020612e2b8339815191529281900390910190a35050565b6129ff8282612a3e565b600160a060020a038216600090815260076020908152604080832033808552925290912054612a3a918491611186908563ffffffff6124b716565b5050565b600160a060020a038216612a865760405160e560020a62461bcd028152600401808060200182810382526021815260200180612e6b6021913960400191505060405180910390fd5b600354612a99908263ffffffff6124b716565b600355600160a060020a038216600090815260066020526040902054612ac5908263ffffffff6124b716565b600160a060020a038316600081815260066020908152604080832094909455835185815293519193600080516020612e2b833981519152929081900390910190a35050565b600160a060020a038116612b525760405160e560020a62461bcd028152600401808060200182810382526026815260200180612c6a6026913960400191505060405180910390fd5b600454604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360048054600160a060020a031916600160a060020a0392909216919091179055565b6040518060c001604052806000600160a060020a03168152602001600015158152602001600015158152602001600081526020016000815260200160008152509056fe45524332303a206275726e46726f6d2066726f6d20746865207a65726f206164647265737345524332303a207472616e7366657220746f20746865207a65726f20616464726573735265616c546f6b656e3a2072656d6f766557686974656c6973742066726f6d20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735265616c546f6b656e3a20676574496e766573746f722066726f6d20746865207a65726f20616464726573735265616c546f6b656e3a207365745665737465642066726f6d20746865207a65726f206164647265737345524332303a206d696e742066726f6d20746865207a65726f20616464726573735265616c546f6b656e3a207265766f6b652066726f6d20746865207a65726f20616464726573735265616c546f6b656e3a20756e72656c6561736564546f6b656e42616c616e63654f662066726f6d20746865207a65726f20616464726573735265616c546f6b656e3a20726563697069656e74206e6f742077686974656c69737465645265616c546f6b656e3a20766573746564546f6b656e42616c616e63654f662066726f6d20746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725265616c546f6b656e3a2069735665737465642066726f6d20746865207a65726f2061646472657373ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2bbb16ff85c602404a1b34adbc6ed0d773b2a13ff86b91bc4670ac961e88b1845524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573735265616c546f6b656e3a2072656c656173652066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735265616c546f6b656e3a2063757272656e742074696d65206973206265666f72652072656c656173652074696d655265616c546f6b656e3a2061646457686974656c6973742066726f6d20746865207a65726f20616464726573735265616c546f6b656e3a20697357686974656c69737465642066726f6d20746865207a65726f20616464726573735265616c546f6b656e3a2073656e646572206e6f742077686974656c69737465645265616c546f6b656e3a207265766f6b6520776974682061207a65726f20726566756e645265616c546f6b656e3a20637265617465496e766573746f722066726f6d20746865207a65726f2061646472657373a265627a7a7231582007ab7f56d48540ec856ba235b739054ab289c3e22c21b75526feef30a0f4f16b64736f6c63430005110032

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.