ETH Price: $3,199.26 (+2.07%)

Contract

0x31F5668F1cB1a7f572C298b51F54b050c9127260
 

Overview

ETH Balance

1.450803214752763297 ETH

ETH Value

$4,641.50 (@ $3,199.26/ETH)

Sponsored

Transaction Hash
Method
Block
From
To
Value
Add Contract To ...133091812024-07-09 4:19:095 days ago1720498749IN
0x31F5668F...0c9127260
0 ETH00.00000025
Deposit Fund Cli...133091782024-07-09 4:19:035 days ago1720498743IN
0x31F5668F...0c9127260
0.012 ETH00.00000025
Add Client To Wh...128960652024-06-29 14:48:3714 days ago1719672517IN
0x31F5668F...0c9127260
0 ETH0.000000140.00100025
Add Client To Wh...128960462024-06-29 14:47:5914 days ago1719672479IN
0x31F5668F...0c9127260
0 ETH0.000000140.00100025
Deposit Fund Cli...127507082024-06-26 6:03:2317 days ago1719381803IN
0x31F5668F...0c9127260
0.1 ETH0.000000040.00100025
Add Contract To ...127506722024-06-26 6:02:1117 days ago1719381731IN
0x31F5668F...0c9127260
0 ETH0.000000090.00100025
Add Client To Wh...126682642024-06-24 8:15:1519 days ago1719216915IN
0x31F5668F...0c9127260
0 ETH0.000000140.00100025
Update Generator...118933372024-06-06 9:44:2137 days ago1717667061IN
0x31F5668F...0c9127260
0 ETH0.00011153.00000025
Add Contract To ...116382392024-05-31 12:01:0543 days ago1717156865IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...116382342024-05-31 12:00:5543 days ago1717156855IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...116382292024-05-31 12:00:4543 days ago1717156845IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...116382232024-05-31 12:00:3343 days ago1717156833IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...116382172024-05-31 12:00:2143 days ago1717156821IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...116382102024-05-31 12:00:0743 days ago1717156807IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...116382052024-05-31 11:59:5743 days ago1717156797IN
0x31F5668F...0c9127260
0 ETH00.0001
Update Generator...116316872024-05-31 8:22:4143 days ago1717143761IN
0x31F5668F...0c9127260
0 ETH0.000000030.00100025
Deposit Fund Cli...115413712024-05-29 6:12:0945 days ago1716963129IN
0x31F5668F...0c9127260
0.26 ETH00.0001
Add Contract To ...115394892024-05-29 5:09:2546 days ago1716959365IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...115394842024-05-29 5:09:1546 days ago1716959355IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...115394792024-05-29 5:09:0546 days ago1716959345IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...115394742024-05-29 5:08:5546 days ago1716959335IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...115394692024-05-29 5:08:4546 days ago1716959325IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...115394622024-05-29 5:08:3146 days ago1716959311IN
0x31F5668F...0c9127260
0 ETH00.0001
Add Contract To ...115394572024-05-29 5:08:2146 days ago1716959301IN
0x31F5668F...0c9127260
0 ETH00.0001
Remove Contract ...115393482024-05-29 5:04:4346 days ago1716959083IN
0x31F5668F...0c9127260
0 ETH00.0001
View all transactions

Latest 3 internal transactions

Parent Transaction Hash Block From To Value
99465772024-04-22 8:12:2182 days ago1713773541
0x31F5668F...0c9127260
1.1071227 ETH
89154332024-03-29 11:20:53106 days ago1711711253
0x31F5668F...0c9127260
1.07407408 ETH
89152582024-03-29 11:15:03106 days ago1711710903
0x31F5668F...0c9127260
0.01 ETH

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DepositContract

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license
File 1 of 8 : DepositContract.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import {EnumerableSet} from "./EnumerableSet.sol";
import {Ownable2Step} from "./Ownable2Step.sol";
import {Pausable} from "./Pausable.sol";
import {IDepositContract} from "./IDepositContract.sol";
import {CheckContractAddress} from "./CheckContractAddress.sol";

contract DepositContract is
Ownable2Step,
Pausable,
IDepositContract,
CheckContractAddress
{
    uint256 constant SUBSCRIPTION_DURATION = 180 days;
    using EnumerableSet for EnumerableSet.AddressSet;

    // Whitelisting
    EnumerableSet.AddressSet private whitelist;
    mapping(address => EnumerableSet.AddressSet) private contractWhitelisted;

    // Subscriptions
    mapping(address => Subscription) private subscriptionPeriod;

    struct Subscription {
        uint256 startDate;
        uint256 endDate;
        bool isSnap;
    }

    // Funds management
    mapping(address => uint256) private minBalanceLimitClient;
    mapping(address => uint256) private clientFund;
    uint256 private supraFund;
    uint256 private minBalanceLimitSupra;

    // Miscellaneous
    address public generator;
    address public router;
    address public coldWallet;
    address public _tempWallet;
    address public approver;
    address public developer;
    bool public adminFeelsOK;

    /// @dev Emitted when a client is whitelisted.
    /// @param _clientAddress Address of the client that has been whitelisted.
    /// @param _startTime The timestamp representing the start time of the subscription period.
    /// @param _endTime The timestamp representing the end time of the subscription period.
    /// @param _isSnap A boolean flag indicating if the client is a part of the SNAP program or not.
    event ClientWhitelisted(
        address _clientAddress,
        uint256 _startTime,
        uint256 _endTime,
        bool _isSnap
    );

    /// @dev Emitted when a client is removed from the whitelist.
    /// @param _clientAddress Address of the client that has been removed from the whitelist.
    /// @param _removedTime The timestamp representing the time at which the client was removed.
    event ClientRemovedFromWhitelist(
        address _clientAddress,
        uint256 _removedTime
    );

    /// @dev Emitted when contracts are removed from the whitelist for a client
    /// @param _clientAddress The address of the client whose contracts were removed
    /// @param _removedTime The timestamp when the contracts were removed
    event ContractsDeletedFromWhitelist(
        address _clientAddress,
        uint256 _removedTime
    );

    /// @dev Emitted when a contract is whitelisted for a client.
    /// @param _clientAddress Address of the client whose contract has been whitelisted.
    /// @param _contractAddress Address of the contract that has been whitelisted.
    /// @param _timeStamp The timestamp representing the time at which the contract was whitelisted.
    event ContractWhitelisted(
        address _clientAddress,
        address _contractAddress,
        uint256 _timeStamp
    );

    /// @dev Emitted when a client deposits funds into their account.
    /// @param _depositer The address of the client who deposited funds.
    /// @param amount The amount of funds that were deposited.
    event ClientDeposited(address _depositer, uint256 amount);

    /// @dev Emitted when a client withdraws funds from their account.
    /// @param _withdrawer The address of the client who withdrew funds.
    /// @param amount The amount of funds that were withdrawn.
    event ClientWithdrwal(address _withdrawer, uint256 amount);

    /// @dev Emitted when Supra collects funds from a client's account.
    /// @param _fromClient The address of the client from whom funds were collected.
    /// @param amount The amount of funds that were collected.
    event SupraCollected(address _fromClient, uint256 amount);

    /// @dev Emitted when Supra refunds funds to a client's account.
    /// @param _toClient The address of the client to whom funds were refunded.
    /// @param amount The amount of funds that were refunded.
    event SupraRefunded(address _toClient, uint256 amount);

    /// @dev Emitted when the approver confirms the new cold wallet address
    /// @param _coldWalletAddress The new address of the cold wallet
    event ColdWalletConfirmed(address _coldWalletAddress);

    /// @dev Emitted when the client set the minimum balance limit to hold in wallet
    /// @param  _clientAddress The client wallet address through which and for which the limit is to be set
    /// @param limit The value which client wants to be a minimum limit for the specified wallet
    event MinBalanceClientSet(address _clientAddress, uint256 limit);

    /// @dev Constructor to initialize contract with provided parameters.
    /// @param _approver Address of the approver who will approve changes.
    /// @param _developer Address of the developer who will manage the contract.
    /// @param _newGenerator Address of the new generator contract.
    /// @param _newRouter Address of the new router contract.
    /// @param _minBalanceLimitSupra Minimum balance limit to execute supra transactions.
    /// The value must be greater than or equal to zero.
    constructor(
        address _approver,
        address _developer,
        address _newGenerator,
        address _newRouter,
        uint256 _minBalanceLimitSupra
    ) {
        require(_approver != msg.sender, "Admin cannot be the approver");
        require(
            _developer != address(0) &&
            _approver != address(0) &&
            _newGenerator != address(0) &&
            _newRouter != address(0),
            "Address cannot be a zero address"
        );
        require(_minBalanceLimitSupra != 0, "Invalid Minimum balance limit");

        developer = _developer;
        approver = _approver;
        generator = _newGenerator;
        router = _newRouter;
        minBalanceLimitSupra = _minBalanceLimitSupra;
    }

    modifier checkClientWhitelisted(address _clientAddress) {
        require(
            isClientWhitelisted(_clientAddress),
            "Client address not whitelisted"
        );
        _;
    }

    /**
        #######################################################################################
            :::::::::::::::::::::::: SUPRA ADMIN OPERATIONS ::::::::::::::::::::::::::::::
        #######################################################################################
    */

    /// @dev Allows SupraAdmin to add a client to the whitelist.
    /// @param _clientAddress The address of the client being added.
    /// @param _isSnap A boolean value indicating whether the client is a Snap user or not.
    function addClientToWhitelist(address _clientAddress, bool _isSnap)
    external
    onlyOwner
    {
        require(
            !isClientWhitelisted(_clientAddress),
            "Client is already whitelisted"
        );
        whitelist.add(_clientAddress);
        addSubscriptionInfoByClient(
            _clientAddress,
            block.timestamp,
            block.timestamp + SUBSCRIPTION_DURATION,
            _isSnap
        );
        emit ClientWhitelisted(
            _clientAddress,
            block.timestamp,
            block.timestamp + SUBSCRIPTION_DURATION,
            _isSnap
        );
    }

    /// @dev Update the end time of a client's subscription
    /// @param _clientAddress The address of the client
    /// @param _newEndTime The new end time for the subscription
    /// - require The client is whitelisted
    /// - require The new end time is in the future
    function updateSubscription(address _clientAddress, uint256 _newEndTime)
    external
    onlyOwner
    checkClientWhitelisted(_clientAddress)
    {
        require(_newEndTime > block.timestamp + 2 days, "Invalid End Time");
        subscriptionPeriod[_clientAddress].endDate = _newEndTime;
    }

    /// @dev Remove a client from the whitelist
    /// @param _clientAddress The address of the client to remove
    function removeClientFromWhitelist(address _clientAddress)
    external
    onlyOwner
    checkClientWhitelisted(_clientAddress)
    {
        uint256 _amount = checkClientFund(_clientAddress);
        (bool sent, bytes memory data) = payable(_clientAddress).call{
                value: _amount
            }("");
        require(sent, "Cannot transfer client funds");
        bool result = whitelist.remove(_clientAddress);
        require(result, "Client not whitelisted or already removed");
        emit ClientRemovedFromWhitelist(_clientAddress, block.timestamp);
    }

    /// @dev Remove all contracts associated with a client
    /// @param _clientAddress The address of the client
    function removeAllContractOfClient(address _clientAddress)
    external
    onlyOwner
    {
        uint256 _totalCount = contractWhitelisted[_clientAddress].length();
        require(
            _totalCount != 0,
            "Contracts not whitelisted or already removed"
        );
        contractWhitelisted[_clientAddress].clear();
    }

    /// @dev Allows the owner to claim free node expenses.
    /// Only the owner can do this.
    /// @param _amount The amount to be claimed to coldwallet.
    function claimFreeNodeExpenses(uint256 _amount) external onlyOwner {
        require(
            coldWallet != address(0),
            "Invalid Address: Address cannot be a zero address"
        );
        require(
            _amount <= supraFund,
            "Insufficient Funds: Claiming free node expenses"
        );
        supraFund -= _amount;
        (bool sent, bytes memory data) = payable(coldWallet).call{
                value: _amount
            }("");
        require(sent, "Cannot claim free node expenses");
    }

    /// @dev Execute a refund from the supra fund to a client
    /// @param _fundReceiver The address of the client receiving the refund
    /// @param _amount The amount to be refunded
    /// - require The client is whitelisted
    /// - require The refund amount is less than or equal to the supra fund
    function executeRefund(address _fundReceiver, uint256 _amount)
    external
    onlyOwner
    checkClientWhitelisted(_fundReceiver)
    {
        require(_amount <= supraFund, "Insufficient funds: executing refund");
        supraFund -= _amount;
        clientFund[_fundReceiver] = clientFund[_fundReceiver] + _amount;
        emit SupraRefunded(_fundReceiver, _amount);
    }

    /// @dev Updates the address of the developer.
    /// Only the owner is authorized to perform this action.
    /// @param _newDeveloper The address of the new developer to be set.
    function updateDeveloper(address _newDeveloper) external onlyOwner {
        require(
            _newDeveloper != address(0),
            "Developer address cannot be a zero address"
        );
        developer = _newDeveloper;
    }

    /// @dev Sets the minimum balance limit for SupraAdmin.
    /// @param _limit The new minimum balance limit for SupraAdmin.
    function updateMinBalanceSupra(uint256 _limit) external onlyOwner {
        minBalanceLimitSupra = _limit;
    }

    /// @dev Deposits ETH into the SupraFund contract.
    function depositSupraFund() external payable onlyOwner {
        supraFund += msg.value;
    }

    /// @dev Pauses withdrawals for the contract.
    /// Only the owner is authorized to perform this action.
    /// Emits a {Paused} event.
    function pauseWithdrawal() external onlyOwner {
        _pause();
    }

    /// @dev Resumes withdrawals for the contract.
    /// Only the owner is authorized to perform this action.
    /// Emits an {Unpaused} event.
    function unpauseWithdrawal() external onlyOwner {
        _unpause();
    }

    /// @dev Sets the generator contract address.
    /// Only the owner can do this.
    /// @param _newGenerator The new generator contract address.
    /// @param _newRouter The new router contract address
    function updateGeneratorRouter(address _newGenerator, address _newRouter)
    external
    onlyOwner
    {
        require(
            isContract(_newGenerator) && isContract(_newRouter),
            "Address cannot be a wallet address"
        );
        require(
            _newGenerator != address(0) && _newRouter != address(0),
            "Contract address cannot be a zero address"
        );
        generator = _newGenerator;
        router = _newRouter;
    }

    /**
        #######################################################################################
            :::::::::::::::::::::: WHITELISTED CLIENT OPERATIONS ::::::::::::::::::::::::
        #######################################################################################
    */

    /// @dev Allows a client to add a contract to their whitelist.
    /// @param _contractAddress The address of the contract being added.
    function addContractToWhitelist(address _contractAddress)
    external
    checkClientWhitelisted(msg.sender)
    {
        require(isContract(_contractAddress), "Address cannot be EOA");
        bool result = contractWhitelisted[msg.sender].add(_contractAddress);
        require(result, "Contract is Already whitelisted");
        emit ContractWhitelisted(msg.sender, _contractAddress, block.timestamp);
    }

    /// @dev Removes a contract from a client's whitelist.
    /// Only the client who added the contract can remove it.
    /// @param _contractAddress The address of the contract to remove.
    function removeContractFromWhitelist(address _contractAddress) external {
        bool result = contractWhitelisted[msg.sender].remove(_contractAddress);
        require(result, "Contract is not whitelisted or already removed");
        emit ContractsDeletedFromWhitelist(_contractAddress, block.timestamp);
    }

    /// @dev Allows a client to deposit funds into their account.
    function depositFundClient()
    external
    payable
    checkClientWhitelisted(msg.sender)
    {
        clientFund[msg.sender] = clientFund[msg.sender] + msg.value;
        emit ClientDeposited(msg.sender, msg.value);
    }

    ///  @dev Sets the minimum balance limit for the calling client.
    ///  @param _limit The new minimum balance limit for the calling client.
    function setMinBalanceClient(uint256 _limit)
    external
    checkClientWhitelisted(msg.sender)
    {
        require(
            _limit >= minBalanceLimitSupra,
            "Cannot set a lower limit than the limit set by the deployer"
        );
        minBalanceLimitClient[msg.sender] = _limit;
        emit MinBalanceClientSet(msg.sender, _limit);
    }

    /// @dev Allows a client to withdraw their funds.
    /// @param _amount The amount to be withdrawn.
    /// Emits a ClientWithdrawal event.
    function withdrawFundClient(uint256 _amount) external whenNotPaused {
        require(
            _amount <= checkClientFund(msg.sender),
            "Insufficient Funds: Fund withdrawing by user"
        );
        clientFund[msg.sender] = checkClientFund(msg.sender) - _amount;
        (bool sent, bytes memory data) = payable(msg.sender).call{
                value: _amount
            }("");
        require(sent, "Cannot withdraw client funds");
        emit ClientWithdrwal(msg.sender, _amount);
    }

    /**
        #######################################################################################
            ::::::::::::::::::::::::: GENERATOR RELATED FUNCTIONS ::::::::::::::::::::::::
        #######################################################################################
    */

    /// @dev Allows the generator contract to collect funds from a client's balance.
    /// @param _clientAddress The address of the client whose funds are being collected.
    /// @param _amount The amount of funds to be collected.
    function collectFund(address _clientAddress, uint256 _amount)
    external
    override
    {
        require(
            msg.sender == generator,
            "Caller is not the owner: Only Generator can collect funds"
        );
        require(
            _amount <= checkClientFund(_clientAddress),
            "Insufficient Funds: Collecting funds by generator"
        );
        clientFund[_clientAddress] = clientFund[_clientAddress] - _amount;
        supraFund = supraFund + _amount;
        emit SupraCollected(_clientAddress, _amount);
    }

    /// @dev Returns the fund balance of the specified client address.
    /// Only authorized callers, including the whitelisted client, developer, owner, and generator, can perform this action.
    /// @param _clientAddress The address of the client whose fund balance is to be checked.
    /// @return The fund balance of the specified client address.
    function checkClientFund(address _clientAddress)
    public
    view
    override
    checkClientWhitelisted(_clientAddress)
    returns (uint256)
    {
        address s = msg.sender;
        require(
            s == _clientAddress ||
            s == developer ||
            s == owner() ||
            s == generator ||
            s == router,
            "Unauthorized Access: Address not allowed to check funds"
        );
        return clientFund[_clientAddress];
    }

    /**
        #######################################################################################
            :::::::::::::::::::::: ROUTER RELATED FUNCTIONS ::::::::::::::::::::::::
        #######################################################################################
    */

    /// @dev Returns a boolean indicating whether the given client and contract addresses are eligible for interaction.
    /// @param _clientAddress The address of the client.
    /// @param _contractAddress The address of the contract.
    /// @return A boolean indicating whether the given client and contract addresses are eligible for interaction.
    function isContractEligible(
        address _clientAddress,
        address _contractAddress
    )
    public
    view
    override
    checkClientWhitelisted(_clientAddress)
    returns (bool)
    {
        return (isContractWhitelisted(_clientAddress, _contractAddress));
    }

    /// @dev Checks whether the minimum balance for a given client address has been reached.
    /// @param _clientAddress The client address to check.
    /// @return A boolean indicating whether the minimum balance for the given client address has been reached.
    function isMinimumBalanceReached(address _clientAddress)
    public
    view
    override
    checkClientWhitelisted(_clientAddress)
    returns (bool)
    {
        address s = msg.sender;
        require(
            s == _clientAddress ||
            s == developer ||
            s == owner() ||
            s == generator ||
            s == router,
            "Unauthorized Access: Address cannot check minimum balance"
        );
        return (checkClientFund(_clientAddress) <=
        checkMinBalance(_clientAddress));
    }

    /**
        #######################################################################################
            :::::::::::::::::::::: ADMIN + APPROVER OPERATIONS ::::::::::::::::::::::::
        #######################################################################################
    */

    /// @dev Propose a new cold wallet address
    /// @param _newColdWallet The address of the new cold wallet
    function proposeColdWallet(address _newColdWallet) external onlyOwner {
        _tempWallet = _newColdWallet;
        adminFeelsOK = true;
    }

    /// @dev Confirm a proposed cold wallet address
    /// @notice This function can only be executed by the approver
    /// @notice The proposal must be confirmed by the owner before the cold wallet can be updated
    /// - require The proposal is ready to be confirmed
    function confirmColdWallet() external {
        require(
            msg.sender == approver,
            "Unauthorized Access: Only Approver can confirm"
        );
        require(adminFeelsOK, "Cold wallet propose not ready");
        coldWallet = _tempWallet;
        adminFeelsOK = false;
        emit ColdWalletConfirmed(coldWallet);
    }

    /**
        #######################################################################################
            :::::::::::::::::::::: CRON AND SCRIPT RELATED FUNCTIONS ::::::::::::::::::::::::
        #######################################################################################
    */

    /// @dev Returns an array of whitelisted client addresses along with their respective fund balances and minimum balance requirements.
    /// @return A tuple of three arrays: (1) an array of whitelisted client addresses, (2) an array of their fund balances, and (3) an array of their minimum balance requirements.
    function checkBalanceAllWhitelisted()
    external
    view
    returns (
        address[] memory,
        uint256[] memory,
        uint256[] memory
    )
    {
        address s = msg.sender;
        require(
            s == developer || s == owner(),
            "Unauthorized Access: Only developer or deployer can check the balance"
        );
        uint256 count = countTotalWhitelistedClient();
        address[] memory _clients = listAllWhitelistedClient();

        uint256[] memory _funds = new uint256[](count);
        uint256[] memory _minBalance = new uint256[](count);

        for (uint256 loop = 0; loop < count; loop++) {
            address client = _clients[loop];
            _funds[loop] = clientFund[client];
            _minBalance[loop] = checkMinBalance(client);
        }

        return (_clients, _funds, _minBalance);
    }

    /// @dev Returns the minimum balance limit for the SupraAdmin.
    /// @return The minimum balance limit for the SupraAdmin.
    function checkMinBalanceSupra() public view returns (uint256) {
        return minBalanceLimitSupra;
    }

    /// @dev Returns the total number of whitelisted clients.
    /// @return The total number of whitelisted clients.
    function countTotalWhitelistedClient() public view returns (uint256) {
        return whitelist.length();
    }

    /**
        #######################################################################################
            ::::::::::::::::::::::::: RESTRICTED VIEW FUNCTIONS ::::::::::::::::::::::::
        #######################################################################################
    */

    /// @dev Returns the effective balance for a given client address.
    /// @param _clientAddress The client address to check.
    /// @return The effective balance for the given client address.
    function checkEffectiveBalance(address _clientAddress)
    public
    view
    checkClientWhitelisted(_clientAddress)
    returns (uint256)
    {
        address s = msg.sender;
        require(
            s == _clientAddress || s == developer || s == owner(),
            "Unauthorized Access: Cannot check effective balance"
        );
        uint256 balance;
        if (checkClientFund(_clientAddress) > checkMinBalance(_clientAddress)) {
            balance =
            checkClientFund(_clientAddress) -
            checkMinBalance(_clientAddress);
        }
        return balance;
    }

    /// @dev Returns the number of contracts whitelisted by a client.
    /// @param _clientAddress The client address to check.
    /// @return The number of contracts whitelisted by the client.
    function countTotalWhitelistedContractByClient(address _clientAddress)
    public
    view
    checkClientWhitelisted(_clientAddress)
    returns (uint256)
    {
        address s = msg.sender;
        require(
            s == _clientAddress ||
            s == developer ||
            s == owner() ||
            s == generator,
            "Unauthorized Access: Cannot check the total count"
        );
        return contractWhitelisted[_clientAddress].length();
    }

    /// @dev Get subscription information for a client.
    /// @param _clientAddress The client's address.
    /// @return A tuple containing the start timestamp and the end timestamp of the subscription period.
    function getSubscriptionInfoByClient(address _clientAddress)
    external
    view
    checkClientWhitelisted(_clientAddress)
    returns (
        uint256,
        uint256,
        bool
    )
    {
        address s = msg.sender;
        require(
            s == _clientAddress ||
            s == developer ||
            s == owner() ||
            s == generator,
            "Unauthorized Access: Cannot check the subscription info"
        );
        Subscription memory subscription = subscriptionPeriod[_clientAddress];
        return (
        subscription.startDate,
        subscription.endDate,
        subscription.isSnap
        );
    }

    /// @dev Check if a contract is whitelisted for a client
    /// @param _clientAddress The address of the client
    /// @param _contractAddress The address of the contract to check
    /// @return A boolean indicating whether the contract is whitelisted
    function isContractWhitelisted(
        address _clientAddress,
        address _contractAddress
    ) public view checkClientWhitelisted(_clientAddress) returns (bool) {
        address s = msg.sender;
        require(
            s == _clientAddress ||
            s == developer ||
            s == owner() ||
            s == generator ||
            s == router,
            "Unauthorized Access: Cannot check for the whitelisted contract"
        );
        return contractWhitelisted[_clientAddress].contains(_contractAddress);
    }

    /// @dev Returns an array of all whitelisted contracts for a specified client address.
    /// Only authorized callers, including the whitelisted client, developer, and owner, can perform this action.
    /// @param _clientAddress The address of the client whose whitelisted contracts are to be listed.
    /// @return An array of all whitelisted contracts for the specified client address.
    function listAllWhitelistedContractByClient(address _clientAddress)
    external
    view
    checkClientWhitelisted(_clientAddress)
    returns (address[] memory)
    {
        address s = msg.sender;
        require(
            s == _clientAddress || s == developer || s == owner(),
            "Unauthorized Access: Cannot check the list of whitelisted contracts"
        );
        require(_clientAddress != address(0), "User address cannot be zero");
        uint256 totalContracts = contractWhitelisted[_clientAddress].length();

        address[] memory contracts = new address[](totalContracts);
        uint256 count = 0;
        for (count; count < totalContracts; count++) {
            address contractAddress = contractWhitelisted[_clientAddress].at(
                count
            );
            contracts[count] = contractAddress;
        }
        if (count == 0) {
            return new address[](0);
        }
        return contracts;
    }

    /// @dev Returns an array of all whitelisted clients.
    /// @return An array of all whitelisted client addresses.
    function listAllWhitelistedClient() public view returns (address[] memory) {
        address s = msg.sender;
        require(
            s == developer || s == owner(),
            "Unauthorized Access: Cannot list whitelisted clients"
        );
        address[] memory clients = new address[](whitelist.length());
        for (uint256 i = 0; i < whitelist.length(); i++) {
            address value = whitelist.at(i);
            clients[i] = value;
        }
        return clients;
    }

    /// @dev Returns the current balance of the SupraFund contract.
    /// @return The current balance of the SupraFund contract.
    function checkSupraFund() external view returns (uint256) {
        require(
            msg.sender == owner() || msg.sender == developer,
            "Unauthorized Access: Cannot check supra funds"
        );
        return supraFund;
    }

    /**
        #######################################################################################
               :::::::::::::::::::::::::: PUBLIC FUNCTIONS :::::::::::::::::::::::::
        #######################################################################################
    */

    /// @dev Checks if a client is whitelisted.
    /// @param _clientAddress The client address to check.
    /// @return True if the client is whitelisted, false otherwise.
    function isClientWhitelisted(address _clientAddress)
    public
    view
    returns (bool)
    {
        return whitelist.contains(_clientAddress);
    }

    /// @dev Returns the minimum balance limit for a given client address.
    /// @param _clientAddress The client address to check.
    /// @return The minimum balance limit for the given client address.
    function checkMinBalance(address _clientAddress)
    public
    view
    override
    returns (uint256)
    {
        uint256 limit;
        if (checkMinBalanceClient(_clientAddress) > checkMinBalanceSupra()) {
            limit = checkMinBalanceClient(_clientAddress);
        } else {
            limit = checkMinBalanceSupra();
        }
        return limit;
    }

    /**
        #######################################################################################
               :::::::::::::::::::::::: INETRNAL FUNCTIONS ::::::::::::::::::::::::
        #######################################################################################
    */
    /// @dev Returns the minimum balance limit for a given client address.
    /// @param _clientAddress The client address to check.
    /// @return The minimum balance limit for the given client address.
    function checkMinBalanceClient(address _clientAddress)
    internal
    view
    returns (uint256)
    {
        return minBalanceLimitClient[_clientAddress];
    }

    /// @dev Add subscription information for a client
    /// @param _clientAddress The address of the client
    /// @param _start The start timestamp of the subscription
    /// @param _end The end timestamp of the subscription
    /// @param _isSnap A flag indicating whether the subscription is a snapshot subscription
    function addSubscriptionInfoByClient(
        address _clientAddress,
        uint256 _start,
        uint256 _end,
        bool _isSnap
    ) internal {
        subscriptionPeriod[_clientAddress] = Subscription(
            _start,
            _end,
            _isSnap
        );
    }
}

File 2 of 8 : EnumerableSet.sol
/**
 * ###############################################################
 *         this is not exact replica of OpenZepplin implementation
 *     ###############################################################
 */

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity 0.8.19;

library EnumerableSet {
    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * ###################################################################################
     *         :::: this is the new method added on top of openzepplin implementation ::::
     *     ###################################################################################
     */
    function _clear(Set storage set) private returns (bool) {
        for (uint256 i = 0; i < set._values.length; i++) {
            delete set._indexes[set._values[i]];
        }
        delete set._values;
        return true;
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function clear(AddressSet storage set) internal returns (bool) {
        return _clear(set._inner);
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

File 3 of 8 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)

pragma solidity 0.8.19;

import "./Ownable.sol";

/**
 * @dev Contract module which provides 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} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

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

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

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

File 4 of 8 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity 0.8.19;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 5 of 8 : IDepositContract.sol
// INSTRUCTIONS : Contains methods that will be used by the ROUTER and GENERATOR contracts.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface IDepositContract {
    function isContractEligible(address _clientAddress, address _contractAddress) external view returns (bool);

    function isMinimumBalanceReached(address _clientAddress) external view returns (bool);

    function checkMinBalance(address _clientAddress) external view returns (uint256);

    function checkClientFund(address _clientAddress) external view returns (uint256);

    function collectFund(address _clientAddress, uint256 _amount) external;
}

File 6 of 8 : CheckContractAddress.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

contract CheckContractAddress {
    /// @dev Returns a boolean indicating whether the given address is a contract or not.
    /// @param _addr The address to be checked.
    /// @return A boolean indicating whether the given address is a contract or not.
    function isContract(address _addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(_addr)
        }
        return size > 0;
    }
}

File 7 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity 0.8.19;

import "./Context.sol";

/**
 * @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() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 8 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity 0.8.19;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/"
  ],
  "viaIR": true,
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_approver","type":"address"},{"internalType":"address","name":"_developer","type":"address"},{"internalType":"address","name":"_newGenerator","type":"address"},{"internalType":"address","name":"_newRouter","type":"address"},{"internalType":"uint256","name":"_minBalanceLimitSupra","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_depositer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClientDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_removedTime","type":"uint256"}],"name":"ClientRemovedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_isSnap","type":"bool"}],"name":"ClientWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClientWithdrwal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_coldWalletAddress","type":"address"}],"name":"ColdWalletConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"address","name":"_contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_timeStamp","type":"uint256"}],"name":"ContractWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_removedTime","type":"uint256"}],"name":"ContractsDeletedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_clientAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"MinBalanceClientSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_fromClient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SupraCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_toClient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SupraRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_tempWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"bool","name":"_isSnap","type":"bool"}],"name":"addClientToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"addContractToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminFeelsOK","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBalanceAllWhitelisted","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"checkClientFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"checkEffectiveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"checkMinBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkMinBalanceSupra","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkSupraFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimFreeNodeExpenses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"coldWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"collectFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmColdWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"countTotalWhitelistedClient","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"countTotalWhitelistedContractByClient","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFundClient","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositSupraFund","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"developer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fundReceiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"executeRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"generator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"getSubscriptionInfoByClient","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"isClientWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"isContractEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"isContractWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"isMinimumBalanceReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listAllWhitelistedClient","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"listAllWhitelistedContractByClient","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newColdWallet","type":"address"}],"name":"proposeColdWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"removeAllContractOfClient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"}],"name":"removeClientFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"removeContractFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMinBalanceClient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newDeveloper","type":"address"}],"name":"updateDeveloper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newGenerator","type":"address"},{"internalType":"address","name":"_newRouter","type":"address"}],"name":"updateGeneratorRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"updateMinBalanceSupra","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"uint256","name":"_newEndTime","type":"uint256"}],"name":"updateSubscription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFundClient","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080346200023657601f62002bc338819003918201601f191683019291906001600160401b038411838510176200023b578160a092849260409687528339810103126200023657620000518162000251565b6200005f6020830162000251565b906200006d84840162000251565b9260806200007e6060830162000251565b91015193600154926000549460018060a01b031995338782161760005588519260018060a01b03968792833391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a81b0319166001551691338314620001f45750841680151580620001ea575b80620001de575b80620001d2575b156200018f5786156200014b579084929186600f541617600f5585600e541617600e551683600a541617600a551690600b541617600b556009555161295c9081620002678239f35b875162461bcd60e51b815260206004820152601d60248201527f496e76616c6964204d696e696d756d2062616c616e6365206c696d69740000006044820152606490fd5b6064885162461bcd60e51b815260206004820152602060248201527f416464726573732063616e6e6f742062652061207a65726f20616464726573736044820152fd5b50848416151562000103565b508483161515620000fc565b50811515620000f5565b62461bcd60e51b815260206004820152601c60248201527f41646d696e2063616e6e6f742062652074686520617070726f766572000000006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620002365756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826303df669314611df85750816308b35dd414611cbc578163141a8dd814611c935781631e06a9ec14611c6d5781631e7c886914611c225781631f721d9014611afc578163233fe0ec14611abf578163287997ea14611a96578163317a229614611a775781633704c94f14611a585781633b698197146119bc5781634c906d751461189f5781634cf614a11461186e5781635a5e701a1461173d5781635c975abb1461171657816368d15bbf146116005781636be13c92146115d75781636ca2a3951461147a5781636f4c3e8c1461135f578163723fed311461133d57816375f4b8a21461128157816379ba5097146111c05781637afa1eed1461119757816386f6fef7146111695781638a3b87c6146110075781638bad5de914610fe15781638da5cb5b14610fb9578163965427c314610e6c57816398f309cc14610d475781639c69c78214610ce6578163b267cfa314610b64578163b480bfff14610a8c578163b52ddfbc146109eb578163bbdded0f146108dd578163c02420f214610884578163c168ae5714610798578163c1e877371461066d578163c36e5d0914610640578163ca4b208b14610617578163d13deea0146104df578163d23d433314610487578163e30c39781461045e578163ebefa86614610437578163f096245d1461035057508063f2fde38b146102e0578063f887ea40146102b85763f948ae291461022a57600080fd5b816003193601126102b4577f1a1293d7af3357cec67893722572b0342502edfe63a5fd97b5d68cb68321d9b190610276610271336000526003602052604060002054151590565b611f4c565b338352600760205261028c818420543490611f29565b3380855260076020908152838620929092559151918252349082015280604081015b0390a180f35b5080fd5b50346102b457816003193601126102b457600b5490516001600160a01b039091168152602090f35b823461034d57602036600319011261034d576102fa611e87565b610302612867565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b82843461034d57602036600319011261034d576001600160a01b0380610374611e87565b1690610390610271836000526003602052604060002054151590565b813314908115610428575b811561041a575b811561040c575b50156103c15781526020928352819020549051908152f35b825162461bcd60e51b8152602081860152603160248201526000805160206129078339815191526044820152701ac81d1a19481d1bdd185b0818dbdd5b9d607a1b6064820152608490fd5b9050600a54163314856103a9565b8091508354163314906103a2565b809150600f541633149061039b565b5050346102b457816003193601126102b45760209060ff600f5460a01c1690519015158152f35b5050346102b457816003193601126102b45760015490516001600160a01b039091168152602090f35b833461034d57602036600319011261034d576104a1611e87565b6104a9612867565b600d80546001600160a01b0319166001600160a01b0392909216919091179055600f805460ff60a01b1916600160a01b17905580f35b91905034610613576020366003190112610613578135916104fe6128bf565b6105073361203d565b83116105bc5761051f8361051a3361203d565b612030565b3385526007602052828520558380808086335af161053b611ff4565b501561057a57505133815260208101919091527fc74ad6879c7740563cf7f39668cc9ad4010de80d20cbff857d745eeba33cbd109080604081016102ae565b6020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f7420776974686472617720636c69656e742066756e6473000000006044820152fd5b6020608492519162461bcd60e51b8352820152602c60248201527f496e73756666696369656e742046756e64733a2046756e64207769746864726160448201526b3bb4b73390313c903ab9b2b960a11b6064820152fd5b8280fd5b5050346102b457816003193601126102b457600f5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666610661611e87565b61203d565b9051908152f35b839150346102b45760203660031901126102b4576001600160a01b039081610693611e87565b16916106af610271846000526003602052604060002054151590565b823314908115610789575b811561077b575b811561076d575b501561071657606084808585815260056020522090806106e6611f98565b9280549384815260ff60026001840154938460208501520154161515938491015281519384526020840152820152f35b608490602085519162461bcd60e51b83528201526037602482015260008051602061290783398151915260448201527f6b2074686520737562736372697074696f6e20696e666f0000000000000000006064820152fd5b9050600a54163314856106c8565b8091508454163314906106c1565b809150600f54163314906106ba565b91905034610613576020366003190112610613578135916107c9610271336000526003602052604060002054151590565b600954831061081c575033808452600660209081528285208490559151908152908101919091527fab834dc04539ce8b6cdebe87cee599127f060c794ebb0dcc66655d6050dc676c9080604081016102ae565b6020608492519162461bcd60e51b8352820152603b60248201527f43616e6e6f74207365742061206c6f776572206c696d6974207468616e20746860448201527f65206c696d69742073657420627920746865206465706c6f79657200000000006064820152fd5b5050346102b457806003193601126102b4576020906108d46108a4611e87565b6108ac611ea2565b906108cf61027160018060a01b0383166000526003602052604060002054151590565b6121c0565b90519015158152f35b9050823461034d57602036600319011261034d576108f9611e87565b6001600160a01b03808216600081815260036020526040902054929492610921901515611f4c565b33149081156109dc575b81156109cf575b5015610982575091602092916109478161203d565b61095082612543565b1061095d575b5051908152f35b61097b91925061097561096f8261203d565b91612543565b90612030565b9083610956565b608490602085519162461bcd60e51b8352820152603360248201526000805160206129078339815191526044820152726b206566666563746976652062616c616e636560681b6064820152fd5b9050825416331485610932565b809150600f541633149061092b565b90503461061357602036600319011261061357610a06611e87565b610a0e612867565b6001600160a01b0316918215610a365750506001600160601b0360a01b600f541617600f5580f35b906020608492519162461bcd60e51b8352820152602a60248201527f446576656c6f70657220616464726573732063616e6e6f742062652061207a65604482015269726f206164647265737360b01b6064820152fd5b9190503461061357602036600319011261061357610aa8611e87565b9133845280602052610ac582852060018060a01b03851690612777565b15610b0b5750516001600160a01b0390911681524260208201527fb427cf1de9ad97d508ddd8d5635c1bc170353a52661b7b77e441474f7c442a7d9080604081016102ae565b6020608492519162461bcd60e51b8352820152602e60248201527f436f6e7472616374206973206e6f742077686974656c6973746564206f72206160448201526d1b1c9958591e481c995b5bdd995960921b6064820152fd5b839150346102b457826003193601126102b457610b7f611e87565b600a54602435926001600160a01b039182163303610c7d57610ba08361203d565b8411610c2057507f63216f1109e37913888a828960a8da002a7702656ade0492848dd2857aa8fe3693946102ae9183168087526007602052610be58583892054612030565b908752600760205281872055610bfd84600854611f29565b600855516001600160a01b03909216825260208201929092529081906040820190565b608490602087519162461bcd60e51b8352820152603160248201527f496e73756666696369656e742046756e64733a20436f6c6c656374696e6720666044820152703ab7323990313c9033b2b732b930ba37b960791b6064820152fd5b608490602087519162461bcd60e51b8352820152603960248201527f43616c6c6572206973206e6f7420746865206f776e65723a204f6e6c7920476560448201527f6e657261746f722063616e20636f6c6c6563742066756e6473000000000000006064820152fd5b5050346102b457816003193601126102b45760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610d24612867565b610d2c6128bf565b6001805460ff60a01b1916600160a01b17905551338152a180f35b82843461034d57602036600319011261034d57610d62611e87565b6001600160a01b03808216600081815260036020526040902054929392610d8a901515611f4c565b3314918215610e5d575b8215610e4f575b508115610e40575b8115610e32575b5015610dc95760209250610dc061096f8261203d565b10159051908152f35b815162461bcd60e51b8152602081850152603960248201527f556e617574686f72697a6564204163636573733a20416464726573732063616e60448201527f6e6f7420636865636b206d696e696d756d2062616c616e6365000000000000006064820152608490fd5b9050600b5416331484610daa565b809150600a5416331490610da3565b819250541633149085610d9b565b915080600f5416331491610d94565b9190503461061357602036600319011261061357610e88611e87565b91610e91612867565b6001600160a01b038316600081815260036020526040902054610eb5901515611f4c565b84808080610ec28861203d565b855af1610ecd611ff4565b5015610f7657610edc9061268d565b15610f225750516001600160a01b0390911681524260208201527f51e7e2c8606f03d2c1f0b012f6707ef7d99d1562a6c7d9eeca75f5b3af3980d59080604081016102ae565b6020608492519162461bcd60e51b8352820152602960248201527f436c69656e74206e6f742077686974656c6973746564206f7220616c726561646044820152681e481c995b5bdd995960ba1b6064820152fd5b506020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f74207472616e7366657220636c69656e742066756e6473000000006044820152fd5b5050346102b457816003193601126102b457905490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666611002611e87565b612543565b839150346102b457816003193601126102b457600f546001600160a01b03919082163314801561115d575b156110e6575060025491611044612459565b9261104e8161215a565b916110588261215a565b93815b8381106110a1576110828761109d8a896110908a8351968796606088526060880190611eb8565b908682036020880152611ef5565b9184830390850152611ef5565b0390f35b806110d1836110b36110e1948b612196565b511680865260076020528a8620546110cb848a612196565b52612543565b6110db8289612196565b52612187565b61105b565b60a490602085519162461bcd60e51b8352820152604560248201527f556e617574686f72697a6564204163636573733a204f6e6c7920646576656c6f60448201527f706572206f72206465706c6f7965722063616e20636865636b207468652062616064820152646c616e636560d81b6084820152fd5b50818354163314611032565b5050346102b457806003193601126102b4576020906108d4611189611e87565b611191611ea2565b906121c0565b5050346102b457816003193601126102b457600a5490516001600160a01b039091168152602090f35b91905034610613578260031936011261061357600154916001600160a01b0391338385160361122c5750506001600160a01b031991821660015582543392811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152fd5b9190503461061357806003193601126106135761129c611e87565b91602435926112a9612867565b6001600160a01b03166000818152600360205260409020549091906112cf901515611f4c565b6202a300420180421161132a578411156112f457508352600560205282206001015580f35b606490602084519162461bcd60e51b8352820152601060248201526f496e76616c696420456e642054696d6560801b6044820152fd5b634e487b7160e01b865260118252602486fd5b8390346102b45760203660031901126102b457611358612867565b3560095580f35b90503461061357602090816003193601126114765761137c611e87565b611384612867565b6001600160a01b0316808552818352838520541561141f57845281528183209083600193848092818601915b6113e7575b50505050815491848155826113c8578480f35b84528320908101905b8181106113dd57808480f35b83815582016113d1565b855481101561141a57806113fe61141492886125a6565b90549060031b1c89528286528884812055612187565b836113b0565b6113b5565b50915162461bcd60e51b815291820152602c60248201527f436f6e747261637473206e6f742077686974656c6973746564206f7220616c7260448201526b1958591e481c995b5bdd995960a21b6064820152608490fd5b8380fd5b91905034610613576020366003190112610613578135611498612867565b600c546001600160a01b0316801561157a5760085480831161151f5785838194936114c583958495612030565b6008555af16114d2611ff4565b50156114dc578280f35b906020606492519162461bcd60e51b8352820152601f60248201527f43616e6e6f7420636c61696d2066726565206e6f646520657870656e736573006044820152fd5b835162461bcd60e51b8152602081870152602f60248201527f496e73756666696369656e742046756e64733a20436c61696d696e672066726560448201526e65206e6f646520657870656e73657360881b6064820152608490fd5b825162461bcd60e51b8152602081860152603160248201527f496e76616c696420416464726573733a20416464726573732063616e6e6f742060448201527062652061207a65726f206164647265737360781b6064820152608490fd5b5050346102b457816003193601126102b457600c5490516001600160a01b039091168152602090f35b919050346106135760203660031901126106135761161c611e87565b91611637610271336000526003602052604060002054151590565b823b156116dc573384528060205261165b8285209360018060a01b03168094612636565b1561169a57507fec3b8f7f6fc93e30f5a4d232044ffe225b0e16bfa3a35dd26929478b7b7cf5079181606092519133835260208301524290820152a180f35b6020606492519162461bcd60e51b8352820152601f60248201527f436f6e747261637420697320416c72656164792077686974656c6973746564006044820152fd5b6020606492519162461bcd60e51b83528201526015602482015274416464726573732063616e6e6f7420626520454f4160581b6044820152fd5b5050346102b457816003193601126102b45760209060ff60015460a01c1690519015158152f35b905034610613578160031936011261061357611757611e87565b90611760611ea2565b90611769612867565b823b151580611864575b15611816576001600160a01b03928316938415158061180b575b156117b65750506001600160601b0360a01b9283600a541617600a551690600b541617600b5580f35b906020608492519162461bcd60e51b8352820152602960248201527f436f6e747261637420616464726573732063616e6e6f742062652061207a65726044820152686f206164647265737360b81b6064820152fd5b50838316151561178d565b608490602085519162461bcd60e51b8352820152602260248201527f416464726573732063616e6e6f7420626520612077616c6c6574206164647265604482015261737360f01b6064820152fd5b50813b1515611773565b5050346102b457816003193601126102b45761109d9061188c612459565b9051918291602083526020830190611eb8565b839150346102b457826003193601126102b4576118ba611e87565b602435916118c6612867565b6001600160a01b0382166000818152600360205260409020549091906118ed901515611f4c565b6008549081851161196d5750946102ae9161192a857ff2e47447f313cd2dfd6619c01eb5086d0e611595137943f8d19508636ce61c769798612030565b60085580875260076020526119428583892054611f29565b908752600760205281872055519283928360209093929193604081019460018060a01b031681520152565b608490602088519162461bcd60e51b83528201526024808201527f496e73756666696369656e742066756e64733a20657865637574696e67207265604482015263199d5b9960e21b6064820152fd5b9050346106135782600319360112610613576119d6612867565b6001549060ff8260a01c1615611a1e575060ff60a01b1916600155513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b5050346102b457816003193601126102b4576020906002549051908152f35b5050346102b457816003193601126102b4576020906009549051908152f35b5050346102b457816003193601126102b457600d5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b4576020906108d46001600160a01b03611ae8611e87565b166000526003602052604060002054151590565b91905034610613578260031936011261061357600e546001600160a01b039081163303611bc857600f549260ff8460a01c1615611b855750916020917ff562f58226d62299459492ca2aa60f98cba368ce1faa18c20b931cb9c84d3a5d93600d541691826001600160601b0360a01b600c541617600c5560ff60a01b1916600f5551908152a180f35b606490602084519162461bcd60e51b8352820152601d60248201527f436f6c642077616c6c65742070726f706f7365206e6f742072656164790000006044820152fd5b815162461bcd60e51b8152602081850152602e60248201527f556e617574686f72697a6564204163636573733a204f6e6c7920417070726f7660448201526d65722063616e20636f6e6669726d60901b6064820152608490fd5b5050346102b45760203660031901126102b45761109d9061188c611c44611e87565b6001600160a01b038116600090815260036020526040902054611c68901515611f4c565b6122c6565b838060031936011261034d57611c81612867565b611c8d34600854611f29565b60085580f35b5050346102b457816003193601126102b457600e5490516001600160a01b039091168152602090f35b8383346102b457806003193601126102b457611cd6611e87565b6024359081151580920361147657611cec612867565b6001600160a01b0316600081815260036020526040902054909290611db657611d14836125be565b5062ed4e00420190814211611da357917f75b0a96771559886d7368303c13fc539a88faea45bbea23b0a72ac991d834a3a9391608093611d52611f98565b4281526002602082019184835283810192868452878b526005602052848b2091518255516001820155019051151560ff8019835416911617905580519384524260208501528301526060820152a180f35b634e487b7160e01b855260118652602485fd5b5162461bcd60e51b8152602081860152601d60248201527f436c69656e7420697320616c72656164792077686974656c69737465640000006044820152606490fd5b9150833461034d578060031936011261034d5754336001600160a01b0391821614908115611e79575b5015611e34576020836008549051908152f35b62461bcd60e51b8252602090820152602d602482015260008051602061290783398151915260448201526c6b2073757072612066756e647360981b6064820152608490fd5b9050600f5416331484611e21565b600435906001600160a01b0382168203611e9d57565b600080fd5b602435906001600160a01b0382168203611e9d57565b90815180825260208080930193019160005b828110611ed8575050505090565b83516001600160a01b031685529381019392810192600101611eca565b90815180825260208080930193019160005b828110611f15575050505090565b835185529381019392810192600101611f07565b91908201809211611f3657565b634e487b7160e01b600052601160045260246000fd5b15611f5357565b60405162461bcd60e51b815260206004820152601e60248201527f436c69656e742061646472657373206e6f742077686974656c697374656400006044820152606490fd5b604051906060820182811067ffffffffffffffff821117611fb857604052565b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f1916820167ffffffffffffffff811183821017611fb857604052565b3d1561202b573d9067ffffffffffffffff8211611fb85761201e601f8301601f1916602001611fce565b9182523d6000602084013e565b606090565b91908203918211611f3657565b6001600160a01b03908116600081815260036020526040902054909190612065901515611f4c565b813314908115612133575b8115612124575b8115612115575b8115612107575b501561209c57600052600760205260406000205490565b60405162461bcd60e51b815260206004820152603760248201527f556e617574686f72697a6564204163636573733a2041646472657373206e6f7460448201527f20616c6c6f77656420746f20636865636b2066756e64730000000000000000006064820152608490fd5b9050600b5416331438612085565b809150600a541633149061207e565b80915060005416331490612077565b809150600f5416331490612070565b67ffffffffffffffff8111611fb85760051b60200190565b9061216c61216783612142565b611fce565b828152809261217d601f1991612142565b0190602036910137565b6000198114611f365760010190565b80518210156121aa5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03908116600081815260036020526040902054909291906121e9901515611f4c565b82331480156122b9575b80156122ac575b801561229f575b8015612292575b1561223957612236926000526004602052604060002091169060019160005201602052604060002054151590565b90565b60405162461bcd60e51b815260206004820152603e602482015260008051602061290783398151915260448201527f6b20666f72207468652077686974656c697374656420636f6e747261637400006064820152608490fd5b5080600b54163314612208565b5080600a54163314612201565b50806000541633146121fa565b5080600f541633146121f3565b6001600160a01b0390811690338214801561244c575b801561243f575b156123da5781156123955790600081815260046020928184526040908184205461230c8161215a565b9685925b8284106123615750505015612326575050505090565b8051945091928401919067ffffffffffffffff83118584101761234e57505280825236813790565b634e487b7160e01b845260419052602483fd5b90919261238d908288528689528361237b82888b206125a6565b90549060031b1c166110db828c612196565b929190612310565b60405162461bcd60e51b815260206004820152601b60248201527f5573657220616464726573732063616e6e6f74206265207a65726f00000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526043602482015260008051602061290783398151915260448201527f6b20746865206c697374206f662077686974656c697374656420636f6e74726160648201526263747360e81b608482015260a490fd5b50806000541633146122e3565b5080600f541633146122dc565b600f546001600160a01b0390811633148015612536575b156124d4576002908154906124848261215a565b926000805b84811061249857505050505090565b6124cf9083835284817f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0154166110db8289612196565b612489565b60405162461bcd60e51b815260206004820152603460248201527f556e617574686f72697a6564204163636573733a2043616e6e6f74206c6973746044820152732077686974656c697374656420636c69656e747360601b6064820152608490fd5b5080600054163314612470565b6001600160a01b03166000908152600660205260409020546009548082111561256a575090565b905090565b6002548110156121aa5760026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b80548210156121aa5760005260206000200190600090565b60008181526003602052604081205461256a57600254600160401b81101561262257908261260e6125f78460016040960160025561256f565b819391549060031b91821b91600019901b19161790565b905560025492815260036020522055600190565b634e487b7160e01b82526041600452602482fd5b600082815260018201602052604090205461268657805490600160401b821015611fb8578261266f6125f78460018096018555846125a6565b905580549260005201602052604060002055600190565b5050600090565b6000818152600360205260408120549091908015612772576000199080820181811161275e576002549083820191821161274a57808203612716575b5050506002548015612702578101906126e18261256f565b909182549160031b1b19169055600255815260036020526040812055600190565b634e487b7160e01b84526031600452602484fd5b6127346127256125f79361256f565b90549060031b1c92839261256f565b90558452600360205260408420553880806126c9565b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b505090565b90600182019060009281845282602052604084205490811515600014612860576000199180830181811161284c5782549084820191821161283857808203612803575b505050805480156127ef578201916127d283836125a6565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6128236128136125f793866125a6565b90549060031b1c928392866125a6565b905586528460205260408620553880806127ba565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526011600452602487fd5b5050505090565b6000546001600160a01b0316330361287b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60ff60015460a01c166128ce57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fdfe556e617574686f72697a6564204163636573733a2043616e6e6f742063686563a2646970667358221220bb4de4759bc0930ad7c36c93faa134d43747722925c79cd1a6cb99a60d52802964736f6c634300081300330000000000000000000000002f80fa9f2f2a31aef93967f0f90faafd08551abf000000000000000000000000f4ea78e438b4462954a2d5fc1c4f82c7e6129b1a000000000000000000000000aed50e38ea396c863b2575c6cd915e297f3434ee000000000000000000000000589b45f2c65796fc60b1b61802b10d7c7de86cc7000000000000000000000000000000000000000000000000002386f26fc10000

Deployed Bytecode

0x608060408181526004918236101561001657600080fd5b600092833560e01c91826303df669314611df85750816308b35dd414611cbc578163141a8dd814611c935781631e06a9ec14611c6d5781631e7c886914611c225781631f721d9014611afc578163233fe0ec14611abf578163287997ea14611a96578163317a229614611a775781633704c94f14611a585781633b698197146119bc5781634c906d751461189f5781634cf614a11461186e5781635a5e701a1461173d5781635c975abb1461171657816368d15bbf146116005781636be13c92146115d75781636ca2a3951461147a5781636f4c3e8c1461135f578163723fed311461133d57816375f4b8a21461128157816379ba5097146111c05781637afa1eed1461119757816386f6fef7146111695781638a3b87c6146110075781638bad5de914610fe15781638da5cb5b14610fb9578163965427c314610e6c57816398f309cc14610d475781639c69c78214610ce6578163b267cfa314610b64578163b480bfff14610a8c578163b52ddfbc146109eb578163bbdded0f146108dd578163c02420f214610884578163c168ae5714610798578163c1e877371461066d578163c36e5d0914610640578163ca4b208b14610617578163d13deea0146104df578163d23d433314610487578163e30c39781461045e578163ebefa86614610437578163f096245d1461035057508063f2fde38b146102e0578063f887ea40146102b85763f948ae291461022a57600080fd5b816003193601126102b4577f1a1293d7af3357cec67893722572b0342502edfe63a5fd97b5d68cb68321d9b190610276610271336000526003602052604060002054151590565b611f4c565b338352600760205261028c818420543490611f29565b3380855260076020908152838620929092559151918252349082015280604081015b0390a180f35b5080fd5b50346102b457816003193601126102b457600b5490516001600160a01b039091168152602090f35b823461034d57602036600319011261034d576102fa611e87565b610302612867565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b82843461034d57602036600319011261034d576001600160a01b0380610374611e87565b1690610390610271836000526003602052604060002054151590565b813314908115610428575b811561041a575b811561040c575b50156103c15781526020928352819020549051908152f35b825162461bcd60e51b8152602081860152603160248201526000805160206129078339815191526044820152701ac81d1a19481d1bdd185b0818dbdd5b9d607a1b6064820152608490fd5b9050600a54163314856103a9565b8091508354163314906103a2565b809150600f541633149061039b565b5050346102b457816003193601126102b45760209060ff600f5460a01c1690519015158152f35b5050346102b457816003193601126102b45760015490516001600160a01b039091168152602090f35b833461034d57602036600319011261034d576104a1611e87565b6104a9612867565b600d80546001600160a01b0319166001600160a01b0392909216919091179055600f805460ff60a01b1916600160a01b17905580f35b91905034610613576020366003190112610613578135916104fe6128bf565b6105073361203d565b83116105bc5761051f8361051a3361203d565b612030565b3385526007602052828520558380808086335af161053b611ff4565b501561057a57505133815260208101919091527fc74ad6879c7740563cf7f39668cc9ad4010de80d20cbff857d745eeba33cbd109080604081016102ae565b6020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f7420776974686472617720636c69656e742066756e6473000000006044820152fd5b6020608492519162461bcd60e51b8352820152602c60248201527f496e73756666696369656e742046756e64733a2046756e64207769746864726160448201526b3bb4b73390313c903ab9b2b960a11b6064820152fd5b8280fd5b5050346102b457816003193601126102b457600f5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666610661611e87565b61203d565b9051908152f35b839150346102b45760203660031901126102b4576001600160a01b039081610693611e87565b16916106af610271846000526003602052604060002054151590565b823314908115610789575b811561077b575b811561076d575b501561071657606084808585815260056020522090806106e6611f98565b9280549384815260ff60026001840154938460208501520154161515938491015281519384526020840152820152f35b608490602085519162461bcd60e51b83528201526037602482015260008051602061290783398151915260448201527f6b2074686520737562736372697074696f6e20696e666f0000000000000000006064820152fd5b9050600a54163314856106c8565b8091508454163314906106c1565b809150600f54163314906106ba565b91905034610613576020366003190112610613578135916107c9610271336000526003602052604060002054151590565b600954831061081c575033808452600660209081528285208490559151908152908101919091527fab834dc04539ce8b6cdebe87cee599127f060c794ebb0dcc66655d6050dc676c9080604081016102ae565b6020608492519162461bcd60e51b8352820152603b60248201527f43616e6e6f74207365742061206c6f776572206c696d6974207468616e20746860448201527f65206c696d69742073657420627920746865206465706c6f79657200000000006064820152fd5b5050346102b457806003193601126102b4576020906108d46108a4611e87565b6108ac611ea2565b906108cf61027160018060a01b0383166000526003602052604060002054151590565b6121c0565b90519015158152f35b9050823461034d57602036600319011261034d576108f9611e87565b6001600160a01b03808216600081815260036020526040902054929492610921901515611f4c565b33149081156109dc575b81156109cf575b5015610982575091602092916109478161203d565b61095082612543565b1061095d575b5051908152f35b61097b91925061097561096f8261203d565b91612543565b90612030565b9083610956565b608490602085519162461bcd60e51b8352820152603360248201526000805160206129078339815191526044820152726b206566666563746976652062616c616e636560681b6064820152fd5b9050825416331485610932565b809150600f541633149061092b565b90503461061357602036600319011261061357610a06611e87565b610a0e612867565b6001600160a01b0316918215610a365750506001600160601b0360a01b600f541617600f5580f35b906020608492519162461bcd60e51b8352820152602a60248201527f446576656c6f70657220616464726573732063616e6e6f742062652061207a65604482015269726f206164647265737360b01b6064820152fd5b9190503461061357602036600319011261061357610aa8611e87565b9133845280602052610ac582852060018060a01b03851690612777565b15610b0b5750516001600160a01b0390911681524260208201527fb427cf1de9ad97d508ddd8d5635c1bc170353a52661b7b77e441474f7c442a7d9080604081016102ae565b6020608492519162461bcd60e51b8352820152602e60248201527f436f6e7472616374206973206e6f742077686974656c6973746564206f72206160448201526d1b1c9958591e481c995b5bdd995960921b6064820152fd5b839150346102b457826003193601126102b457610b7f611e87565b600a54602435926001600160a01b039182163303610c7d57610ba08361203d565b8411610c2057507f63216f1109e37913888a828960a8da002a7702656ade0492848dd2857aa8fe3693946102ae9183168087526007602052610be58583892054612030565b908752600760205281872055610bfd84600854611f29565b600855516001600160a01b03909216825260208201929092529081906040820190565b608490602087519162461bcd60e51b8352820152603160248201527f496e73756666696369656e742046756e64733a20436f6c6c656374696e6720666044820152703ab7323990313c9033b2b732b930ba37b960791b6064820152fd5b608490602087519162461bcd60e51b8352820152603960248201527f43616c6c6572206973206e6f7420746865206f776e65723a204f6e6c7920476560448201527f6e657261746f722063616e20636f6c6c6563742066756e6473000000000000006064820152fd5b5050346102b457816003193601126102b45760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610d24612867565b610d2c6128bf565b6001805460ff60a01b1916600160a01b17905551338152a180f35b82843461034d57602036600319011261034d57610d62611e87565b6001600160a01b03808216600081815260036020526040902054929392610d8a901515611f4c565b3314918215610e5d575b8215610e4f575b508115610e40575b8115610e32575b5015610dc95760209250610dc061096f8261203d565b10159051908152f35b815162461bcd60e51b8152602081850152603960248201527f556e617574686f72697a6564204163636573733a20416464726573732063616e60448201527f6e6f7420636865636b206d696e696d756d2062616c616e6365000000000000006064820152608490fd5b9050600b5416331484610daa565b809150600a5416331490610da3565b819250541633149085610d9b565b915080600f5416331491610d94565b9190503461061357602036600319011261061357610e88611e87565b91610e91612867565b6001600160a01b038316600081815260036020526040902054610eb5901515611f4c565b84808080610ec28861203d565b855af1610ecd611ff4565b5015610f7657610edc9061268d565b15610f225750516001600160a01b0390911681524260208201527f51e7e2c8606f03d2c1f0b012f6707ef7d99d1562a6c7d9eeca75f5b3af3980d59080604081016102ae565b6020608492519162461bcd60e51b8352820152602960248201527f436c69656e74206e6f742077686974656c6973746564206f7220616c726561646044820152681e481c995b5bdd995960ba1b6064820152fd5b506020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f74207472616e7366657220636c69656e742066756e6473000000006044820152fd5b5050346102b457816003193601126102b457905490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666611002611e87565b612543565b839150346102b457816003193601126102b457600f546001600160a01b03919082163314801561115d575b156110e6575060025491611044612459565b9261104e8161215a565b916110588261215a565b93815b8381106110a1576110828761109d8a896110908a8351968796606088526060880190611eb8565b908682036020880152611ef5565b9184830390850152611ef5565b0390f35b806110d1836110b36110e1948b612196565b511680865260076020528a8620546110cb848a612196565b52612543565b6110db8289612196565b52612187565b61105b565b60a490602085519162461bcd60e51b8352820152604560248201527f556e617574686f72697a6564204163636573733a204f6e6c7920646576656c6f60448201527f706572206f72206465706c6f7965722063616e20636865636b207468652062616064820152646c616e636560d81b6084820152fd5b50818354163314611032565b5050346102b457806003193601126102b4576020906108d4611189611e87565b611191611ea2565b906121c0565b5050346102b457816003193601126102b457600a5490516001600160a01b039091168152602090f35b91905034610613578260031936011261061357600154916001600160a01b0391338385160361122c5750506001600160a01b031991821660015582543392811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152fd5b9190503461061357806003193601126106135761129c611e87565b91602435926112a9612867565b6001600160a01b03166000818152600360205260409020549091906112cf901515611f4c565b6202a300420180421161132a578411156112f457508352600560205282206001015580f35b606490602084519162461bcd60e51b8352820152601060248201526f496e76616c696420456e642054696d6560801b6044820152fd5b634e487b7160e01b865260118252602486fd5b8390346102b45760203660031901126102b457611358612867565b3560095580f35b90503461061357602090816003193601126114765761137c611e87565b611384612867565b6001600160a01b0316808552818352838520541561141f57845281528183209083600193848092818601915b6113e7575b50505050815491848155826113c8578480f35b84528320908101905b8181106113dd57808480f35b83815582016113d1565b855481101561141a57806113fe61141492886125a6565b90549060031b1c89528286528884812055612187565b836113b0565b6113b5565b50915162461bcd60e51b815291820152602c60248201527f436f6e747261637473206e6f742077686974656c6973746564206f7220616c7260448201526b1958591e481c995b5bdd995960a21b6064820152608490fd5b8380fd5b91905034610613576020366003190112610613578135611498612867565b600c546001600160a01b0316801561157a5760085480831161151f5785838194936114c583958495612030565b6008555af16114d2611ff4565b50156114dc578280f35b906020606492519162461bcd60e51b8352820152601f60248201527f43616e6e6f7420636c61696d2066726565206e6f646520657870656e736573006044820152fd5b835162461bcd60e51b8152602081870152602f60248201527f496e73756666696369656e742046756e64733a20436c61696d696e672066726560448201526e65206e6f646520657870656e73657360881b6064820152608490fd5b825162461bcd60e51b8152602081860152603160248201527f496e76616c696420416464726573733a20416464726573732063616e6e6f742060448201527062652061207a65726f206164647265737360781b6064820152608490fd5b5050346102b457816003193601126102b457600c5490516001600160a01b039091168152602090f35b919050346106135760203660031901126106135761161c611e87565b91611637610271336000526003602052604060002054151590565b823b156116dc573384528060205261165b8285209360018060a01b03168094612636565b1561169a57507fec3b8f7f6fc93e30f5a4d232044ffe225b0e16bfa3a35dd26929478b7b7cf5079181606092519133835260208301524290820152a180f35b6020606492519162461bcd60e51b8352820152601f60248201527f436f6e747261637420697320416c72656164792077686974656c6973746564006044820152fd5b6020606492519162461bcd60e51b83528201526015602482015274416464726573732063616e6e6f7420626520454f4160581b6044820152fd5b5050346102b457816003193601126102b45760209060ff60015460a01c1690519015158152f35b905034610613578160031936011261061357611757611e87565b90611760611ea2565b90611769612867565b823b151580611864575b15611816576001600160a01b03928316938415158061180b575b156117b65750506001600160601b0360a01b9283600a541617600a551690600b541617600b5580f35b906020608492519162461bcd60e51b8352820152602960248201527f436f6e747261637420616464726573732063616e6e6f742062652061207a65726044820152686f206164647265737360b81b6064820152fd5b50838316151561178d565b608490602085519162461bcd60e51b8352820152602260248201527f416464726573732063616e6e6f7420626520612077616c6c6574206164647265604482015261737360f01b6064820152fd5b50813b1515611773565b5050346102b457816003193601126102b45761109d9061188c612459565b9051918291602083526020830190611eb8565b839150346102b457826003193601126102b4576118ba611e87565b602435916118c6612867565b6001600160a01b0382166000818152600360205260409020549091906118ed901515611f4c565b6008549081851161196d5750946102ae9161192a857ff2e47447f313cd2dfd6619c01eb5086d0e611595137943f8d19508636ce61c769798612030565b60085580875260076020526119428583892054611f29565b908752600760205281872055519283928360209093929193604081019460018060a01b031681520152565b608490602088519162461bcd60e51b83528201526024808201527f496e73756666696369656e742066756e64733a20657865637574696e67207265604482015263199d5b9960e21b6064820152fd5b9050346106135782600319360112610613576119d6612867565b6001549060ff8260a01c1615611a1e575060ff60a01b1916600155513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b5050346102b457816003193601126102b4576020906002549051908152f35b5050346102b457816003193601126102b4576020906009549051908152f35b5050346102b457816003193601126102b457600d5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b4576020906108d46001600160a01b03611ae8611e87565b166000526003602052604060002054151590565b91905034610613578260031936011261061357600e546001600160a01b039081163303611bc857600f549260ff8460a01c1615611b855750916020917ff562f58226d62299459492ca2aa60f98cba368ce1faa18c20b931cb9c84d3a5d93600d541691826001600160601b0360a01b600c541617600c5560ff60a01b1916600f5551908152a180f35b606490602084519162461bcd60e51b8352820152601d60248201527f436f6c642077616c6c65742070726f706f7365206e6f742072656164790000006044820152fd5b815162461bcd60e51b8152602081850152602e60248201527f556e617574686f72697a6564204163636573733a204f6e6c7920417070726f7660448201526d65722063616e20636f6e6669726d60901b6064820152608490fd5b5050346102b45760203660031901126102b45761109d9061188c611c44611e87565b6001600160a01b038116600090815260036020526040902054611c68901515611f4c565b6122c6565b838060031936011261034d57611c81612867565b611c8d34600854611f29565b60085580f35b5050346102b457816003193601126102b457600e5490516001600160a01b039091168152602090f35b8383346102b457806003193601126102b457611cd6611e87565b6024359081151580920361147657611cec612867565b6001600160a01b0316600081815260036020526040902054909290611db657611d14836125be565b5062ed4e00420190814211611da357917f75b0a96771559886d7368303c13fc539a88faea45bbea23b0a72ac991d834a3a9391608093611d52611f98565b4281526002602082019184835283810192868452878b526005602052848b2091518255516001820155019051151560ff8019835416911617905580519384524260208501528301526060820152a180f35b634e487b7160e01b855260118652602485fd5b5162461bcd60e51b8152602081860152601d60248201527f436c69656e7420697320616c72656164792077686974656c69737465640000006044820152606490fd5b9150833461034d578060031936011261034d5754336001600160a01b0391821614908115611e79575b5015611e34576020836008549051908152f35b62461bcd60e51b8252602090820152602d602482015260008051602061290783398151915260448201526c6b2073757072612066756e647360981b6064820152608490fd5b9050600f5416331484611e21565b600435906001600160a01b0382168203611e9d57565b600080fd5b602435906001600160a01b0382168203611e9d57565b90815180825260208080930193019160005b828110611ed8575050505090565b83516001600160a01b031685529381019392810192600101611eca565b90815180825260208080930193019160005b828110611f15575050505090565b835185529381019392810192600101611f07565b91908201809211611f3657565b634e487b7160e01b600052601160045260246000fd5b15611f5357565b60405162461bcd60e51b815260206004820152601e60248201527f436c69656e742061646472657373206e6f742077686974656c697374656400006044820152606490fd5b604051906060820182811067ffffffffffffffff821117611fb857604052565b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f1916820167ffffffffffffffff811183821017611fb857604052565b3d1561202b573d9067ffffffffffffffff8211611fb85761201e601f8301601f1916602001611fce565b9182523d6000602084013e565b606090565b91908203918211611f3657565b6001600160a01b03908116600081815260036020526040902054909190612065901515611f4c565b813314908115612133575b8115612124575b8115612115575b8115612107575b501561209c57600052600760205260406000205490565b60405162461bcd60e51b815260206004820152603760248201527f556e617574686f72697a6564204163636573733a2041646472657373206e6f7460448201527f20616c6c6f77656420746f20636865636b2066756e64730000000000000000006064820152608490fd5b9050600b5416331438612085565b809150600a541633149061207e565b80915060005416331490612077565b809150600f5416331490612070565b67ffffffffffffffff8111611fb85760051b60200190565b9061216c61216783612142565b611fce565b828152809261217d601f1991612142565b0190602036910137565b6000198114611f365760010190565b80518210156121aa5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03908116600081815260036020526040902054909291906121e9901515611f4c565b82331480156122b9575b80156122ac575b801561229f575b8015612292575b1561223957612236926000526004602052604060002091169060019160005201602052604060002054151590565b90565b60405162461bcd60e51b815260206004820152603e602482015260008051602061290783398151915260448201527f6b20666f72207468652077686974656c697374656420636f6e747261637400006064820152608490fd5b5080600b54163314612208565b5080600a54163314612201565b50806000541633146121fa565b5080600f541633146121f3565b6001600160a01b0390811690338214801561244c575b801561243f575b156123da5781156123955790600081815260046020928184526040908184205461230c8161215a565b9685925b8284106123615750505015612326575050505090565b8051945091928401919067ffffffffffffffff83118584101761234e57505280825236813790565b634e487b7160e01b845260419052602483fd5b90919261238d908288528689528361237b82888b206125a6565b90549060031b1c166110db828c612196565b929190612310565b60405162461bcd60e51b815260206004820152601b60248201527f5573657220616464726573732063616e6e6f74206265207a65726f00000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526043602482015260008051602061290783398151915260448201527f6b20746865206c697374206f662077686974656c697374656420636f6e74726160648201526263747360e81b608482015260a490fd5b50806000541633146122e3565b5080600f541633146122dc565b600f546001600160a01b0390811633148015612536575b156124d4576002908154906124848261215a565b926000805b84811061249857505050505090565b6124cf9083835284817f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0154166110db8289612196565b612489565b60405162461bcd60e51b815260206004820152603460248201527f556e617574686f72697a6564204163636573733a2043616e6e6f74206c6973746044820152732077686974656c697374656420636c69656e747360601b6064820152608490fd5b5080600054163314612470565b6001600160a01b03166000908152600660205260409020546009548082111561256a575090565b905090565b6002548110156121aa5760026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b80548210156121aa5760005260206000200190600090565b60008181526003602052604081205461256a57600254600160401b81101561262257908261260e6125f78460016040960160025561256f565b819391549060031b91821b91600019901b19161790565b905560025492815260036020522055600190565b634e487b7160e01b82526041600452602482fd5b600082815260018201602052604090205461268657805490600160401b821015611fb8578261266f6125f78460018096018555846125a6565b905580549260005201602052604060002055600190565b5050600090565b6000818152600360205260408120549091908015612772576000199080820181811161275e576002549083820191821161274a57808203612716575b5050506002548015612702578101906126e18261256f565b909182549160031b1b19169055600255815260036020526040812055600190565b634e487b7160e01b84526031600452602484fd5b6127346127256125f79361256f565b90549060031b1c92839261256f565b90558452600360205260408420553880806126c9565b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b505090565b90600182019060009281845282602052604084205490811515600014612860576000199180830181811161284c5782549084820191821161283857808203612803575b505050805480156127ef578201916127d283836125a6565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6128236128136125f793866125a6565b90549060031b1c928392866125a6565b905586528460205260408620553880806127ba565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526011600452602487fd5b5050505090565b6000546001600160a01b0316330361287b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60ff60015460a01c166128ce57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fdfe556e617574686f72697a6564204163636573733a2043616e6e6f742063686563a2646970667358221220bb4de4759bc0930ad7c36c93faa134d43747722925c79cd1a6cb99a60d52802964736f6c63430008130033

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

0000000000000000000000002f80fa9f2f2a31aef93967f0f90faafd08551abf000000000000000000000000f4ea78e438b4462954a2d5fc1c4f82c7e6129b1a000000000000000000000000aed50e38ea396c863b2575c6cd915e297f3434ee000000000000000000000000589b45f2c65796fc60b1b61802b10d7c7de86cc7000000000000000000000000000000000000000000000000002386f26fc10000

-----Decoded View---------------
Arg [0] : _approver (address): 0x2f80fA9F2F2A31aEf93967f0f90fAafd08551ABF
Arg [1] : _developer (address): 0xf4EA78e438b4462954a2D5fc1c4f82C7E6129b1a
Arg [2] : _newGenerator (address): 0xaED50E38Ea396c863b2575C6cD915E297F3434Ee
Arg [3] : _newRouter (address): 0x589b45F2c65796fc60b1b61802B10d7C7de86cc7
Arg [4] : _minBalanceLimitSupra (uint256): 10000000000000000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000002f80fa9f2f2a31aef93967f0f90faafd08551abf
Arg [1] : 000000000000000000000000f4ea78e438b4462954a2d5fc1c4f82c7e6129b1a
Arg [2] : 000000000000000000000000aed50e38ea396c863b2575c6cd915e297f3434ee
Arg [3] : 000000000000000000000000589b45f2c65796fc60b1b61802b10d7c7de86cc7
Arg [4] : 000000000000000000000000000000000000000000000000002386f26fc10000


Deployed Bytecode Sourcemap

321:30046:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14033:38;13933:10;6048:112;4959:55:3;13933:10:2;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;4959:55;6048:112:2;:::i;:::-;13933:10;321:30046;;13984:10;321:30046;;13984:34;321:30046;;;;14009:9;13984:34;;:::i;:::-;13933:10;321:30046;;;13984:10;321:30046;;;;;;;;;;;;;;;;14009:9;321:30046;;;;;;;;14033:38;;;;321:30046;;;;;;;;;;;;;;;;;;;1132:21;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;1056:62:5;;:::i;:::-;321:30046:2;;;-1:-1:-1;;;;;;321:30046:2;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;1267:43:6;321:30046:2;;1267:43:6;321:30046:2;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;-1:-1:-1;;;;;321:30046:2;;;:::i;:::-;;4959:55:3;6048:112:2;4959:55:3;;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;23544:10;;23585:19;:49;;;;;321:30046;23585:77;;;;321:30046;23585:107;;;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;-1:-1:-1;;;321:30046:2;;;;;;;23585:107;321:30046;;23683:9;321:30046;;23544:10;23678:14;23585:107;;;:77;321:30046;;;;;;23544:10;23650:12;23585:77;;;:49;321:30046;;;23625:9;321:30046;;23544:10;23620:14;23585:49;;;321:30046;;;;;;;;;;;;;;;;;1281:24;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;1056:62:5;;:::i;:::-;19415:28:2;321:30046;;-1:-1:-1;;;;;;321:30046:2;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;19453:19;321:30046;;-1:-1:-1;;;;321:30046:2;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;1197:72:7;;;:::i;:::-;16842:7:2;14867:10;16842:7;:::i;:::-;14840:38;;321:30046;;14983:37;14867:10;16842:7;14867:10;16842:7;:::i;:::-;14983:37;:::i;:::-;14867:10;321:30046;;14958:10;321:30046;;;;;;14867:10;;;;;;15063:74;;;;:::i;:::-;;321:30046;;;-1:-1:-1;321:30046:2;14867:10;321:30046;;;;;;;;;15207:36;;321:30046;;;;15207:36;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;1251:24;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;16842:7;321:30046;;:::i;:::-;16842:7;:::i;:::-;321:30046;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;-1:-1:-1;;;;;321:30046:2;;;;:::i;:::-;;4959:55:3;6048:112:2;4959:55:3;;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;24273:10;;24314:19;:49;;;;;321:30046;24314:77;;;;321:30046;24314:107;;;;321:30046;;;;;;;;;;;;24547:18;321:30046;;;;;;;:::i;:::-;;;;;;;;;28460:9;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;;;;;;;24314:107;321:30046;;24412:9;321:30046;;24273:10;24407:14;24314:107;;;:77;321:30046;;;;;;24273:10;24379:12;24314:77;;;:49;321:30046;;;24354:9;321:30046;;24273:10;24349:14;24314:49;;;321:30046;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;14315:10;6048:112;4959:55:3;14315:10:2;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;14372:20;321:30046;14362:30;;321:30046;;-1:-1:-1;14315:10:2;321:30046;;;14487:21;321:30046;;;;;;;;;;;;;;;;;;;;;;14544:39;;321:30046;;;;14544:39;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25134:4;321:30046;;:::i;:::-;;;:::i;:::-;;6048:112;4959:55:3;321:30046:2;;;;;;;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;25134:4;:::i;:::-;321:30046;;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;22729:10;22770:19;:37;;;;;321:30046;22770:53;;;;321:30046;;;;;22910:15;;321:30046;22910:15;16842:7;;;;:::i;:::-;22973:31;;;:::i;:::-;-1:-1:-1;22935:195:2;;321:30046;;;;;;;22935:195;23042:77;16842:7;;;23088:31;16842:7;;;:::i;:::-;23088:31;;:::i;:::-;23042:77;;:::i;:::-;22935:195;;;;321:30046;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;-1:-1:-1;;;321:30046:2;;;;;22770:53;321:30046;;;;;22729:10;22811:12;22770:53;;;:37;321:30046;;;22798:9;321:30046;;22729:10;22793:14;22770:37;;;321:30046;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;1056:62:5;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;10742:27;;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;10847:25;321:30046;;;10847:25;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;13583:10;;321:30046;;;;;4790:53:3;321:30046:2;;;;;;;;;;4790:53:3;;:::i;:::-;321:30046:2;;;-1:-1:-1;321:30046:2;-1:-1:-1;;;;;321:30046:2;;;;;13757:15;321:30046;;;;13709:64;;321:30046;;;;13709:64;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15926:9;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;;15912:10;:23;321:30046;;16842:7;;;:::i;:::-;16049:42;;321:30046;;;16297:39;321:30046;;16297:39;321:30046;;;;;;16205:10;321:30046;;16205:36;321:30046;;;;;16205:36;:::i;:::-;321:30046;;;16205:10;321:30046;;;;;;16263:19;321:30046;16263:9;321:30046;16263:19;:::i;:::-;:9;321:30046;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2267:20:7;1056:62:5;;;:::i;:::-;1197:72:7;;:::i;:::-;321:30046:2;;;-1:-1:-1;;;;321:30046:2;-1:-1:-1;;;321:30046:2;;;;222:10:1;321:30046:2;;2267:20:7;321:30046:2;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;18563:10;18604:19;:49;;;;;321:30046;18604:77;;;;321:30046;18604:107;;;;;321:30046;18604:134;;;;321:30046;;;;;;16842:7;;18882:31;16842:7;;;:::i;18882:31::-;-1:-1:-1;18839:74:2;321:30046;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;18604:134;321:30046;;18732:6;321:30046;;18563:10;18727:11;18604:134;;;:107;321:30046;;;18702:9;321:30046;;18563:10;18697:14;18604:107;;;:77;321:30046;;;;;18563:10;18669:12;18604:77;;;;:49;321:30046;;;18644:9;321:30046;;18563:10;18639:14;18604:49;;;321:30046;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;1056:62:5;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;16842:7;;;;;;;:::i;:::-;8262:78;;;;;:::i;:::-;;321:30046;;;4790:53:3;;;:::i;:::-;321:30046:2;;;-1:-1:-1;321:30046:2;-1:-1:-1;;;;;321:30046:2;;;;;8579:15;321:30046;;;;8536:59;;321:30046;;;;8536:59;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;20957:9;321:30046;-1:-1:-1;;;;;321:30046:2;;;;20911:10;20952:14;:30;;;;321:30046;;;;;22037:9;321:30046;21170:26;;;:::i;:::-;21233:20;;;;:::i;:::-;21294;;;;:::i;:::-;21330:16;;21348:12;;;;;;321:30046;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;21362:6;21401:14;21496:23;21401:14;;21362:6;21401:14;;;:::i;:::-;321:30046;;;;;21444:10;321:30046;;;;;;21429:33;;;;:::i;:::-;321:30046;21496:23;:::i;:::-;21476:43;;;;:::i;:::-;321:30046;21362:6;:::i;:::-;21330:16;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;20952:30;321:30046;;;;;20911:10;20970:12;20952:30;;321:30046;;;;;;;;;;;;;;;;25134:4;321:30046;;:::i;:::-;;;:::i;:::-;25134:4;;:::i;321:30046::-;;;;;;;;;;;;;;1102:24;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;926:13:6;321:30046:2;;-1:-1:-1;;;;;321:30046:2;222:10:1;321:30046:2;;;1833:24:6;321:30046:2;;-1:-1:-1;;;;;;;;321:30046:2;;;926:13:6;321:30046:2;;;222:10:1;321:30046:2;;;;;;;;2123:40:5;321:30046:2;;2123:40:5;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1056:62:5;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;4959:55:3;6048:112:2;;2891:24:3;;6048:112:2;:::i;:::-;7807:6;7789:15;459:8;7789:15;;459:8;;;7775:38;;321:30046;;;-1:-1:-1;321:30046:2;;7844:18;321:30046;;;;;7844:42;321:30046;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;459:8;-1:-1:-1;;;459:8:2;;;;;321:30046;459:8;;321:30046;;;;;;;;-1:-1:-1;;321:30046:2;;;;1056:62:5;;:::i;:::-;321:30046:2;11089:29;321:30046;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1056:62:5;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;8920:16;321:30046;;;;;;;;;1499:13:3;;321:30046:2;1564:12:3;;;;;;;1494:109;321:30046:2;;;1494:109:3;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1538:3:3;321:30046:2;;1514:22:3;;;;;1577:14;;1538:3;1577:14;;;:::i;:::-;321:30046:2;;;;;;;;;;;;;;;;1538:3:3;:::i;:::-;1499:13;;;1514:22;;;321:30046:2;-1:-1:-1;321:30046:2;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;1056:62:5;;:::i;:::-;9328:10:2;321:30046;-1:-1:-1;;;;;321:30046:2;9328:24;;321:30046;;9469:9;321:30046;9458:20;;;321:30046;;9561:20;;;;;;;;;;;:::i;:::-;9469:9;321:30046;9624:74;;;;:::i;:::-;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;1159:25;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;:::i;:::-;12956:10;6048:112;4959:55:3;12956:10:2;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;6048:112:2;412:59:0;;487:8;321:30046:2;;12956:10;321:30046;;;;;4520:50:3;321:30046:2;;;;;;;;;;4520:50:3;;;:::i;:::-;321:30046:2;;;;13196:66;321:30046;;;;;12956:10;;321:30046;;;;;;13246:15;321:30046;;;;13196:66;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;1678:7:7;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;1056:62:5;;;:::i;:::-;412:59:0;;487:8;;12079:51:2;;;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;;;12221:27;;;;:55;;321:30046;;;;;;-1:-1:-1;;;;;321:30046:2;;;;12353:25;321:30046;;;12353:25;321:30046;;;12388:19;321:30046;;;12388:19;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;12221:55;321:30046;;;;12252:24;;12221:55;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;12079:51;412:59:0;;;487:8;;12079:51:2;;321:30046;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;1056:62:5;;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;4959:55:3;6048:112:2;;2891:24:3;;6048:112:2;:::i;:::-;10241:9;321:30046;10230:20;;;;321:30046;;10301:20;;10409:37;10301:20;;;10409:37;10301:20;;;:::i;:::-;10241:9;321:30046;;;;10359:10;321:30046;;10359:35;321:30046;;;;;10359:35;:::i;:::-;321:30046;;;10359:10;321:30046;;;;;;;10409:37;;;;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;1056:62:5;;:::i;:::-;1678:7:7;321:30046:2;;;;;;;;;;-1:-1:-1;;;;;321:30046:2;1678:7:7;321:30046:2;;222:10:1;321:30046:2;;2514:22:7;;321:30046:2;;2514:22:7;321:30046:2;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;22037:9;321:30046;;;;;;;;;;;;;;;;;;;;;;;21799:20;321:30046;;;;;;;;;;;;;;;;;;;;;1190:26;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;4959:55:3;-1:-1:-1;;;;;321:30046:2;;:::i;:::-;;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;321:30046:2;;;;;;;;;;;;;;;19841:8;321:30046;-1:-1:-1;;;;;321:30046:2;;;19827:10;:22;321:30046;;19939:12;321:30046;;;;;;;;;;;;;;20064:31;321:30046;20008:11;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;19995:24;321:30046;;;19995:24;321:30046;;;;;;19939:12;321:30046;;;;;20064:31;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;6170:1;321:30046;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;6170:1;:::i;321:30046::-;;;;;;;;;;1056:62:5;;:::i;:::-;11251:22:2;11264:9;11251:22;321:30046;11251:22;:::i;:::-;;321:30046;;;;;;;;;;;;;;;;;1222:23;321:30046;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;1056:62:5;;:::i;:::-;-1:-1:-1;;;;;321:30046:2;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;4959:55:3;321:30046:2;;4520:50:3;;;:::i;:::-;;459:8:2;7048:15;459:8;7048:15;;;459:8;;;321:30046;7162:158;321:30046;;459:8;321:30046;;;:::i;:::-;7048:15;321:30046;;28460:9;321:30046;30277:81;;321:30046;;;;30277:81;;;321:30046;;;;;;;30240:18;321:30046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7048:15;321:30046;459:8;;321:30046;459:8;;321:30046;;459:8;;321:30046;7162:158;321:30046;;459:8;-1:-1:-1;;;459:8:2;;;;;321:30046;459:8;;321:30046;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27721:10;-1:-1:-1;;;;;321:30046:2;;;27721:21;;:48;;;;321:30046;;;;;;;27857:9;321:30046;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;-1:-1:-1;;;321:30046:2;;;;;;;27721:48;321:30046;;27760:9;321:30046;;27721:10;27746:23;27721:48;;;321:30046;;;;-1:-1:-1;;;;;321:30046:2;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;;;;321:30046:2;;;;;;:::o;:::-;;;;;;;;;;;;;;;-1:-1:-1;321:30046:2;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;321:30046:2;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;459:8;;;;;;;;;;:::o;:::-;;;;;;;;;;;;321:30046;;;;:::o;:::-;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;459:8;;;321:30046;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;321:30046:2;;;;:::i;:::-;;;;;-1:-1:-1;321:30046:2;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;:::o;5982:196::-;-1:-1:-1;;;;;321:30046:2;;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;16877:10;;16918:19;:49;;;;;5982:196;16918:77;;;;5982:196;16918:107;;;;5982:196;16918:134;;;;5982:196;321:30046;;;;;;17150:10;321:30046;;;;;;5982:196;:::o;321:30046::-;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;;;16918:134;321:30046;;17046:6;321:30046;;16877:10;17041:11;16918:134;;;:107;321:30046;;;17016:9;321:30046;;16877:10;17011:14;16918:107;;;:77;321:30046;;;;;;16877:10;16983:12;16918:77;;;:49;321:30046;;;16958:9;321:30046;;16877:10;16953:14;16918:49;;;321:30046;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;-1:-1:-1;;321:30046:2;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;459:8;;;321:30046;;;;;;;;5982:196;-1:-1:-1;;;;;321:30046:2;;;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;5982:196;321:30046;6048:112;;2891:24:3;;6048:112:2;:::i;:::-;25162:10;;25203:19;:49;;;;5982:196;25203:77;;;;5982:196;25203:107;;;;5982:196;25203:134;;;;5982:196;321:30046;;;4959:55:3;321:30046:2;;;25442:19;321:30046;;;;;;;4959:55:3;2891:12;2795:127;-1:-1:-1;321:30046:2;2891:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;2891:24:3;;2795:127;;4959:55;5982:196:2;:::o;321:30046::-;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;;;;;;;;;25203:134;321:30046;;25331:6;321:30046;;25162:10;25326:11;25203:134;;:107;321:30046;;25301:9;321:30046;;25162:10;25296:14;25203:107;;:77;321:30046;;;;;25162:10;25268:12;25203:77;;:49;321:30046;;25243:9;321:30046;;25162:10;25238:14;25203:49;;25912:964;-1:-1:-1;;;;;321:30046:2;;;;26102:10;26143:19;;:37;;;;25912:964;26143:53;;;;25912:964;321:30046;;;26307:28;;321:30046;;26333:1;;321:30046;;;26402:19;321:30046;;;;;;;;;;;26486:29;;;:::i;:::-;26525:17;;26552:219;26564:22;;;;;;26784:10;;;;26780:64;;26853:16;;;;25912:964;:::o;26780:64::-;321:30046;;;-1:-1:-1;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;26810:23;:::o;321:30046::-;-1:-1:-1;;;321:30046:2;;;;;;459:8;321:30046;26588:7;321:30046;;;26588:7;321:30046;;;;;;;;3209:18:3;321:30046:2;;;;3209:18:3;:::i;:::-;321:30046:2;;;;;;;26726:34;;;;:::i;26588:7::-;26557:5;;;;;321:30046;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;321:30046:2;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;26143:53;321:30046;;1266:6:5;321:30046:2;;26102:10;26184:12;26143:53;;:37;321:30046;;26171:9;321:30046;;26102:10;26166:14;26143:37;;27002:493;27145:9;321:30046;-1:-1:-1;;;;;321:30046:2;;;27099:10;27140:14;:30;;;;27002:493;321:30046;;;27299:9;321:30046;;;27285:33;;;;:::i;:::-;27333:13;-1:-1:-1;27333:13:2;27348:22;;;;;;27474:14;;;;;27002:493;:::o;27372:3::-;;321:30046;;;;;;;;;;27436:18;;;;:::i;27372:3::-;27333:13;;321:30046;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;;27140:30;321:30046;;-1:-1:-1;321:30046:2;;27099:10;27158:12;27140:30;;28713:368;-1:-1:-1;;;;;321:30046:2;-1:-1:-1;321:30046:2;;;29704:21;321:30046;;;;;;21799:20;321:30046;28858:62;;;;;;28936:45;28713:368;:::o;28854:199::-;29012:30;;28713:368;:::o;321:30046::-;28460:9;321:30046;;;;;;28460:9;-1:-1:-1;321:30046:2;;;;-1:-1:-1;321:30046:2;:::o;:::-;;;;;;;;-1:-1:-1;321:30046:2;;-1:-1:-1;321:30046:2;;;-1:-1:-1;321:30046:2;:::o;725:404:3:-;-1:-1:-1;321:30046:2;;;2891:12:3;321:30046:2;;;;;;;;28460:9;321:30046;-1:-1:-1;;;321:30046:2;;;;;;;;;;2891:12:3;321:30046:2;;;28460:9;321:30046;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;28460:9;321:30046;;;;2891:12:3;321:30046:2;;;;2891:12:3;1058:11;:::o;321:30046:2:-;-1:-1:-1;;;321:30046:2;;;;;;459:8;321:30046;725:404:3;-1:-1:-1;321:30046:2;;;2891:12:3;;;321:30046:2;;;;;;809:21:3;;321:30046:2;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;321:30046:2;1004:12:3;321:30046:2;;;-1:-1:-1;321:30046:2;;;1058:11:3;:::o;804:319::-;1100:12;;-1:-1:-1;1100:12:3;:::o;1664:1050::-;-1:-1:-1;321:30046:2;;;1867:12:3;321:30046:2;;;;;;-1:-1:-1;;321:30046:2;1901:15:3;;;;-1:-1:-1;;321:30046:2;;;;;;;;;28460:9;321:30046;;;;;;;;;;2045:26:3;;;2041:398;;1897:811;321:30046:2;;;28460:9;321:30046;;;;;;;;;;;:::i;:::-;;;;;;1867:12:3;321:30046:2;;;;;;28460:9;321:30046;;;1867:12:3;321:30046:2;;;;;;1867:12:3;2643:11;:::o;321:30046:2:-;-1:-1:-1;;;321:30046:2;;;;;;459:8;321:30046;2041:398:3;321:30046:2;2111:22:3;2233:26;2111:22;;:::i;:::-;321:30046:2;;;1867:12:3;321:30046:2;;2233:26:3;;;;:::i;321:30046:2:-;;;;;1867:12:3;321:30046:2;;;;;;2041:398:3;;;;;321:30046:2;-1:-1:-1;;;459:8:2;;;;;;;;321:30046;-1:-1:-1;;;459:8:2;;;;;;;;1897:811:3;2685:12;;;:::o;1664:1050::-;;1867:12;;;-1:-1:-1;;321:30046:2;;;;;;;;;;;1901:15:3;;;;1897:811;1901:15;;;-1:-1:-1;;321:30046:2;;;;;;;;;;;;;;;;;;;;2045:26:3;;;2041:398;;1897:811;321:30046:2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;1867:12:3;2643:11;:::o;321:30046:2:-;-1:-1:-1;;;321:30046:2;;;;;;459:8;321:30046;2041:398:3;321:30046:2;2111:22:3;2233:26;2111:22;;;:::i;:::-;321:30046:2;;;;;;2233:26:3;;;;;:::i;321:30046:2:-;;;;;;;;;;;;2041:398:3;;;;;321:30046:2;-1:-1:-1;;;459:8:2;;;;;;;;321:30046;-1:-1:-1;;;459:8:2;;;;;;;;1897:811:3;2685:12;;;;;:::o;1352:130:5:-;1266:6;321:30046:2;-1:-1:-1;;;;;321:30046:2;222:10:1;1415:23:5;321:30046:2;;1352:130:5:o;321:30046:2:-;;;;;;;;;;;;;;;;;;;;;;;;;1760:106:7;321:30046:2;1678:7:7;321:30046:2;;;;;;1760:106:7:o;321:30046:2:-;;;-1:-1:-1;;;321:30046:2;;;;;;;;;;;;-1:-1:-1;;;321:30046:2;;;;;;

Swarm Source

ipfs://bb4de4759bc0930ad7c36c93faa134d43747722925c79cd1a6cb99a60d528029

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
[ Download: CSV Export  ]
[ 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.