Contract Overview
Balance: 0 Ether
Transactions: 19 txns
 Latest 19 txns

TxHash Age From To Value [TxFee]
0xaadd41c8f46e0e3d66b19ad48e39f6c5caf89ddf5f3040f28bad0e02c26367f63 days 22 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.00030577
0xe60a78bf725610cbc58c02b7c302202556951e60819e7d087230ba2149f487b14 days 11 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.000102425
0xf4edb77e27c12d2ca9151ae0a6f5043f93f9913beee861c7a488acc13e8b79d45 days 1 hr ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.000310627
0x55fa59ed23c50009b4a7e9e2e87ad0a9b3cd931263e0f0b35d351eea25f303b15 days 21 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.000102425
0x6ed885191071198960c7c9d70f6aa211ece8d0c076d0c80edff9d844918d7f8d5 days 22 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.00030577
0x9b08bfba9aa5364be59bcf8880841f170dae93d843cf2aa8b3eb0e4d73ed46f06 days 17 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.00010265
0x0dae09374328ed600a1f631175dbd9c754e6028aa001b4af6940b4e7bc91b7146 days 18 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.00010265
0xf15f3b8048e06164f74540a3784c7901c1ff8762437e137db23c2376f28280e96 days 18 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.00010265
0xd965e3ccb57161f6a6a16122ad8517d80c02d76394d6e4604311b57111b5248a6 days 18 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.00010265
0x09fb7aa53ad25314beadfb930145e265e026725f8149e75a8ff5704919dca4806 days 19 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.000083052
0x78b4e7b27d38c15a5a3c343f83f04db527dc4d55f5fbce5bfb799f575c76220c6 days 19 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.000083052
0x773f6d1cd766c4d634a61d659b4a5fb792b93e4976a2385d2a941d09b764acb46 days 19 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.000083052
0x9ec4a7de92ba9d92942d709601d92308ba30061f5c7f10b851a242cbf5ba74f06 days 19 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.000083052
0xc8ee7831e092acf5bef09af01c8fbbe3203711710f78ec768c1e1ab0ab0c64336 days 19 hrs ago0xe8575e787e28bcb0ee3046605f795bf883e82e84  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.000433941
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f56757 days 6 hrs ago0x3caac75eaf3860ed355ca260b01b396985a40a70  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.2892854
0x4691032893a3f75c7979f3dacb93a9f9a599e4b1281fc0a35aae0c09bd5073617 days 6 hrs ago0x3caac75eaf3860ed355ca260b01b396985a40a70  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.294316
0x965d6aa2afc1dc00064758782a27ee719999f46416c7c81fbf53a843c5c7dec27 days 6 hrs ago0x3caac75eaf3860ed355ca260b01b396985a40a70  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.0044888
0x6ba4c26070d018862156370e33ba5b2eab201578275e8065c2dc96acfc679ec77 days 6 hrs ago0x3caac75eaf3860ed355ca260b01b396985a40a70  IN   0x05a9ffb5657f8dc5a718485324d17b16fd52a6190 Ether0.0045261
0x81fd64c9d5590955dc0ca031b3b7961e7a0f7aac4b502d7cd5020ed958cd9f007 days 6 hrs ago0x3caac75eaf3860ed355ca260b01b396985a40a70  IN    Contract Creation0 Ether0.1397345
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0xaadd41c8f46e0e3d66b19ad48e39f6c5caf89ddf5f3040f28bad0e02c26367f648308023 days 22 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xf4edb77e27c12d2ca9151ae0a6f5043f93f9913beee861c7a488acc13e8b79d448246645 days 1 hr ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0x6ed885191071198960c7c9d70f6aa211ece8d0c076d0c80edff9d844918d7f8d48206185 days 22 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xc8ee7831e092acf5bef09af01c8fbbe3203711710f78ec768c1e1ab0ab0c643348130546 days 19 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
0xcdcd71f6895058d0195d51c67ff5c1bd850908f2eb7e9d79452b8909e56f567548100437 days 6 hrs ago0x05a9ffb5657f8dc5a718485324d17b16fd52a6190xde34dacbc68155187cc83f0bdc8d9ff528ad8c100 Ether
[ Download CSV Export  ] 
Contract Source Code Verified (Exact Match)
Contract Name: RevenueTokenManager
Compiler Text: v0.4.25+commit.59dbf8f1
Optimization Enabled: Yes
Runs (Optimiser):  0



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.13;

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];
  }
}

contract MinterRole {
  using Roles for Roles.Role;

  event MinterAdded(address indexed account);
  event MinterRemoved(address indexed account);

  Roles.Role private minters;

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

  modifier onlyMinter() {
    require(isMinter(msg.sender));
    _;
  }

  function isMinter(address account) public view returns (bool) {
    return minters.has(account);
  }

  function addMinter(address account) public onlyMinter {
    _addMinter(account);
  }

  function renounceMinter() public {
    _removeMinter(msg.sender);
  }

  function _addMinter(address account) internal {
    minters.add(account);
    emit MinterAdded(account);
  }

  function _removeMinter(address account) internal {
    minters.remove(account);
    emit MinterRemoved(account);
  }
}

library SafeMath {

  /**
  * @dev Multiplies two numbers, 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 numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0); // Solidity only automatically asserts when dividing by 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 numbers, 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 numbers, 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 numbers 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;
  }
}

interface IERC20 {
  function totalSupply() external view returns (uint256);

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

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

  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);

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

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

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 An 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 for 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) {
    require(spender != address(0));

    _allowed[msg.sender][spender] = value;
    emit Approval(msg.sender, spender, value);
    return true;
  }

  /**
   * @dev Transfer tokens from one address to another
   * @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)
  {
    require(value <= _allowed[from][msg.sender]);

    _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
    _transfer(from, to, value);
    return true;
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed_[_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
   * @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)
  {
    require(spender != address(0));

    _allowed[msg.sender][spender] = (
      _allowed[msg.sender][spender].add(addedValue));
    emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed_[_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
   * @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)
  {
    require(spender != address(0));

    _allowed[msg.sender][spender] = (
      _allowed[msg.sender][spender].sub(subtractedValue));
    emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
    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(value <= _balances[from]);
    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 != 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 != 0);
    require(value <= _balances[account]);

    _totalSupply = _totalSupply.sub(value);
    _balances[account] = _balances[account].sub(value);
    emit Transfer(account, address(0), 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.
   * @param account The account whose tokens will be burnt.
   * @param value The amount that will be burnt.
   */
  function _burnFrom(address account, uint256 value) internal {
    require(value <= _allowed[account][msg.sender]);

    // Should https://github.com/OpenZeppelin/zeppelin-solidity/issues/707 be accepted,
    // this function needs to emit an event with the updated approval.
    _allowed[account][msg.sender] = _allowed[account][msg.sender].sub(
      value);
    _burn(account, value);
  }
}

contract ERC20Mintable is ERC20, MinterRole {
  /**
   * @dev Function to mint tokens
   * @param to The address that will receive the minted tokens.
   * @param value The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(
    address to,
    uint256 value
  )
    public
    onlyMinter
    returns (bool)
  {
    _mint(to, value);
    return true;
  }
}

library SafeERC20 {

  using SafeMath for uint256;

  function safeTransfer(
    IERC20 token,
    address to,
    uint256 value
  )
    internal
  {
    require(token.transfer(to, value));
  }

  function safeTransferFrom(
    IERC20 token,
    address from,
    address to,
    uint256 value
  )
    internal
  {
    require(token.transferFrom(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(msg.sender, spender) == 0));
    require(token.approve(spender, value));
  }

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

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

contract Modifiable {
    //
    // Modifiers
    // -----------------------------------------------------------------------------------------------------------------
    modifier notNullAddress(address _address) {
        require(_address != address(0));
        _;
    }

    modifier notThisAddress(address _address) {
        require(_address != address(this));
        _;
    }

    modifier notNullOrThisAddress(address _address) {
        require(_address != address(0));
        require(_address != address(this));
        _;
    }

    modifier notSameAddresses(address _address1, address _address2) {
        if (_address1 != _address2)
            _;
    }
}

contract RevenueToken is ERC20Mintable {
    using SafeMath for uint256;

    bool public mintingDisabled;

    address[] public holders;

    mapping(address => bool) public holdersMap;

    mapping(address => uint256[]) public balances;

    mapping(address => uint256[]) public balanceBlocks;

    mapping(address => uint256[]) public balanceBlockNumbers;

    event DisableMinting();

    /**
     * @notice Disable further minting
     * @dev This operation can not be undone
     */
    function disableMinting()
    public
    onlyMinter
    {
        mintingDisabled = true;

        emit DisableMinting();
    }

    /**
     * @notice Mint tokens
     * @param to The address that will receive the minted tokens.
     * @param value The amount of tokens to mint.
     * @return A boolean that indicates if the operation was successful.
     */
    function mint(address to, uint256 value)
    public
    onlyMinter
    returns (bool)
    {
        require(!mintingDisabled);

        // Call super's mint, including event emission
        bool minted = super.mint(to, value);

        if (minted) {
            // Adjust balance blocks
            addBalanceBlocks(to);

            // Add to the token holders list
            if (!holdersMap[to]) {
                holdersMap[to] = true;
                holders.push(to);
            }
        }

        return minted;
    }

    /**
     * @notice Transfer token for a specified address
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     * @return A boolean that indicates if the operation was successful.
     */
    function transfer(address to, uint256 value)
    public
    returns (bool)
    {
        // Call super's transfer, including event emission
        bool transferred = super.transfer(to, value);

        if (transferred) {
            // Adjust balance blocks
            addBalanceBlocks(msg.sender);
            addBalanceBlocks(to);

            // Add to the token holders list
            if (!holdersMap[to]) {
                holdersMap[to] = true;
                holders.push(to);
            }
        }

        return transferred;
    }

    /**
     * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * @dev Beware that to change the approve amount you first have to reduce the addresses'
     * allowance to zero by calling `approve(spender, 0)` if it is not already 0 to mitigate the race
     * condition described here:
     * 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)
    {
        // Prevent the update of non-zero allowance
        require(0 == value || 0 == allowance(msg.sender, spender));

        // Call super's approve, including event emission
        return super.approve(spender, value);
    }

    /**
     * @dev Transfer tokens from one address to another
     * @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
     * @return A boolean that indicates if the operation was successful.
     */
    function transferFrom(address from, address to, uint256 value)
    public
    returns (bool)
    {
        // Call super's transferFrom, including event emission
        bool transferred = super.transferFrom(from, to, value);

        if (transferred) {
            // Adjust balance blocks
            addBalanceBlocks(from);
            addBalanceBlocks(to);

            // Add to the token holders list
            if (!holdersMap[to]) {
                holdersMap[to] = true;
                holders.push(to);
            }
        }

        return transferred;
    }

    /**
     * @notice Calculate the amount of balance blocks, i.e. the area under the curve (AUC) of
     * balance as function of block number
     * @dev The AUC is used as weight for the share of revenue that a token holder may claim
     * @param account The account address for which calculation is done
     * @param startBlock The start block number considered
     * @param endBlock The end block number considered
     * @return The calculated AUC
     */
    function balanceBlocksIn(address account, uint256 startBlock, uint256 endBlock)
    public
    view
    returns (uint256)
    {
        require(startBlock < endBlock);
        require(account != address(0));

        if (balanceBlockNumbers[account].length == 0 || endBlock < balanceBlockNumbers[account][0])
            return 0;

        uint256 i = 0;
        while (i < balanceBlockNumbers[account].length && balanceBlockNumbers[account][i] < startBlock)
            i++;

        uint256 r;
        if (i >= balanceBlockNumbers[account].length)
            r = balances[account][balanceBlockNumbers[account].length - 1].mul(endBlock.sub(startBlock));

        else {
            uint256 l = (i == 0) ? startBlock : balanceBlockNumbers[account][i - 1];

            uint256 h = balanceBlockNumbers[account][i];
            if (h > endBlock)
                h = endBlock;

            h = h.sub(startBlock);
            r = (h == 0) ? 0 : balanceBlocks[account][i].mul(h).div(balanceBlockNumbers[account][i].sub(l));
            i++;

            while (i < balanceBlockNumbers[account].length && balanceBlockNumbers[account][i] < endBlock) {
                r = r.add(balanceBlocks[account][i]);
                i++;
            }

            if (i >= balanceBlockNumbers[account].length)
                r = r.add(
                    balances[account][balanceBlockNumbers[account].length - 1].mul(
                        endBlock.sub(balanceBlockNumbers[account][balanceBlockNumbers[account].length - 1])
                    )
                );

            else if (balanceBlockNumbers[account][i - 1] < endBlock)
                r = r.add(
                    balanceBlocks[account][i].mul(
                        endBlock.sub(balanceBlockNumbers[account][i - 1])
                    ).div(
                        balanceBlockNumbers[account][i].sub(balanceBlockNumbers[account][i - 1])
                    )
                );
        }

        return r;
    }

    /**
     * @notice Get the count of balance updates for the given account
     * @return The count of balance updates
     */
    function balanceUpdatesCount(address account)
    public
    view
    returns (uint256)
    {
        return balanceBlocks[account].length;
    }

    /**
     * @notice Get the count of holders
     * @return The count of holders
     */
    function holdersCount()
    public
    view
    returns (uint256)
    {
        return holders.length;
    }

    /**
     * @notice Get the subset of holders (optionally with positive balance only) in the given 0 based index range
     * @param low The lower inclusive index
     * @param up The upper inclusive index
     * @param posOnly List only positive balance holders
     * @return The subset of positive balance registered holders in the given range
     */
    function holdersByIndices(uint256 low, uint256 up, bool posOnly)
    public
    view
    returns (address[])
    {
        require(low <= up);

        up = up > holders.length - 1 ? holders.length - 1 : up;

        uint256 length = 0;
        if (posOnly) {
            for (uint256 i = low; i <= up; i++)
                if (0 < balanceOf(holders[i]))
                    length++;
        } else
            length = up - low + 1;

        address[] memory _holders = new address[](length);

        uint256 j = 0;
        for (i = low; i <= up; i++)
            if (!posOnly || 0 < balanceOf(holders[i]))
                _holders[j++] = holders[i];

        return _holders;
    }

    function addBalanceBlocks(address account)
    private
    {
        uint256 length = balanceBlockNumbers[account].length;
        balances[account].push(balanceOf(account));
        if (0 < length)
            balanceBlocks[account].push(
                balances[account][length - 1].mul(
                    block.number.sub(balanceBlockNumbers[account][length - 1])
                )
            );
        else
            balanceBlocks[account].push(0);
        balanceBlockNumbers[account].push(block.number);
    }
}

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

    function div(uint256 a, uint256 b)
    internal
    pure
    returns (uint256)
    {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

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

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

    //
    //Clamping functions.
    //
    function clamp(uint256 a, uint256 min, uint256 max)
    public
    pure
    returns (uint256)
    {
        return (a > max) ? max : ((a < min) ? min : a);
    }

    function clampMin(uint256 a, uint256 min)
    public
    pure
    returns (uint256)
    {
        return (a < min) ? min : a;
    }

    function clampMax(uint256 a, uint256 max)
    public
    pure
    returns (uint256)
    {
        return (a > max) ? max : a;
    }
}

contract SelfDestructible {
    //
    // Variables
    // -----------------------------------------------------------------------------------------------------------------
    bool public selfDestructionDisabled;

    //
    // Events
    // -----------------------------------------------------------------------------------------------------------------
    event SelfDestructionDisabledEvent(address wallet);
    event TriggerSelfDestructionEvent(address wallet);

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    /// @notice Get the address of the destructor role
    function destructor()
    public
    view
    returns (address);

    /// @notice Disable self-destruction of this contract
    /// @dev This operation can not be undone
    function disableSelfDestruction()
    public
    {
        // Require that sender is the assigned destructor
        require(destructor() == msg.sender);

        // Disable self-destruction
        selfDestructionDisabled = true;

        // Emit event
        emit SelfDestructionDisabledEvent(msg.sender);
    }

    /// @notice Destroy this contract
    function triggerSelfDestruction()
    public
    {
        // Require that sender is the assigned destructor
        require(destructor() == msg.sender);

        // Require that self-destruction has not been disabled
        require(!selfDestructionDisabled);

        // Emit event
        emit TriggerSelfDestructionEvent(msg.sender);

        // Self-destruct and reward destructor
        selfdestruct(msg.sender);
    }
}

contract Ownable is Modifiable, SelfDestructible {
    //
    // Variables
    // -----------------------------------------------------------------------------------------------------------------
    address public deployer;
    address public operator;

    //
    // Events
    // -----------------------------------------------------------------------------------------------------------------
    event SetDeployerEvent(address oldDeployer, address newDeployer);
    event SetOperatorEvent(address oldOperator, address newOperator);

    //
    // Constructor
    // -----------------------------------------------------------------------------------------------------------------
    constructor(address _deployer) internal notNullOrThisAddress(_deployer) {
        deployer = _deployer;
        operator = _deployer;
    }

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    /// @notice Return the address that is able to initiate self-destruction
    function destructor()
    public
    view
    returns (address)
    {
        return deployer;
    }

    /// @notice Set the deployer of this contract
    /// @param newDeployer The address of the new deployer
    function setDeployer(address newDeployer)
    public
    onlyDeployer
    notNullOrThisAddress(newDeployer)
    {
        if (newDeployer != deployer) {
            // Set new deployer
            address oldDeployer = deployer;
            deployer = newDeployer;

            // Emit event
            emit SetDeployerEvent(oldDeployer, newDeployer);
        }
    }

    /// @notice Set the operator of this contract
    /// @param newOperator The address of the new operator
    function setOperator(address newOperator)
    public
    onlyOperator
    notNullOrThisAddress(newOperator)
    {
        if (newOperator != operator) {
            // Set new operator
            address oldOperator = operator;
            operator = newOperator;

            // Emit event
            emit SetOperatorEvent(oldOperator, newOperator);
        }
    }

    /// @notice Gauge whether message sender is deployer or not
    /// @return true if msg.sender is deployer, else false
    function isDeployer()
    internal
    view
    returns (bool)
    {
        return msg.sender == deployer;
    }

    /// @notice Gauge whether message sender is operator or not
    /// @return true if msg.sender is operator, else false
    function isOperator()
    internal
    view
    returns (bool)
    {
        return msg.sender == operator;
    }

    /// @notice Gauge whether message sender is operator or deployer on the one hand, or none of these on these on
    /// on the other hand
    /// @return true if msg.sender is operator, else false
    function isDeployerOrOperator()
    internal
    view
    returns (bool)
    {
        return isDeployer() || isOperator();
    }

    // Modifiers
    // -----------------------------------------------------------------------------------------------------------------
    modifier onlyDeployer() {
        require(isDeployer());
        _;
    }

    modifier notDeployer() {
        require(!isDeployer());
        _;
    }

    modifier onlyOperator() {
        require(isOperator());
        _;
    }

    modifier notOperator() {
        require(!isOperator());
        _;
    }

    modifier onlyDeployerOrOperator() {
        require(isDeployerOrOperator());
        _;
    }

    modifier notDeployerOrOperator() {
        require(!isDeployerOrOperator());
        _;
    }
}

contract TokenMultiTimelock is Ownable {
    using SafeERC20 for IERC20;

    //
    // Structures
    // -----------------------------------------------------------------------------------------------------------------
    struct Release {
        uint256 earliestReleaseTime;
        uint256 amount;
        uint256 blockNumber;
        bool done;
    }

    //
    // Variables
    // -----------------------------------------------------------------------------------------------------------------
    IERC20 public token;
    address public beneficiary;

    Release[] public releases;
    uint256 public totalLockedAmount;
    uint256 public executedReleasesCount;

    //
    // Events
    // -----------------------------------------------------------------------------------------------------------------
    event SetTokenEvent(IERC20 token);
    event SetBeneficiaryEvent(address beneficiary);
    event DefineReleaseEvent(uint256 earliestReleaseTime, uint256 amount, uint256 blockNumber);
    event SetReleaseBlockNumberEvent(uint256 index, uint256 blockNumber);
    event ReleaseEvent(uint256 index, uint256 blockNumber, uint256 earliestReleaseTime,
        uint256 actualReleaseTime, uint256 amount);

    //
    // Constructor
    // -----------------------------------------------------------------------------------------------------------------
    constructor(address deployer)
    Ownable(deployer)
    public
    {
    }

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    /// @notice Set the address of token
    /// @param _token The address of token
    function setToken(IERC20 _token)
    public
    onlyOperator
    notNullOrThisAddress(_token)
    {
        // Require that the token has not previously been set
        require(address(token) == address(0));

        // Update beneficiary
        token = _token;

        // Emit event
        emit SetTokenEvent(token);
    }

    /// @notice Set the address of beneficiary
    /// @param _beneficiary The new address of beneficiary
    function setBeneficiary(address _beneficiary)
    public
    onlyOperator
    notNullAddress(_beneficiary)
    {
        // Update beneficiary
        beneficiary = _beneficiary;

        // Emit event
        emit SetBeneficiaryEvent(beneficiary);
    }

    /// @notice Define a set of new releases
    /// @param earliestReleaseTimes The timestamp after which the corresponding amount may be released
    /// @param amounts The amounts to be released
    /// @param releaseBlockNumbers The set release block numbers for releases whose earliest release time
    /// is in the past
    function defineReleases(uint256[] earliestReleaseTimes, uint256[] amounts, uint256[] releaseBlockNumbers)
    onlyOperator
    public
    {
        require(earliestReleaseTimes.length == amounts.length);
        require(earliestReleaseTimes.length >= releaseBlockNumbers.length);

        // Require that token address has been set
        require(address(token) != address(0));

        for (uint256 i = 0; i < earliestReleaseTimes.length; i++) {
            // Update the total amount locked by this contract
            totalLockedAmount += amounts[i];

            // Require that total amount locked is smaller than or equal to the token balance of
            // this contract
            require(token.balanceOf(address(this)) >= totalLockedAmount);

            // Retrieve early block number where available
            uint256 blockNumber = i < releaseBlockNumbers.length ? releaseBlockNumbers[i] : 0;

            // Add release
            releases.push(Release(earliestReleaseTimes[i], amounts[i], blockNumber, false));

            // Emit event
            emit DefineReleaseEvent(earliestReleaseTimes[i], amounts[i], blockNumber);
        }
    }

    /// @notice Get the count of releases
    /// @return The number of defined releases
    function releasesCount()
    public
    view
    returns (uint256)
    {
        return releases.length;
    }

    /// @notice Set the block number of a release that is not done
    /// @param index The index of the release
    /// @param blockNumber The updated block number
    function setReleaseBlockNumber(uint256 index, uint256 blockNumber)
    public
    onlyBeneficiary
    {
        // Require that the release is not done
        require(!releases[index].done);

        // Update the release block number
        releases[index].blockNumber = blockNumber;

        // Emit event
        emit SetReleaseBlockNumberEvent(index, blockNumber);
    }

    /// @notice Transfers tokens held in the indicated release to beneficiary.
    /// @param index The index of the release
    function release(uint256 index)
    public
    onlyBeneficiary
    {
        // Get the release object
        Release storage _release = releases[index];

        // Require that this release has not already been executed
        require(!_release.done);

        // Require that the current timestamp is beyond the nominal release time
        require(block.timestamp >= _release.earliestReleaseTime);

        // Set release done
        _release.done = true;

        // Bump number of executed releases
        executedReleasesCount++;

        // Decrement the total locked amount
        totalLockedAmount -= _release.amount;

        // Execute transfer
        token.safeTransfer(beneficiary, _release.amount);

        // Get block number
        uint256 blockNumber = 0 < _release.blockNumber ? _release.blockNumber : block.number;

        // Emit event
        emit ReleaseEvent(index, blockNumber, _release.earliestReleaseTime, block.timestamp, _release.amount);
    }

    // Modifiers
    // -----------------------------------------------------------------------------------------------------------------
    modifier onlyBeneficiary() {
        require(msg.sender == beneficiary);
        _;
    }
}

contract RevenueTokenManager is TokenMultiTimelock {
    using SafeMathUintLib for uint256;

    //
    // Variables
    // -----------------------------------------------------------------------------------------------------------------
    uint256[] public releaseBlockNumbers;
    uint256[] public totalReleasedAmounts;
    uint256[] public totalReleasedAmountBlocks;

    //
    // Constructor
    // -----------------------------------------------------------------------------------------------------------------
    constructor(address deployer)
    public
    TokenMultiTimelock(deployer)
    {
    }

    //
    // Functions
    // -----------------------------------------------------------------------------------------------------------------
    /// @notice Transfers tokens held in the indicated release to beneficiary
    /// and update amount blocks
    /// @param index The index of the release
    function release(uint256 index)
    public
    onlyBeneficiary
    {
        // Add amount blocks
        _addAmountBlocks(index);

        // Call release of multi timelock
        super.release(index);
    }

    /// @notice Calculate the released amount blocks, i.e. the area under the curve (AUC) of
    /// release amount as function of block number
    /// @param startBlock The start block number considered
    /// @param endBlock The end block number considered
    /// @return The calculated AUC
    function releasedAmountBlocksIn(uint256 startBlock, uint256 endBlock)
    public
    view
    returns (uint256)
    {
        require(startBlock < endBlock);

        if (releaseBlockNumbers.length == 0 || endBlock < releaseBlockNumbers[0])
            return 0;

        uint256 i = 0;
        while (i < releaseBlockNumbers.length && releaseBlockNumbers[i] < startBlock)
            i++;

        uint256 r;
        if (i >= releaseBlockNumbers.length)
            r = totalReleasedAmounts[releaseBlockNumbers.length - 1].mul(endBlock.sub(startBlock));

        else {
            uint256 l = (i == 0) ? startBlock : releaseBlockNumbers[i - 1];

            uint256 h = releaseBlockNumbers[i];
            if (h > endBlock)
                h = endBlock;

            h = h.sub(startBlock);
            r = (h == 0) ? 0 : totalReleasedAmountBlocks[i].mul(h).div(releaseBlockNumbers[i].sub(l));
            i++;

            while (i < releaseBlockNumbers.length && releaseBlockNumbers[i] < endBlock) {
                r = r.add(totalReleasedAmountBlocks[i]);
                i++;
            }

            if (i >= releaseBlockNumbers.length)
                r = r.add(
                    totalReleasedAmounts[releaseBlockNumbers.length - 1].mul(
                        endBlock.sub(releaseBlockNumbers[releaseBlockNumbers.length - 1])
                    )
                );

            else if (releaseBlockNumbers[i - 1] < endBlock)
                r = r.add(
                    totalReleasedAmountBlocks[i].mul(
                        endBlock.sub(releaseBlockNumbers[i - 1])
                    ).div(
                        releaseBlockNumbers[i].sub(releaseBlockNumbers[i - 1])
                    )
                );
        }

        return r;
    }

    //
    // Private functions
    // -----------------------------------------------------------------------------------------------------------------
    function _addAmountBlocks(uint256 index)
    private
    {
        // Use block number defined in release if it is non-null
        uint256 blockNumber = 0 < releases[index].blockNumber ? releases[index].blockNumber : block.number;

        // Store the new total amount released by adding this release' amount to
        // previous total amount
        totalReleasedAmounts.push(
            (0 == totalReleasedAmounts.length ? 0 : totalReleasedAmounts[totalReleasedAmounts.length - 1])
            + releases[index].amount
        );

        // Add to total released amount blocks
        if (0 < executedReleasesCount)
            totalReleasedAmountBlocks.push(
                totalReleasedAmounts[executedReleasesCount - 1].mul(
                    blockNumber.sub(releaseBlockNumbers[executedReleasesCount - 1])
                )
            );
        else
            totalReleasedAmountBlocks.push(0);

        // Store the block number of the release
        releaseBlockNumbers.push(blockNumber);
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"totalLockedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"setToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"triggerSelfDestruction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"selfDestructionDisabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"index","type":"uint256"}],"name":"release","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"destructor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"earliestReleaseTimes","type":"uint256[]"},{"name":"amounts","type":"uint256[]"},{"name":"releaseBlockNumbers","type":"uint256[]"}],"name":"defineReleases","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"index","type":"uint256"},{"name":"blockNumber","type":"uint256"}],"name":"setReleaseBlockNumber","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"totalReleasedAmountBlocks","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableSelfDestruction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"startBlock","type":"uint256"},{"name":"endBlock","type":"uint256"}],"name":"releasedAmountBlocksIn","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"executedReleasesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newDeployer","type":"address"}],"name":"setDeployer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"releases","outputs":[{"name":"earliestReleaseTime","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"blockNumber","type":"uint256"},{"name":"done","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"releaseBlockNumbers","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"releasesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deployer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"totalReleasedAmounts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"deployer","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"}],"name":"SetTokenEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"beneficiary","type":"address"}],"name":"SetBeneficiaryEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"earliestReleaseTime","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"blockNumber","type":"uint256"}],"name":"DefineReleaseEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"index","type":"uint256"},{"indexed":false,"name":"blockNumber","type":"uint256"}],"name":"SetReleaseBlockNumberEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"index","type":"uint256"},{"indexed":false,"name":"blockNumber","type":"uint256"},{"indexed":false,"name":"earliestReleaseTime","type":"uint256"},{"indexed":false,"name":"actualReleaseTime","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"ReleaseEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldDeployer","type":"address"},{"indexed":false,"name":"newDeployer","type":"address"}],"name":"SetDeployerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOperator","type":"address"},{"indexed":false,"name":"newOperator","type":"address"}],"name":"SetOperatorEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"SelfDestructionDisabledEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"wallet","type":"address"}],"name":"TriggerSelfDestructionEvent","type":"event"}]

  Contract Creation Code Switch To Opcodes View
608060405234801561001057600080fd5b506040516020806113928339810160405251808080600160a060020a038116151561003a57600080fd5b600160a060020a03811630141561005057600080fd5b5060008054600160a060020a03909216610100810261010060a860020a031990931692909217905560018054600160a060020a031916909117905550506112f68061009c6000396000f3006080604052600436106101195763ffffffff60e060020a60003504166305a9f274811461011e578063144fa6d7146101455780631c31f710146101685780632738a112146101895780632f013a001461019e57806337bdc99b146101c757806338af3eed146101df5780634476d23b146102105780634524c0cd146102255780634eddcf5b146102ec578063570ca735146103075780635c35c1ff1461031c57806370327ea11461033457806385a4757e1461034957806392e35ad4146103645780639621473514610379578063b3ab15fb1461039a578063b6a9f40f146103bb578063cffc6233146103fb578063d02764f314610413578063d5f3948814610428578063f7aa74801461043d578063fc0c546a14610455575b600080fd5b34801561012a57600080fd5b5061013361046a565b60408051918252519081900360200190f35b34801561015157600080fd5b50610166600160a060020a0360043516610470565b005b34801561017457600080fd5b50610166600160a060020a0360043516610520565b34801561019557600080fd5b506101666105a4565b3480156101aa57600080fd5b506101b3610606565b604080519115158252519081900360200190f35b3480156101d357600080fd5b5061016660043561060f565b3480156101eb57600080fd5b506101f461063b565b60408051600160a060020a039092168252519081900360200190f35b34801561021c57600080fd5b506101f461064a565b34801561023157600080fd5b506040805160206004803580820135838102808601850190965280855261016695369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061065e9650505050505050565b3480156102f857600080fd5b506101666004356024356108a7565b34801561031357600080fd5b506101f4610955565b34801561032857600080fd5b50610133600435610964565b34801561034057600080fd5b50610166610983565b34801561035557600080fd5b506101336004356024356109e1565b34801561037057600080fd5b50610133610ce2565b34801561038557600080fd5b50610166600160a060020a0360043516610ce8565b3480156103a657600080fd5b50610166600160a060020a0360043516610db4565b3480156103c757600080fd5b506103d3600435610e71565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b34801561040757600080fd5b50610133600435610eac565b34801561041f57600080fd5b50610133610eba565b34801561043457600080fd5b506101f4610ec0565b34801561044957600080fd5b50610133600435610ed4565b34801561046157600080fd5b506101f4610ee2565b60055481565b610478610ef1565b151561048357600080fd5b80600160a060020a038116151561049957600080fd5b600160a060020a0381163014156104af57600080fd5b600254600160a060020a0316156104c557600080fd5b60028054600160a060020a031916600160a060020a03848116919091179182905560408051929091168252517f6d8175d5535b8ed95618101b59531eb23efe2c999ffea7c6831918fc088b512b916020908290030190a15050565b610528610ef1565b151561053357600080fd5b80600160a060020a038116151561054957600080fd5b60038054600160a060020a031916600160a060020a03848116919091179182905560408051929091168252517fa269fa1cb7bcf5c01f056e2ab269416779172ccca0613c264c1333c6db01f144916020908290030190a15050565b336105ad61064a565b600160a060020a0316146105c057600080fd5b60005460ff16156105d057600080fd5b6040805133815290517f787a5d936e74f4b564b9153575886059829c78cd9927b1be5e0d976b317ef7369181900360200190a133ff5b60005460ff1681565b600354600160a060020a0316331461062657600080fd5b61062f81610f02565b61063881611096565b50565b600354600160a060020a031681565b6000546101009004600160a060020a031690565b600080610669610ef1565b151561067457600080fd5b835185511461068257600080fd5b82518551101561069157600080fd5b600254600160a060020a031615156106a857600080fd5b600091505b84518210156108a05783828151811015156106c457fe5b602090810290910181015160058054909101908190556002546040805160e060020a6370a0823102815230600482015290519293600160a060020a03909216926370a08231926024808401939192918290030181600087803b15801561072957600080fd5b505af115801561073d573d6000803e3d6000fd5b505050506040513d602081101561075357600080fd5b5051101561076057600080fd5b8251821061076f576000610788565b828281518110151561077d57fe5b906020019060200201515b9050600460806040519081016040528087858151811015156107a657fe5b90602001906020020151815260200186858151811015156107c357fe5b60209081029190910181015182528181018590526000604092830181905284546001808201875595825290829020845160049092020190815590830151938101939093558101516002830155606001516003909101805460ff191691151591909117905584517f7a4b817334cd72c0bcda88d842afe9d164deab0f72ed72c7157b05f9bc3c9b599086908490811061085757fe5b90602001906020020151858481518110151561086f57fe5b60209081029091018101516040805193845291830152818101849052519081900360600190a16001909101906106ad565b5050505050565b600354600160a060020a031633146108be57600080fd5b60048054839081106108cc57fe5b600091825260209091206003600490920201015460ff16156108ed57600080fd5b806004838154811015156108fd57fe5b9060005260206000209060040201600201819055507f7cf19267ac0e3fcfc04da70aa689f851cd659a051bab5a357d0d31085b9430858282604051808381526020018281526020019250505060405180910390a15050565b600154600160a060020a031681565b600980548290811061097257fe5b600091825260209091200154905081565b3361098c61064a565b600160a060020a03161461099f57600080fd5b6000805460ff191660011790556040805133815290517fd5a2a04a775c741c2ca0dc46ea7ce4835190e1aaf1ca018def0e82568ec336169181900360200190a1565b6000808080808587106109f357600080fd5b6007541580610a1a5750600780546000908110610a0c57fe5b906000526020600020015486105b15610a285760009450610cd8565b600093505b60075484108015610a56575086600785815481101515610a4957fe5b9060005260206000200154105b15610a6657600190930192610a2d565b6007548410610ab857610ab1610a82878963ffffffff6111b716565b60075460088054909160001901908110610a9857fe5b90600052602060002001546111c990919063ffffffff16565b9250610cd4565b8315610ae057600780546000198601908110610ad057fe5b9060005260206000200154610ae2565b865b9150600784815481101515610af357fe5b9060005260206000200154905085811115610b0b5750845b610b1b818863ffffffff6111b716565b90508015610b7657610b71610b5283600787815481101515610b3957fe5b90600052602060002001546111b790919063ffffffff16565b610b6583600988815481101515610a9857fe5b9063ffffffff6111f416565b610b79565b60005b60019094019392505b60075484108015610bab575085600785815481101515610b9e57fe5b9060005260206000200154105b15610be957610bdc600985815481101515610bc257fe5b90600052602060002001548461120b90919063ffffffff16565b6001909401939250610b82565b6007548410610c385760078054610ab191610c2b91610a8291906000198101908110610c1157fe5b9060005260206000200154896111b790919063ffffffff16565b849063ffffffff61120b16565b85600760018603815481101515610c4b57fe5b90600052602060002001541015610cd457610cd1610c2b610c91600760018803815481101515610c7757fe5b9060005260206000200154600788815481101515610b3957fe5b610b65610cc3600760018a03815481101515610ca957fe5b90600052602060002001548b6111b790919063ffffffff16565b600980548a908110610a9857fe5b92505b8294505b5050505092915050565b60065481565b6000610cf261121a565b1515610cfd57600080fd5b81600160a060020a0381161515610d1357600080fd5b600160a060020a038116301415610d2957600080fd5b600054600160a060020a038481166101009092041614610daf5760008054600160a060020a0385811661010081810261010060a860020a0319851617909455604080519490930491909116808452602084019190915281519094507f977e5fa58e458501775e0008d275006294c5249e3c08d1d0e3a9f3acad14f6e49281900390910190a15b505050565b6000610dbe610ef1565b1515610dc957600080fd5b81600160a060020a0381161515610ddf57600080fd5b600160a060020a038116301415610df557600080fd5b600154600160a060020a03848116911614610daf5760018054600160a060020a03858116600160a060020a0319831681179093556040805191909216808252602082019390935281519294507f9f611b789425d0d5b90b920f1b2852907dd865c80074a30b1629aaa041d1812c929081900390910190a1505050565b6004805482908110610e7f57fe5b60009182526020909120600490910201805460018201546002830154600390930154919350919060ff1684565b600780548290811061097257fe5b60045490565b6000546101009004600160a060020a031681565b600880548290811061097257fe5b600254600160a060020a031681565b600154600160a060020a0316331490565b6000600482815481101515610f1357fe5b906000526020600020906004020160020154600010610f325743610f53565b6004805483908110610f4057fe5b9060005260206000209060040201600201545b90506008600483815481101515610f6657fe5b600091825260209091206001600490920201015460085415610fa457600880546000198101908110610f9457fe5b9060005260206000200154610fa7565b60005b825460018101845560009384526020842092909101910155600654111561102d576009611012610ffe6007600160065403815481101515610fe457fe5b9060005260206000200154846111b790919063ffffffff16565b6008600160065403815481101515610a9857fe5b81546001810183556000928352602090922090910155611060565b6009805460018101825560009182527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af01555b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688015550565b6003546000908190600160a060020a031633146110b257600080fd5b60048054849081106110c057fe5b60009182526020909120600490910201600381015490925060ff16156110e557600080fd5b81544210156110f357600080fd5b6003808301805460ff19166001908117909155600680548201905583018054600580549190910390559054905460025461114192600160a060020a039182169291169063ffffffff61123016565b81600201546000106111535743611159565b81600201545b825460018401546040805187815260208101859052808201939093524260608401526080830191909152519192507f192a2424596ca5fd763237e85156a3cca5a544ec2de91fcce52165f11430c9fb919081900360a00190a1505050565b6000828211156111c357fe5b50900390565b60008282028315806111e557508284828115156111e257fe5b04145b15156111ed57fe5b9392505050565b600080828481151561120257fe5b04949350505050565b6000828201838110156111ed57fe5b6000546101009004600160a060020a0316331490565b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b505050506040513d60208110156112bd57600080fd5b50511515610daf57600080fd00a165627a7a72305820ae8bc66a34a04f378d1e26a3848d1754ae5facbb7384e5530e143cca5e3d342600290000000000000000000000003caac75eaf3860ed355ca260b01b396985a40a70

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

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003caac75eaf3860ed355ca260b01b396985a40a70


   Swarm Source:
bzzr://ae8bc66a34a04f378d1e26a3848d1754ae5facbb7384e5530e143cca5e3d3426

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward