ETH Price: $3,396.23 (-1.07%)

Contract

0xE565711e7a59800e110c959E156121988E6F4704
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Remove Module131040212021-08-26 23:33:091188 days ago1630020789IN
0xE565711e...88E6F4704
0 ETH0.00547498106.40549257
Add Module131038702021-08-26 23:01:401188 days ago1630018900IN
0xE565711e...88E6F4704
0 ETH0.0055152171.75942326
Remove Module131036792021-08-26 22:18:111188 days ago1630016291IN
0xE565711e...88E6F4704
0 ETH0.0047660297.66039496
Add Module131034862021-08-26 21:33:361188 days ago1630013616IN
0xE565711e...88E6F4704
0 ETH0.0062461581.26977602
Add Module129459602021-08-02 12:33:281212 days ago1627907608IN
0xE565711e...88E6F4704
0 ETH0.0024594232
Remove Module129457902021-08-02 11:56:151212 days ago1627905375IN
0xE565711e...88E6F4704
0 ETH0.0007393926.62
Add Resource129448422021-08-02 8:17:301212 days ago1627892250IN
0xE565711e...88E6F4704
0 ETH0.003190432
Add Module129448382021-08-02 8:16:281212 days ago1627892188IN
0xE565711e...88E6F4704
0 ETH0.0024594232
Add Resource127876092021-07-08 15:50:531237 days ago1625759453IN
0xE565711e...88E6F4704
0 ETH0.0031405531.5
Add Module127876092021-07-08 15:50:531237 days ago1625759453IN
0xE565711e...88E6F4704
0 ETH0.0024209931.5
Add Module127743252021-07-06 14:09:371239 days ago1625580577IN
0xE565711e...88E6F4704
0 ETH0.0073014195
Remove Module127742232021-07-06 13:44:491239 days ago1625579089IN
0xE565711e...88E6F4704
0 ETH0.0023679795
Add Module127734302021-07-06 10:43:241239 days ago1625568204IN
0xE565711e...88E6F4704
0 ETH0.0059179877
Remove Module127733072021-07-06 10:20:321239 days ago1625566832IN
0xE565711e...88E6F4704
0 ETH0.00261723105
Remove Module127730382021-07-06 9:11:541239 days ago1625562714IN
0xE565711e...88E6F4704
0 ETH0.00150257
Add Module127730112021-07-06 9:05:431239 days ago1625562343IN
0xE565711e...88E6F4704
0 ETH0.0043808457
Initialize125979842021-06-09 3:40:541267 days ago1623210054IN
0xE565711e...88E6F4704
0 ETH0.0051983815.00000145
0x60806040125979482021-06-09 3:33:001267 days ago1623209580IN
 Create: Controller
0 ETH0.0358040215.00000145

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Controller

Compiler Version
v0.6.10+commit.00c0fcaf

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-09
*/

/**
 *Submitted for verification at hecoinfo.com on 2021-06-09
*/

// Sources flattened with hardhat v2.0.11 https://hardhat.org

// File @openzeppelin/contracts/token/ERC20/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File contracts/lib/AddressArrayUtils.sol

/*
    Copyright 2021 Cook Finance.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

/**
 * @title AddressArrayUtils
 * @author Cook Finance
 *
 * Utility functions to handle Address Arrays
 */
library AddressArrayUtils {

    /**
     * Finds the index of the first occurrence of the given element.
     * @param A The input array to search
     * @param a The value to find
     * @return Returns (index and isIn) for the first occurrence starting from index 0
     */
    function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {
        uint256 length = A.length;
        for (uint256 i = 0; i < length; i++) {
            if (A[i] == a) {
                return (i, true);
            }
        }
        return (uint256(-1), false);
    }

    /**
    * Returns true if the value is present in the list. Uses indexOf internally.
    * @param A The input array to search
    * @param a The value to find
    * @return Returns isIn for the first occurrence starting from index 0
    */
    function contains(address[] memory A, address a) internal pure returns (bool) {
        (, bool isIn) = indexOf(A, a);
        return isIn;
    }

    /**
    * Returns true if there are 2 elements that are the same in an array
    * @param A The input array to search
    * @return Returns boolean for the first occurrence of a duplicate
    */
    function hasDuplicate(address[] memory A) internal pure returns(bool) {
        require(A.length > 0, "A is empty");

        for (uint256 i = 0; i < A.length - 1; i++) {
            address current = A[i];
            for (uint256 j = i + 1; j < A.length; j++) {
                if (current == A[j]) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * @param A The input array to search
     * @param a The address to remove     
     * @return Returns the array with the object removed.
     */
    function remove(address[] memory A, address a)
        internal
        pure
        returns (address[] memory)
    {
        (uint256 index, bool isIn) = indexOf(A, a);
        if (!isIn) {
            revert("Address not in array.");
        } else {
            (address[] memory _A,) = pop(A, index);
            return _A;
        }
    }

    /**
     * @param A The input array to search
     * @param a The address to remove
     */
    function removeStorage(address[] storage A, address a)
        internal
    {
        (uint256 index, bool isIn) = indexOf(A, a);
        if (!isIn) {
            revert("Address not in array.");
        } else {
            uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here
            if (index != lastIndex) { A[index] = A[lastIndex]; }
            A.pop();
        }
    }

    /**
    * Removes specified index from array
    * @param A The input array to search
    * @param index The index to remove
    * @return Returns the new array and the removed entry
    */
    function pop(address[] memory A, uint256 index)
        internal
        pure
        returns (address[] memory, address)
    {
        uint256 length = A.length;
        require(index < A.length, "Index must be < A length");
        address[] memory newAddresses = new address[](length - 1);
        for (uint256 i = 0; i < index; i++) {
            newAddresses[i] = A[i];
        }
        for (uint256 j = index + 1; j < length; j++) {
            newAddresses[j - 1] = A[j];
        }
        return (newAddresses, A[index]);
    }

    /**
     * Returns the combination of the two arrays
     * @param A The first array
     * @param B The second array
     * @return Returns A extended by B
     */
    function extend(address[] memory A, address[] memory B) internal pure returns (address[] memory) {
        uint256 aLength = A.length;
        uint256 bLength = B.length;
        address[] memory newAddresses = new address[](aLength + bLength);
        for (uint256 i = 0; i < aLength; i++) {
            newAddresses[i] = A[i];
        }
        for (uint256 j = 0; j < bLength; j++) {
            newAddresses[aLength + j] = B[j];
        }
        return newAddresses;
    }

    /**
     * Validate that address and uint array lengths match. Validate address array is not empty
     * and contains no duplicate elements.
     *
     * @param A         Array of addresses
     * @param B         Array of uint
     */
    function validatePairsWithArray(address[] memory A, uint[] memory B) internal pure {
        require(A.length == B.length, "Array length mismatch");
        _validateLengthAndUniqueness(A);
    }

    /**
     * Validate that address and bool array lengths match. Validate address array is not empty
     * and contains no duplicate elements.
     *
     * @param A         Array of addresses
     * @param B         Array of bool
     */
    function validatePairsWithArray(address[] memory A, bool[] memory B) internal pure {
        require(A.length == B.length, "Array length mismatch");
        _validateLengthAndUniqueness(A);
    }

    /**
     * Validate that address and string array lengths match. Validate address array is not empty
     * and contains no duplicate elements.
     *
     * @param A         Array of addresses
     * @param B         Array of strings
     */
    function validatePairsWithArray(address[] memory A, string[] memory B) internal pure {
        require(A.length == B.length, "Array length mismatch");
        _validateLengthAndUniqueness(A);
    }

    /**
     * Validate that address array lengths match, and calling address array are not empty
     * and contain no duplicate elements.
     *
     * @param A         Array of addresses
     * @param B         Array of addresses
     */
    function validatePairsWithArray(address[] memory A, address[] memory B) internal pure {
        require(A.length == B.length, "Array length mismatch");
        _validateLengthAndUniqueness(A);
    }

    /**
     * Validate that address and bytes array lengths match. Validate address array is not empty
     * and contains no duplicate elements.
     *
     * @param A         Array of addresses
     * @param B         Array of bytes
     */
    function validatePairsWithArray(address[] memory A, bytes[] memory B) internal pure {
        require(A.length == B.length, "Array length mismatch");
        _validateLengthAndUniqueness(A);
    }

    /**
     * Validate address array is not empty and contains no duplicate elements.
     *
     * @param A          Array of addresses
     */
    function _validateLengthAndUniqueness(address[] memory A) internal pure {
        require(A.length > 0, "Array length must be > 0");
        require(!hasDuplicate(A), "Cannot duplicate addresses");
    }
}


// File contracts/protocol/Controller.sol

/*
    Copyright 2021 Cook Finance.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/


/**
 * @title Controller
 * @author Cook Finance
 *
 * Contract that houses state for approvals and system contracts such as added CKs,
 * modules, factories, resources (like price oracles), and protocol fee configurations.
 */
contract Controller is Ownable {
    using AddressArrayUtils for address[];

    /* ============ Events ============ */

    event FactoryAdded(address indexed _factory);
    event FactoryRemoved(address indexed _factory);
    event FeeEdited(address indexed _module, uint256 indexed _feeType, uint256 _feePercentage);
    event FeeRecipientChanged(address _newFeeRecipient);
    event ModuleAdded(address indexed _module);
    event ModuleRemoved(address indexed _module);
    event ResourceAdded(address indexed _resource, uint256 _id);
    event ResourceRemoved(address indexed _resource, uint256 _id);
    event CKAdded(address indexed _ckToken, address indexed _factory);
    event CKRemoved(address indexed _ckToken);

    /* ============ Modifiers ============ */

    /**
     * Throws if function is called by any address other than a valid factory.
     */
    modifier onlyFactory() {
        require(isFactory[msg.sender], "Only valid factories can call");
        _;
    }

    modifier onlyInitialized() {
        require(isInitialized, "Contract must be initialized.");
        _;
    }

    /* ============ State Variables ============ */

    // List of enabled CKs
    address[] public cks;
    // List of enabled factories of CKTokens
    address[] public factories;
    // List of enabled Modules; Modules extend the functionality of CKTokens
    address[] public modules;
    // List of enabled Resources; Resources provide data, functionality, or
    // permissions that can be drawn upon from Module, CKTokens or factories
    address[] public resources;

    // Mappings to check whether address is valid CK, Factory, Module or Resource
    mapping(address => bool) public isCK;
    mapping(address => bool) public isFactory;
    mapping(address => bool) public isModule;
    mapping(address => bool) public isResource;

    // Mapping of modules to fee types to fee percentage. A module can have multiple feeTypes
    // Fee is denominated in precise unit percentages (100% = 1e18, 1% = 1e16)
    mapping(address => mapping(uint256 => uint256)) public fees;

    // Mapping of resource ID to resource address, which allows contracts to fetch the correct
    // resource while providing an ID
    mapping(uint256 => address) public resourceId;

    // Recipient of protocol fees
    address public feeRecipient;

    // Return true if the controller is initialized
    bool public isInitialized;

    /* ============ Constructor ============ */

    /**
     * Initializes the initial fee recipient on deployment.
     *
     * @param _feeRecipient          Address of the initial protocol fee recipient
     */
    constructor(address _feeRecipient) public {
        feeRecipient = _feeRecipient;
    }

    /* ============ External Functions ============ */

    /**
     * Initializes any predeployed factories, modules, and resources post deployment. Note: This function can
     * only be called by the owner once to batch initialize the initial system contracts.
     *
     * @param _factories             List of factories to add
     * @param _modules               List of modules to add
     * @param _resources             List of resources to add
     * @param _resourceIds           List of resource IDs associated with the resources
     */
    function initialize(
        address[] memory _factories,
        address[] memory _modules,
        address[] memory _resources,
        uint256[] memory _resourceIds
    )
        external
        onlyOwner
    {
        require(!isInitialized, "Controller is already initialized");
        require(_resources.length == _resourceIds.length, "Array lengths do not match.");

        factories = _factories;
        modules = _modules;
        resources = _resources;

        // Loop through and initialize isModule, isFactory, and isResource mapping
        for (uint256 i = 0; i < _factories.length; i++) {
            require(_factories[i] != address(0), "Zero address submitted.");
            isFactory[_factories[i]] = true;
        }
        for (uint256 i = 0; i < _modules.length; i++) {
            require(_modules[i] != address(0), "Zero address submitted.");
            isModule[_modules[i]] = true;
        }

        for (uint256 i = 0; i < _resources.length; i++) {
            require(_resources[i] != address(0), "Zero address submitted.");
            require(resourceId[_resourceIds[i]] == address(0), "Resource ID already exists");
            isResource[_resources[i]] = true;
            resourceId[_resourceIds[i]] = _resources[i];
        }

        // Set to true to only allow initialization once
        isInitialized = true;
    }

    /**
     * PRIVILEGED FACTORY FUNCTION. Adds a newly deployed CKToken as an enabled CKToken.
     *
     * @param _ckToken               Address of the CKToken contract to add
     */
    function addCK(address _ckToken) external onlyInitialized onlyFactory {
        require(!isCK[_ckToken], "CK already exists");

        isCK[_ckToken] = true;

        cks.push(_ckToken);

        emit CKAdded(_ckToken, msg.sender);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to remove a CK
     *
     * @param _ckToken               Address of the CKToken contract to remove
     */
    function removeCK(address _ckToken) external onlyInitialized onlyOwner {
        require(isCK[_ckToken], "CK does not exist");

        cks = cks.remove(_ckToken);

        isCK[_ckToken] = false;

        emit CKRemoved(_ckToken);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to add a factory
     *
     * @param _factory               Address of the factory contract to add
     */
    function addFactory(address _factory) external onlyInitialized onlyOwner {
        require(!isFactory[_factory], "Factory already exists");

        isFactory[_factory] = true;

        factories.push(_factory);

        emit FactoryAdded(_factory);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to remove a factory
     *
     * @param _factory               Address of the factory contract to remove
     */
    function removeFactory(address _factory) external onlyInitialized onlyOwner {
        require(isFactory[_factory], "Factory does not exist");

        factories = factories.remove(_factory);

        isFactory[_factory] = false;

        emit FactoryRemoved(_factory);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to add a module
     *
     * @param _module               Address of the module contract to add
     */
    function addModule(address _module) external onlyInitialized onlyOwner {
        require(!isModule[_module], "Module already exists");

        isModule[_module] = true;

        modules.push(_module);

        emit ModuleAdded(_module);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to remove a module
     *
     * @param _module               Address of the module contract to remove
     */
    function removeModule(address _module) external onlyInitialized onlyOwner {
        require(isModule[_module], "Module does not exist");

        modules = modules.remove(_module);

        isModule[_module] = false;

        emit ModuleRemoved(_module);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to add a resource
     *
     * @param _resource               Address of the resource contract to add
     * @param _id                     New ID of the resource contract
     */
    function addResource(address _resource, uint256 _id) external onlyInitialized onlyOwner {
        require(!isResource[_resource], "Resource already exists");

        require(resourceId[_id] == address(0), "Resource ID already exists");

        isResource[_resource] = true;

        resourceId[_id] = _resource;

        resources.push(_resource);

        emit ResourceAdded(_resource, _id);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to remove a resource
     *
     * @param _id               ID of the resource contract to remove
     */
    function removeResource(uint256 _id) external onlyInitialized onlyOwner {
        address resourceToRemove = resourceId[_id];

        require(resourceToRemove != address(0), "Resource does not exist");

        resources = resources.remove(resourceToRemove);

        delete resourceId[_id];

        isResource[resourceToRemove] = false;

        emit ResourceRemoved(resourceToRemove, _id);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to add a fee to a module
     *
     * @param _module               Address of the module contract to add fee to
     * @param _feeType              Type of the fee to add in the module
     * @param _newFeePercentage     Percentage of fee to add in the module (denominated in preciseUnits eg 1% = 1e16)
     */
    function addFee(address _module, uint256 _feeType, uint256 _newFeePercentage) external onlyInitialized onlyOwner {
        require(isModule[_module], "Module does not exist");

        require(fees[_module][_feeType] == 0, "Fee type already exists on module");

        fees[_module][_feeType] = _newFeePercentage;

        emit FeeEdited(_module, _feeType, _newFeePercentage);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to edit a fee in an existing module
     *
     * @param _module               Address of the module contract to edit fee
     * @param _feeType              Type of the fee to edit in the module
     * @param _newFeePercentage     Percentage of fee to edit in the module (denominated in preciseUnits eg 1% = 1e16)
     */
    function editFee(address _module, uint256 _feeType, uint256 _newFeePercentage) external onlyInitialized onlyOwner {
        require(isModule[_module], "Module does not exist");

        require(fees[_module][_feeType] != 0, "Fee type does not exist on module");

        fees[_module][_feeType] = _newFeePercentage;

        emit FeeEdited(_module, _feeType, _newFeePercentage);
    }

    /**
     * PRIVILEGED GOVERNANCE FUNCTION. Allows governance to edit the protocol fee recipient
     *
     * @param _newFeeRecipient      Address of the new protocol fee recipient
     */
    function editFeeRecipient(address _newFeeRecipient) external onlyInitialized onlyOwner {
        require(_newFeeRecipient != address(0), "Address must not be 0");

        feeRecipient = _newFeeRecipient;

        emit FeeRecipientChanged(_newFeeRecipient);
    }

    /* ============ External Getter Functions ============ */

    function getModuleFee(
        address _moduleAddress,
        uint256 _feeType
    )
        external
        view
        returns (uint256)
    {
        return fees[_moduleAddress][_feeType];
    }

    function getFactories() external view returns (address[] memory) {
        return factories;
    }

    function getModules() external view returns (address[] memory) {
        return modules;
    }

    function getResources() external view returns (address[] memory) {
        return resources;
    }

    function getCKs() external view returns (address[] memory) {
        return cks;
    }

    /**
     * Check if a contract address is a module, CK, resource, factory or controller
     *
     * @param  _contractAddress           The contract address to check
     */
    function isSystemContract(address _contractAddress) external view returns (bool) {
        return (
            isCK[_contractAddress] ||
            isModule[_contractAddress] ||
            isResource[_contractAddress] ||
            isFactory[_contractAddress] ||
            _contractAddress == address(this)
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_ckToken","type":"address"},{"indexed":true,"internalType":"address","name":"_factory","type":"address"}],"name":"CKAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_ckToken","type":"address"}],"name":"CKRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_factory","type":"address"}],"name":"FactoryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_factory","type":"address"}],"name":"FactoryRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_module","type":"address"},{"indexed":true,"internalType":"uint256","name":"_feeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_feePercentage","type":"uint256"}],"name":"FeeEdited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newFeeRecipient","type":"address"}],"name":"FeeRecipientChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_module","type":"address"}],"name":"ModuleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_module","type":"address"}],"name":"ModuleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_resource","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"ResourceAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_resource","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"ResourceRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"_ckToken","type":"address"}],"name":"addCK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"addFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"},{"internalType":"uint256","name":"_feeType","type":"uint256"},{"internalType":"uint256","name":"_newFeePercentage","type":"uint256"}],"name":"addFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"}],"name":"addModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_resource","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"addResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cks","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"},{"internalType":"uint256","name":"_feeType","type":"uint256"},{"internalType":"uint256","name":"_newFeePercentage","type":"uint256"}],"name":"editFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeRecipient","type":"address"}],"name":"editFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"factories","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCKs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFactories","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_moduleAddress","type":"address"},{"internalType":"uint256","name":"_feeType","type":"uint256"}],"name":"getModuleFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getModules","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getResources","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_factories","type":"address[]"},{"internalType":"address[]","name":"_modules","type":"address[]"},{"internalType":"address[]","name":"_resources","type":"address[]"},{"internalType":"uint256[]","name":"_resourceIds","type":"uint256[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isCK","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isModule","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isResource","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"isSystemContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"modules","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ckToken","type":"address"}],"name":"removeCK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"removeFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"}],"name":"removeModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"removeResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"resourceId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"resources","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5060405162002a1f38038062002a1f8339818101604052602081101561003557600080fd5b5051600061004a6001600160e01b036100b916565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b80546001600160a01b0319166001600160a01b03929092169190911790556100bd565b3390565b61295280620000cd6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063792aa04f1161011a578063c5bb387b116100ad578063e5c8c9271161007c578063e5c8c927146107dc578063e65b0a4114610802578063e765ced61461080a578063f2fde38b14610827578063f36b9a9a1461084d576101fb565b8063c5bb387b1461073e578063dd2525d614610764578063e0b753171461078a578063e37f2b3f146107b6576101fb565b8063a0632461116100e9578063a0632461146104e1578063a3c5661514610507578063b2494df31461072e578063c1cc57b014610736576101fb565b8063792aa04f146104385780637e6cbb6a1461046457806381b2248a146104bc5780638da5cb5b146104d9576101fb565b806329ce1ec5116101925780634b37c73f116101615780634b37c73f146103bb578063672383c4146103e1578063715018a6146103fe57806376a5bcf614610406576101fb565b806329ce1ec51461035f578063392e53cd1461038557806342f6e3891461038d57806346904840146103b3576101fb565b8063201d4313116101ce578063201d4313146102a5578063207a9485146102de578063244d6daa14610304578063263a536214610321576101fb565b806301b98339146102005780630f04ba671461021f57806313bc6d4b146102595780631ed86f191461027f575b600080fd5b61021d6004803603602081101561021657600080fd5b503561087f565b005b6102456004803603602081101561023557600080fd5b50356001600160a01b0316610a8b565b604080519115158252519081900360200190f35b6102456004803603602081101561026f57600080fd5b50356001600160a01b0316610aa0565b61021d6004803603602081101561029557600080fd5b50356001600160a01b0316610b3e565b6102c2600480360360208110156102bb57600080fd5b5035610cde565b604080516001600160a01b039092168252519081900360200190f35b610245600480360360208110156102f457600080fd5b50356001600160a01b0316610d05565b6102c26004803603602081101561031a57600080fd5b5035610d1a565b61034d6004803603604081101561033757600080fd5b506001600160a01b038135169060200135610d27565b60408051918252519081900360200190f35b61021d6004803603602081101561037557600080fd5b50356001600160a01b0316610d44565b610245610ee5565b610245600480360360208110156103a357600080fd5b50356001600160a01b0316610ef5565b6102c2610f0a565b61021d600480360360208110156103d157600080fd5b50356001600160a01b0316610f19565b6102c2600480360360208110156103f757600080fd5b50356110f6565b61021d611103565b61021d6004803603606081101561041c57600080fd5b506001600160a01b0381351690602081013590604001356111af565b61034d6004803603604081101561044e57600080fd5b506001600160a01b038135169060200135611380565b61046c6113a8565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104a8578181015183820152602001610490565b505050509050019250505060405180910390f35b6102c2600480360360208110156104d257600080fd5b503561140b565b6102c2611418565b61021d600480360360208110156104f757600080fd5b50356001600160a01b0316611427565b61021d6004803603608081101561051d57600080fd5b810190602081018135600160201b81111561053757600080fd5b82018360208201111561054957600080fd5b803590602001918460208302840111600160201b8311171561056a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105b957600080fd5b8201836020820111156105cb57600080fd5b803590602001918460208302840111600160201b831117156105ec57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561063b57600080fd5b82018360208201111561064d57600080fd5b803590602001918460208302840111600160201b8311171561066e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106bd57600080fd5b8201836020820111156106cf57600080fd5b803590602001918460208302840111600160201b831117156106f057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611603945050505050565b61046c611abd565b61046c611b1d565b61021d6004803603602081101561075457600080fd5b50356001600160a01b0316611b7d565b61021d6004803603602081101561077a57600080fd5b50356001600160a01b0316611cd2565b61021d600480360360408110156107a057600080fd5b506001600160a01b038135169060200135611eaa565b610245600480360360208110156107cc57600080fd5b50356001600160a01b03166120e3565b61021d600480360360208110156107f257600080fd5b50356001600160a01b03166120f8565b61046c612297565b6102c26004803603602081101561082057600080fd5b50356122f7565b61021d6004803603602081101561083d57600080fd5b50356001600160a01b0316612312565b61021d6004803603606081101561086357600080fd5b506001600160a01b038135169060208101359060400135612414565b600b54600160a01b900460ff166108cb576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b6108d3612587565b6001600160a01b03166108e4611418565b6001600160a01b03161461092d576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6000818152600a60205260409020546001600160a01b031680610997576040805162461bcd60e51b815260206004820152601760248201527f5265736f7572636520646f6573206e6f74206578697374000000000000000000604482015290519081900360640190fd5b610a048160048054806020026020016040519081016040528092919081815260200182805480156109f157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109d3575b505050505061258b90919063ffffffff16565b8051610a18916004916020909101906127ca565b506000828152600a6020908152604080832080546001600160a01b03191690556001600160a01b0384168084526008835292819020805460ff19169055805185815290517fbc7961276d9fc2a4fe4fc4d817e48d15615364e5df46fa0d8fb45637582ae4f8929181900390910190a25050565b60066020526000908152604090205460ff1681565b6001600160a01b03811660009081526005602052604081205460ff1680610adf57506001600160a01b03821660009081526007602052604090205460ff165b80610b0257506001600160a01b03821660009081526008602052604090205460ff165b80610b2557506001600160a01b03821660009081526006602052604090205460ff165b80610b3857506001600160a01b03821630145b92915050565b600b54600160a01b900460ff16610b8a576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b610b92612587565b6001600160a01b0316610ba3611418565b6001600160a01b031614610bec576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610c52576040805162461bcd60e51b81526020600482015260156024820152744d6f64756c6520616c72656164792065786973747360581b604482015290519081900360640190fd5b6001600160a01b038116600081815260076020526040808220805460ff1916600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b03191684179055517fead6a006345da1073a106d5f32372d2d2204f46cb0b4bca8f5ebafcbbed12b8a9190a250565b60018181548110610ceb57fe5b6000918252602090912001546001600160a01b0316905081565b60086020526000908152604090205460ff1681565b60048181548110610ceb57fe5b600960209081526000928352604080842090915290825290205481565b600b54600160a01b900460ff16610d90576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b610d98612587565b6001600160a01b0316610da9611418565b6001600160a01b031614610df2576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526006602052604090205460ff1615610e59576040805162461bcd60e51b8152602060048201526016602482015275466163746f727920616c72656164792065786973747360501b604482015290519081900360640190fd5b6001600160a01b038116600081815260066020526040808220805460ff1916600190811790915560028054918201815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b03191684179055517f6fdc0147105e43e21da80a75b42d0fd464060d5e1a34b0cefbf0b4ccfc2e36a19190a250565b600b54600160a01b900460ff1681565b60076020526000908152604090205460ff1681565b600b546001600160a01b031681565b600b54600160a01b900460ff16610f65576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b610f6d612587565b6001600160a01b0316610f7e611418565b6001600160a01b031614610fc7576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526006602052604090205460ff1661102d576040805162461bcd60e51b8152602060048201526016602482015275119858dd1bdc9e48191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b6110988160028054806020026020016040519081016040528092919081815260200182805480156109f1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109d357505050505061258b90919063ffffffff16565b80516110ac916002916020909101906127ca565b506001600160a01b038116600081815260066020526040808220805460ff19169055517fafa2737b2090fa39c66b7348625f0c03726240f724defbc6216d679506f944419190a250565b60028181548110610ceb57fe5b61110b612587565b6001600160a01b031661111c611418565b6001600160a01b031614611165576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600b54600160a01b900460ff166111fb576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b611203612587565b6001600160a01b0316611214611418565b6001600160a01b03161461125d576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526007602052604090205460ff166112c2576040805162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526009602090815260408083208584529091529020546113215760405162461bcd60e51b815260040180806020018281038252602181526020018061287a6021913960400191505060405180910390fd5b6001600160a01b0383166000818152600960209081526040808320868452825291829020849055815184815291518593927f84d9943a841552627b79770783a3cfd4da8303efc30bd75b65d863bd909926e392908290030190a3505050565b6001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6060600280548060200260200160405190810160405280929190818152602001828054801561140057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113e2575b505050505090505b90565b60038181548110610ceb57fe5b6000546001600160a01b031690565b600b54600160a01b900460ff16611473576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b61147b612587565b6001600160a01b031661148c611418565b6001600160a01b0316146114d5576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1661153a576040805162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6115a58160038054806020026020016040519081016040528092919081815260200182805480156109f1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109d357505050505061258b90919063ffffffff16565b80516115b9916003916020909101906127ca565b506001600160a01b038116600081815260076020526040808220805460ff19169055517f0a1ee69f55c33d8467c69ca59ce2007a737a88603d75392972520bf67cb513b89190a250565b61160b612587565b6001600160a01b031661161c611418565b6001600160a01b031614611665576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b600b54600160a01b900460ff16156116ae5760405162461bcd60e51b81526004018080602001828103825260218152602001806128fc6021913960400191505060405180910390fd5b8051825114611704576040805162461bcd60e51b815260206004820152601b60248201527f4172726179206c656e6774687320646f206e6f74206d617463682e0000000000604482015290519081900360640190fd5b83516117179060029060208701906127ca565b50825161172b9060039060208601906127ca565b50815161173f9060049060208501906127ca565b5060005b845181101561180d5760006001600160a01b031685828151811061176357fe5b60200260200101516001600160a01b031614156117c1576040805162461bcd60e51b81526020600482015260176024820152762d32b9379030b2323932b9b99039bab136b4ba3a32b21760491b604482015290519081900360640190fd5b6001600660008784815181106117d357fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611743565b5060005b83518110156118db5760006001600160a01b031684828151811061183157fe5b60200260200101516001600160a01b0316141561188f576040805162461bcd60e51b81526020600482015260176024820152762d32b9379030b2323932b9b99039bab136b4ba3a32b21760491b604482015290519081900360640190fd5b6001600760008684815181106118a157fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611811565b5060005b8251811015611aa35760006001600160a01b03168382815181106118ff57fe5b60200260200101516001600160a01b0316141561195d576040805162461bcd60e51b81526020600482015260176024820152762d32b9379030b2323932b9b99039bab136b4ba3a32b21760491b604482015290519081900360640190fd5b60006001600160a01b0316600a600084848151811061197857fe5b6020908102919091018101518252810191909152604001600020546001600160a01b0316146119ee576040805162461bcd60e51b815260206004820152601a60248201527f5265736f7572636520494420616c726561647920657869737473000000000000604482015290519081900360640190fd5b600160086000858481518110611a0057fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550828181518110611a4b57fe5b6020026020010151600a6000848481518110611a6357fe5b602090810291909101810151825281019190915260400160002080546001600160a01b0319166001600160a01b03929092169190911790556001016118df565b5050600b805460ff60a01b1916600160a01b179055505050565b60606003805480602002602001604051908101604052809291908181526020018280548015611400576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113e2575050505050905090565b60606004805480602002602001604051908101604052809291908181526020018280548015611400576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113e2575050505050905090565b600b54600160a01b900460ff16611bc9576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b611bd1612587565b6001600160a01b0316611be2611418565b6001600160a01b031614611c2b576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b038116611c7e576040805162461bcd60e51b8152602060048201526015602482015274041646472657373206d757374206e6f74206265203605c1b604482015290519081900360640190fd5b600b80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f167cccccc6e9b2892a740ec13fc1e51d3de8ea384f25bd87fee7412d588637e29181900360200190a150565b600b54600160a01b900460ff16611d1e576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b611d26612587565b6001600160a01b0316611d37611418565b6001600160a01b031614611d80576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff16611de1576040805162461bcd60e51b815260206004820152601160248201527010d2c8191bd95cc81b9bdd08195e1a5cdd607a1b604482015290519081900360640190fd5b611e4c8160018054806020026020016040519081016040528092919081815260200182805480156109f1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109d357505050505061258b90919063ffffffff16565b8051611e60916001916020909101906127ca565b506001600160a01b038116600081815260056020526040808220805460ff19169055517fb7242aa278e90fff6643a17c14b6260d1c146189ce917f7a32427ed755c5ffbd9190a250565b600b54600160a01b900460ff16611ef6576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b611efe612587565b6001600160a01b0316611f0f611418565b6001600160a01b031614611f58576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526008602052604090205460ff1615611fc6576040805162461bcd60e51b815260206004820152601760248201527f5265736f7572636520616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b6000818152600a60205260409020546001600160a01b031615612030576040805162461bcd60e51b815260206004820152601a60248201527f5265736f7572636520494420616c726561647920657869737473000000000000604482015290519081900360640190fd5b6001600160a01b0382166000818152600860209081526040808320805460ff19166001908117909155858452600a835281842080546001600160a01b031990811687179091556004805492830181559094527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180549093168417909255815184815291517f5674036e091d8b4ee7f8e06cc71d41ee33f3fc331821fc0e017c1a091e8c861e9281900390910190a25050565b60056020526000908152604090205460ff1681565b600b54600160a01b900460ff16612144576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b3360009081526006602052604090205460ff166121a8576040805162461bcd60e51b815260206004820152601d60248201527f4f6e6c792076616c696420666163746f726965732063616e2063616c6c000000604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff161561220a576040805162461bcd60e51b8152602060048201526011602482015270434b20616c72656164792065786973747360781b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001908117909155805480820182559083527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b03191684179055513392917fcf07c02838e2c678715c09442864a71e040ed103d16693e932a4e063f6dd6e2b91a350565b60606001805480602002602001604051908101604052809291908181526020018280548015611400576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113e2575050505050905090565b600a602052600090815260409020546001600160a01b031681565b61231a612587565b6001600160a01b031661232b611418565b6001600160a01b031614612374576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b0381166123b95760405162461bcd60e51b81526004018080602001828103825260268152602001806128546026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600b54600160a01b900460ff16612460576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b612468612587565b6001600160a01b0316612479611418565b6001600160a01b0316146124c2576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526007602052604090205460ff16612527576040805162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600960209081526040808320858452909152902054156113215760405162461bcd60e51b815260040180806020018281038252602181526020018061289b6021913960400191505060405180910390fd5b3390565b606060008061259a8585612600565b91509150806125e8576040805162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604482015290519081900360640190fd5b60606125f48684612666565b509350610b3892505050565b81516000908190815b8181101561265357846001600160a01b031686828151811061262757fe5b60200260200101516001600160a01b0316141561264b5792506001915061265f9050565b600101612609565b50600019600092509250505b9250929050565b81516060906000908084106126c2576040805162461bcd60e51b815260206004820152601860248201527f496e646578206d757374206265203c2041206c656e6774680000000000000000604482015290519081900360640190fd5b60606001820367ffffffffffffffff811180156126de57600080fd5b50604051908082528060200260200182016040528015612708578160200160208202803683370190505b50905060005b858110156127565786818151811061272257fe5b602002602001015182828151811061273657fe5b6001600160a01b039092166020928302919091019091015260010161270e565b50600185015b828110156127a75786818151811061277057fe5b602002602001015182600183038151811061278757fe5b6001600160a01b039092166020928302919091019091015260010161275c565b50808686815181106127b557fe5b60200260200101519350935050509250929050565b82805482825590600052602060002090810192821561281f579160200282015b8281111561281f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906127ea565b5061282b92915061282f565b5090565b61140891905b8082111561282b5780546001600160a01b031916815560010161283556fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373466565207479706520646f6573206e6f74206578697374206f6e206d6f64756c65466565207479706520616c726561647920657869737473206f6e206d6f64756c654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e7472616374206d75737420626520696e697469616c697a65642e000000436f6e74726f6c6c657220697320616c726561647920696e697469616c697a6564a2646970667358221220e528174b41351920781a994b500fa383233901b16d19d011f669c5ae21d290e364736f6c634300060a0033000000000000000000000000eed8a32c99192794430383509465e5e360c74605

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063792aa04f1161011a578063c5bb387b116100ad578063e5c8c9271161007c578063e5c8c927146107dc578063e65b0a4114610802578063e765ced61461080a578063f2fde38b14610827578063f36b9a9a1461084d576101fb565b8063c5bb387b1461073e578063dd2525d614610764578063e0b753171461078a578063e37f2b3f146107b6576101fb565b8063a0632461116100e9578063a0632461146104e1578063a3c5661514610507578063b2494df31461072e578063c1cc57b014610736576101fb565b8063792aa04f146104385780637e6cbb6a1461046457806381b2248a146104bc5780638da5cb5b146104d9576101fb565b806329ce1ec5116101925780634b37c73f116101615780634b37c73f146103bb578063672383c4146103e1578063715018a6146103fe57806376a5bcf614610406576101fb565b806329ce1ec51461035f578063392e53cd1461038557806342f6e3891461038d57806346904840146103b3576101fb565b8063201d4313116101ce578063201d4313146102a5578063207a9485146102de578063244d6daa14610304578063263a536214610321576101fb565b806301b98339146102005780630f04ba671461021f57806313bc6d4b146102595780631ed86f191461027f575b600080fd5b61021d6004803603602081101561021657600080fd5b503561087f565b005b6102456004803603602081101561023557600080fd5b50356001600160a01b0316610a8b565b604080519115158252519081900360200190f35b6102456004803603602081101561026f57600080fd5b50356001600160a01b0316610aa0565b61021d6004803603602081101561029557600080fd5b50356001600160a01b0316610b3e565b6102c2600480360360208110156102bb57600080fd5b5035610cde565b604080516001600160a01b039092168252519081900360200190f35b610245600480360360208110156102f457600080fd5b50356001600160a01b0316610d05565b6102c26004803603602081101561031a57600080fd5b5035610d1a565b61034d6004803603604081101561033757600080fd5b506001600160a01b038135169060200135610d27565b60408051918252519081900360200190f35b61021d6004803603602081101561037557600080fd5b50356001600160a01b0316610d44565b610245610ee5565b610245600480360360208110156103a357600080fd5b50356001600160a01b0316610ef5565b6102c2610f0a565b61021d600480360360208110156103d157600080fd5b50356001600160a01b0316610f19565b6102c2600480360360208110156103f757600080fd5b50356110f6565b61021d611103565b61021d6004803603606081101561041c57600080fd5b506001600160a01b0381351690602081013590604001356111af565b61034d6004803603604081101561044e57600080fd5b506001600160a01b038135169060200135611380565b61046c6113a8565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104a8578181015183820152602001610490565b505050509050019250505060405180910390f35b6102c2600480360360208110156104d257600080fd5b503561140b565b6102c2611418565b61021d600480360360208110156104f757600080fd5b50356001600160a01b0316611427565b61021d6004803603608081101561051d57600080fd5b810190602081018135600160201b81111561053757600080fd5b82018360208201111561054957600080fd5b803590602001918460208302840111600160201b8311171561056a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105b957600080fd5b8201836020820111156105cb57600080fd5b803590602001918460208302840111600160201b831117156105ec57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561063b57600080fd5b82018360208201111561064d57600080fd5b803590602001918460208302840111600160201b8311171561066e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106bd57600080fd5b8201836020820111156106cf57600080fd5b803590602001918460208302840111600160201b831117156106f057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611603945050505050565b61046c611abd565b61046c611b1d565b61021d6004803603602081101561075457600080fd5b50356001600160a01b0316611b7d565b61021d6004803603602081101561077a57600080fd5b50356001600160a01b0316611cd2565b61021d600480360360408110156107a057600080fd5b506001600160a01b038135169060200135611eaa565b610245600480360360208110156107cc57600080fd5b50356001600160a01b03166120e3565b61021d600480360360208110156107f257600080fd5b50356001600160a01b03166120f8565b61046c612297565b6102c26004803603602081101561082057600080fd5b50356122f7565b61021d6004803603602081101561083d57600080fd5b50356001600160a01b0316612312565b61021d6004803603606081101561086357600080fd5b506001600160a01b038135169060208101359060400135612414565b600b54600160a01b900460ff166108cb576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b6108d3612587565b6001600160a01b03166108e4611418565b6001600160a01b03161461092d576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6000818152600a60205260409020546001600160a01b031680610997576040805162461bcd60e51b815260206004820152601760248201527f5265736f7572636520646f6573206e6f74206578697374000000000000000000604482015290519081900360640190fd5b610a048160048054806020026020016040519081016040528092919081815260200182805480156109f157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109d3575b505050505061258b90919063ffffffff16565b8051610a18916004916020909101906127ca565b506000828152600a6020908152604080832080546001600160a01b03191690556001600160a01b0384168084526008835292819020805460ff19169055805185815290517fbc7961276d9fc2a4fe4fc4d817e48d15615364e5df46fa0d8fb45637582ae4f8929181900390910190a25050565b60066020526000908152604090205460ff1681565b6001600160a01b03811660009081526005602052604081205460ff1680610adf57506001600160a01b03821660009081526007602052604090205460ff165b80610b0257506001600160a01b03821660009081526008602052604090205460ff165b80610b2557506001600160a01b03821660009081526006602052604090205460ff165b80610b3857506001600160a01b03821630145b92915050565b600b54600160a01b900460ff16610b8a576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b610b92612587565b6001600160a01b0316610ba3611418565b6001600160a01b031614610bec576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1615610c52576040805162461bcd60e51b81526020600482015260156024820152744d6f64756c6520616c72656164792065786973747360581b604482015290519081900360640190fd5b6001600160a01b038116600081815260076020526040808220805460ff1916600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b03191684179055517fead6a006345da1073a106d5f32372d2d2204f46cb0b4bca8f5ebafcbbed12b8a9190a250565b60018181548110610ceb57fe5b6000918252602090912001546001600160a01b0316905081565b60086020526000908152604090205460ff1681565b60048181548110610ceb57fe5b600960209081526000928352604080842090915290825290205481565b600b54600160a01b900460ff16610d90576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b610d98612587565b6001600160a01b0316610da9611418565b6001600160a01b031614610df2576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526006602052604090205460ff1615610e59576040805162461bcd60e51b8152602060048201526016602482015275466163746f727920616c72656164792065786973747360501b604482015290519081900360640190fd5b6001600160a01b038116600081815260066020526040808220805460ff1916600190811790915560028054918201815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b03191684179055517f6fdc0147105e43e21da80a75b42d0fd464060d5e1a34b0cefbf0b4ccfc2e36a19190a250565b600b54600160a01b900460ff1681565b60076020526000908152604090205460ff1681565b600b546001600160a01b031681565b600b54600160a01b900460ff16610f65576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b610f6d612587565b6001600160a01b0316610f7e611418565b6001600160a01b031614610fc7576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526006602052604090205460ff1661102d576040805162461bcd60e51b8152602060048201526016602482015275119858dd1bdc9e48191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b6110988160028054806020026020016040519081016040528092919081815260200182805480156109f1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109d357505050505061258b90919063ffffffff16565b80516110ac916002916020909101906127ca565b506001600160a01b038116600081815260066020526040808220805460ff19169055517fafa2737b2090fa39c66b7348625f0c03726240f724defbc6216d679506f944419190a250565b60028181548110610ceb57fe5b61110b612587565b6001600160a01b031661111c611418565b6001600160a01b031614611165576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600b54600160a01b900460ff166111fb576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b611203612587565b6001600160a01b0316611214611418565b6001600160a01b03161461125d576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526007602052604090205460ff166112c2576040805162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526009602090815260408083208584529091529020546113215760405162461bcd60e51b815260040180806020018281038252602181526020018061287a6021913960400191505060405180910390fd5b6001600160a01b0383166000818152600960209081526040808320868452825291829020849055815184815291518593927f84d9943a841552627b79770783a3cfd4da8303efc30bd75b65d863bd909926e392908290030190a3505050565b6001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6060600280548060200260200160405190810160405280929190818152602001828054801561140057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113e2575b505050505090505b90565b60038181548110610ceb57fe5b6000546001600160a01b031690565b600b54600160a01b900460ff16611473576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b61147b612587565b6001600160a01b031661148c611418565b6001600160a01b0316146114d5576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526007602052604090205460ff1661153a576040805162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6115a58160038054806020026020016040519081016040528092919081815260200182805480156109f1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109d357505050505061258b90919063ffffffff16565b80516115b9916003916020909101906127ca565b506001600160a01b038116600081815260076020526040808220805460ff19169055517f0a1ee69f55c33d8467c69ca59ce2007a737a88603d75392972520bf67cb513b89190a250565b61160b612587565b6001600160a01b031661161c611418565b6001600160a01b031614611665576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b600b54600160a01b900460ff16156116ae5760405162461bcd60e51b81526004018080602001828103825260218152602001806128fc6021913960400191505060405180910390fd5b8051825114611704576040805162461bcd60e51b815260206004820152601b60248201527f4172726179206c656e6774687320646f206e6f74206d617463682e0000000000604482015290519081900360640190fd5b83516117179060029060208701906127ca565b50825161172b9060039060208601906127ca565b50815161173f9060049060208501906127ca565b5060005b845181101561180d5760006001600160a01b031685828151811061176357fe5b60200260200101516001600160a01b031614156117c1576040805162461bcd60e51b81526020600482015260176024820152762d32b9379030b2323932b9b99039bab136b4ba3a32b21760491b604482015290519081900360640190fd5b6001600660008784815181106117d357fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611743565b5060005b83518110156118db5760006001600160a01b031684828151811061183157fe5b60200260200101516001600160a01b0316141561188f576040805162461bcd60e51b81526020600482015260176024820152762d32b9379030b2323932b9b99039bab136b4ba3a32b21760491b604482015290519081900360640190fd5b6001600760008684815181106118a157fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101611811565b5060005b8251811015611aa35760006001600160a01b03168382815181106118ff57fe5b60200260200101516001600160a01b0316141561195d576040805162461bcd60e51b81526020600482015260176024820152762d32b9379030b2323932b9b99039bab136b4ba3a32b21760491b604482015290519081900360640190fd5b60006001600160a01b0316600a600084848151811061197857fe5b6020908102919091018101518252810191909152604001600020546001600160a01b0316146119ee576040805162461bcd60e51b815260206004820152601a60248201527f5265736f7572636520494420616c726561647920657869737473000000000000604482015290519081900360640190fd5b600160086000858481518110611a0057fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550828181518110611a4b57fe5b6020026020010151600a6000848481518110611a6357fe5b602090810291909101810151825281019190915260400160002080546001600160a01b0319166001600160a01b03929092169190911790556001016118df565b5050600b805460ff60a01b1916600160a01b179055505050565b60606003805480602002602001604051908101604052809291908181526020018280548015611400576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113e2575050505050905090565b60606004805480602002602001604051908101604052809291908181526020018280548015611400576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113e2575050505050905090565b600b54600160a01b900460ff16611bc9576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b611bd1612587565b6001600160a01b0316611be2611418565b6001600160a01b031614611c2b576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b038116611c7e576040805162461bcd60e51b8152602060048201526015602482015274041646472657373206d757374206e6f74206265203605c1b604482015290519081900360640190fd5b600b80546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f167cccccc6e9b2892a740ec13fc1e51d3de8ea384f25bd87fee7412d588637e29181900360200190a150565b600b54600160a01b900460ff16611d1e576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b611d26612587565b6001600160a01b0316611d37611418565b6001600160a01b031614611d80576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff16611de1576040805162461bcd60e51b815260206004820152601160248201527010d2c8191bd95cc81b9bdd08195e1a5cdd607a1b604482015290519081900360640190fd5b611e4c8160018054806020026020016040519081016040528092919081815260200182805480156109f1576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116109d357505050505061258b90919063ffffffff16565b8051611e60916001916020909101906127ca565b506001600160a01b038116600081815260056020526040808220805460ff19169055517fb7242aa278e90fff6643a17c14b6260d1c146189ce917f7a32427ed755c5ffbd9190a250565b600b54600160a01b900460ff16611ef6576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b611efe612587565b6001600160a01b0316611f0f611418565b6001600160a01b031614611f58576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526008602052604090205460ff1615611fc6576040805162461bcd60e51b815260206004820152601760248201527f5265736f7572636520616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b6000818152600a60205260409020546001600160a01b031615612030576040805162461bcd60e51b815260206004820152601a60248201527f5265736f7572636520494420616c726561647920657869737473000000000000604482015290519081900360640190fd5b6001600160a01b0382166000818152600860209081526040808320805460ff19166001908117909155858452600a835281842080546001600160a01b031990811687179091556004805492830181559094527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180549093168417909255815184815291517f5674036e091d8b4ee7f8e06cc71d41ee33f3fc331821fc0e017c1a091e8c861e9281900390910190a25050565b60056020526000908152604090205460ff1681565b600b54600160a01b900460ff16612144576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b3360009081526006602052604090205460ff166121a8576040805162461bcd60e51b815260206004820152601d60248201527f4f6e6c792076616c696420666163746f726965732063616e2063616c6c000000604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff161561220a576040805162461bcd60e51b8152602060048201526011602482015270434b20616c72656164792065786973747360781b604482015290519081900360640190fd5b6001600160a01b038116600081815260056020526040808220805460ff19166001908117909155805480820182559083527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b03191684179055513392917fcf07c02838e2c678715c09442864a71e040ed103d16693e932a4e063f6dd6e2b91a350565b60606001805480602002602001604051908101604052809291908181526020018280548015611400576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116113e2575050505050905090565b600a602052600090815260409020546001600160a01b031681565b61231a612587565b6001600160a01b031661232b611418565b6001600160a01b031614612374576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b0381166123b95760405162461bcd60e51b81526004018080602001828103825260268152602001806128546026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600b54600160a01b900460ff16612460576040805162461bcd60e51b815260206004820152601d60248201526000805160206128dc833981519152604482015290519081900360640190fd5b612468612587565b6001600160a01b0316612479611418565b6001600160a01b0316146124c2576040805162461bcd60e51b815260206004820181905260248201526000805160206128bc833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526007602052604090205460ff16612527576040805162461bcd60e51b8152602060048201526015602482015274135bd91d5b1948191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600960209081526040808320858452909152902054156113215760405162461bcd60e51b815260040180806020018281038252602181526020018061289b6021913960400191505060405180910390fd5b3390565b606060008061259a8585612600565b91509150806125e8576040805162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b604482015290519081900360640190fd5b60606125f48684612666565b509350610b3892505050565b81516000908190815b8181101561265357846001600160a01b031686828151811061262757fe5b60200260200101516001600160a01b0316141561264b5792506001915061265f9050565b600101612609565b50600019600092509250505b9250929050565b81516060906000908084106126c2576040805162461bcd60e51b815260206004820152601860248201527f496e646578206d757374206265203c2041206c656e6774680000000000000000604482015290519081900360640190fd5b60606001820367ffffffffffffffff811180156126de57600080fd5b50604051908082528060200260200182016040528015612708578160200160208202803683370190505b50905060005b858110156127565786818151811061272257fe5b602002602001015182828151811061273657fe5b6001600160a01b039092166020928302919091019091015260010161270e565b50600185015b828110156127a75786818151811061277057fe5b602002602001015182600183038151811061278757fe5b6001600160a01b039092166020928302919091019091015260010161275c565b50808686815181106127b557fe5b60200260200101519350935050509250929050565b82805482825590600052602060002090810192821561281f579160200282015b8281111561281f57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906127ea565b5061282b92915061282f565b5090565b61140891905b8082111561282b5780546001600160a01b031916815560010161283556fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373466565207479706520646f6573206e6f74206578697374206f6e206d6f64756c65466565207479706520616c726561647920657869737473206f6e206d6f64756c654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e7472616374206d75737420626520696e697469616c697a65642e000000436f6e74726f6c6c657220697320616c726561647920696e697469616c697a6564a2646970667358221220e528174b41351920781a994b500fa383233901b16d19d011f669c5ae21d290e364736f6c634300060a0033

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

000000000000000000000000eed8a32c99192794430383509465e5e360c74605

-----Decoded View---------------
Arg [0] : _feeRecipient (address): 0xeED8A32c99192794430383509465e5E360C74605

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000eed8a32c99192794430383509465e5e360c74605


Deployed Bytecode Sourcemap

14712:12008:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23026:411;;;;;;;;;;;;;;;;-1:-1:-1;23026:411:0;;:::i;:::-;;16464:41;;;;;;;;;;;;;;;;-1:-1:-1;16464:41:0;-1:-1:-1;;;;;16464:41:0;;:::i;:::-;;;;;;;;;;;;;;;;;;26380:337;;;;;;;;;;;;;;;;-1:-1:-1;26380:337:0;-1:-1:-1;;;;;26380:337:0;;:::i;21462:251::-;;;;;;;;;;;;;;;;-1:-1:-1;21462:251:0;-1:-1:-1;;;;;21462:251:0;;:::i;15933:20::-;;;;;;;;;;;;;;;;-1:-1:-1;15933:20:0;;:::i;:::-;;;;-1:-1:-1;;;;;15933:20:0;;;;;;;;;;;;;;16559:42;;;;;;;;;;;;;;;;-1:-1:-1;16559:42:0;-1:-1:-1;;;;;16559:42:0;;:::i;16303:26::-;;;;;;;;;;;;;;;;-1:-1:-1;16303:26:0;;:::i;16785:59::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16785:59:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;20542:263;;;;;;;;;;;;;;;;-1:-1:-1;20542:263:0;-1:-1:-1;;;;;20542:263:0;;:::i;17166:25::-;;;:::i;16512:40::-;;;;;;;;;;;;;;;;-1:-1:-1;16512:40:0;-1:-1:-1;;;;;16512:40:0;;:::i;17077:27::-;;;:::i;20997:282::-;;;;;;;;;;;;;;;;-1:-1:-1;20997:282:0;-1:-1:-1;;;;;20997:282:0;;:::i;16006:26::-;;;;;;;;;;;;;;;;-1:-1:-1;16006:26:0;;:::i;5674:148::-;;;:::i;24623:392::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24623:392:0;;;;;;;;;;;;;:::i;25563:209::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25563:209:0;;;;;;;;:::i;25780:100::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16117:24;;;;;;;;;;;;;;;;-1:-1:-1;16117:24:0;;:::i;5023:87::-;;;:::i;21902:268::-;;;;;;;;;;;;;;;;-1:-1:-1;21902:268:0;-1:-1:-1;;;;;21902:268:0;;:::i;18081:1396::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18081:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18081:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18081:1396:0;;;;;;;;-1:-1:-1;18081:1396:0;;-1:-1:-1;;;;;18081:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18081:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18081:1396:0;;;;;;;;-1:-1:-1;18081:1396:0;;-1:-1:-1;;;;;18081:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18081:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18081:1396:0;;;;;;;;-1:-1:-1;18081:1396:0;;-1:-1:-1;;;;;18081:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18081:1396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18081:1396:0;;-1:-1:-1;18081:1396:0;;-1:-1:-1;;;;;18081:1396:0:i;25888:96::-;;;:::i;25992:100::-;;;:::i;25221:269::-;;;;;;;;;;;;;;;;-1:-1:-1;25221:269:0;-1:-1:-1;;;;;25221:269:0;;:::i;20111:245::-;;;;;;;;;;;;;;;;-1:-1:-1;20111:245:0;-1:-1:-1;;;;;20111:245:0;;:::i;22430:412::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22430:412:0;;;;;;;;:::i;16421:36::-;;;;;;;;;;;;;;;;-1:-1:-1;16421:36:0;-1:-1:-1;;;;;16421:36:0;;:::i;19678:246::-;;;;;;;;;;;;;;;;-1:-1:-1;19678:246:0;-1:-1:-1;;;;;19678:246:0;;:::i;26100:88::-;;;:::i;16988:45::-;;;;;;;;;;;;;;;;-1:-1:-1;16988:45:0;;:::i;5977:244::-;;;;;;;;;;;;;;;;-1:-1:-1;5977:244:0;-1:-1:-1;;;;;5977:244:0;;:::i;23829:391::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23829:391:0;;;;;;;;;;;;;:::i;23026:411::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;23109:24:::2;23136:15:::0;;;:10:::2;:15;::::0;;;;;-1:-1:-1;;;;;23136:15:0::2;23172:30:::0;23164:66:::2;;;::::0;;-1:-1:-1;;;23164:66:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;23255:34;23272:16;23255:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;23255:16:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;;;;:34;;;;:::i;:::-;23243:46:::0;;::::2;::::0;:9:::2;::::0;:46:::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;23309:15:0::2;::::0;;;:10:::2;:15;::::0;;;;;;;23302:22;;-1:-1:-1;;;;;;23302:22:0::2;::::0;;-1:-1:-1;;;;;23337:28:0;::::2;::::0;;;:10:::2;:28:::0;;;;;;:36;;-1:-1:-1;;23337:36:0::2;::::0;;23391:38;;;;;;;::::2;::::0;;;;;;;;;::::2;5314:1;23026:411:::0;:::o;16464:41::-;;;;;;;;;;;;;;;:::o;26380:337::-;-1:-1:-1;;;;;26494:22:0;;26455:4;26494:22;;;:4;:22;;;;;;;;;:65;;-1:-1:-1;;;;;;26533:26:0;;;;;;:8;:26;;;;;;;;26494:65;:110;;;-1:-1:-1;;;;;;26576:28:0;;;;;;:10;:28;;;;;;;;26494:110;:154;;;-1:-1:-1;;;;;;26621:27:0;;;;;;:9;:27;;;;;;;;26494:154;:204;;;-1:-1:-1;;;;;;26665:33:0;;26693:4;26665:33;26494:204;26472:237;26380:337;-1:-1:-1;;26380:337:0:o;21462:251::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;21553:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;::::2;;21552:18;21544:52;;;::::0;;-1:-1:-1;;;21544:52:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21544:52:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;21609:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;:24;;-1:-1:-1;;21609:24:0::2;21629:4;21609:24:::0;;::::2;::::0;;;21646:7:::2;:21:::0;;;;::::2;::::0;;;;;::::2;::::0;;-1:-1:-1;;;;;;21646:21:0::2;::::0;::::2;::::0;;21685:20;::::2;::::0;21609:17;21685:20:::2;21462:251:::0;:::o;15933:20::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15933:20:0;;-1:-1:-1;15933:20:0;:::o;16559:42::-;;;;;;;;;;;;;;;:::o;16303:26::-;;;;;;;;;;16785:59;;;;;;;;;;;;;;;;;;;;;;;;:::o;20542:263::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;20635:19:0;::::2;;::::0;;;:9:::2;:19;::::0;;;;;::::2;;20634:20;20626:55;;;::::0;;-1:-1:-1;;;20626:55:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20626:55:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;20694:19:0;::::2;;::::0;;;:9:::2;:19;::::0;;;;;:26;;-1:-1:-1;;20694:26:0::2;20716:4;20694:26:::0;;::::2;::::0;;;20733:9:::2;:24:::0;;;;::::2;::::0;;;;;::::2;::::0;;-1:-1:-1;;;;;;20733:24:0::2;::::0;::::2;::::0;;20775:22;::::2;::::0;20694:19;20775:22:::2;20542:263:::0;:::o;17166:25::-;;;-1:-1:-1;;;17166:25:0;;;;;:::o;16512:40::-;;;;;;;;;;;;;;;:::o;17077:27::-;;;-1:-1:-1;;;;;17077:27:0;;:::o;20997:282::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;21092:19:0;::::2;;::::0;;;:9:::2;:19;::::0;;;;;::::2;;21084:54;;;::::0;;-1:-1:-1;;;21084:54:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21084:54:0;;;;;;;;;;;;;::::2;;21163:26;21180:8;21163:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;21163:16:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;;;:26;;;;:::i;:::-;21151:38:::0;;::::2;::::0;:9:::2;::::0;:38:::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;;;;;21202:19:0;::::2;21224:5;21202:19:::0;;;:9:::2;:19;::::0;;;;;:27;;-1:-1:-1;;21202:27:0::2;::::0;;21247:24;::::2;::::0;21224:5;21247:24:::2;20997:282:::0;:::o;16006:26::-;;;;;;;;;;5674:148;5254:12;:10;:12::i;:::-;-1:-1:-1;;;;;5243:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5243:23:0;;5235:68;;;;;-1:-1:-1;;;5235:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;;;5781:1:::1;5765:6:::0;;5744:40:::1;::::0;-1:-1:-1;;;;;5765:6:0;;::::1;::::0;5744:40:::1;::::0;5781:1;;5744:40:::1;5812:1;5795:19:::0;;-1:-1:-1;;;;;;5795:19:0::1;::::0;;5674:148::o;24623:392::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;24756:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;::::2;;24748:51;;;::::0;;-1:-1:-1;;;24748:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;24748:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;24820:13:0;::::2;;::::0;;;:4:::2;:13;::::0;;;;;;;:23;;;;;;;;;24812:74:::2;;;;-1:-1:-1::0;;;24812:74:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;24899:13:0;::::2;;::::0;;;:4:::2;:13;::::0;;;;;;;:23;;;;;;;;;:43;;;24960:47;;;;;;;24913:8;;24899:13;24960:47:::2;::::0;;;;;;;::::2;24623:392:::0;;;:::o;25563:209::-;-1:-1:-1;;;;;25734:20:0;;;;25702:7;25734:20;;;:4;:20;;;;;;;;:30;;;;;;;;;25563:209::o;25780:100::-;25827:16;25863:9;25856:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25856:16:0;;;;;;;;;;;;;;;;;;;;;;;25780:100;;:::o;16117:24::-;;;;;;;;;;5023:87;5069:7;5096:6;-1:-1:-1;;;;;5096:6:0;5023:87;:::o;21902:268::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;21995:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;::::2;;21987:51;;;::::0;;-1:-1:-1;;;21987:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;21987:51:0;;;;;;;;;;;;;::::2;;22061:23;22076:7;22061;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;22061:14:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;;;:23;;;;:::i;:::-;22051:33:::0;;::::2;::::0;:7:::2;::::0;:33:::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;;;;;22097:17:0;::::2;22117:5;22097:17:::0;;;:8:::2;:17;::::0;;;;;:25;;-1:-1:-1;;22097:25:0::2;::::0;;22140:22;::::2;::::0;22117:5;22140:22:::2;21902:268:::0;:::o;18081:1396::-;5254:12;:10;:12::i;:::-;-1:-1:-1;;;;;5243:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5243:23:0;;5235:68;;;;;-1:-1:-1;;;5235:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;;;18322:13:::1;::::0;-1:-1:-1;;;18322:13:0;::::1;;;18321:14;18313:60;;;;-1:-1:-1::0;;;18313:60:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18413:12;:19;18392:10;:17;:40;18384:80;;;::::0;;-1:-1:-1;;;18384:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;18477:22:::0;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;18510:18:0;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;18539:22:0;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;18663:9:0::1;18658:184;18682:10;:17;18678:1;:21;18658:184;;;18754:1;-1:-1:-1::0;;;;;18729:27:0::1;:10;18740:1;18729:13;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18729:27:0::1;;;18721:63;;;::::0;;-1:-1:-1;;;18721:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18721:63:0;;;;;;;;;;;;;::::1;;18826:4;18799:9;:24;18809:10;18820:1;18809:13;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;18799:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;18799:24:0;:31;;-1:-1:-1;;18799:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;18701:3:0::1;18658:184;;;-1:-1:-1::0;18857:9:0::1;18852:177;18876:8;:15;18872:1;:19;18852:177;;;18944:1;-1:-1:-1::0;;;;;18921:25:0::1;:8;18930:1;18921:11;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18921:25:0::1;;;18913:61;;;::::0;;-1:-1:-1;;;18913:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;18913:61:0;;;;;;;;;;;;;::::1;;19013:4;18989:8;:21;18998:8;19007:1;18998:11;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;18989:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;18989:21:0;:28;;-1:-1:-1;;18989:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;18893:3:0::1;18852:177;;;-1:-1:-1::0;19046:9:0::1;19041:338;19065:10;:17;19061:1;:21;19041:338;;;19137:1;-1:-1:-1::0;;;;;19112:27:0::1;:10;19123:1;19112:13;;;;;;;;;;;;;;-1:-1:-1::0;;;;;19112:27:0::1;;;19104:63;;;::::0;;-1:-1:-1;;;19104:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;19104:63:0;;;;;;;;;;;;;::::1;;19229:1;-1:-1:-1::0;;;;;19190:41:0::1;:10;:27;19201:12;19214:1;19201:15;;;;;;;;;::::0;;::::1;::::0;;;;;;;19190:27;;;::::1;::::0;;;;;;-1:-1:-1;19190:27:0;;-1:-1:-1;;;;;19190:27:0::1;:41;19182:80;;;::::0;;-1:-1:-1;;;19182:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;19305:4;19277:10;:25;19288:10;19299:1;19288:13;;;;;;;;;;;;;;-1:-1:-1::0;;;;;19277:25:0::1;-1:-1:-1::0;;;;;19277:25:0::1;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;19354:10;19365:1;19354:13;;;;;;;;;;;;;;19324:10;:27;19335:12;19348:1;19335:15;;;;;;;;;::::0;;::::1;::::0;;;;;;;19324:27;;;::::1;::::0;;;;;;-1:-1:-1;19324:27:0;:43;;-1:-1:-1;;;;;;19324:43:0::1;-1:-1:-1::0;;;;;19324:43:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;19084:3:0::1;19041:338;;;-1:-1:-1::0;;19449:13:0::1;:20:::0;;-1:-1:-1;;;;19449:20:0::1;-1:-1:-1::0;;;19449:20:0::1;::::0;;-1:-1:-1;;;18081:1396:0:o;25888:96::-;25933:16;25969:7;25962:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25962:14:0;;;;;;;;;;;;;;;;;;;;;;25888:96;:::o;25992:100::-;26039:16;26075:9;26068:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26068:16:0;;;;;;;;;;;;;;;;;;;;;;25992:100;:::o;25221:269::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;25327:30:0;::::2;25319:64;;;::::0;;-1:-1:-1;;;25319:64:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;25319:64:0;;;;;;;;;;;;;::::2;;25396:12;:31:::0;;-1:-1:-1;;;;;25396:31:0;::::2;-1:-1:-1::0;;;;;;25396:31:0;;::::2;::::0;::::2;::::0;;;25445:37:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;25221:269:::0;:::o;20111:245::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;20201:14:0;::::2;;::::0;;;:4:::2;:14;::::0;;;;;::::2;;20193:44;;;::::0;;-1:-1:-1;;;20193:44:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;20193:44:0;;;;;;;;;;;;;::::2;;20256:20;20267:8;20256:3;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;20256:10:0::2;::::0;;;;;::::2;::::0;::::2;;::::0;;::::2;;;;;;;;;;:20;;;;:::i;:::-;20250:26:::0;;::::2;::::0;:3:::2;::::0;:26:::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;;;;;20289:14:0;::::2;20306:5;20289:14:::0;;;:4:::2;:14;::::0;;;;;:22;;-1:-1:-1;;20289:22:0::2;::::0;;20329:19;::::2;::::0;20306:5;20329:19:::2;20111:245:::0;:::o;22430:412::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;22538:21:0;::::2;;::::0;;;:10:::2;:21;::::0;;;;;::::2;;22537:22;22529:58;;;::::0;;-1:-1:-1;;;22529:58:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;22635:1;22608:15:::0;;;:10:::2;:15;::::0;;;;;-1:-1:-1;;;;;22608:15:0::2;:29:::0;22600:68:::2;;;::::0;;-1:-1:-1;;;22600:68:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;22681:21:0;::::2;;::::0;;;:10:::2;:21;::::0;;;;;;;:28;;-1:-1:-1;;22681:28:0::2;22705:4;22681:28:::0;;::::2;::::0;;;22722:15;;;:10:::2;:15:::0;;;;;:27;;-1:-1:-1;;;;;;22722:27:0;;::::2;::::0;::::2;::::0;;;22762:9:::2;:25:::0;;;;::::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;22805:29;;;;;;;::::2;::::0;;;;;;;;::::2;22430:412:::0;;:::o;16421:36::-;;;;;;;;;;;;;;;:::o;19678:246::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;15656:10:::1;15646:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;15638:63;;;::::0;;-1:-1:-1;;;15638:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;19768:14:0;::::2;;::::0;;;:4:::2;:14;::::0;;;;;::::2;;19767:15;19759:45;;;::::0;;-1:-1:-1;;;19759:45:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;19759:45:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;19817:14:0;::::2;;::::0;;;:4:::2;:14;::::0;;;;;:21;;-1:-1:-1;;19817:21:0::2;19834:4;19817:21:::0;;::::2;::::0;;;19851:18;;;;::::2;::::0;;;;;;::::2;::::0;;-1:-1:-1;;;;;;19851:18:0::2;::::0;::::2;::::0;;19887:29;19905:10:::2;::::0;19817:14;19887:29:::2;::::0;::::2;19678:246:::0;:::o;26100:88::-;26141:16;26177:3;26170:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26170:10:0;;;;;;;;;;;;;;;;;;;;;;26100:88;:::o;16988:45::-;;;;;;;;;;;;-1:-1:-1;;;;;16988:45:0;;:::o;5977:244::-;5254:12;:10;:12::i;:::-;-1:-1:-1;;;;;5243:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5243:23:0;;5235:68;;;;;-1:-1:-1;;;5235:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;6066:22:0;::::1;6058:73;;;;-1:-1:-1::0;;;6058:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6168:6;::::0;;6147:38:::1;::::0;-1:-1:-1;;;;;6147:38:0;;::::1;::::0;6168:6;::::1;::::0;6147:38:::1;::::0;::::1;6196:6;:17:::0;;-1:-1:-1;;;;;;6196:17:0::1;-1:-1:-1::0;;;;;6196:17:0;;;::::1;::::0;;;::::1;::::0;;5977:244::o;23829:391::-;15775:13;;-1:-1:-1;;;15775:13:0;;;;15767:55;;;;;-1:-1:-1;;;15767:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15767:55:0;;;;;;;;;;;;;;;5254:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5243:23:0::1;;5235:68;;;::::0;;-1:-1:-1;;;5235:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;5235:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;23961:17:0;::::2;;::::0;;;:8:::2;:17;::::0;;;;;::::2;;23953:51;;;::::0;;-1:-1:-1;;;23953:51:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;23953:51:0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;24025:13:0;::::2;;::::0;;;:4:::2;:13;::::0;;;;;;;:23;;;;;;;;;:28;24017:74:::2;;;;-1:-1:-1::0;;;24017:74:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3589:106:::0;3677:10;3589:106;:::o;8808:355::-;8905:16;8940:13;8955:9;8968:13;8976:1;8979;8968:7;:13::i;:::-;8939:42;;;;8997:4;8992:164;;9018:31;;;-1:-1:-1;;;9018:31:0;;;;;;;;;;;;-1:-1:-1;;;9018:31:0;;;;;;;;;;;;;;8992:164;9083:19;9107:13;9111:1;9114:5;9107:3;:13::i;:::-;-1:-1:-1;9082:38:0;-1:-1:-1;9135:9:0;;-1:-1:-1;;;9135:9:0;7294:307;7408:8;;7365:7;;;;;7427:129;7451:6;7447:1;:10;7427:129;;;7491:1;-1:-1:-1;;;;;7483:9:0;:1;7485;7483:4;;;;;;;;;;;;;;-1:-1:-1;;;;;7483:9:0;;7479:66;;;7521:1;-1:-1:-1;7524:4:0;;-1:-1:-1;7513:16:0;;-1:-1:-1;7513:16:0;7479:66;7459:3;;7427:129;;;;-1:-1:-1;;7587:5:0;7566:27;;;;;7294:307;;;;;;:::o;9934:551::-;10092:8;;10032:16;;10050:7;;10119:16;;;10111:53;;;;;-1:-1:-1;;;10111:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10175:29;10230:1;10221:6;:10;10207:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10207:25:0;-1:-1:-1;10175:57:0;-1:-1:-1;10248:9:0;10243:85;10267:5;10263:1;:9;10243:85;;;10312:1;10314;10312:4;;;;;;;;;;;;;;10294:12;10307:1;10294:15;;;;;;;;-1:-1:-1;;;;;10294:22:0;;;:15;;;;;;;;;;;:22;10274:3;;10243:85;;;-1:-1:-1;10363:1:0;10355:9;;10338:98;10370:6;10366:1;:10;10338:98;;;10420:1;10422;10420:4;;;;;;;;;;;;;;10398:12;10415:1;10411;:5;10398:19;;;;;;;;-1:-1:-1;;;;;10398:26:0;;;:19;;;;;;;;;;;:26;10378:3;;10338:98;;;;10454:12;10468:1;10470:5;10468:8;;;;;;;;;;;;;;10446:31;;;;;;9934:551;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://e528174b41351920781a994b500fa383233901b16d19d011f669c5ae21d290e3

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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