Contract 0x6d2ef8f049307633b25f62e7052774418bd9860f

Contract Overview

Balance:
0 Ether
TxHash Block Age From To Value [TxFee]
0x3786db814b41973207ddce290af420362d6ac71c2581e2a51fa47c348e49a56e1014233857 days 2 hrs ago0x4bc58769a5139ec2b76e93282ededc4cd2325853 IN  0x6d2ef8f049307633b25f62e7052774418bd9860f0 Ether0.00037139
[ Download CSV Export 

Latest 6 internal transactions Internal Transactions as a result of Contract Execution

[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Verified Source Code for Contract 0xa1526a32761bec4301146316466a00865d0f7718
Contract Name: GeneralTransferManager
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.24;

/**
 * @title Utility contract to allow pausing and unpausing of certain functions
 */
contract Pausable {

    event Pause(uint256 _timestammp);
    event Unpause(uint256 _timestamp);

    bool public paused = false;

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

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

   /**
    * @notice Called by the owner to pause, triggers stopped state
    */
    function _pause() internal whenNotPaused {
        paused = true;
        /*solium-disable-next-line security/no-block-members*/
        emit Pause(now);
    }

    /**
    * @notice Called by the owner to unpause, returns to normal state
    */
    function _unpause() internal whenPaused {
        paused = false;
        /*solium-disable-next-line security/no-block-members*/
        emit Unpause(now);
    }

}

/**
 * @title Interface that every module contract should implement
 */
interface IModule {

    /**
     * @notice This function returns the signature of configure function
     */
    function getInitFunction() external pure returns (bytes4);

    /**
     * @notice Return the permission flags that are associated with a module
     */
    function getPermissions() external view returns(bytes32[]);

    /**
     * @notice Used to withdraw the fee by the factory owner
     */
    function takeFee(uint256 _amount) external returns(bool);

}

/**
 * @title Interface for all security tokens
 */
interface ISecurityToken {

    // Standard ERC20 interface
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address _owner) external view returns (uint256);
    function allowance(address _owner, address _spender) external view returns (uint256);
    function transfer(address _to, uint256 _value) external returns (bool);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool);
    function approve(address _spender, uint256 _value) external returns (bool);
    function decreaseApproval(address _spender, uint _subtractedValue) external returns (bool);
    function increaseApproval(address _spender, uint _addedValue) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    //transfer, transferFrom must respect the result of verifyTransfer
    function verifyTransfer(address _from, address _to, uint256 _value) external returns (bool success);

    /**
     * @notice Mints new tokens and assigns them to the target _investor.
     * Can only be called by the STO attached to the token (Or by the ST owner if there's no STO attached yet)
     * @param _investor Address the tokens will be minted to
     * @param _value is the amount of tokens that will be minted to the investor
     */
    function mint(address _investor, uint256 _value) external returns (bool success);

    /**
     * @notice Mints new tokens and assigns them to the target _investor.
     * Can only be called by the STO attached to the token (Or by the ST owner if there's no STO attached yet)
     * @param _investor Address the tokens will be minted to
     * @param _value is The amount of tokens that will be minted to the investor
     * @param _data Data to indicate validation
     */
    function mintWithData(address _investor, uint256 _value, bytes _data) external returns (bool success);

    /**
     * @notice Used to burn the securityToken on behalf of someone else
     * @param _from Address for whom to burn tokens
     * @param _value No. of tokens to be burned
     * @param _data Data to indicate validation
     */
    function burnFromWithData(address _from, uint256 _value, bytes _data) external;

    /**
     * @notice Used to burn the securityToken
     * @param _value No. of tokens to be burned
     * @param _data Data to indicate validation
     */
    function burnWithData(uint256 _value, bytes _data) external;

    event Minted(address indexed _to, uint256 _value);
    event Burnt(address indexed _burner, uint256 _value);

    // Permissions this to a Permission module, which has a key of 1
    // If no Permission return false - note that IModule withPerm will allow ST owner all permissions anyway
    // this allows individual modules to override this logic if needed (to not allow ST owner all permissions)
    function checkPermission(address _delegate, address _module, bytes32 _perm) external view returns (bool);

    /**
     * @notice Returns module list for a module type
     * @param _module Address of the module
     * @return bytes32 Name
     * @return address Module address
     * @return address Module factory address
     * @return bool Module archived
     * @return uint8 Module type
     * @return uint256 Module index
     * @return uint256 Name index

     */
    function getModule(address _module) external view returns(bytes32, address, address, bool, uint8, uint256, uint256);

    /**
     * @notice Returns module list for a module name
     * @param _name Name of the module
     * @return address[] List of modules with this name
     */
    function getModulesByName(bytes32 _name) external view returns (address[]);

    /**
     * @notice Returns module list for a module type
     * @param _type Type of the module
     * @return address[] List of modules with this type
     */
    function getModulesByType(uint8 _type) external view returns (address[]);

    /**
     * @notice Queries totalSupply at a specified checkpoint
     * @param _checkpointId Checkpoint ID to query as of
     */
    function totalSupplyAt(uint256 _checkpointId) external view returns (uint256);

    /**
     * @notice Queries balance at a specified checkpoint
     * @param _investor Investor to query balance for
     * @param _checkpointId Checkpoint ID to query as of
     */
    function balanceOfAt(address _investor, uint256 _checkpointId) external view returns (uint256);

    /**
     * @notice Creates a checkpoint that can be used to query historical balances / totalSuppy
     */
    function createCheckpoint() external returns (uint256);

    /**
     * @notice Gets length of investors array
     * NB - this length may differ from investorCount if the list has not been pruned of zero-balance investors
     * @return Length
     */
    function getInvestors() external view returns (address[]);

    /**
     * @notice returns an array of investors at a given checkpoint
     * NB - this length may differ from investorCount as it contains all investors that ever held tokens
     * @param _checkpointId Checkpoint id at which investor list is to be populated
     * @return list of investors
     */
    function getInvestorsAt(uint256 _checkpointId) external view returns(address[]);

    /**
     * @notice generates subset of investors
     * NB - can be used in batches if investor list is large
     * @param _start Position of investor to start iteration from
     * @param _end Position of investor to stop iteration at
     * @return list of investors
     */
    function iterateInvestors(uint256 _start, uint256 _end) external view returns(address[]);
    
    /**
     * @notice Gets current checkpoint ID
     * @return Id
     */
    function currentCheckpointId() external view returns (uint256);

    /**
    * @notice Gets an investor at a particular index
    * @param _index Index to return address from
    * @return Investor address
    */
    function investors(uint256 _index) external view returns (address);

   /**
    * @notice Allows the owner to withdraw unspent POLY stored by them on the ST or any ERC20 token.
    * @dev Owner can transfer POLY to the ST which will be used to pay for modules that require a POLY fee.
    * @param _tokenContract Address of the ERC20Basic compliance token
    * @param _value Amount of POLY to withdraw
    */
    function withdrawERC20(address _tokenContract, uint256 _value) external;

    /**
    * @notice Allows owner to approve more POLY to one of the modules
    * @param _module Module address
    * @param _budget New budget
    */
    function changeModuleBudget(address _module, uint256 _budget) external;

    /**
     * @notice Changes the tokenDetails
     * @param _newTokenDetails New token details
     */
    function updateTokenDetails(string _newTokenDetails) external;

    /**
    * @notice Allows the owner to change token granularity
    * @param _granularity Granularity level of the token
    */
    function changeGranularity(uint256 _granularity) external;

    /**
    * @notice Removes addresses with zero balances from the investors list
    * @param _start Index in investors list at which to start removing zero balances
    * @param _iters Max number of iterations of the for loop
    * NB - pruning this list will mean you may not be able to iterate over investors on-chain as of a historical checkpoint
    */
    function pruneInvestors(uint256 _start, uint256 _iters) external;

    /**
     * @notice Freezes all the transfers
     */
    function freezeTransfers() external;

    /**
     * @notice Un-freezes all the transfers
     */
    function unfreezeTransfers() external;

    /**
     * @notice Ends token minting period permanently
     */
    function freezeMinting() external;

    /**
     * @notice Mints new tokens and assigns them to the target investors.
     * Can only be called by the STO attached to the token or by the Issuer (Security Token contract owner)
     * @param _investors A list of addresses to whom the minted tokens will be delivered
     * @param _values A list of the amount of tokens to mint to corresponding addresses from _investor[] list
     * @return Success
     */
    function mintMulti(address[] _investors, uint256[] _values) external returns (bool success);

    /**
     * @notice Function used to attach a module to the security token
     * @dev  E.G.: On deployment (through the STR) ST gets a TransferManager module attached to it
     * @dev to control restrictions on transfers.
     * @dev You are allowed to add a new moduleType if:
     * @dev - there is no existing module of that type yet added
     * @dev - the last member of the module list is replacable
     * @param _moduleFactory is the address of the module factory to be added
     * @param _data is data packed into bytes used to further configure the module (See STO usage)
     * @param _maxCost max amount of POLY willing to pay to module. (WIP)
     */
    function addModule(
        address _moduleFactory,
        bytes _data,
        uint256 _maxCost,
        uint256 _budget
    ) external;

    /**
    * @notice Archives a module attached to the SecurityToken
    * @param _module address of module to archive
    */
    function archiveModule(address _module) external;

    /**
    * @notice Unarchives a module attached to the SecurityToken
    * @param _module address of module to unarchive
    */
    function unarchiveModule(address _module) external;

    /**
    * @notice Removes a module attached to the SecurityToken
    * @param _module address of module to archive
    */
    function removeModule(address _module) external;

    /**
     * @notice Used by the issuer to set the controller addresses
     * @param _controller address of the controller
     */
    function setController(address _controller) external;

    /**
     * @notice Used by a controller to execute a forced transfer
     * @param _from address from which to take tokens
     * @param _to address where to send tokens
     * @param _value amount of tokens to transfer
     * @param _data data to indicate validation
     * @param _log data attached to the transfer by controller to emit in event
     */
    function forceTransfer(address _from, address _to, uint256 _value, bytes _data, bytes _log) external;

    /**
     * @notice Used by a controller to execute a foced burn
     * @param _from address from which to take tokens
     * @param _value amount of tokens to transfer
     * @param _data data to indicate validation
     * @param _log data attached to the transfer by controller to emit in event
     */
    function forceBurn(address _from, uint256 _value, bytes _data, bytes _log) external;

    /**
     * @notice Used by the issuer to permanently disable controller functionality
     * @dev enabled via feature switch "disableControllerAllowed"
     */
     function disableController() external;

     /**
     * @notice Used to get the version of the securityToken
     */
     function getVersion() external view returns(uint8[]);

     /**
     * @notice Gets the investor count
     */
     function getInvestorCount() external view returns(uint256);

     /**
      * @notice Overloaded version of the transfer function
      * @param _to receiver of transfer
      * @param _value value of transfer
      * @param _data data to indicate validation
      * @return bool success
      */
     function transferWithData(address _to, uint256 _value, bytes _data) external returns (bool success);

     /**
      * @notice Overloaded version of the transferFrom function
      * @param _from sender of transfer
      * @param _to receiver of transfer
      * @param _value value of transfer
      * @param _data data to indicate validation
      * @return bool success
      */
     function transferFromWithData(address _from, address _to, uint256 _value, bytes _data) external returns(bool);

     /**
      * @notice Provides the granularity of the token
      * @return uint256
      */
     function granularity() external view returns(uint256);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address _owner) external view returns (uint256);
    function allowance(address _owner, address _spender) external view returns (uint256);
    function transfer(address _to, uint256 _value) external returns (bool);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool);
    function approve(address _spender, uint256 _value) external returns (bool);
    function decreaseApproval(address _spender, uint _subtractedValue) external returns (bool);
    function increaseApproval(address _spender, uint _addedValue) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @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 OwnershipRenounced(address indexed previousOwner);
  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 relinquish control of the contract.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

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

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

/**
 * @title Interface that any module contract should implement
 * @notice Contract is abstract
 */
contract Module is IModule {

    address public factory;

    address public securityToken;

    bytes32 public constant FEE_ADMIN = "FEE_ADMIN";

    IERC20 public polyToken;

    /**
     * @notice Constructor
     * @param _securityToken Address of the security token
     * @param _polyAddress Address of the polytoken
     */
    constructor (address _securityToken, address _polyAddress) public {
        securityToken = _securityToken;
        factory = msg.sender;
        polyToken = IERC20(_polyAddress);
    }

    //Allows owner, factory or permissioned delegate
    modifier withPerm(bytes32 _perm) {
        bool isOwner = msg.sender == Ownable(securityToken).owner();
        bool isFactory = msg.sender == factory;
        require(isOwner||isFactory||ISecurityToken(securityToken).checkPermission(msg.sender, address(this), _perm), "Permission check failed");
        _;
    }

    modifier onlyOwner {
        require(msg.sender == Ownable(securityToken).owner(), "Sender is not owner");
        _;
    }

    modifier onlyFactory {
        require(msg.sender == factory, "Sender is not factory");
        _;
    }

    modifier onlyFactoryOwner {
        require(msg.sender == Ownable(factory).owner(), "Sender is not factory owner");
        _;
    }

    modifier onlyFactoryOrOwner {
        require((msg.sender == Ownable(securityToken).owner()) || (msg.sender == factory), "Sender is not factory or owner");
        _;
    }

    /**
     * @notice used to withdraw the fee by the factory owner
     */
    function takeFee(uint256 _amount) public withPerm(FEE_ADMIN) returns(bool) {
        require(polyToken.transferFrom(securityToken, Ownable(factory).owner(), _amount), "Unable to take fee");
        return true;
    }
}

/**
 * @title Interface to be implemented by all Transfer Manager modules
 * @dev abstract contract
 */
contract ITransferManager is Module, Pausable {

    //If verifyTransfer returns:
    //  FORCE_VALID, the transaction will always be valid, regardless of other TM results
    //  INVALID, then the transfer should not be allowed regardless of other TM results
    //  VALID, then the transfer is valid for this TM
    //  NA, then the result from this TM is ignored
    enum Result {INVALID, NA, VALID, FORCE_VALID}

    function verifyTransfer(address _from, address _to, uint256 _amount, bytes _data, bool _isTransfer) public returns(Result);

    function unpause() public onlyOwner {
        super._unpause();
    }

    function pause() public onlyOwner {
        super._pause();
    }
}

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

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting '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;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  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).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @title Transfer Manager module for core transfer validation functionality
 */
contract GeneralTransferManager is ITransferManager {

    using SafeMath for uint256;

    //Address from which issuances come
    address public issuanceAddress = address(0);

    //Address which can sign whitelist changes
    address public signingAddress = address(0);

    bytes32 public constant WHITELIST = "WHITELIST";
    bytes32 public constant FLAGS = "FLAGS";

    //from and to timestamps that an investor can send / receive tokens respectively
    struct TimeRestriction {
        uint256 fromTime;
        uint256 toTime;
        uint256 expiryTime;
        bool canBuyFromSTO;
    }

    // An address can only send / receive tokens once their corresponding uint256 > block.number
    // (unless allowAllTransfers == true or allowAllWhitelistTransfers == true)
    mapping (address => TimeRestriction) public whitelist;
    // Map of used nonces by customer
    mapping(address => mapping(uint256 => bool)) public nonceMap;  

    //If true, there are no transfer restrictions, for any addresses
    bool public allowAllTransfers = false;
    //If true, time lock is ignored for transfers (address must still be on whitelist)
    bool public allowAllWhitelistTransfers = false;
    //If true, time lock is ignored for issuances (address must still be on whitelist)
    bool public allowAllWhitelistIssuances = true;
    //If true, time lock is ignored for burn transactions
    bool public allowAllBurnTransfers = false;

    // Emit when Issuance address get changed
    event ChangeIssuanceAddress(address _issuanceAddress);
    // Emit when there is change in the flag variable called allowAllTransfers
    event AllowAllTransfers(bool _allowAllTransfers);
    // Emit when there is change in the flag variable called allowAllWhitelistTransfers
    event AllowAllWhitelistTransfers(bool _allowAllWhitelistTransfers);
    // Emit when there is change in the flag variable called allowAllWhitelistIssuances
    event AllowAllWhitelistIssuances(bool _allowAllWhitelistIssuances);
    // Emit when there is change in the flag variable called allowAllBurnTransfers
    event AllowAllBurnTransfers(bool _allowAllBurnTransfers);
    // Emit when there is change in the flag variable called signingAddress
    event ChangeSigningAddress(address _signingAddress);
    // Emit when investor details get modified related to their whitelisting
    event ModifyWhitelist(
        address _investor,
        uint256 _dateAdded,
        address _addedBy,
        uint256 _fromTime,
        uint256 _toTime,
        uint256 _expiryTime,
        bool _canBuyFromSTO
    );

    /**
     * @notice Constructor
     * @param _securityToken Address of the security token
     * @param _polyAddress Address of the polytoken
     */
    constructor (address _securityToken, address _polyAddress)
    public
    Module(_securityToken, _polyAddress)
    {
    }

    /**
     * @notice This function returns the signature of configure function
     */
    function getInitFunction() public pure returns (bytes4) {
        return bytes4(0);
    }

    /**
     * @notice Used to change the Issuance Address
     * @param _issuanceAddress new address for the issuance
     */
    function changeIssuanceAddress(address _issuanceAddress) public withPerm(FLAGS) {
        issuanceAddress = _issuanceAddress;
        emit ChangeIssuanceAddress(_issuanceAddress);
    }

    /**
     * @notice Used to change the Sigining Address
     * @param _signingAddress new address for the signing
     */
    function changeSigningAddress(address _signingAddress) public withPerm(FLAGS) {
        signingAddress = _signingAddress;
        emit ChangeSigningAddress(_signingAddress);
    }

    /**
     * @notice Used to change the flag
            true - It refers there are no transfer restrictions, for any addresses
            false - It refers transfers are restricted for all addresses.
     * @param _allowAllTransfers flag value
     */
    function changeAllowAllTransfers(bool _allowAllTransfers) public withPerm(FLAGS) {
        allowAllTransfers = _allowAllTransfers;
        emit AllowAllTransfers(_allowAllTransfers);
    }

    /**
     * @notice Used to change the flag
            true - It refers that time lock is ignored for transfers (address must still be on whitelist)
            false - It refers transfers are restricted for all addresses.
     * @param _allowAllWhitelistTransfers flag value
     */
    function changeAllowAllWhitelistTransfers(bool _allowAllWhitelistTransfers) public withPerm(FLAGS) {
        allowAllWhitelistTransfers = _allowAllWhitelistTransfers;
        emit AllowAllWhitelistTransfers(_allowAllWhitelistTransfers);
    }

    /**
     * @notice Used to change the flag
            true - It refers that time lock is ignored for issuances (address must still be on whitelist)
            false - It refers transfers are restricted for all addresses.
     * @param _allowAllWhitelistIssuances flag value
     */
    function changeAllowAllWhitelistIssuances(bool _allowAllWhitelistIssuances) public withPerm(FLAGS) {
        allowAllWhitelistIssuances = _allowAllWhitelistIssuances;
        emit AllowAllWhitelistIssuances(_allowAllWhitelistIssuances);
    }

    /**
     * @notice Used to change the flag
            true - It allow to burn the tokens
            false - It deactivate the burning mechanism.
     * @param _allowAllBurnTransfers flag value
     */
    function changeAllowAllBurnTransfers(bool _allowAllBurnTransfers) public withPerm(FLAGS) {
        allowAllBurnTransfers = _allowAllBurnTransfers;
        emit AllowAllBurnTransfers(_allowAllBurnTransfers);
    }

    /**
     * @notice Default implementation of verifyTransfer used by SecurityToken
     * If the transfer request comes from the STO, it only checks that the investor is in the whitelist
     * If the transfer request comes from a token holder, it checks that:
     * a) Both are on the whitelist
     * b) Seller's sale lockup period is over
     * c) Buyer's purchase lockup is over
     * @param _from Address of the sender
     * @param _to Address of the receiver
    */
    function verifyTransfer(address _from, address _to, uint256 /*_amount*/, bytes /* _data */, bool /* _isTransfer */) public returns(Result) {
        if (!paused) {
            if (allowAllTransfers) {
                //All transfers allowed, regardless of whitelist
                return Result.VALID;
            }
            if (allowAllBurnTransfers && (_to == address(0))) {
                return Result.VALID;
            }
            if (allowAllWhitelistTransfers) {
                //Anyone on the whitelist can transfer, regardless of time
                return (_onWhitelist(_to) && _onWhitelist(_from)) ? Result.VALID : Result.NA;
            }
            if (allowAllWhitelistIssuances && _from == issuanceAddress) {
                if (!whitelist[_to].canBuyFromSTO && _isSTOAttached()) {
                    return Result.NA;
                }
                return _onWhitelist(_to) ? Result.VALID : Result.NA;
            }
            //Anyone on the whitelist can transfer provided the blocknumber is large enough
            /*solium-disable-next-line security/no-block-members*/
            return ((_onWhitelist(_from) && whitelist[_from].fromTime <= now) &&
                (_onWhitelist(_to) && whitelist[_to].toTime <= now)) ? Result.VALID : Result.NA; /*solium-disable-line security/no-block-members*/
        }
        return Result.NA;
    }

    /**
    * @notice Adds or removes addresses from the whitelist.
    * @param _investor is the address to whitelist
    * @param _fromTime is the moment when the sale lockup period ends and the investor can freely sell his tokens
    * @param _toTime is the moment when the purchase lockup period ends and the investor can freely purchase tokens from others
    * @param _expiryTime is the moment till investors KYC will be validated. After that investor need to do re-KYC
    * @param _canBuyFromSTO is used to know whether the investor is restricted investor or not.
    */
    function modifyWhitelist(
        address _investor,
        uint256 _fromTime,
        uint256 _toTime,
        uint256 _expiryTime,
        bool _canBuyFromSTO
    )
        public
        withPerm(WHITELIST)
    {
        //Passing a _time == 0 into this function, is equivalent to removing the _investor from the whitelist
        whitelist[_investor] = TimeRestriction(_fromTime, _toTime, _expiryTime, _canBuyFromSTO);
        /*solium-disable-next-line security/no-block-members*/
        emit ModifyWhitelist(_investor, now, msg.sender, _fromTime, _toTime, _expiryTime, _canBuyFromSTO);
    }

    /**
    * @notice Adds or removes addresses from the whitelist.
    * @param _investors List of the addresses to whitelist
    * @param _fromTimes An array of the moment when the sale lockup period ends and the investor can freely sell his tokens
    * @param _toTimes An array of the moment when the purchase lockup period ends and the investor can freely purchase tokens from others
    * @param _expiryTimes An array of the moment till investors KYC will be validated. After that investor need to do re-KYC
    * @param _canBuyFromSTO An array of boolean values
    */
    function modifyWhitelistMulti(
        address[] _investors,
        uint256[] _fromTimes,
        uint256[] _toTimes,
        uint256[] _expiryTimes,
        bool[] _canBuyFromSTO
    ) public withPerm(WHITELIST) {
        require(_investors.length == _fromTimes.length, "Mismatched input lengths");
        require(_fromTimes.length == _toTimes.length, "Mismatched input lengths");
        require(_toTimes.length == _expiryTimes.length, "Mismatched input lengths");
        require(_canBuyFromSTO.length == _toTimes.length, "Mismatched input length");
        for (uint256 i = 0; i < _investors.length; i++) {
            modifyWhitelist(_investors[i], _fromTimes[i], _toTimes[i], _expiryTimes[i], _canBuyFromSTO[i]);
        }
    }

    /**
    * @notice Adds or removes addresses from the whitelist - can be called by anyone with a valid signature
    * @param _investor is the address to whitelist
    * @param _fromTime is the moment when the sale lockup period ends and the investor can freely sell his tokens
    * @param _toTime is the moment when the purchase lockup period ends and the investor can freely purchase tokens from others
    * @param _expiryTime is the moment till investors KYC will be validated. After that investor need to do re-KYC
    * @param _canBuyFromSTO is used to know whether the investor is restricted investor or not.
    * @param _validFrom is the time that this signature is valid from
    * @param _validTo is the time that this signature is valid until
    * @param _nonce nonce of signature (avoid replay attack)
    * @param _v issuer signature
    * @param _r issuer signature
    * @param _s issuer signature
    */
    function modifyWhitelistSigned(
        address _investor,
        uint256 _fromTime,
        uint256 _toTime,
        uint256 _expiryTime,
        bool _canBuyFromSTO,
        uint256 _validFrom,
        uint256 _validTo,
        uint256 _nonce,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) public {
        /*solium-disable-next-line security/no-block-members*/
        require(_validFrom <= now, "ValidFrom is too early");
        /*solium-disable-next-line security/no-block-members*/
        require(_validTo >= now, "ValidTo is too late");
        require(!nonceMap[_investor][_nonce], "Already used signature");
        nonceMap[_investor][_nonce] = true;
        bytes32 hash = keccak256(
            abi.encodePacked(this, _investor, _fromTime, _toTime, _expiryTime, _canBuyFromSTO, _validFrom, _validTo, _nonce)
        );
        _checkSig(hash, _v, _r, _s);
        //Passing a _time == 0 into this function, is equivalent to removing the _investor from the whitelist
        whitelist[_investor] = TimeRestriction(_fromTime, _toTime, _expiryTime, _canBuyFromSTO);
        /*solium-disable-next-line security/no-block-members*/
        emit ModifyWhitelist(_investor, now, msg.sender, _fromTime, _toTime, _expiryTime, _canBuyFromSTO);
    }

    /**
     * @notice Used to verify the signature
     */
    function _checkSig(bytes32 _hash, uint8 _v, bytes32 _r, bytes32 _s) internal view {
        //Check that the signature is valid
        //sig should be signing - _investor, _fromTime, _toTime & _expiryTime and be signed by the issuer address
        address signer = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)), _v, _r, _s);
        require(signer == Ownable(securityToken).owner() || signer == signingAddress, "Incorrect signer");
    }

    /**
     * @notice Internal function used to check whether the investor is in the whitelist or not
            & also checks whether the KYC of investor get expired or not
     * @param _investor Address of the investor
     */
    function _onWhitelist(address _investor) internal view returns(bool) {
        return (((whitelist[_investor].fromTime != 0) || (whitelist[_investor].toTime != 0)) &&
            (whitelist[_investor].expiryTime >= now)); /*solium-disable-line security/no-block-members*/
    }

    /**
     * @notice Internal function use to know whether the STO is attached or not
     */
    function _isSTOAttached() internal view returns(bool) {
        bool attached = ISecurityToken(securityToken).getModulesByType(3).length > 0;
        return attached;
    }

    /**
     * @notice Return the permissions flag that are associated with general trnasfer manager
     */
    function getPermissions() public view returns(bytes32[]) {
        bytes32[] memory allPermissions = new bytes32[](2);
        allPermissions[0] = WHITELIST;
        allPermissions[1] = FLAGS;
        return allPermissions;
    }

}

Contract ABI
[{"constant":false,"inputs":[{"name":"_investors","type":"address[]"},{"name":"_fromTimes","type":"uint256[]"},{"name":"_toTimes","type":"uint256[]"},{"name":"_expiryTimes","type":"uint256[]"},{"name":"_canBuyFromSTO","type":"bool[]"}],"name":"modifyWhitelistMulti","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allowAllBurnTransfers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitFunction","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"WHITELIST","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allowAllWhitelistTransfers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_allowAllTransfers","type":"bool"}],"name":"changeAllowAllTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_signingAddress","type":"address"}],"name":"changeSigningAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"takeFee","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"polyToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_allowAllWhitelistIssuances","type":"bool"}],"name":"changeAllowAllWhitelistIssuances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_allowAllWhitelistTransfers","type":"bool"}],"name":"changeAllowAllWhitelistTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"FLAGS","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"fromTime","type":"uint256"},{"name":"toTime","type":"uint256"},{"name":"expiryTime","type":"uint256"},{"name":"canBuyFromSTO","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"nonceMap","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allowAllTransfers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"signingAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"issuanceAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"securityToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPermissions","outputs":[{"name":"","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FEE_ADMIN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_fromTime","type":"uint256"},{"name":"_toTime","type":"uint256"},{"name":"_expiryTime","type":"uint256"},{"name":"_canBuyFromSTO","type":"bool"}],"name":"modifyWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"bytes"},{"name":"","type":"bool"}],"name":"verifyTransfer","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_issuanceAddress","type":"address"}],"name":"changeIssuanceAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allowAllWhitelistIssuances","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_allowAllBurnTransfers","type":"bool"}],"name":"changeAllowAllBurnTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_fromTime","type":"uint256"},{"name":"_toTime","type":"uint256"},{"name":"_expiryTime","type":"uint256"},{"name":"_canBuyFromSTO","type":"bool"},{"name":"_validFrom","type":"uint256"},{"name":"_validTo","type":"uint256"},{"name":"_nonce","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"modifyWhitelistSigned","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_securityToken","type":"address"},{"name":"_polyAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_issuanceAddress","type":"address"}],"name":"ChangeIssuanceAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_allowAllTransfers","type":"bool"}],"name":"AllowAllTransfers","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_allowAllWhitelistTransfers","type":"bool"}],"name":"AllowAllWhitelistTransfers","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_allowAllWhitelistIssuances","type":"bool"}],"name":"AllowAllWhitelistIssuances","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_allowAllBurnTransfers","type":"bool"}],"name":"AllowAllBurnTransfers","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_signingAddress","type":"address"}],"name":"ChangeSigningAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_investor","type":"address"},{"indexed":false,"name":"_dateAdded","type":"uint256"},{"indexed":false,"name":"_addedBy","type":"address"},{"indexed":false,"name":"_fromTime","type":"uint256"},{"indexed":false,"name":"_toTime","type":"uint256"},{"indexed":false,"name":"_expiryTime","type":"uint256"},{"indexed":false,"name":"_canBuyFromSTO","type":"bool"}],"name":"ModifyWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_timestammp","type":"uint256"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"Unpause","type":"event"}]

Contract Creation Code
60806040526002805460a060020a60ff021916905560038054600160a060020a03199081169091556004805490911690556007805463ff0000001962ffffff19909116620100001716905534801561005657600080fd5b506040516040806129f783398101604052805160209091015160018054600160a060020a03938416600160a060020a0319918216179091556000805482163317905560028054939092169216919091179055612940806100b76000396000f3006080604052600436106101665763ffffffff60e060020a6000350416630f28937c811461016b578063144b8afa146102a65780631613ec9d146102cf5780631bb7cc99146103195780632909a80e146103405780633f0547bb146103555780633f4ba83a1461036f5780634caaf45f146103845780635c975abb146103a55780635f7619a4146103ba5780636faa22a5146103d25780637ecc866f146104035780638456cb591461041d5780639332b62c146104325780639728538f1461044c5780639b19251a146104615780639ba0b7c0146104aa578063b1dd8111146104ce578063b3e82dc9146104e3578063b3fac8ce146104f8578063b84dfbd21461050d578063c3a07df614610522578063c45a015514610587578063d70afa961461059c578063d7604a78146105b1578063de6ee1bc146105e0578063e0c6815814610677578063e55d0f8b14610698578063e8a28d52146106ad578063f5c19231146106c7575b600080fd5b34801561017757600080fd5b50604080516020600480358082013583810280860185019096528085526102a495369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061070e9650505050505050565b005b3480156102b257600080fd5b506102bb610a9e565b604080519115158252519081900360200190f35b3480156102db57600080fd5b506102e4610aae565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b34801561032557600080fd5b5061032e610ab3565b60408051918252519081900360200190f35b34801561034c57600080fd5b506102bb610ac5565b34801561036157600080fd5b506102a46004351515610ad3565b34801561037b57600080fd5b506102a4610ca0565b34801561039057600080fd5b506102a4600160a060020a0360043516610d88565b3480156103b157600080fd5b506102bb610f6f565b3480156103c657600080fd5b506102bb600435610f7f565b3480156103de57600080fd5b506103e761129b565b60408051600160a060020a039092168252519081900360200190f35b34801561040f57600080fd5b506102a460043515156112aa565b34801561042957600080fd5b506102a4611481565b34801561043e57600080fd5b506102a46004351515611567565b34801561045857600080fd5b5061032e61173c565b34801561046d57600080fd5b50610482600160a060020a036004351661174b565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b3480156104b657600080fd5b506102bb600160a060020a0360043516602435611775565b3480156104da57600080fd5b506102bb611795565b3480156104ef57600080fd5b506103e761179e565b34801561050457600080fd5b506103e76117ad565b34801561051957600080fd5b506103e76117bc565b34801561052e57600080fd5b506105376117cb565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561057357818101518382015260200161055b565b505050509050019250505060405180910390f35b34801561059357600080fd5b506103e7611842565b3480156105a857600080fd5b5061032e611851565b3480156105bd57600080fd5b506102a4600160a060020a03600435166024356044356064356084351515611875565b3480156105ec57600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261065394600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750505050913515159250611b1e915050565b6040518082600381111561066357fe5b60ff16815260200191505060405180910390f35b34801561068357600080fd5b506102a4600160a060020a0360043516611c9c565b3480156106a457600080fd5b506102bb611e83565b3480156106b957600080fd5b506102a46004351515611e92565b3480156106d357600080fd5b506102a4600160a060020a0360043516602435604435606435608435151560a43560c43560e43560ff6101043516610124356101443561206b565b60006000805160206128d5833981519152600080600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561077557600080fd5b505af1158015610789573d6000803e3d6000fd5b505050506040513d602081101561079f57600080fd5b505160005433600160a060020a0392831681149450911614905081806107c25750805b8061085257506001546040805160e060020a638658b8b9028152336004820152306024820152604481018690529051600160a060020a0390921691638658b8b9916064808201926020929091908290030181600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b505050506040513d602081101561084f57600080fd5b50515b1515610896576040805160e560020a62461bcd02815260206004820152601760248201526000805160206128f5833981519152604482015290519081900360640190fd5b87518951146108ef576040805160e560020a62461bcd02815260206004820152601860248201527f4d69736d61746368656420696e707574206c656e677468730000000000000000604482015290519081900360640190fd5b8651885114610948576040805160e560020a62461bcd02815260206004820152601860248201527f4d69736d61746368656420696e707574206c656e677468730000000000000000604482015290519081900360640190fd5b85518751146109a1576040805160e560020a62461bcd02815260206004820152601860248201527f4d69736d61746368656420696e707574206c656e677468730000000000000000604482015290519081900360640190fd5b86518551146109fa576040805160e560020a62461bcd02815260206004820152601760248201527f4d69736d61746368656420696e707574206c656e677468000000000000000000604482015290519081900360640190fd5b600093505b8851841015610a9357610a888985815181101515610a1957fe5b906020019060200201518986815181101515610a3157fe5b906020019060200201518987815181101515610a4957fe5b906020019060200201518988815181101515610a6157fe5b906020019060200201518989815181101515610a7957fe5b90602001906020020151611875565b6001909301926109ff565b505050505050505050565b6007546301000000900460ff1681565b600090565b6000805160206128d583398151915281565b600754610100900460ff1681565b60d860020a64464c41475302600080600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610b3557600080fd5b505af1158015610b49573d6000803e3d6000fd5b505050506040513d6020811015610b5f57600080fd5b505160005433600160a060020a039283168114945091161490508180610b825750805b80610c1257506001546040805160e060020a638658b8b9028152336004820152306024820152604481018690529051600160a060020a0390921691638658b8b9916064808201926020929091908290030181600087803b158015610be557600080fd5b505af1158015610bf9573d6000803e3d6000fd5b505050506040513d6020811015610c0f57600080fd5b50515b1515610c56576040805160e560020a62461bcd02815260206004820152601760248201526000805160206128f5833981519152604482015290519081900360640190fd5b6007805485151560ff19909116811790915560408051918252517fae2c9b7ebf181a59fcf3d24127f903b5b0345b3b81454442bebdee22b3aabde99181900360200190a150505050565b600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cf357600080fd5b505af1158015610d07573d6000803e3d6000fd5b505050506040513d6020811015610d1d57600080fd5b5051600160a060020a03163314610d7e576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b610d866123dc565b565b60d860020a64464c41475302600080600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610dea57600080fd5b505af1158015610dfe573d6000803e3d6000fd5b505050506040513d6020811015610e1457600080fd5b505160005433600160a060020a039283168114945091161490508180610e375750805b80610ec757506001546040805160e060020a638658b8b9028152336004820152306024820152604481018690529051600160a060020a0390921691638658b8b9916064808201926020929091908290030181600087803b158015610e9a57600080fd5b505af1158015610eae573d6000803e3d6000fd5b505050506040513d6020811015610ec457600080fd5b50515b1515610f0b576040805160e560020a62461bcd02815260206004820152601760248201526000805160206128f5833981519152604482015290519081900360640190fd5b60048054600160a060020a03861673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517f82ef67454f9b99f9e532e149d0fd486c3460e5b8cb68c47a3a95a2ffb8e1fe369181900360200190a150505050565b60025460a060020a900460ff1681565b60007f4645455f41444d494e0000000000000000000000000000000000000000000000600080600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610ff857600080fd5b505af115801561100c573d6000803e3d6000fd5b505050506040513d602081101561102257600080fd5b505160005433600160a060020a0392831681149450911614905081806110455750805b806110d557506001546040805160e060020a638658b8b9028152336004820152306024820152604481018690529051600160a060020a0390921691638658b8b9916064808201926020929091908290030181600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b505050506040513d60208110156110d257600080fd5b50515b1515611119576040805160e560020a62461bcd02815260206004820152601760248201526000805160206128f5833981519152604482015290519081900360640190fd5b60025460015460008054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600160a060020a03958616956323b872dd95811694931692638da5cb5b92600480820193602093909283900390910190829087803b15801561118d57600080fd5b505af11580156111a1573d6000803e3d6000fd5b505050506040513d60208110156111b757600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018990525160648083019260209291908290030181600087803b15801561120e57600080fd5b505af1158015611222573d6000803e3d6000fd5b505050506040513d602081101561123857600080fd5b50511515611290576040805160e560020a62461bcd02815260206004820152601260248201527f556e61626c6520746f2074616b65206665650000000000000000000000000000604482015290519081900360640190fd5b506001949350505050565b600254600160a060020a031681565b60d860020a64464c41475302600080600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b505160005433600160a060020a0392831681149450911614905081806113595750805b806113e957506001546040805160e060020a638658b8b9028152336004820152306024820152604481018690529051600160a060020a0390921691638658b8b9916064808201926020929091908290030181600087803b1580156113bc57600080fd5b505af11580156113d0573d6000803e3d6000fd5b505050506040513d60208110156113e657600080fd5b50515b151561142d576040805160e560020a62461bcd02815260206004820152601760248201526000805160206128f5833981519152604482015290519081900360640190fd5b6007805485151562010000810262ff0000199092169190911790915560408051918252517f83c2e8b0976b04b49f0e5828c064a239880ff3d68d2f14ffdd30a31bb734d1939181900360200190a150505050565b600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156114d457600080fd5b505af11580156114e8573d6000803e3d6000fd5b505050506040513d60208110156114fe57600080fd5b5051600160a060020a0316331461155f576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b610d86612492565b60d860020a64464c41475302600080600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156115c957600080fd5b505af11580156115dd573d6000803e3d6000fd5b505050506040513d60208110156115f357600080fd5b505160005433600160a060020a0392831681149450911614905081806116165750805b806116a657506001546040805160e060020a638658b8b9028152336004820152306024820152604481018690529051600160a060020a0390921691638658b8b9916064808201926020929091908290030181600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b505050506040513d60208110156116a357600080fd5b50515b15156116ea576040805160e560020a62461bcd02815260206004820152601760248201526000805160206128f5833981519152604482015290519081900360640190fd5b60078054851515610100810261ff00199092169190911790915560408051918252517f53a6bab5b50dfca289500469494dc3a8d40681a9e6f36feddcf52e56238e5b2f9181900360200190a150505050565b60d860020a64464c4147530281565b60056020526000908152604090208054600182015460028301546003909301549192909160ff1684565b600660209081526000928352604080842090915290825290205460ff1681565b60075460ff1681565b600454600160a060020a031681565b600354600160a060020a031681565b600154600160a060020a031681565b6040805160028082526060808301845292839291906020830190803883390190505090506000805160206128d583398151915281600081518110151561180d57fe5b60209081029091010152805160d860020a64464c41475302908290600190811061183357fe5b60209081029091010152905090565b600054600160a060020a031681565b7f4645455f41444d494e000000000000000000000000000000000000000000000081565b6000805160206128d5833981519152600080600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156118da57600080fd5b505af11580156118ee573d6000803e3d6000fd5b505050506040513d602081101561190457600080fd5b505160005433600160a060020a0392831681149450911614905081806119275750805b806119b757506001546040805160e060020a638658b8b9028152336004820152306024820152604481018690529051600160a060020a0390921691638658b8b9916064808201926020929091908290030181600087803b15801561198a57600080fd5b505af115801561199e573d6000803e3d6000fd5b505050506040513d60208110156119b457600080fd5b50515b15156119fb576040805160e560020a62461bcd02815260206004820152601760248201526000805160206128f5833981519152604482015290519081900360640190fd5b608060405190810160405280888152602001878152602001868152602001851515815250600560008a600160a060020a0316600160a060020a0316815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050507f82f858918377c2e6d8e7bff05724502b64b977f47a83aca1faaabf9036b1ef158842338a8a8a8a6040518088600160a060020a0316600160a060020a0316815260200187815260200186600160a060020a0316600160a060020a031681526020018581526020018481526020018381526020018215151515815260200197505050505050505060405180910390a15050505050505050565b60025460009060a060020a900460ff161515611c8f5760075460ff1615611b4757506002611c93565b6007546301000000900460ff168015611b675750600160a060020a038516155b15611b7457506002611c93565b600754610100900460ff1615611bb257611b8d8561254d565b8015611b9d5750611b9d8661254d565b611ba8576001611bab565b60025b9050611c93565b60075462010000900460ff168015611bd75750600354600160a060020a038781169116145b15611c2157600160a060020a03851660009081526005602052604090206003015460ff16158015611c0b5750611c0b6125ba565b15611c1857506001611c93565b611b9d8561254d565b611c2a8661254d565b8015611c4e5750600160a060020a0386166000908152600560205260409020544210155b8015611b9d5750611c5e8561254d565b8015611b9d5750600160a060020a038516600090815260056020526040902060010154421015611ba8576001611bab565b5060015b95945050505050565b60d860020a64464c41475302600080600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611cfe57600080fd5b505af1158015611d12573d6000803e3d6000fd5b505050506040513d6020811015611d2857600080fd5b505160005433600160a060020a039283168114945091161490508180611d4b5750805b80611ddb57506001546040805160e060020a638658b8b9028152336004820152306024820152604481018690529051600160a060020a0390921691638658b8b9916064808201926020929091908290030181600087803b158015611dae57600080fd5b505af1158015611dc2573d6000803e3d6000fd5b505050506040513d6020811015611dd857600080fd5b50515b1515611e1f576040805160e560020a62461bcd02815260206004820152601760248201526000805160206128f5833981519152604482015290519081900360640190fd5b60038054600160a060020a03861673ffffffffffffffffffffffffffffffffffffffff19909116811790915560408051918252517fc2f94c1edade7e889be574a1c807f58a5f5e38d4f75da71514d59777c1811bce9181900360200190a150505050565b60075462010000900460ff1681565b60d860020a64464c41475302600080600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611ef457600080fd5b505af1158015611f08573d6000803e3d6000fd5b505050506040513d6020811015611f1e57600080fd5b505160005433600160a060020a039283168114945091161490508180611f415750805b80611fd157506001546040805160e060020a638658b8b9028152336004820152306024820152604481018690529051600160a060020a0390921691638658b8b9916064808201926020929091908290030181600087803b158015611fa457600080fd5b505af1158015611fb8573d6000803e3d6000fd5b505050506040513d6020811015611fce57600080fd5b50515b1515612015576040805160e560020a62461bcd02815260206004820152601760248201526000805160206128f5833981519152604482015290519081900360640190fd5b600780548515156301000000810263ff000000199092169190911790915560408051918252517f9fe8a9db1e7351be9db0119ccb2556d18d98181683fc59d9556fbc510a844be29181900360200190a150505050565b6000428711156120c5576040805160e560020a62461bcd02815260206004820152601660248201527f56616c696446726f6d20697320746f6f206561726c7900000000000000000000604482015290519081900360640190fd5b4286101561211d576040805160e560020a62461bcd02815260206004820152601360248201527f56616c6964546f20697320746f6f206c61746500000000000000000000000000604482015290519081900360640190fd5b600160a060020a038c16600090815260066020908152604080832088845290915290205460ff1615612199576040805160e560020a62461bcd02815260206004820152601660248201527f416c72656164792075736564207369676e617475726500000000000000000000604482015290519081900360640190fd5b600160a060020a038c166000818152600660209081526040808320898452825291829020805460ff1916600117905581516c01000000000000000000000000308102828401529093026034840152604883018e9052606883018d9052608883018c90527f01000000000000000000000000000000000000000000000000000000000000008b15150260a884015260a983018a905260c9830189905260e98084018990528251808503909101815261010990930191829052825182918401908083835b6020831061227a5780518252601f19909201916020918201910161225b565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902090506122b5818585856126bb565b6080604051908101604052808c81526020018b81526020018a8152602001891515815250600560008e600160a060020a0316600160a060020a0316815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050507f82f858918377c2e6d8e7bff05724502b64b977f47a83aca1faaabf9036b1ef158c42338e8e8e8e6040518088600160a060020a0316600160a060020a0316815260200187815260200186600160a060020a0316600160a060020a031681526020018581526020018481526020018381526020018215151515815260200197505050505050505060405180910390a1505050505050505050505050565b60025460a060020a900460ff16151561243f576040805160e560020a62461bcd02815260206004820152601660248201527f436f6e7472616374206973206e6f742070617573656400000000000000000000604482015290519081900360640190fd5b6002805474ff0000000000000000000000000000000000000000191690556040805142815290517faaa520fdd7d2c83061d632fa017b0432407e798818af63ea908589fceda39ab79181900360200190a1565b60025460a060020a900460ff16156124f4576040805160e560020a62461bcd02815260206004820152601260248201527f436f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a1790556040805142815290517f68b095021b1f40fe513109f513c66692f0b3219aee674a69f4efc57badb8201d9181900360200190a1565b600160a060020a03811660009081526005602052604081205415158061258d5750600160a060020a03821660009081526005602052604090206001015415155b80156125b45750600160a060020a0382166000908152600560205260409020600201544211155b92915050565b600154604080517fac90b42200000000000000000000000000000000000000000000000000000000815260036004820152905160009283928392600160a060020a039092169163ac90b42291602480820192869290919082900301818387803b15801561262657600080fd5b505af115801561263a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561266357600080fd5b81019080805164010000000081111561267b57600080fd5b8201602081018481111561268e57600080fd5b81518560208202830111640100000000821117156126ab57600080fd5b5050519390931195945050505050565b600060018560405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061273e5780518252601f19909201916020918201910161271f565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008084528383018087529190915260ff8c1683860152606083018b9052608083018a9052935160a08084019750919550601f1981019492819003909101925090865af11580156127ba573d6000803e3d6000fd5b505060408051601f198101516001547f8da5cb5b0000000000000000000000000000000000000000000000000000000083529251909450600160a060020a039092169250638da5cb5b9160048083019260209291908290030181600087803b15801561282557600080fd5b505af1158015612839573d6000803e3d6000fd5b505050506040513d602081101561284f57600080fd5b5051600160a060020a03828116911614806128775750600454600160a060020a038281169116145b15156128cd576040805160e560020a62461bcd02815260206004820152601060248201527f496e636f7272656374207369676e657200000000000000000000000000000000604482015290519081900360640190fd5b5050505050560057484954454c49535400000000000000000000000000000000000000000000005065726d697373696f6e20636865636b206661696c6564000000000000000000a165627a7a72305820ea4a6e921ba41b7343c8682b3545240298fbbf9af2086887e8db8e63110958a600290000000000000000000000004b604cdaf7354eaf23cb33d283a647dd46601772000000000000000000000000b347b9f5b56b431b2cf4e1d90a5995f7519ca792


   Swarm Source:
bzzr://ea4a6e921ba41b7343c8682b3545240298fbbf9af2086887e8db8e63110958a6
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward