Address io1f4acssp65t6s90egjkzpvrdsrjjyysnvxgqjrh

Contract Overview

Balance:
0 IOTX

IOTX Value:
$ 0

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
28d720ef48eff8cda1d50f778ed5fe8569caabe0ca06e21b46bd198d0d433752 29507750 2024-04-16 12:06:30 +0000 UTC 3 days ago io1y8mgwh40kfme0fsu2us709d64fhjnlq6xlzd3t  IN    Contract: CycloneToken 0 IOTX 0.02418
cbb4eaaf25d035735f3163aaa8305ed8c1022a05b2d9b303e72b43c25b1aa2e5 29501070 2024-04-16 02:49:45 +0000 UTC 3 days ago io1yj3k50vhrusjhv2ftwmsqpkjzfnnku9hqv6uug  IN    Contract: CycloneToken 0 IOTX 0.08256
4d536cd9856a05f01fa7d41fe03fcd349a926b674ecff90f54eb6ed484c93d8a 29487999 2024-04-15 08:40:30 +0000 UTC 4 days ago io1yj3k50vhrusjhv2ftwmsqpkjzfnnku9hqv6uug  IN    Contract: CycloneToken 0 IOTX 0.08256
f3aae3df86aa8b514b76868500ab3b253d99a30cc27cfefa2f5f61bb359b3938 29454978 2024-04-13 10:44:20 +0000 UTC 6 days ago io1eqa032yxtux2qmld47qzlfsn04xz9fkya57m57  IN    Contract: CycloneToken 0 IOTX 0.08256
2226a33833af5be4e955382cb43c82740583e9158cb0c490bfd9fc49289fc55b 29452842 2024-04-13 07:46:20 +0000 UTC 6 days ago io1yj3k50vhrusjhv2ftwmsqpkjzfnnku9hqv6uug  IN    Contract: CycloneToken 0 IOTX 0.08256
f8c487d0a1771bb96903dc394e60e5575a8dd1c89a21e2c8496c833cc8fa21d4 29433148 2024-04-12 04:25:10 +0000 UTC 7 days ago io1y8mgwh40kfme0fsu2us709d64fhjnlq6xlzd3t  IN    Contract: CycloneToken 0 IOTX 0.02418
43dc5ca09d2b6f2d7da044cbaf66c8cc68d181af5a3bcad5086dcbaa9d029f60 29415284 2024-04-11 03:36:30 +0000 UTC 8 days ago io1yj3k50vhrusjhv2ftwmsqpkjzfnnku9hqv6uug  IN    Contract: CycloneToken 0 IOTX 0.08256
2ea97abc01107e44600a3c9304fad392270e74831b1668a19356e81a4273b4c7 29407963 2024-04-10 17:26:25 +0000 UTC 9 days ago io1kvpxh5yv3g8g4hm5zvv5dw8zkj0zrvwtme3snd  IN    Contract: CycloneToken 0 IOTX 0.2064
f87b29e6736da302a19e8e0bb8a31d54e1d968e04415db7e25fea8cddba30ddb 29396298 2024-04-10 01:14:20 +0000 UTC 10 days ago io1jytltm6p2ecfpyhhjaq2j7ck8r9rnxsqy0syfq  IN    Contract: CycloneToken 0 IOTX 0.08256
e9979c21bf4211770424f0e2517266685af246a230a1e8f8fd053e1c2749bbcb 29381800 2024-04-09 05:06:05 +0000 UTC 10 days ago io1dfp0ntw867k366q8cllkjnvkxxhyq7s4qp26ev  IN    Contract: CycloneToken 0 IOTX 0.08256
ce4a2d0db5c66862030262646ae7575c70adaeba8fd7b24e2edc9bf894832e73 29380946 2024-04-09 03:54:55 +0000 UTC 10 days ago io1sukzhu2z84n3vj5xl36ndhkhg3wkcd7ut9t4aw  IN    Contract: CycloneToken 0 IOTX 0.08256
c05ac5b7cb8f0221005cc6f46f4a96bc35e5f3e907e3573d57ddf2ed15d88bdf 29372074 2024-04-08 15:30:45 +0000 UTC 11 days ago io1sukzhu2z84n3vj5xl36ndhkhg3wkcd7ut9t4aw  IN    Contract: CycloneToken 0 IOTX 0.08256
9e707d71e39daa4f44c01269cd3beab458c0269a2d475ef20b8fbad35ed8ce06 29367494 2024-04-08 09:08:55 +0000 UTC 11 days ago io1dwckgckre633g83j64jkcfgyr3qy4w6eara84y  IN    Contract: CycloneToken 0 IOTX 0.08256
89ec66c14ad133026e73c27d74b5bec9a4b2db7f677ddbd7badbf14e26cf2867 29352294 2024-04-07 11:59:45 +0000 UTC 12 days ago io1qh7ypugcywzx9mc8vpwexzwcfwknckvy79v62y  IN    Contract: CycloneToken 0 IOTX 0.08256
e3fa020f6ffa406f1e53f7bddea12090dfeb430e85fa77820f7583b266286576 29350396 2024-04-07 09:21:30 +0000 UTC 12 days ago io1szpkhseuqmw6clqt7c5k3jkkf3se38pthupr2v  IN    Contract: CycloneToken 0 IOTX 0.08256
cab2a413950230c7a2c47a5478f9c7a5bb3ebe311fcfde8c6e545d26cb840807 29262535 2024-04-02 07:07:45 +0000 UTC 17 days ago io18lscnfyupq89dn8exkdpzvf9dh22u7szkjjka6  IN    Contract: CycloneToken 0 IOTX 0.08256
d086ac8087e06fa1f427fa4451a447def5e9b04cabe877c15f5d1013dc5bdfc0 29261280 2024-04-02 05:23:10 +0000 UTC 17 days ago io1s2z3fc8l6lc05d8h4las2cazp70y5pz2y9tdq4  IN    Contract: CycloneToken 0 IOTX 0.08256
01f4473245ec3976bff07caf428ca345b23409b72aabb6ae20bff91b51d9b964 29252889 2024-04-01 17:43:40 +0000 UTC 18 days ago io12fu3fm49974p6355nzyxwtrevtek6s8u3eq3fz  IN    Contract: CycloneToken 0 IOTX 0.09285
639ec6a3584db738379cfd8c8f793ed82966401836d314ec6cd635f5fa5da7d7 29212659 2024-03-30 09:50:50 +0000 UTC 20 days ago io1598llr8n2c2jf4v08343g8jkwc6d5sgwp7z2zn  IN    Contract: CycloneToken 0 IOTX 0.06825
4535d7aa863d9ceae44732e5fa56f06339b24623765e55b13ffc006377478737 29201040 2024-03-29 17:42:35 +0000 UTC 21 days ago io17nc6d6kmw7f4z4ghxc6cdkwtan2qwuypvv4lal  IN    Contract: CycloneToken 0 IOTX 0.08256
8423a72d72468b0e517c3eb2695aefa52f369566da10b815f11010c1a2e3c70e 29199490 2024-03-29 15:30:55 +0000 UTC 21 days ago io1y8mgwh40kfme0fsu2us709d64fhjnlq6xlzd3t  IN    Contract: CycloneToken 0 IOTX 0.02418
73fd2d821c53614513eac42d9d12fb04d80a610c130ee28347151da621f3afc3 29198658 2024-03-29 14:21:35 +0000 UTC 21 days ago io1sl5t40pljh09jthza352w8gaje3cfpkeqefa5n  IN    Contract: CycloneToken 0 IOTX 0.08256
03710da963726fda35fe3ad0c5d4db8acae2e437ecddd32a6028485c4d662798 29194057 2024-03-29 07:53:10 +0000 UTC 21 days ago io1k98zsyxekkaa0vza3sjrxm5yh2ay02lrwrdgfu  IN    Contract: CycloneToken 0 IOTX 0.08256
8b8f42a28439ecc973832bd9f8c0e795a3bca46e176f4d0503c4e8fd5fa7df39 29186979 2024-03-28 21:58:20 +0000 UTC 22 days ago io1r7yjkjpkhs58gtamvqn88tyluxqqwrcdlrafhg  IN    Contract: CycloneToken 0 IOTX 0.08256
e13d2c6995023a8f73a6fec0799e962f51877a72bf84889b85b2a194fba832ae 29180426 2024-03-28 12:49:45 +0000 UTC 22 days ago io1gnhrtz26ahgs3cw6fvr84c34lxd3wjn2z550c3  IN    Contract: CycloneToken 0 IOTX 0.08256
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CycloneToken

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

// File: contracts/ownership/Ownable.sol

pragma solidity <6.0 >=0.4.0;


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


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


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

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

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}
// File: contracts/lifecycle/Pausable.sol

pragma solidity <0.6 >=0.4.24;


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


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

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

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}

// File: contracts/math/SafeMath.sol

pragma solidity <0.6 >=0.4.21;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */

  /*@CTK SafeMath_mul
    @tag spec
    @post __reverted == __has_assertion_failure
    @post __has_assertion_failure == __has_overflow
    @post __reverted == false -> c == a * b
    @post msg == msg__post
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  /*@CTK SafeMath_div
    @tag spec
    @pre b != 0
    @post __reverted == __has_assertion_failure
    @post __has_overflow == true -> __has_assertion_failure == true
    @post __reverted == false -> __return == a / b
    @post msg == msg__post
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  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 a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  /*@CTK SafeMath_sub
    @tag spec
    @post __reverted == __has_assertion_failure
    @post __has_overflow == true -> __has_assertion_failure == true
    @post __reverted == false -> __return == a - b
    @post msg == msg__post
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  /*@CTK SafeMath_add
    @tag spec
    @post __reverted == __has_assertion_failure
    @post __has_assertion_failure == __has_overflow
    @post __reverted == false -> c == a + b
    @post msg == msg__post
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

// File: contracts/token/IERC20Basic.sol

pragma solidity <0.6 >=0.4.21;


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract IERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}
// File: contracts/token/BasicToken.sol

pragma solidity <0.6 >=0.4.21;




/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is IERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

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

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  /*@CTK transfer_success
    @pre _to != address(0)
    @pre balances[msg.sender] >= _value
    @pre __reverted == false
    @post __reverted == false
    @post __return == true
   */
  /*@CTK transfer_same_address
    @tag no_overflow
    @pre _to == msg.sender
    @post this == __post
   */
  /*@CTK transfer_conditions
    @tag assume_completion
    @pre _to != msg.sender
    @post __post.balances[_to] == balances[_to] + _value
    @post __post.balances[msg.sender] == balances[msg.sender] - _value
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  /*@CTK balanceOf
    @post __reverted == false
    @post __return == balances[_owner]
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }
}
// File: contracts/token/IERC20.sol

pragma solidity <0.6 >=0.4.21;



/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract IERC20 is IERC20Basic {
  function name() external view returns (string memory);
  function symbol() external view returns (string memory);
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: contracts/token/StandardToken.sol

pragma solidity <0.6 >=0.4.21;




/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is IERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @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
   */
  /*@CTK transferFrom
    @tag assume_completion
    @pre _from != _to
    @post __return == true
    @post __post.balances[_to] == balances[_to] + _value
    @post __post.balances[_from] == balances[_from] - _value
    @post __has_overflow == false
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _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.
   */
  /*@CTK approve_success
    @post _value == 0 -> __reverted == false
    @post allowed[msg.sender][_spender] == 0 -> __reverted == false
   */
  /*@CTK approve
    @tag assume_completion
    @post __post.allowed[msg.sender][_spender] == _value
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @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 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.
   */
  /*@CTK CtkIncreaseApprovalEffect
    @tag assume_completion
    @post __post.allowed[msg.sender][_spender] == allowed[msg.sender][_spender] + _addedValue
    @post __has_overflow == false
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    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.
   */
  /*@CTK CtkDecreaseApprovalEffect_1
    @pre allowed[msg.sender][_spender] >= _subtractedValue
    @tag assume_completion
    @post __post.allowed[msg.sender][_spender] == allowed[msg.sender][_spender] - _subtractedValue
    @post __has_overflow == false
   */
   /*@CTK CtkDecreaseApprovalEffect_2
    @pre allowed[msg.sender][_spender] < _subtractedValue
    @tag assume_completion
    @post __post.allowed[msg.sender][_spender] == 0
    @post __has_overflow == false
   */
  /* CertiK Smart Labelling, for more details visit: https://certik.org */
  function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

// File: contracts/token/IMintableToken.sol

pragma solidity <0.6 >=0.4.24;


contract IMintableToken is IERC20 {
    function mint(address, uint) external returns (bool);
    function burn(uint) external returns (bool);

    event Minted(address indexed to, uint256 amount);
    event Burned(address indexed from, uint256 amount);
    event MinterAdded(address indexed minter);
    event MinterRemoved(address indexed minter);
}
// File: contracts/token/ShadowToken.sol

pragma solidity <0.6 >=0.4.24;




contract ShadowToken is StandardToken, IMintableToken, Pausable {
    event Minted(address indexed to, uint256 amount);
    event Burned(address indexed from, uint256 amount);
    event MinterAdded(address indexed minter);
    event MinterRemoved(address indexed minter);

    modifier onlyMinter() {
        require(minter == msg.sender, "not the minter");
        _;
    }

    address public coToken;
    address public minter;
    string public name;
    string public symbol;
    uint8 public decimals;

    constructor(address _minter, address _coToken, string memory _name, string memory _symbol, uint8 _decimals) public {
        minter = _minter;
        coToken = _coToken;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        emit MinterAdded(_minter);
    }

    function mint(address _to, uint256 _amount) public onlyMinter whenNotPaused returns (bool) {
        totalSupply_ = totalSupply_.add(_amount);
        balances[_to] = balances[_to].add(_amount);
        emit Minted(_to, _amount);
        emit Transfer(address(0), _to, _amount);
        return true;
    }

    // user can also burn by sending token to address(0), but this function will emit Burned event
    function burn(uint256 _amount) public returns (bool) {
        require(balances[msg.sender] >= _amount);
        totalSupply_ = totalSupply_.sub(_amount);
        balances[msg.sender] = balances[msg.sender].sub(_amount);
        emit Burned(msg.sender, _amount);
        emit Transfer(msg.sender, address(0), _amount);
        return true;
    }
}
// File: contracts/token/CycloneToken.sol

pragma solidity <0.6 >=0.4.24;





contract CycloneToken is StandardToken, IMintableToken, Pausable {

    modifier onlyOperator() {
        require(operator == msg.sender, "not the operator");
        _;
    }

    // Minters include Aeolus (liquidity mining) and CoinCyclone/ERC20Cyclone (anonymity mining)
    modifier onlyMinters() {
        require(minters[msg.sender] == true, "not the minter");
        _;
    }

    address public operator;
    mapping (address => bool) public minters;
    string public constant name = "Cyclone Protocol";
    string public constant symbol = "CYC";
    uint8 public constant decimals = 18;
    ShadowToken public shadowToken;  // this is to support CYC living on multiple chains!

    constructor(address _operator, address _lp) public {
        require (_operator != address(0), "invalid address");
        require (_lp != address(0), "invalid address");
        operator = _operator;
        
        // mint 2021 CYC for community
        totalSupply_ = totalSupply_.add(2021 * 1000000000000000000);	
        balances[_lp] = balances[_lp].add(2021 * 1000000000000000000);
        _moveDelegates(address(0), delegates[_lp], 2021 * 1000000000000000000);
    }

    function addMinter(address _minter) external onlyOperator {
        minters[_minter] = true;
        emit MinterAdded(_minter);
    }

    function removeMinter(address _minter) external onlyOperator {
        minters[_minter] = false;
        emit MinterRemoved(_minter);
    }

    function setShadowToken(address _shadowToken) external onlyOperator {
        require (_shadowToken != address(0), "invalid shadow token address");
        shadowToken = ShadowToken(_shadowToken);
    }

    function updateOperator(address _operator) external onlyOperator {
        require (_operator != address(0), "invalid operator address");
        operator = _operator;
    }

    function mint(address _to, uint256 _amount) public onlyMinters whenNotPaused returns (bool) {
        require (_to != address(0), "invalid address for mint");
        require (_amount != 0, "mint amount should not be zero");
        totalSupply_ = totalSupply_.add(_amount);
        balances[_to] = balances[_to].add(_amount);
        emit Minted(_to, _amount);
        emit Transfer(address(0), _to, _amount);
        _moveDelegates(address(0), delegates[_to], _amount);
        return true;
    }

    // user can also burn by sending token to address(0), but this function will emit Burned event
    function burn(uint256 _amount) public returns (bool) {
        require (_amount != 0, "burn amount should not be zero");
        require(balances[msg.sender] >= _amount);
        totalSupply_ = totalSupply_.sub(_amount);
        balances[msg.sender] = balances[msg.sender].sub(_amount);
        emit Burned(msg.sender, _amount);
        emit Transfer(msg.sender, address(0), _amount);
        _moveDelegates(delegates[msg.sender], address(0), _amount);
        return true;
    }

    // burnShadowToMint supports CYC tokens living on different public blockchains and CYC tokens peg to the same value
    function burnShadowToMint(address _to, uint256 _amount) public whenNotPaused returns (bool) {
        require (_to != address(0), "invalid address for mint");
        require (_amount != 0, "mint amount should not be zero");
        require(shadowToken.transferFrom(msg.sender, address(this), _amount), "failed to invoke transferFrom of shadowToken");
        require(shadowToken.burn(_amount), "failed to burn shadowToken for given amount");
        totalSupply_ = totalSupply_.add(_amount);
        balances[_to] = balances[_to].add(_amount);
        emit Minted(_to, _amount);
        emit Transfer(address(0), _to, _amount);
        _moveDelegates(address(0), delegates[_to], _amount);
        return true;
    }
  
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol
    
    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice A record of each accounts delegate
    mapping (address => address) public delegates;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint256 amount) public returns (bool) {
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint256 amount) public returns (bool) {
        address spender = msg.sender;
        uint256 spenderAllowance = allowed[src][spender];

        if (spender != src) {
            uint256 newAllowance = spenderAllowance.sub(amount);
            allowed[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegatee The address to delegate votes to
     */
    function delegate(address delegatee) public {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) public {
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), uint(0), address(this)));
        bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "delegateBySig: invalid nonce");
        require(now <= expiry, "delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint256) {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber) public view returns (uint256) {
        require(blockNumber < block.number, "getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = delegates[delegator];
        uint256 delegatorBalance = balances[delegator];
        delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _transferTokens(address src, address dst, uint256 amount) internal {
        require(src != address(0), "_transferTokens: cannot transfer from the zero address");
        require(dst != address(0), "_transferTokens: cannot transfer to the zero address");

        balances[src] = balances[src].sub(amount);
        balances[dst] = balances[dst].add(amount);
        emit Transfer(src, dst, amount);

        _moveDelegates(delegates[src], delegates[dst], amount);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld.sub(amount);
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld.add(amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes) internal {
      uint32 blockNumber = safe32(block.number, "_writeCheckpoint: block number exceeds 32 bits");

      if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
          checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
      } else {
          checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
          numCheckpoints[delegatee] = nCheckpoints + 1;
      }

      emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_lp","type":"address"}],"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"}],"name":"MinterRemoved","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":[],"name":"Pause","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":[],"name":"Unpause","type":"event"},{"constant":true,"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[],"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":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnShadowToMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"payable":false,"stateMutability":"view","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":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","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":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_shadowToken","type":"address"}],"name":"setShadowToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"shadowToken","outputs":[{"internalType":"contract ShadowToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","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":"dst","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":"src","type":"address"},{"internalType":"address","name":"dst","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":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"updateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

Contract Creation Code

608060405234801561001057600080fd5b506004361061021c5760003560e01c8063782d6fe111610125578063be9a6aaa116100ad578063e7a324dc1161007c578063e7a324dc146106d1578063f1127ed8146106d9578063f2fde38b1461072b578063f46eccc414610751578063ffc5d97a146107775761021c565b8063be9a6aaa1461060a578063c3cda52014610630578063d73dd62314610677578063dd62ed3e146106a35761021c565b806395d89b41116100f457806395d89b4114610564578063983b2d561461056c578063a9059cbb14610592578063ac7475ed146105be578063b4b5ea57146105e45761021c565b8063782d6fe1146105025780637ecebe001461052e5780638456cb59146105545780638da5cb5b1461055c5761021c565b806340c10f19116101a85780635c19a95c116101775780635c19a95c146104435780635c975abb1461046957806366188463146104715780636fcfff451461049d57806370a08231146104dc5761021c565b806340c10f19146103b057806342966c68146103dc578063570ca735146103f9578063587cde1e1461041d5761021c565b806323b872dd116101ef57806323b872dd146103005780632b588a55146103365780633092afd514610362578063313ce5671461038a5780633f4ba83a146103a85761021c565b806306fdde0314610221578063095ea7b31461029e57806318160ddd146102de57806320606b70146102f8575b600080fd5b61022961077f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026357818101518382015260200161024b565b50505050905090810190601f1680156102905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ca600480360360408110156102b457600080fd5b506001600160a01b0381351690602001356107ab565b604080519115158252519081900360200190f35b6102e6610800565b60408051918252519081900360200190f35b6102e6610806565b6102ca6004803603606081101561031657600080fd5b506001600160a01b03813581169160208101359091169060400135610821565b6102ca6004803603604081101561034c57600080fd5b506001600160a01b0381351690602001356108cc565b6103886004803603602081101561037857600080fd5b50356001600160a01b0316610c02565b005b610392610c9d565b6040805160ff9092168252519081900360200190f35b610388610ca2565b6102ca600480360360408110156103c657600080fd5b506001600160a01b038135169060200135610d07565b6102ca600480360360208110156103f257600080fd5b5035610e20565b610401610f73565b604080516001600160a01b039092168252519081900360200190f35b6104016004803603602081101561043357600080fd5b50356001600160a01b0316610f82565b6103886004803603602081101561045957600080fd5b50356001600160a01b0316610f9d565b6102ca610faa565b6102ca6004803603604081101561048757600080fd5b506001600160a01b038135169060200135610fba565b6104c3600480360360208110156104b357600080fd5b50356001600160a01b0316611098565b6040805163ffffffff9092168252519081900360200190f35b6102e6600480360360208110156104f257600080fd5b50356001600160a01b03166110b0565b6102e66004803603604081101561051857600080fd5b506001600160a01b0381351690602001356110cb565b6102e66004803603602081101561054457600080fd5b50356001600160a01b03166112d3565b6103886112e5565b610401611351565b610229611360565b6103886004803603602081101561058257600080fd5b50356001600160a01b031661137f565b6102ca600480360360408110156105a857600080fd5b506001600160a01b03813516906020013561141d565b610388600480360360208110156105d457600080fd5b50356001600160a01b031661142a565b6102e6600480360360208110156105fa57600080fd5b50356001600160a01b03166114f9565b6103886004803603602081101561062057600080fd5b50356001600160a01b031661155d565b610388600480360360c081101561064657600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a0013561162c565b6102ca6004803603604081101561068d57600080fd5b506001600160a01b0381351690602001356118fa565b6102e6600480360360408110156106b957600080fd5b506001600160a01b0381358116916020013516611981565b6102e66119ac565b61070b600480360360408110156106ef57600080fd5b5080356001600160a01b0316906020013563ffffffff166119c7565b6040805163ffffffff909316835260208301919091528051918290030190f35b6103886004803603602081101561074157600080fd5b50356001600160a01b03166119f4565b6102ca6004803603602081101561076757600080fd5b50356001600160a01b0316611a7a565b610401611a8f565b6040518060400160405280601081526020016f10de58db1bdb9948141c9bdd1bd8dbdb60821b81525081565b3360008181526002602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020612138833981519152928290030190a35060015b92915050565b60015490565b60405180604361205d82396043019050604051809103902081565b6001600160a01b0383166000818152600260209081526040808320338085529252822054919290919082146108b5576000610862828663ffffffff611a9e16565b6001600160a01b03808916600081815260026020908152604080832094891680845294825291829020859055815185815291519495509293919260008051602061213883398151915292918290030190a3505b6108c0868686611ab0565b50600195945050505050565b600354600090600160a01b900460ff16156108e657600080fd5b6001600160a01b03831661093c576040805162461bcd60e51b81526020600482015260186024820152771a5b9d985b1a59081859191c995cdcc8199bdc881b5a5b9d60421b604482015290519081900360640190fd5b8161098e576040805162461bcd60e51b815260206004820152601e60248201527f6d696e7420616d6f756e742073686f756c64206e6f74206265207a65726f0000604482015290519081900360640190fd5b600654604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156109e857600080fd5b505af11580156109fc573d6000803e3d6000fd5b505050506040513d6020811015610a1257600080fd5b5051610a4f5760405162461bcd60e51b815260040180806020018281038252602c815260200180612192602c913960400191505060405180910390fd5b60065460408051630852cd8d60e31b81526004810185905290516001600160a01b03909216916342966c68916024808201926020929091908290030181600087803b158015610a9d57600080fd5b505af1158015610ab1573d6000803e3d6000fd5b505050506040513d6020811015610ac757600080fd5b5051610b045760405162461bcd60e51b815260040180806020018281038252602b815260200180612032602b913960400191505060405180910390fd5b600154610b17908363ffffffff611c2416565b6001556001600160a01b038316600090815260208190526040902054610b43908363ffffffff611c2416565b6001600160a01b03841660008181526020818152604091829020939093558051858152905191927f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe92918290030190a26040805183815290516001600160a01b038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a36001600160a01b03808416600090815260096020526040812054610bf9921684611c31565b50600192915050565b6004546001600160a01b03163314610c54576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329037b832b930ba37b960811b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b601281565b6003546001600160a01b03163314610cb957600080fd5b600354600160a01b900460ff16610ccf57600080fd5b6003805460ff60a01b191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b3360009081526005602052604081205460ff161515600114610d61576040805162461bcd60e51b815260206004820152600e60248201526d3737ba103a34329036b4b73a32b960911b604482015290519081900360640190fd5b600354600160a01b900460ff1615610d7857600080fd5b6001600160a01b038316610dce576040805162461bcd60e51b81526020600482015260186024820152771a5b9d985b1a59081859191c995cdcc8199bdc881b5a5b9d60421b604482015290519081900360640190fd5b81610b04576040805162461bcd60e51b815260206004820152601e60248201527f6d696e7420616d6f756e742073686f756c64206e6f74206265207a65726f0000604482015290519081900360640190fd5b600081610e74576040805162461bcd60e51b815260206004820152601e60248201527f6275726e20616d6f756e742073686f756c64206e6f74206265207a65726f0000604482015290519081900360640190fd5b33600090815260208190526040902054821115610e9057600080fd5b600154610ea3908363ffffffff611a9e16565b60015533600090815260208190526040902054610ec6908363ffffffff611a9e16565b3360008181526020818152604091829020939093558051858152905191927f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df792918290030190a260408051838152905160009133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a333600090815260096020526040812054610f6b916001600160a01b039091169084611c31565b506001919050565b6004546001600160a01b031681565b6009602052600090815260409020546001600160a01b031681565b610fa73382611d7a565b50565b600354600160a01b900460ff1681565b3360009081526002602090815260408083206001600160a01b03861684529091528120548083111561100f573360009081526002602090815260408083206001600160a01b0388168452909152812055611044565b61101f818463ffffffff611a9e16565b3360009081526002602090815260408083206001600160a01b03891684529091529020555b3360008181526002602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020612138833981519152929181900390910190a35060019392505050565b60086020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526020819052604090205490565b600043821061110b5760405162461bcd60e51b81526004018080602001828103825260218152602001806120116021913960400191505060405180910390fd5b6001600160a01b03831660009081526008602052604090205463ffffffff16806111395760009150506107fa565b6001600160a01b038416600090815260076020908152604080832063ffffffff6000198601811685529252909120541683106111a8576001600160a01b03841660009081526007602090815260408083206000199490940163ffffffff168352929052206001015490506107fa565b6001600160a01b038416600090815260076020908152604080832083805290915290205463ffffffff168310156111e35760009150506107fa565b600060001982015b8163ffffffff168163ffffffff16111561129c57600282820363ffffffff16048103611215611ff9565b506001600160a01b038716600090815260076020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415611277576020015194506107fa9350505050565b805163ffffffff1687111561128e57819350611295565b6001820392505b50506111eb565b506001600160a01b038516600090815260076020908152604080832063ffffffff9094168352929052206001015491505092915050565b600a6020526000908152604090205481565b6003546001600160a01b031633146112fc57600080fd5b600354600160a01b900460ff161561131357600080fd5b6003805460ff60a01b1916600160a01b1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6003546001600160a01b031681565b6040518060400160405280600381526020016243594360e81b81525081565b6004546001600160a01b031633146113d1576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329037b832b930ba37b960811b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b6000610bf9338484611ab0565b6004546001600160a01b0316331461147c576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329037b832b930ba37b960811b604482015290519081900360640190fd5b6001600160a01b0381166114d7576040805162461bcd60e51b815260206004820152601860248201527f696e76616c6964206f70657261746f7220616464726573730000000000000000604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526008602052604081205463ffffffff1680611524576000611556565b6001600160a01b038316600090815260076020908152604080832063ffffffff60001986011684529091529020600101545b9392505050565b6004546001600160a01b031633146115af576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329037b832b930ba37b960811b604482015290519081900360640190fd5b6001600160a01b03811661160a576040805162461bcd60e51b815260206004820152601c60248201527f696e76616c696420736861646f7720746f6b656e206164647265737300000000604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000604051808061205d60439139604080519182900360430182208282018252601083526f10de58db1bdb9948141c9bdd1bd8dbdb60821b6020938401528151808401919091527f2b864030ed85b6ce9d972b623265c944c666a1d2f7baa2e5853ac0cb91e4f5c181830152600060608201819052306080808401919091528351808403909101815260a09092019283905281519190930120935090915080603a61215882396040805191829003603a0182206020808401919091526001600160a01b038c1683830152606083018b905260808084018b90528251808503909101815260a08401835280519082012061190160f01b60c085015260c2840187905260e2808501829052835180860390910181526101028501808552815191840191909120600091829052610122860180865281905260ff8c1661014287015261016286018b905261018286018a9052935191965092945091926001926101a28083019392601f198301929081900390910190855afa1580156117b2573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661181a576040805162461bcd60e51b815260206004820181905260248201527f64656c656761746542795369673a20696e76616c6964207369676e6174757265604482015290519081900360640190fd5b6001600160a01b0381166000908152600a60205260409020805460018101909155891461188e576040805162461bcd60e51b815260206004820152601c60248201527f64656c656761746542795369673a20696e76616c6964206e6f6e636500000000604482015290519081900360640190fd5b874211156118e3576040805162461bcd60e51b815260206004820181905260248201527f64656c656761746542795369673a207369676e61747572652065787069726564604482015290519081900360640190fd5b6118ed818b611d7a565b505050505b505050505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205461192e908363ffffffff611c2416565b3360008181526002602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020612138833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60405180603a6121588239603a019050604051809103902081565b60076020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6003546001600160a01b03163314611a0b57600080fd5b6001600160a01b038116611a1e57600080fd5b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b60056020526000908152604090205460ff1681565b6006546001600160a01b031681565b600082821115611aaa57fe5b50900390565b6001600160a01b038316611af55760405162461bcd60e51b81526004018080602001828103825260368152602001806120a06036913960400191505060405180910390fd5b6001600160a01b038216611b3a5760405162461bcd60e51b81526004018080602001828103825260348152602001806120d66034913960400191505060405180910390fd5b6001600160a01b038316600090815260208190526040902054611b63908263ffffffff611a9e16565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611b98908263ffffffff611c2416565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a36001600160a01b03808416600090815260096020526040808220548584168352912054611c1f92918216911683611c31565b505050565b818101828110156107fa57fe5b816001600160a01b0316836001600160a01b031614158015611c535750600081115b15611c1f576001600160a01b03831615611ceb576001600160a01b03831660009081526008602052604081205463ffffffff169081611c93576000611cc5565b6001600160a01b038516600090815260076020908152604080832063ffffffff60001987011684529091529020600101545b90506000611cd9828563ffffffff611a9e16565b9050611ce786848484611df9565b5050505b6001600160a01b03821615611c1f576001600160a01b03821660009081526008602052604081205463ffffffff169081611d26576000611d58565b6001600160a01b038416600090815260076020908152604080832063ffffffff60001987011684529091529020600101545b90506000611d6c828563ffffffff611c2416565b90506118f285848484611df9565b6001600160a01b038083166000818152600960208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611df3828483611c31565b50505050565b6000611e1d436040518060600160405280602e815260200161210a602e9139611f5e565b905060008463ffffffff16118015611e6657506001600160a01b038516600090815260076020908152604080832063ffffffff6000198901811685529252909120548282169116145b15611ea3576001600160a01b038516600090815260076020908152604080832063ffffffff60001989011684529091529020600101829055611f14565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600784528681208b8616825284528681209551865490861663ffffffff19918216178755925160019687015590815260089092529390208054928801909116919092161790555b604080518481526020810184905281516001600160a01b038816927fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724928290030190a25050505050565b6000816401000000008410611ff15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611fb6578181015183820152602001611f9e565b50505050905090810190601f168015611fe35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509192915050565b60408051808201909152600080825260208201529056fe6765745072696f72566f7465733a206e6f74207965742064657465726d696e65646661696c656420746f206275726e20736861646f77546f6b656e20666f7220676976656e20616d6f756e74454950373132446f6d61696e28737472696e67206e616d652c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374295f7472616e73666572546f6b656e733a2063616e6e6f74207472616e736665722066726f6d20746865207a65726f20616464726573735f7472616e73666572546f6b656e733a2063616e6e6f74207472616e7366657220746f20746865207a65726f20616464726573735f7772697465436865636b706f696e743a20626c6f636b206e756d626572206578636565647320333220626974738c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92544656c65676174696f6e28616464726573732064656c6567617465652c75696e74323536206e6f6e63652c75696e7432353620657870697279296661696c656420746f20696e766f6b65207472616e7366657246726f6d206f6620736861646f77546f6b656ea265627a7a72315820f109dd79d939b8094f5378b4c8ad2d028e4f574ff77d8aad43d825df999691c764736f6c63430005110032

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.