Contract 0x9106d7fbbd2996ef787913876341d0070cbdfc95

Contract Overview

Balance:
0 Ether

Latest 25 internal transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0x17ef397ba736e9cdf7b47659476e3ceb98bf4ac00x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950x9489d5568f0cc6905fd2fe9ddddfaed82c08e9ae0 Ether
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950xb004ff6893b95dc8a19b9e09b2920a44a609bae30 Ether
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950xb004ff6893b95dc8a19b9e09b2920a44a609bae30 Ether
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950xb347b9f5b56b431b2cf4e1d90a5995f7519ca7920 Ether
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0x17ef397ba736e9cdf7b47659476e3ceb98bf4ac00x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0x17ef397ba736e9cdf7b47659476e3ceb98bf4ac00x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0x17ef397ba736e9cdf7b47659476e3ceb98bf4ac00x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0xde6d19d7a68d453244227b6ccc5d8e6c2314627a0x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x78b1074d603cfcbe91767ef94501fdecaa1e4ff59c05065e2cb1e535337fedd01058990344 mins ago0xde6d19d7a68d453244227b6ccc5d8e6c2314627a0x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x2fa978d5958b63a1798a6f69bae6d3c3f26b6bf0458ba26c3fb1d14c1a8a05301058347623 hrs 4 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950xb004ff6893b95dc8a19b9e09b2920a44a609bae30 Ether
0x2fa978d5958b63a1798a6f69bae6d3c3f26b6bf0458ba26c3fb1d14c1a8a05301058347623 hrs 4 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950xb004ff6893b95dc8a19b9e09b2920a44a609bae30 Ether
0x2fa978d5958b63a1798a6f69bae6d3c3f26b6bf0458ba26c3fb1d14c1a8a05301058347623 hrs 4 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950xb347b9f5b56b431b2cf4e1d90a5995f7519ca7920 Ether
0x2fa978d5958b63a1798a6f69bae6d3c3f26b6bf0458ba26c3fb1d14c1a8a05301058347623 hrs 4 mins ago0x063da60798b37dfb4c70f85e5eb84b2bee0494020x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x2fa978d5958b63a1798a6f69bae6d3c3f26b6bf0458ba26c3fb1d14c1a8a05301058347623 hrs 4 mins ago0x063da60798b37dfb4c70f85e5eb84b2bee0494020x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x2fa978d5958b63a1798a6f69bae6d3c3f26b6bf0458ba26c3fb1d14c1a8a05301058347623 hrs 4 mins ago0x063da60798b37dfb4c70f85e5eb84b2bee0494020x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x2fa978d5958b63a1798a6f69bae6d3c3f26b6bf0458ba26c3fb1d14c1a8a05301058347623 hrs 4 mins ago0xde6d19d7a68d453244227b6ccc5d8e6c2314627a0x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x2fa978d5958b63a1798a6f69bae6d3c3f26b6bf0458ba26c3fb1d14c1a8a05301058347623 hrs 4 mins ago0xde6d19d7a68d453244227b6ccc5d8e6c2314627a0x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x618a9c6f8b668066e82a523c7cede3fd5a75a36e8659cd6e5e7a0f9e81c982e9105831231 day 50 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950xb004ff6893b95dc8a19b9e09b2920a44a609bae30 Ether
0x618a9c6f8b668066e82a523c7cede3fd5a75a36e8659cd6e5e7a0f9e81c982e9105831231 day 50 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950xb004ff6893b95dc8a19b9e09b2920a44a609bae30 Ether
0x618a9c6f8b668066e82a523c7cede3fd5a75a36e8659cd6e5e7a0f9e81c982e9105831231 day 50 mins ago0x9106d7fbbd2996ef787913876341d0070cbdfc950xb347b9f5b56b431b2cf4e1d90a5995f7519ca7920 Ether
0x618a9c6f8b668066e82a523c7cede3fd5a75a36e8659cd6e5e7a0f9e81c982e9105831231 day 50 mins ago0x063da60798b37dfb4c70f85e5eb84b2bee0494020x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x618a9c6f8b668066e82a523c7cede3fd5a75a36e8659cd6e5e7a0f9e81c982e9105831231 day 50 mins ago0x063da60798b37dfb4c70f85e5eb84b2bee0494020x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x618a9c6f8b668066e82a523c7cede3fd5a75a36e8659cd6e5e7a0f9e81c982e9105831231 day 50 mins ago0x063da60798b37dfb4c70f85e5eb84b2bee0494020x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
0x618a9c6f8b668066e82a523c7cede3fd5a75a36e8659cd6e5e7a0f9e81c982e9105831231 day 50 mins ago0xde6d19d7a68d453244227b6ccc5d8e6c2314627a0x9106d7fbbd2996ef787913876341d0070cbdfc950 Ether
[ 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 0x01c17f387224148931ce03788e61836e7fe5d753

Contract Name:
USDTieredSTOFactory

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes

Runs (Optimizer):
200

Contract Source Code

pragma solidity ^0.4.24;

/**
 * @title Interface for security token proxy deployment
 */
interface IUSDTieredSTOProxy {

   /**
     * @notice Deploys the STO.
     * @param _securityToken Contract address of the securityToken
     * @param _polyAddress Contract address of the PolyToken
     * @param _factoryAddress Contract address of the factory 
     * @return address Address of the deployed STO
     */
    function deploySTO(address _securityToken, address _polyAddress, address _factoryAddress) external returns (address);
    
     /**
     * @notice Used to get the init function signature
     * @param _contractAddress Address of the STO contract
     * @return bytes4
     */
    function getInitFunction(address _contractAddress) external returns (bytes4);

}

/**
 * @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 Interface that every module factory contract should implement
 */
interface IModuleFactory {

    event ChangeFactorySetupFee(uint256 _oldSetupCost, uint256 _newSetupCost, address _moduleFactory);
    event ChangeFactoryUsageFee(uint256 _oldUsageCost, uint256 _newUsageCost, address _moduleFactory);
    event ChangeFactorySubscriptionFee(uint256 _oldSubscriptionCost, uint256 _newMonthlySubscriptionCost, address _moduleFactory);
    event GenerateModuleFromFactory(
        address _module,
        bytes32 indexed _moduleName,
        address indexed _moduleFactory,
        address _creator,
        uint256 _setupCost,
        uint256 _timestamp
    );
    event ChangeSTVersionBound(string _boundType, uint8 _major, uint8 _minor, uint8 _patch);

    //Should create an instance of the Module, or throw
    function deploy(bytes _data) external returns(address);

    /**
     * @notice Type of the Module factory
     */
    function getTypes() external view returns(uint8[]);

    /**
     * @notice Get the name of the Module
     */
    function getName() external view returns(bytes32);

    /**
     * @notice Returns the instructions associated with the module
     */
    function getInstructions() external view returns (string);

    /**
     * @notice Get the tags related to the module factory
     */
    function getTags() external view returns (bytes32[]);

    /**
     * @notice Used to change the setup fee
     * @param _newSetupCost New setup fee
     */
    function changeFactorySetupFee(uint256 _newSetupCost) external;

    /**
     * @notice Used to change the usage fee
     * @param _newUsageCost New usage fee
     */
    function changeFactoryUsageFee(uint256 _newUsageCost) external;

    /**
     * @notice Used to change the subscription fee
     * @param _newSubscriptionCost New subscription fee
     */
    function changeFactorySubscriptionFee(uint256 _newSubscriptionCost) external;

    /**
     * @notice Function use to change the lower and upper bound of the compatible version st
     * @param _boundType Type of bound
     * @param _newVersion New version array
     */
    function changeSTVersionBounds(string _boundType, uint8[] _newVersion) external;

   /**
     * @notice Get the setup cost of the module
     */
    function getSetupCost() external view returns (uint256);

    /**
     * @notice Used to get the lower bound
     * @return Lower bound
     */
    function getLowerSTVersionBounds() external view returns(uint8[]);

     /**
     * @notice Used to get the upper bound
     * @return Upper bound
     */
    function getUpperSTVersionBounds() external view returns(uint8[]);

}

/**
 * @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 Helper library use to compare or validate the semantic versions
 */

library VersionUtils {

    /**
     * @notice This function is used to validate the version submitted
     * @param _current Array holds the present version of ST
     * @param _new Array holds the latest version of the ST
     * @return bool
     */
    function isValidVersion(uint8[] _current, uint8[] _new) internal pure returns(bool) {
        bool[] memory _temp = new bool[](_current.length);
        uint8 counter = 0;
        for (uint8 i = 0; i < _current.length; i++) {
            if (_current[i] < _new[i])
                _temp[i] = true;
            else
                _temp[i] = false;
        }

        for (i = 0; i < _current.length; i++) {
            if (i == 0) {
                if (_current[i] <= _new[i])
                    if(_temp[0]) {
                        counter = counter + 3;
                        break;
                    } else
                        counter++;
                else
                    return false;
            } else {
                if (_temp[i-1])
                    counter++;
                else if (_current[i] <= _new[i])
                    counter++;
                else
                    return false;
            }
        }
        if (counter == _current.length)
            return true;
    }

    /**
     * @notice Used to compare the lower bound with the latest version
     * @param _version1 Array holds the lower bound of the version
     * @param _version2 Array holds the latest version of the ST
     * @return bool
     */
    function compareLowerBound(uint8[] _version1, uint8[] _version2) internal pure returns(bool) {
        require(_version1.length == _version2.length, "Input length mismatch");
        uint counter = 0;
        for (uint8 j = 0; j < _version1.length; j++) {
            if (_version1[j] == 0)
                counter ++;
        }
        if (counter != _version1.length) {
            counter = 0;
            for (uint8 i = 0; i < _version1.length; i++) {
                if (_version2[i] > _version1[i])
                    return true;
                else if (_version2[i] < _version1[i])
                    return false;
                else
                    counter++;
            }
            if (counter == _version1.length - 1)
                return true;
            else
                return false;
        } else
            return true;
    }

    /**
     * @notice Used to compare the upper bound with the latest version
     * @param _version1 Array holds the upper bound of the version
     * @param _version2 Array holds the latest version of the ST
     * @return bool
     */
    function compareUpperBound(uint8[] _version1, uint8[] _version2) internal pure returns(bool) {
        require(_version1.length == _version2.length, "Input length mismatch");
        uint counter = 0;
        for (uint8 j = 0; j < _version1.length; j++) {
            if (_version1[j] == 0)
                counter ++;
        }
        if (counter != _version1.length) {
            counter = 0;
            for (uint8 i = 0; i < _version1.length; i++) {
                if (_version1[i] > _version2[i])
                    return true;
                else if (_version1[i] < _version2[i])
                    return false;
                else
                    counter++;
            }
            if (counter == _version1.length - 1)
                return true;
            else
                return false;
        } else
            return true;
    }


    /**
     * @notice Used to pack the uint8[] array data into uint24 value
     * @param _major Major version
     * @param _minor Minor version
     * @param _patch Patch version
     */
    function pack(uint8 _major, uint8 _minor, uint8 _patch) internal pure returns(uint24) {
        return (uint24(_major) << 16) | (uint24(_minor) << 8) | uint24(_patch);
    }

    /**
     * @notice Used to convert packed data into uint8 array
     * @param _packedVersion Packed data
     */
    function unpack(uint24 _packedVersion) internal pure returns (uint8[]) {
        uint8[] memory _unpackVersion = new uint8[](3);
        _unpackVersion[0] = uint8(_packedVersion >> 16);
        _unpackVersion[1] = uint8(_packedVersion >> 8);
        _unpackVersion[2] = uint8(_packedVersion);
        return _unpackVersion;
    }


}

/**
 * @title Interface that any module factory contract should implement
 * @notice Contract is abstract
 */
contract ModuleFactory is IModuleFactory, Ownable {

    IERC20 public polyToken;
    uint256 public usageCost;
    uint256 public monthlySubscriptionCost;

    uint256 public setupCost;
    string public description;
    string public version;
    bytes32 public name;
    string public title;

    // @notice Allow only two variables to be stored
    // 1. lowerBound 
    // 2. upperBound
    // @dev (0.0.0 will act as the wildcard) 
    // @dev uint24 consists packed value of uint8 _major, uint8 _minor, uint8 _patch
    mapping(string => uint24) compatibleSTVersionRange;

    event ChangeFactorySetupFee(uint256 _oldSetupCost, uint256 _newSetupCost, address _moduleFactory);
    event ChangeFactoryUsageFee(uint256 _oldUsageCost, uint256 _newUsageCost, address _moduleFactory);
    event ChangeFactorySubscriptionFee(uint256 _oldSubscriptionCost, uint256 _newMonthlySubscriptionCost, address _moduleFactory);
    event GenerateModuleFromFactory(
        address _module,
        bytes32 indexed _moduleName,
        address indexed _moduleFactory,
        address _creator,
        uint256 _timestamp
    );
    event ChangeSTVersionBound(string _boundType, uint8 _major, uint8 _minor, uint8 _patch);

    /**
     * @notice Constructor
     * @param _polyAddress Address of the polytoken
     */
    constructor (address _polyAddress, uint256 _setupCost, uint256 _usageCost, uint256 _subscriptionCost) public {
        polyToken = IERC20(_polyAddress);
        setupCost = _setupCost;
        usageCost = _usageCost;
        monthlySubscriptionCost = _subscriptionCost;
    }

    /**
     * @notice Used to change the fee of the setup cost
     * @param _newSetupCost new setup cost
     */
    function changeFactorySetupFee(uint256 _newSetupCost) public onlyOwner {
        emit ChangeFactorySetupFee(setupCost, _newSetupCost, address(this));
        setupCost = _newSetupCost;
    }

    /**
     * @notice Used to change the fee of the usage cost
     * @param _newUsageCost new usage cost
     */
    function changeFactoryUsageFee(uint256 _newUsageCost) public onlyOwner {
        emit ChangeFactoryUsageFee(usageCost, _newUsageCost, address(this));
        usageCost = _newUsageCost;
    }

    /**
     * @notice Used to change the fee of the subscription cost
     * @param _newSubscriptionCost new subscription cost
     */
    function changeFactorySubscriptionFee(uint256 _newSubscriptionCost) public onlyOwner {
        emit ChangeFactorySubscriptionFee(monthlySubscriptionCost, _newSubscriptionCost, address(this));
        monthlySubscriptionCost = _newSubscriptionCost;

    }

    /**
     * @notice Updates the title of the ModuleFactory
     * @param _newTitle New Title that will replace the old one.
     */
    function changeTitle(string _newTitle) public onlyOwner {
        require(bytes(_newTitle).length > 0, "Invalid title");
        title = _newTitle;
    }

    /**
     * @notice Updates the description of the ModuleFactory
     * @param _newDesc New description that will replace the old one.
     */
    function changeDescription(string _newDesc) public onlyOwner {
        require(bytes(_newDesc).length > 0, "Invalid description");
        description = _newDesc;
    }

    /**
     * @notice Updates the name of the ModuleFactory
     * @param _newName New name that will replace the old one.
     */
    function changeName(bytes32 _newName) public onlyOwner {
        require(_newName != bytes32(0),"Invalid name");
        name = _newName;
    }

    /**
     * @notice Updates the version of the ModuleFactory
     * @param _newVersion New name that will replace the old one.
     */
    function changeVersion(string _newVersion) public onlyOwner {
        require(bytes(_newVersion).length > 0, "Invalid version");
        version = _newVersion;
    }

    /**
     * @notice Function use to change the lower and upper bound of the compatible version st
     * @param _boundType Type of bound
     * @param _newVersion new version array
     */
    function changeSTVersionBounds(string _boundType, uint8[] _newVersion) external onlyOwner {
        require(
            keccak256(abi.encodePacked(_boundType)) == keccak256(abi.encodePacked("lowerBound")) ||
            keccak256(abi.encodePacked(_boundType)) == keccak256(abi.encodePacked("upperBound")),
            "Must be a valid bound type"
        );
        require(_newVersion.length == 3);
        if (compatibleSTVersionRange[_boundType] != uint24(0)) { 
            uint8[] memory _currentVersion = VersionUtils.unpack(compatibleSTVersionRange[_boundType]);
            require(VersionUtils.isValidVersion(_currentVersion, _newVersion), "Failed because of in-valid version");
        }
        compatibleSTVersionRange[_boundType] = VersionUtils.pack(_newVersion[0], _newVersion[1], _newVersion[2]);
        emit ChangeSTVersionBound(_boundType, _newVersion[0], _newVersion[1], _newVersion[2]);
    }

    /**
     * @notice Used to get the lower bound
     * @return lower bound
     */
    function getLowerSTVersionBounds() external view returns(uint8[]) {
        return VersionUtils.unpack(compatibleSTVersionRange["lowerBound"]);
    }

    /**
     * @notice Used to get the upper bound
     * @return upper bound
     */
    function getUpperSTVersionBounds() external view returns(uint8[]) {
        return VersionUtils.unpack(compatibleSTVersionRange["upperBound"]);
    }

    /**
     * @notice Get the setup cost of the module
     */
    function getSetupCost() external view returns (uint256) {
        return setupCost;
    }

   /**
    * @notice Get the name of the Module
    */
    function getName() public view returns(bytes32) {
        return name;
    }

}

/**
 * @title Utility contract for reusable code
 */
library Util {

   /**
    * @notice Changes a string to upper case
    * @param _base String to change
    */
    function upper(string _base) internal pure returns (string) {
        bytes memory _baseBytes = bytes(_base);
        for (uint i = 0; i < _baseBytes.length; i++) {
            bytes1 b1 = _baseBytes[i];
            if (b1 >= 0x61 && b1 <= 0x7A) {
                b1 = bytes1(uint8(b1)-32);
            }
            _baseBytes[i] = b1;
        }
        return string(_baseBytes);
    }

    /**
     * @notice Changes the string into bytes32
     * @param _source String that need to convert into bytes32
     */
    /// Notice - Maximum Length for _source will be 32 chars otherwise returned bytes32 value will have lossy value.
    function stringToBytes32(string memory _source) internal pure returns (bytes32) {
        return bytesToBytes32(bytes(_source), 0);
    }

    /**
     * @notice Changes bytes into bytes32
     * @param _b Bytes that need to convert into bytes32
     * @param _offset Offset from which to begin conversion
     */
    /// Notice - Maximum length for _source will be 32 chars otherwise returned bytes32 value will have lossy value.
    function bytesToBytes32(bytes _b, uint _offset) internal pure returns (bytes32) {
        bytes32 result;

        for (uint i = 0; i < _b.length; i++) {
            result |= bytes32(_b[_offset + i] & 0xFF) >> (i * 8);
        }
        return result;
    }

    /**
     * @notice Changes the bytes32 into string
     * @param _source that need to convert into string
     */
    function bytes32ToString(bytes32 _source) internal pure returns (string result) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(_source) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }

    /**
     * @notice Gets function signature from _data
     * @param _data Passed data
     * @return bytes4 sig
     */
    function getSig(bytes _data) internal pure returns (bytes4 sig) {
        uint len = _data.length < 4 ? _data.length : 4;
        for (uint i = 0; i < len; i++) {
            sig = bytes4(uint(sig) + uint(_data[i]) * (2 ** (8 * (len - 1 - i))));
        }
    }


}

/**
 * @title Factory for deploying CappedSTO module
 */
contract USDTieredSTOFactory is ModuleFactory {

    address public USDTieredSTOProxyAddress;

    /**
     * @notice Constructor
     * @param _polyAddress Address of the polytoken
     */
    constructor (address _polyAddress, uint256 _setupCost, uint256 _usageCost, uint256 _subscriptionCost, address _proxyFactoryAddress) public
    ModuleFactory(_polyAddress, _setupCost, _usageCost, _subscriptionCost)
    {
        require(_proxyFactoryAddress != address(0), "0x address is not allowed");
        USDTieredSTOProxyAddress = _proxyFactoryAddress;
        version = "1.0.0";
        name = "USDTieredSTO";
        title = "USD Tiered STO";
        /*solium-disable-next-line max-len*/
        description = "It allows both accredited and non-accredited investors to contribute into the STO. Non-accredited investors will be capped at a maximum investment limit (as a default or specific to their jurisdiction). Tokens will be sold according to tiers sequentially & each tier has its own price and volume of tokens to sell. Upon receipt of funds (ETH, POLY or DAI), security tokens will automatically transfer to investor’s wallet address";
        compatibleSTVersionRange["lowerBound"] = VersionUtils.pack(uint8(0), uint8(0), uint8(0));
        compatibleSTVersionRange["upperBound"] = VersionUtils.pack(uint8(0), uint8(0), uint8(0));
    }

     /**
     * @notice Used to launch the Module with the help of factory
     * @return address Contract address of the Module
     */
    function deploy(bytes _data) external returns(address) {
        if(setupCost > 0)
            require(polyToken.transferFrom(msg.sender, owner, setupCost), "Sufficent Allowance is not provided");
        require(USDTieredSTOProxyAddress != address(0), "Proxy contract should be pre-set");
        //Check valid bytes - can only call module init function
        address usdTieredSTO = IUSDTieredSTOProxy(USDTieredSTOProxyAddress).deploySTO(msg.sender, address(polyToken), address(this));
        //Checks that _data is valid (not calling anything it shouldn't)
        require(Util.getSig(_data) == IUSDTieredSTOProxy(USDTieredSTOProxyAddress).getInitFunction(usdTieredSTO), "Invalid data");
        /*solium-disable-next-line security/no-low-level-calls*/
        require(address(usdTieredSTO).call(_data), "Unsuccessfull call");
        /*solium-disable-next-line security/no-block-members*/
        emit GenerateModuleFromFactory(usdTieredSTO, getName(), address(this), msg.sender, setupCost, now);
        return address(usdTieredSTO);
    }

    /**
     * @notice Type of the Module factory
     */
    function getTypes() external view returns(uint8[]) {
        uint8[] memory res = new uint8[](1);
        res[0] = 3;
        return res;
    }

    /**
     * @notice Returns the instructions associated with the module
     */
    function getInstructions() external view returns(string) {
        return "Initialises a USD tiered STO.";
    }

    /**
     * @notice Get the tags related to the module factory
     */
    function getTags() external view returns(bytes32[]) {
        bytes32[] memory availableTags = new bytes32[](4);
        availableTags[0] = "USD";
        availableTags[1] = "Tiered";
        availableTags[2] = "POLY";
        availableTags[3] = "ETH";
        return availableTags;
    }

}

Contract ABI

[{"constant":false,"inputs":[{"name":"_data","type":"bytes"}],"name":"deploy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"monthlySubscriptionCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getName","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newTitle","type":"string"}],"name":"changeTitle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newSubscriptionCost","type":"uint256"}],"name":"changeFactorySubscriptionFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"title","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newSetupCost","type":"uint256"}],"name":"changeFactorySetupFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newVersion","type":"string"}],"name":"changeVersion","outputs":[],"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":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"description","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"setupCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLowerSTVersionBounds","outputs":[{"name":"","type":"uint8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newName","type":"bytes32"}],"name":"changeName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTags","outputs":[{"name":"","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSetupCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newUsageCost","type":"uint256"}],"name":"changeFactoryUsageFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTypes","outputs":[{"name":"","type":"uint8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"usageCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"USDTieredSTOProxyAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInstructions","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDesc","type":"string"}],"name":"changeDescription","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getUpperSTVersionBounds","outputs":[{"name":"","type":"uint8[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_boundType","type":"string"},{"name":"_newVersion","type":"uint8[]"}],"name":"changeSTVersionBounds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_polyAddress","type":"address"},{"name":"_setupCost","type":"uint256"},{"name":"_usageCost","type":"uint256"},{"name":"_subscriptionCost","type":"uint256"},{"name":"_proxyFactoryAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldSetupCost","type":"uint256"},{"indexed":false,"name":"_newSetupCost","type":"uint256"},{"indexed":false,"name":"_moduleFactory","type":"address"}],"name":"ChangeFactorySetupFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldUsageCost","type":"uint256"},{"indexed":false,"name":"_newUsageCost","type":"uint256"},{"indexed":false,"name":"_moduleFactory","type":"address"}],"name":"ChangeFactoryUsageFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldSubscriptionCost","type":"uint256"},{"indexed":false,"name":"_newMonthlySubscriptionCost","type":"uint256"},{"indexed":false,"name":"_moduleFactory","type":"address"}],"name":"ChangeFactorySubscriptionFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_module","type":"address"},{"indexed":true,"name":"_moduleName","type":"bytes32"},{"indexed":true,"name":"_moduleFactory","type":"address"},{"indexed":false,"name":"_creator","type":"address"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"GenerateModuleFromFactory","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_boundType","type":"string"},{"indexed":false,"name":"_major","type":"uint8"},{"indexed":false,"name":"_minor","type":"uint8"},{"indexed":false,"name":"_patch","type":"uint8"}],"name":"ChangeSTVersionBound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_module","type":"address"},{"indexed":true,"name":"_moduleName","type":"bytes32"},{"indexed":true,"name":"_moduleFactory","type":"address"},{"indexed":false,"name":"_creator","type":"address"},{"indexed":false,"name":"_setupCost","type":"uint256"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"GenerateModuleFromFactory","type":"event"}]

Contract Creation Code

60806040523480156200001157600080fd5b5060405160a080620020af8339810160409081528151602083015191830151606084015160809094015160008054600160a060020a0319908116331790915560018054600160a060020a03808716919093161790556004859055600283905560038690559294919281161515620000e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f30782061646472657373206973206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b600a8054600160a060020a031916600160a060020a0383161790556040805180820190915260058082527f312e302e3000000000000000000000000000000000000000000000000000000060209092019182526200014a91600691620002ec565b507f55534454696572656453544f000000000000000000000000000000000000000060075560408051808201909152600e8082527f555344205469657265642053544f0000000000000000000000000000000000006020909201918252620001b591600891620002ec565b506101e0604051908101604052806101af815260200162001f006101af91398051620001ea91600591602090910190620002ec565b50620002076000808064010000000062001a8a620002d182021704565b604080517f6c6f776572426f756e640000000000000000000000000000000000000000000081526009600a820152905190819003602a019020805462ffffff9290921662ffffff19909216919091179055620002746000808064010000000062001a8a620002d182021704565b604080517f7570706572426f756e640000000000000000000000000000000000000000000081526009600a820152905190819003602a019020805462ffffff9290921662ffffff1990921691909117905550620003919350505050565b60ff9081169181166101000292166201000002919091171790565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200032f57805160ff19168380011785556200035f565b828001600101855582156200035f579182015b828111156200035f57825182559160200191906001019062000342565b506200036d92915062000371565b5090565b6200038e91905b808211156200036d576000815560010162000378565b90565b611b5f80620003a16000396000f30060806040526004361061014f5763ffffffff60e060020a600035041662774360811461015457806306184a251461019057806306fdde03146101b757806317d7de7c146101cc5780632dbe07c7146101e15780633ae192bd1461023c5780634a79d50c1461025457806354fd4d50146102de57806358a191c3146102f357806364bb432c1461030b5780636faa22a514610364578063715018a6146103795780637284e4161461038e5780637e363ffa146103a35780638677768f146103b8578063898855ed1461041d5780638da5cb5b14610435578063995d9ab71461044a578063a5e9d7c91461045f578063aac67b0514610474578063b4579d601461048c578063d54c4726146104a1578063d6a40076146104b6578063e0d54970146104cb578063e6120413146104e0578063f2fde38b14610539578063f78629991461055a578063fb9724561461056f575b600080fd5b34801561016057600080fd5b50610174600480356024810191013561059b565b60408051600160a060020a039092168252519081900360200190f35b34801561019c57600080fd5b506101a5610a22565b60408051918252519081900360200190f35b3480156101c357600080fd5b506101a5610a28565b3480156101d857600080fd5b506101a5610a2e565b3480156101ed57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261023a943694929360249392840191908190840183828082843750949750610a359650505050505050565b005b34801561024857600080fd5b5061023a600435610abc565b34801561026057600080fd5b50610269610b19565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102a357818101518382015260200161028b565b50505050905090810190601f1680156102d05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ea57600080fd5b50610269610ba7565b3480156102ff57600080fd5b5061023a600435610c02565b34801561031757600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261023a943694929360249392840191908190840183828082843750949750610c5f9650505050505050565b34801561037057600080fd5b50610174610ce2565b34801561038557600080fd5b5061023a610cf1565b34801561039a57600080fd5b50610269610d5d565b3480156103af57600080fd5b506101a5610db8565b3480156103c457600080fd5b506103cd610dbe565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104095781810151838201526020016103f1565b505050509050019250505060405180910390f35b34801561042957600080fd5b5061023a600435610e0e565b34801561044157600080fd5b50610174610e81565b34801561045657600080fd5b506103cd610e90565b34801561046b57600080fd5b506101a5610fa9565b34801561048057600080fd5b5061023a600435610faf565b34801561049857600080fd5b506103cd61100c565b3480156104ad57600080fd5b506101a5611058565b3480156104c257600080fd5b5061017461105e565b3480156104d757600080fd5b5061026961106d565b3480156104ec57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261023a9436949293602493928401919081908401838280828437509497506110a49650505050505050565b34801561054557600080fd5b5061023a600160a060020a0360043516611127565b34801561056657600080fd5b506103cd61114a565b34801561057b57600080fd5b5061023a6024600480358281019290820135918135918201910135611195565b600080600060045411156106d3576001546000805460048054604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523393810193909352600160a060020a03938416602484015260448301919091525191909316926323b872dd9260648083019360209390929083900390910190829087803b15801561062b57600080fd5b505af115801561063f573d6000803e3d6000fd5b505050506040513d602081101561065557600080fd5b505115156106d3576040805160e560020a62461bcd02815260206004820152602360248201527f537566666963656e7420416c6c6f77616e6365206973206e6f742070726f766960448201527f6465640000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600a54600160a060020a03161515610735576040805160e560020a62461bcd02815260206004820181905260248201527f50726f787920636f6e74726163742073686f756c64206265207072652d736574604482015290519081900360640190fd5b600a54600154604080517fb9f6f066000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a0392831660248201523060448201529051919092169163b9f6f0669160648083019260209291908290030181600087803b1580156107ac57600080fd5b505af11580156107c0573d6000803e3d6000fd5b505050506040513d60208110156107d657600080fd5b5051600a54604080517f6d91f826000000000000000000000000000000000000000000000000000000008152600160a060020a0380851660048301529151939450911691636d91f826916024808201926020929091908290030181600087803b15801561084257600080fd5b505af1158015610856573d6000803e3d6000fd5b505050506040513d602081101561086c57600080fd5b5051604080516020601f87018190048102820181019092528581527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909216916108c7918790879081908401838280828437506116d4945050505050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461093b576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420646174610000000000000000000000000000000000000000604482015290519081900360640190fd5b80600160a060020a03168484604051808383808284378201915050925050506000604051808303816000865af191505015156109c1576040805160e560020a62461bcd02815260206004820152601260248201527f556e7375636365737366756c6c2063616c6c0000000000000000000000000000604482015290519081900360640190fd5b306109ca610a2e565b60045460408051600160a060020a038616815233602082015280820192909252426060830152517fb68b4973fbce93f056103272c1f3f53b607527138d7e323b7b94f7ac169ebf779181900360800190a39392505050565b60035481565b60075481565b6007545b90565b600054600160a060020a03163314610a4c57600080fd5b8051600010610aa5576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c6964207469746c6500000000000000000000000000000000000000604482015290519081900360640190fd5b8051610ab8906008906020840190611aa5565b5050565b600054600160a060020a03163314610ad357600080fd5b60035460408051918252602082018390523082820152517fb14468ff50b0c356f5373be0ef0791de71449aaf8ac5ca096049b7ac79d0b1139181900360600190a1600355565b6008805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b9f5780601f10610b7457610100808354040283529160200191610b9f565b820191906000526020600020905b815481529060010190602001808311610b8257829003601f168201915b505050505081565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b9f5780601f10610b7457610100808354040283529160200191610b9f565b600054600160a060020a03163314610c1957600080fd5b60045460408051918252602082018390523082820152517f9672983540fb671cd7c0c946255b4dc769a3e557a25ef91ca7c98995c8d694b69181900360600190a1600455565b600054600160a060020a03163314610c7657600080fd5b8051600010610ccf576040805160e560020a62461bcd02815260206004820152600f60248201527f496e76616c69642076657273696f6e0000000000000000000000000000000000604482015290519081900360640190fd5b8051610ab8906006906020840190611aa5565b600154600160a060020a031681565b600054600160a060020a03163314610d0857600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6005805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b9f5780601f10610b7457610100808354040283529160200191610b9f565b60045481565b604080517f6c6f776572426f756e640000000000000000000000000000000000000000000081526009600a820152905190819003602a01902054606090610e099062ffffff16611755565b905090565b600054600160a060020a03163314610e2557600080fd5b801515610e7c576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c6964206e616d650000000000000000000000000000000000000000604482015290519081900360640190fd5b600755565b600054600160a060020a031681565b60408051600480825260a08201909252606091829190602082016080803883390190505090507f5553440000000000000000000000000000000000000000000000000000000000816000815181101515610ee657fe5b6020908102909101015280517f54696572656400000000000000000000000000000000000000000000000000009082906001908110610f2157fe5b6020908102909101015280517f504f4c59000000000000000000000000000000000000000000000000000000009082906002908110610f5c57fe5b6020908102909101015280517f45544800000000000000000000000000000000000000000000000000000000009082906003908110610f9757fe5b602090810290910101529050805b5090565b60045490565b600054600160a060020a03163314610fc657600080fd5b60025460408051918252602082018390523082820152517fc39ec4e85127e00b5b203f9c40814616d5977d8de85e6e0717e5ca4b0896206c9181900360600190a1600255565b60408051600180825281830190925260609182919060208083019080388339019050509050600381600081518110151561104257fe5b60ff909216602092830290910190910152905090565b60025481565b600a54600160a060020a031681565b60408051808201909152601d81527f496e697469616c69736573206120555344207469657265642053544f2e000000602082015290565b600054600160a060020a031633146110bb57600080fd5b8051600010611114576040805160e560020a62461bcd02815260206004820152601360248201527f496e76616c6964206465736372697074696f6e00000000000000000000000000604482015290519081900360640190fd5b8051610ab8906005906020840190611aa5565b600054600160a060020a0316331461113e57600080fd5b611147816117fa565b50565b604080517f7570706572426f756e640000000000000000000000000000000000000000000081526009600a820152905190819003602a01902054606090610e099062ffffff16611755565b600054606090600160a060020a031633146111af57600080fd5b60405160200180807f6c6f776572426f756e6400000000000000000000000000000000000000000000815250600a0190506040516020818303038152906040526040518082805190602001908083835b6020831061121e5780518252601f1990920191602091820191016111ff565b51815160209384036101000a600019018019909216911617905260405191909301819003812094508993508892019050808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b6020831061129c5780518252601f19909201916020918201910161127d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191614806113f4575060405160200180807f7570706572426f756e6400000000000000000000000000000000000000000000815250600a0190506040516020818303038152906040526040518082805190602001908083835b602083106113435780518252601f199092019160209182019101611324565b51815160209384036101000a600019018019909216911617905260405191909301819003812094508993508892019050808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083106113c15780518252601f1990920191602091820191016113a2565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916145b151561144a576040805160e560020a62461bcd02815260206004820152601a60248201527f4d75737420626520612076616c696420626f756e642074797065000000000000604482015290519081900360640190fd5b6003821461145757600080fd5b600062ffffff1660098686604051808383808284379091019485525050604051928390036020019092205462ffffff1692909214915061157d9050576114c860098686604051808383808284379091019485525050604051928390036020019092205462ffffff1691506117559050565b90506115018184848080602002602001604051908101604052809392919081815260200183836020028082843750611877945050505050565b151561157d576040805160e560020a62461bcd02815260206004820152602260248201527f4661696c65642062656361757365206f6620696e2d76616c696420766572736960448201527f6f6e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6115ce8383600081811061158d57fe5b9050602002013560ff168484600181811015156115a657fe5b9050602002013560ff168585600281811015156115bf57fe5b9050602002013560ff16611a8a565b6009868660405180838380828437909101948552505060405192839003602001909220805462ffffff9490941662ffffff1990941693909317909255507f5b67e16edaf7fc70c8d065ea6e70b97ed944d98fe593b04d682216615a3b04db905085858585600081811061163d57fe5b9050602002013560ff1686866001818110151561165657fe5b9050602002013560ff1687876002818110151561166f57fe5b9050602002013560ff1660405180806020018560ff1660ff1681526020018460ff1660ff1681526020018360ff1660ff168152602001828103825287878281815260200192508082843760405192018290039850909650505050505050a15050505050565b600080600060048451106116e95760046116ec565b83515b9150600090505b8181101561174e5780600183030360080260020a848281518110151561171557fe5b90602001015160f860020a900460f860020a0260f860020a9004028360e060020a90040160e060020a02925080806001019150506116f3565b5050919050565b6040805160038082526080820190925260609182919060208201838038833950508151919250506201000062ffffff851604908290600090811061179557fe5b60ff909216602092830290910190910152805161010062ffffff85160490829060019081106117c057fe5b60ff90921660209283029091019091015280518390829060029081106117e257fe5b60ff9092166020928302909101909101529050919050565b600160a060020a038116151561180f57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000606060008085516040519080825280602002602001820160405280156118a9578160200160208202803883390190505b50925060009150600090505b85518160ff16101561195557848160ff168151811015156118d257fe5b9060200190602002015160ff16868260ff168151811015156118f057fe5b9060200190602002015160ff16101561192a576001838260ff1681518110151561191657fe5b91151560209283029091019091015261194d565b6000838260ff1681518110151561193d57fe5b9115156020928302909101909101525b6001016118b5565b5060005b85518160ff161015611a705760ff811615156119f257848160ff1681518110151561198057fe5b9060200190602002015160ff16868260ff1681518110151561199e57fe5b6020908102909101015160ff16116119e4578260008151811015156119bf57fe5b90602001906020020151156119d957816003019150611a70565b6001909101906119ed565b60009350611a81565b611a68565b826001820360ff16815181101515611a0657fe5b9060200190602002015115611a2057600190910190611a68565b848160ff16815181101515611a3157fe5b9060200190602002015160ff16868260ff16815181101515611a4f57fe5b6020908102909101015160ff16116119e4576001909101905b600101611959565b85518260ff161415611a8157600193505b50505092915050565b60ff9081169181166101000292166201000002919091171790565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611ae657805160ff1916838001178555611b13565b82800160010185558215611b13579182015b82811115611b13578251825591602001919060010190611af8565b50610fa592610a329250905b80821115610fa55760008155600101611b1f5600a165627a7a72305820a1ec9e26d0917f6ee2f2ee0c04eb9e66b8d0133daa0ab2219e5b9269c76e5c700029497420616c6c6f777320626f7468206163637265646974656420616e64206e6f6e2d6163637265646974656420696e766573746f727320746f20636f6e7472696275746520696e746f207468652053544f2e204e6f6e2d6163637265646974656420696e766573746f72732077696c6c206265206361707065642061742061206d6178696d756d20696e766573746d656e74206c696d69742028617320612064656661756c74206f7220737065636966696320746f207468656972206a7572697364696374696f6e292e20546f6b656e732077696c6c20626520736f6c64206163636f7264696e6720746f2074696572732073657175656e7469616c6c792026206561636820746965722068617320697473206f776e20707269636520616e6420766f6c756d65206f6620746f6b656e7320746f2073656c6c2e2055706f6e2072656365697074206f662066756e647320284554482c20504f4c59206f7220444149292c20736563757269747920746f6b656e732077696c6c206175746f6d61746963616c6c79207472616e7366657220746f20696e766573746f72e28099732077616c6c65742061646472657373000000000000000000000000b06d72a24df50d4e2cac133b320c5e7de3ef94cb00000000000000000000000000000000000000000000152d02c7e14af68000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063d0371a3dfa419a50670770b55618f6b5269057

Swarm Source

bzzr://a1ec9e26d0917f6ee2f2ee0c04eb9e66b8d0133daa0ab2219e5b9269c76e5c70
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward