Sonic Blaze Testnet

Contract

0xDF666c76E859D6541FF17E1C6c215e46BfA563B2

Overview

S Balance

Sonic Blaze LogoSonic Blaze LogoSonic Blaze Logo2.1 S

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deposit Fund Cli...82361132024-12-30 7:05:113 hrs ago1735542311IN
0xDF666c76...6BfA563B2
2 S0.000052871.1
Add Client To Wh...82359772024-12-30 7:04:323 hrs ago1735542272IN
0xDF666c76...6BfA563B2
0 S0.000134861.1
Deposit Fund Cli...50150362024-12-18 8:25:4912 days ago1734510349IN
0xDF666c76...6BfA563B2
0.1 S0.000052871.1
Add Contract To ...50148122024-12-18 8:24:3712 days ago1734510277IN
0xDF666c76...6BfA563B2
0 S0.0001051.1
Add Client To Wh...50132342024-12-18 8:16:1012 days ago1734509770IN
0xDF666c76...6BfA563B2
0 S0.000144981

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
82379882024-12-30 7:14:343 hrs ago1735542874
0xDF666c76...6BfA563B2
0 S
82379722024-12-30 7:14:303 hrs ago1735542870
0xDF666c76...6BfA563B2
0 S
82379722024-12-30 7:14:303 hrs ago1735542870
0xDF666c76...6BfA563B2
0 S
71042472024-12-26 6:55:534 days ago1735196153
0xDF666c76...6BfA563B2
0 S
71042282024-12-26 6:55:494 days ago1735196149
0xDF666c76...6BfA563B2
0 S
71042282024-12-26 6:55:494 days ago1735196149
0xDF666c76...6BfA563B2
0 S
53090082024-12-19 10:46:4610 days ago1734605206
0xDF666c76...6BfA563B2
0 S
53090082024-12-19 10:46:4610 days ago1734605206
0xDF666c76...6BfA563B2
0 S
53090082024-12-19 10:46:4610 days ago1734605206
0xDF666c76...6BfA563B2
0 S
53090052024-12-19 10:46:4510 days ago1734605205
0xDF666c76...6BfA563B2
0 S
53090052024-12-19 10:46:4510 days ago1734605205
0xDF666c76...6BfA563B2
0 S
53090052024-12-19 10:46:4510 days ago1734605205
0xDF666c76...6BfA563B2
0 S
53090052024-12-19 10:46:4510 days ago1734605205
0xDF666c76...6BfA563B2
0 S
53090052024-12-19 10:46:4510 days ago1734605205
0xDF666c76...6BfA563B2
0 S
53090052024-12-19 10:46:4510 days ago1734605205
0xDF666c76...6BfA563B2
0 S
53088092024-12-19 10:45:4110 days ago1734605141
0xDF666c76...6BfA563B2
0 S
53088052024-12-19 10:45:4010 days ago1734605140
0xDF666c76...6BfA563B2
0 S
53088052024-12-19 10:45:4010 days ago1734605140
0xDF666c76...6BfA563B2
0 S
52965602024-12-19 9:37:4911 days ago1734601069
0xDF666c76...6BfA563B2
0 S
52965602024-12-19 9:37:4911 days ago1734601069
0xDF666c76...6BfA563B2
0 S
50395712024-12-18 10:39:1011 days ago1734518350
0xDF666c76...6BfA563B2
0 S
50395612024-12-18 10:39:0711 days ago1734518347
0xDF666c76...6BfA563B2
0 S
50395612024-12-18 10:39:0711 days ago1734518347
0xDF666c76...6BfA563B2
0 S
50393172024-12-18 10:37:4811 days ago1734518268
0xDF666c76...6BfA563B2
0 S
50393062024-12-18 10:37:4411 days ago1734518264
0xDF666c76...6BfA563B2
0 S
View All Internal Transactions
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

Contract Source Code (Solidity Standard Json-Input format)

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/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": true,
  "libraries": {}
}

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"}]

6080346200023657601f62002bc338819003918201601f191683019291906001600160401b038411838510176200023b578160a092849260409687528339810103126200023657620000518162000251565b6200005f6020830162000251565b906200006d84840162000251565b9260806200007e6060830162000251565b91015193600154926000549460018060a01b031995338782161760005588519260018060a01b03968792833391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a81b0319166001551691338314620001f45750841680151580620001ea575b80620001de575b80620001d2575b156200018f5786156200014b579084929186600f541617600f5585600e541617600e551683600a541617600a551690600b541617600b556009555161295c9081620002678239f35b875162461bcd60e51b815260206004820152601d60248201527f496e76616c6964204d696e696d756d2062616c616e6365206c696d69740000006044820152606490fd5b6064885162461bcd60e51b815260206004820152602060248201527f416464726573732063616e6e6f742062652061207a65726f20616464726573736044820152fd5b50848416151562000103565b508483161515620000fc565b50811515620000f5565b62461bcd60e51b815260206004820152601c60248201527f41646d696e2063616e6e6f742062652074686520617070726f766572000000006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620002365756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826303df669314611df85750816308b35dd414611cbc578163141a8dd814611c935781631e06a9ec14611c6d5781631e7c886914611c225781631f721d9014611afc578163233fe0ec14611abf578163287997ea14611a96578163317a229614611a775781633704c94f14611a585781633b698197146119bc5781634c906d751461189f5781634cf614a11461186e5781635a5e701a1461173d5781635c975abb1461171657816368d15bbf146116005781636be13c92146115d75781636ca2a3951461147a5781636f4c3e8c1461135f578163723fed311461133d57816375f4b8a21461128157816379ba5097146111c05781637afa1eed1461119757816386f6fef7146111695781638a3b87c6146110075781638bad5de914610fe15781638da5cb5b14610fb9578163965427c314610e6c57816398f309cc14610d475781639c69c78214610ce6578163b267cfa314610b64578163b480bfff14610a8c578163b52ddfbc146109eb578163bbdded0f146108dd578163c02420f214610884578163c168ae5714610798578163c1e877371461066d578163c36e5d0914610640578163ca4b208b14610617578163d13deea0146104df578163d23d433314610487578163e30c39781461045e578163ebefa86614610437578163f096245d1461035057508063f2fde38b146102e0578063f887ea40146102b85763f948ae291461022a57600080fd5b816003193601126102b4577f1a1293d7af3357cec67893722572b0342502edfe63a5fd97b5d68cb68321d9b190610276610271336000526003602052604060002054151590565b611f4c565b338352600760205261028c818420543490611f29565b3380855260076020908152838620929092559151918252349082015280604081015b0390a180f35b5080fd5b50346102b457816003193601126102b457600b5490516001600160a01b039091168152602090f35b823461034d57602036600319011261034d576102fa611e87565b610302612867565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b82843461034d57602036600319011261034d576001600160a01b0380610374611e87565b1690610390610271836000526003602052604060002054151590565b813314908115610428575b811561041a575b811561040c575b50156103c15781526020928352819020549051908152f35b825162461bcd60e51b8152602081860152603160248201526000805160206129078339815191526044820152701ac81d1a19481d1bdd185b0818dbdd5b9d607a1b6064820152608490fd5b9050600a54163314856103a9565b8091508354163314906103a2565b809150600f541633149061039b565b5050346102b457816003193601126102b45760209060ff600f5460a01c1690519015158152f35b5050346102b457816003193601126102b45760015490516001600160a01b039091168152602090f35b833461034d57602036600319011261034d576104a1611e87565b6104a9612867565b600d80546001600160a01b0319166001600160a01b0392909216919091179055600f805460ff60a01b1916600160a01b17905580f35b91905034610613576020366003190112610613578135916104fe6128bf565b6105073361203d565b83116105bc5761051f8361051a3361203d565b612030565b3385526007602052828520558380808086335af161053b611ff4565b501561057a57505133815260208101919091527fc74ad6879c7740563cf7f39668cc9ad4010de80d20cbff857d745eeba33cbd109080604081016102ae565b6020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f7420776974686472617720636c69656e742066756e6473000000006044820152fd5b6020608492519162461bcd60e51b8352820152602c60248201527f496e73756666696369656e742046756e64733a2046756e64207769746864726160448201526b3bb4b73390313c903ab9b2b960a11b6064820152fd5b8280fd5b5050346102b457816003193601126102b457600f5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666610661611e87565b61203d565b9051908152f35b839150346102b45760203660031901126102b4576001600160a01b039081610693611e87565b16916106af610271846000526003602052604060002054151590565b823314908115610789575b811561077b575b811561076d575b501561071657606084808585815260056020522090806106e6611f98565b9280549384815260ff60026001840154938460208501520154161515938491015281519384526020840152820152f35b608490602085519162461bcd60e51b83528201526037602482015260008051602061290783398151915260448201527f6b2074686520737562736372697074696f6e20696e666f0000000000000000006064820152fd5b9050600a54163314856106c8565b8091508454163314906106c1565b809150600f54163314906106ba565b91905034610613576020366003190112610613578135916107c9610271336000526003602052604060002054151590565b600954831061081c575033808452600660209081528285208490559151908152908101919091527fab834dc04539ce8b6cdebe87cee599127f060c794ebb0dcc66655d6050dc676c9080604081016102ae565b6020608492519162461bcd60e51b8352820152603b60248201527f43616e6e6f74207365742061206c6f776572206c696d6974207468616e20746860448201527f65206c696d69742073657420627920746865206465706c6f79657200000000006064820152fd5b5050346102b457806003193601126102b4576020906108d46108a4611e87565b6108ac611ea2565b906108cf61027160018060a01b0383166000526003602052604060002054151590565b6121c0565b90519015158152f35b9050823461034d57602036600319011261034d576108f9611e87565b6001600160a01b03808216600081815260036020526040902054929492610921901515611f4c565b33149081156109dc575b81156109cf575b5015610982575091602092916109478161203d565b61095082612543565b1061095d575b5051908152f35b61097b91925061097561096f8261203d565b91612543565b90612030565b9083610956565b608490602085519162461bcd60e51b8352820152603360248201526000805160206129078339815191526044820152726b206566666563746976652062616c616e636560681b6064820152fd5b9050825416331485610932565b809150600f541633149061092b565b90503461061357602036600319011261061357610a06611e87565b610a0e612867565b6001600160a01b0316918215610a365750506001600160601b0360a01b600f541617600f5580f35b906020608492519162461bcd60e51b8352820152602a60248201527f446576656c6f70657220616464726573732063616e6e6f742062652061207a65604482015269726f206164647265737360b01b6064820152fd5b9190503461061357602036600319011261061357610aa8611e87565b9133845280602052610ac582852060018060a01b03851690612777565b15610b0b5750516001600160a01b0390911681524260208201527fb427cf1de9ad97d508ddd8d5635c1bc170353a52661b7b77e441474f7c442a7d9080604081016102ae565b6020608492519162461bcd60e51b8352820152602e60248201527f436f6e7472616374206973206e6f742077686974656c6973746564206f72206160448201526d1b1c9958591e481c995b5bdd995960921b6064820152fd5b839150346102b457826003193601126102b457610b7f611e87565b600a54602435926001600160a01b039182163303610c7d57610ba08361203d565b8411610c2057507f63216f1109e37913888a828960a8da002a7702656ade0492848dd2857aa8fe3693946102ae9183168087526007602052610be58583892054612030565b908752600760205281872055610bfd84600854611f29565b600855516001600160a01b03909216825260208201929092529081906040820190565b608490602087519162461bcd60e51b8352820152603160248201527f496e73756666696369656e742046756e64733a20436f6c6c656374696e6720666044820152703ab7323990313c9033b2b732b930ba37b960791b6064820152fd5b608490602087519162461bcd60e51b8352820152603960248201527f43616c6c6572206973206e6f7420746865206f776e65723a204f6e6c7920476560448201527f6e657261746f722063616e20636f6c6c6563742066756e6473000000000000006064820152fd5b5050346102b457816003193601126102b45760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610d24612867565b610d2c6128bf565b6001805460ff60a01b1916600160a01b17905551338152a180f35b82843461034d57602036600319011261034d57610d62611e87565b6001600160a01b03808216600081815260036020526040902054929392610d8a901515611f4c565b3314918215610e5d575b8215610e4f575b508115610e40575b8115610e32575b5015610dc95760209250610dc061096f8261203d565b10159051908152f35b815162461bcd60e51b8152602081850152603960248201527f556e617574686f72697a6564204163636573733a20416464726573732063616e60448201527f6e6f7420636865636b206d696e696d756d2062616c616e6365000000000000006064820152608490fd5b9050600b5416331484610daa565b809150600a5416331490610da3565b819250541633149085610d9b565b915080600f5416331491610d94565b9190503461061357602036600319011261061357610e88611e87565b91610e91612867565b6001600160a01b038316600081815260036020526040902054610eb5901515611f4c565b84808080610ec28861203d565b855af1610ecd611ff4565b5015610f7657610edc9061268d565b15610f225750516001600160a01b0390911681524260208201527f51e7e2c8606f03d2c1f0b012f6707ef7d99d1562a6c7d9eeca75f5b3af3980d59080604081016102ae565b6020608492519162461bcd60e51b8352820152602960248201527f436c69656e74206e6f742077686974656c6973746564206f7220616c726561646044820152681e481c995b5bdd995960ba1b6064820152fd5b506020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f74207472616e7366657220636c69656e742066756e6473000000006044820152fd5b5050346102b457816003193601126102b457905490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666611002611e87565b612543565b839150346102b457816003193601126102b457600f546001600160a01b03919082163314801561115d575b156110e6575060025491611044612459565b9261104e8161215a565b916110588261215a565b93815b8381106110a1576110828761109d8a896110908a8351968796606088526060880190611eb8565b908682036020880152611ef5565b9184830390850152611ef5565b0390f35b806110d1836110b36110e1948b612196565b511680865260076020528a8620546110cb848a612196565b52612543565b6110db8289612196565b52612187565b61105b565b60a490602085519162461bcd60e51b8352820152604560248201527f556e617574686f72697a6564204163636573733a204f6e6c7920646576656c6f60448201527f706572206f72206465706c6f7965722063616e20636865636b207468652062616064820152646c616e636560d81b6084820152fd5b50818354163314611032565b5050346102b457806003193601126102b4576020906108d4611189611e87565b611191611ea2565b906121c0565b5050346102b457816003193601126102b457600a5490516001600160a01b039091168152602090f35b91905034610613578260031936011261061357600154916001600160a01b0391338385160361122c5750506001600160a01b031991821660015582543392811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152fd5b9190503461061357806003193601126106135761129c611e87565b91602435926112a9612867565b6001600160a01b03166000818152600360205260409020549091906112cf901515611f4c565b6202a300420180421161132a578411156112f457508352600560205282206001015580f35b606490602084519162461bcd60e51b8352820152601060248201526f496e76616c696420456e642054696d6560801b6044820152fd5b634e487b7160e01b865260118252602486fd5b8390346102b45760203660031901126102b457611358612867565b3560095580f35b90503461061357602090816003193601126114765761137c611e87565b611384612867565b6001600160a01b0316808552818352838520541561141f57845281528183209083600193848092818601915b6113e7575b50505050815491848155826113c8578480f35b84528320908101905b8181106113dd57808480f35b83815582016113d1565b855481101561141a57806113fe61141492886125a6565b90549060031b1c89528286528884812055612187565b836113b0565b6113b5565b50915162461bcd60e51b815291820152602c60248201527f436f6e747261637473206e6f742077686974656c6973746564206f7220616c7260448201526b1958591e481c995b5bdd995960a21b6064820152608490fd5b8380fd5b91905034610613576020366003190112610613578135611498612867565b600c546001600160a01b0316801561157a5760085480831161151f5785838194936114c583958495612030565b6008555af16114d2611ff4565b50156114dc578280f35b906020606492519162461bcd60e51b8352820152601f60248201527f43616e6e6f7420636c61696d2066726565206e6f646520657870656e736573006044820152fd5b835162461bcd60e51b8152602081870152602f60248201527f496e73756666696369656e742046756e64733a20436c61696d696e672066726560448201526e65206e6f646520657870656e73657360881b6064820152608490fd5b825162461bcd60e51b8152602081860152603160248201527f496e76616c696420416464726573733a20416464726573732063616e6e6f742060448201527062652061207a65726f206164647265737360781b6064820152608490fd5b5050346102b457816003193601126102b457600c5490516001600160a01b039091168152602090f35b919050346106135760203660031901126106135761161c611e87565b91611637610271336000526003602052604060002054151590565b823b156116dc573384528060205261165b8285209360018060a01b03168094612636565b1561169a57507fec3b8f7f6fc93e30f5a4d232044ffe225b0e16bfa3a35dd26929478b7b7cf5079181606092519133835260208301524290820152a180f35b6020606492519162461bcd60e51b8352820152601f60248201527f436f6e747261637420697320416c72656164792077686974656c6973746564006044820152fd5b6020606492519162461bcd60e51b83528201526015602482015274416464726573732063616e6e6f7420626520454f4160581b6044820152fd5b5050346102b457816003193601126102b45760209060ff60015460a01c1690519015158152f35b905034610613578160031936011261061357611757611e87565b90611760611ea2565b90611769612867565b823b151580611864575b15611816576001600160a01b03928316938415158061180b575b156117b65750506001600160601b0360a01b9283600a541617600a551690600b541617600b5580f35b906020608492519162461bcd60e51b8352820152602960248201527f436f6e747261637420616464726573732063616e6e6f742062652061207a65726044820152686f206164647265737360b81b6064820152fd5b50838316151561178d565b608490602085519162461bcd60e51b8352820152602260248201527f416464726573732063616e6e6f7420626520612077616c6c6574206164647265604482015261737360f01b6064820152fd5b50813b1515611773565b5050346102b457816003193601126102b45761109d9061188c612459565b9051918291602083526020830190611eb8565b839150346102b457826003193601126102b4576118ba611e87565b602435916118c6612867565b6001600160a01b0382166000818152600360205260409020549091906118ed901515611f4c565b6008549081851161196d5750946102ae9161192a857ff2e47447f313cd2dfd6619c01eb5086d0e611595137943f8d19508636ce61c769798612030565b60085580875260076020526119428583892054611f29565b908752600760205281872055519283928360209093929193604081019460018060a01b031681520152565b608490602088519162461bcd60e51b83528201526024808201527f496e73756666696369656e742066756e64733a20657865637574696e67207265604482015263199d5b9960e21b6064820152fd5b9050346106135782600319360112610613576119d6612867565b6001549060ff8260a01c1615611a1e575060ff60a01b1916600155513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b5050346102b457816003193601126102b4576020906002549051908152f35b5050346102b457816003193601126102b4576020906009549051908152f35b5050346102b457816003193601126102b457600d5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b4576020906108d46001600160a01b03611ae8611e87565b166000526003602052604060002054151590565b91905034610613578260031936011261061357600e546001600160a01b039081163303611bc857600f549260ff8460a01c1615611b855750916020917ff562f58226d62299459492ca2aa60f98cba368ce1faa18c20b931cb9c84d3a5d93600d541691826001600160601b0360a01b600c541617600c5560ff60a01b1916600f5551908152a180f35b606490602084519162461bcd60e51b8352820152601d60248201527f436f6c642077616c6c65742070726f706f7365206e6f742072656164790000006044820152fd5b815162461bcd60e51b8152602081850152602e60248201527f556e617574686f72697a6564204163636573733a204f6e6c7920417070726f7660448201526d65722063616e20636f6e6669726d60901b6064820152608490fd5b5050346102b45760203660031901126102b45761109d9061188c611c44611e87565b6001600160a01b038116600090815260036020526040902054611c68901515611f4c565b6122c6565b838060031936011261034d57611c81612867565b611c8d34600854611f29565b60085580f35b5050346102b457816003193601126102b457600e5490516001600160a01b039091168152602090f35b8383346102b457806003193601126102b457611cd6611e87565b6024359081151580920361147657611cec612867565b6001600160a01b0316600081815260036020526040902054909290611db657611d14836125be565b5062ed4e00420190814211611da357917f75b0a96771559886d7368303c13fc539a88faea45bbea23b0a72ac991d834a3a9391608093611d52611f98565b4281526002602082019184835283810192868452878b526005602052848b2091518255516001820155019051151560ff8019835416911617905580519384524260208501528301526060820152a180f35b634e487b7160e01b855260118652602485fd5b5162461bcd60e51b8152602081860152601d60248201527f436c69656e7420697320616c72656164792077686974656c69737465640000006044820152606490fd5b9150833461034d578060031936011261034d5754336001600160a01b0391821614908115611e79575b5015611e34576020836008549051908152f35b62461bcd60e51b8252602090820152602d602482015260008051602061290783398151915260448201526c6b2073757072612066756e647360981b6064820152608490fd5b9050600f5416331484611e21565b600435906001600160a01b0382168203611e9d57565b600080fd5b602435906001600160a01b0382168203611e9d57565b90815180825260208080930193019160005b828110611ed8575050505090565b83516001600160a01b031685529381019392810192600101611eca565b90815180825260208080930193019160005b828110611f15575050505090565b835185529381019392810192600101611f07565b91908201809211611f3657565b634e487b7160e01b600052601160045260246000fd5b15611f5357565b60405162461bcd60e51b815260206004820152601e60248201527f436c69656e742061646472657373206e6f742077686974656c697374656400006044820152606490fd5b604051906060820182811067ffffffffffffffff821117611fb857604052565b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f1916820167ffffffffffffffff811183821017611fb857604052565b3d1561202b573d9067ffffffffffffffff8211611fb85761201e601f8301601f1916602001611fce565b9182523d6000602084013e565b606090565b91908203918211611f3657565b6001600160a01b03908116600081815260036020526040902054909190612065901515611f4c565b813314908115612133575b8115612124575b8115612115575b8115612107575b501561209c57600052600760205260406000205490565b60405162461bcd60e51b815260206004820152603760248201527f556e617574686f72697a6564204163636573733a2041646472657373206e6f7460448201527f20616c6c6f77656420746f20636865636b2066756e64730000000000000000006064820152608490fd5b9050600b5416331438612085565b809150600a541633149061207e565b80915060005416331490612077565b809150600f5416331490612070565b67ffffffffffffffff8111611fb85760051b60200190565b9061216c61216783612142565b611fce565b828152809261217d601f1991612142565b0190602036910137565b6000198114611f365760010190565b80518210156121aa5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03908116600081815260036020526040902054909291906121e9901515611f4c565b82331480156122b9575b80156122ac575b801561229f575b8015612292575b1561223957612236926000526004602052604060002091169060019160005201602052604060002054151590565b90565b60405162461bcd60e51b815260206004820152603e602482015260008051602061290783398151915260448201527f6b20666f72207468652077686974656c697374656420636f6e747261637400006064820152608490fd5b5080600b54163314612208565b5080600a54163314612201565b50806000541633146121fa565b5080600f541633146121f3565b6001600160a01b0390811690338214801561244c575b801561243f575b156123da5781156123955790600081815260046020928184526040908184205461230c8161215a565b9685925b8284106123615750505015612326575050505090565b8051945091928401919067ffffffffffffffff83118584101761234e57505280825236813790565b634e487b7160e01b845260419052602483fd5b90919261238d908288528689528361237b82888b206125a6565b90549060031b1c166110db828c612196565b929190612310565b60405162461bcd60e51b815260206004820152601b60248201527f5573657220616464726573732063616e6e6f74206265207a65726f00000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526043602482015260008051602061290783398151915260448201527f6b20746865206c697374206f662077686974656c697374656420636f6e74726160648201526263747360e81b608482015260a490fd5b50806000541633146122e3565b5080600f541633146122dc565b600f546001600160a01b0390811633148015612536575b156124d4576002908154906124848261215a565b926000805b84811061249857505050505090565b6124cf9083835284817f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0154166110db8289612196565b612489565b60405162461bcd60e51b815260206004820152603460248201527f556e617574686f72697a6564204163636573733a2043616e6e6f74206c6973746044820152732077686974656c697374656420636c69656e747360601b6064820152608490fd5b5080600054163314612470565b6001600160a01b03166000908152600660205260409020546009548082111561256a575090565b905090565b6002548110156121aa5760026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b80548210156121aa5760005260206000200190600090565b60008181526003602052604081205461256a57600254600160401b81101561262257908261260e6125f78460016040960160025561256f565b819391549060031b91821b91600019901b19161790565b905560025492815260036020522055600190565b634e487b7160e01b82526041600452602482fd5b600082815260018201602052604090205461268657805490600160401b821015611fb8578261266f6125f78460018096018555846125a6565b905580549260005201602052604060002055600190565b5050600090565b6000818152600360205260408120549091908015612772576000199080820181811161275e576002549083820191821161274a57808203612716575b5050506002548015612702578101906126e18261256f565b909182549160031b1b19169055600255815260036020526040812055600190565b634e487b7160e01b84526031600452602484fd5b6127346127256125f79361256f565b90549060031b1c92839261256f565b90558452600360205260408420553880806126c9565b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b505090565b90600182019060009281845282602052604084205490811515600014612860576000199180830181811161284c5782549084820191821161283857808203612803575b505050805480156127ef578201916127d283836125a6565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6128236128136125f793866125a6565b90549060031b1c928392866125a6565b905586528460205260408620553880806127ba565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526011600452602487fd5b5050505090565b6000546001600160a01b0316330361287b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60ff60015460a01c166128ce57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fdfe556e617574686f72697a6564204163636573733a2043616e6e6f742063686563a264697066735822122019c531164674eda13eb2fbd01e06290c89bfc390a09f95b95d8b609e2b7f14cb64736f6c634300081300330000000000000000000000008b61f1c25483380cf1ecbac8c55c5b3b80f05b9d000000000000000000000000578dd059ec425f83cccc3149ed594d4e067a530700000000000000000000000097787e6a911480e1026b6f658f330f7b323a3c920000000000000000000000003b5f96986389f6bacf58d5b69425fab000d3551e000000000000000000000000000000000000000000000000002386f26fc10000

Deployed Bytecode

0x608060408181526004918236101561001657600080fd5b600092833560e01c91826303df669314611df85750816308b35dd414611cbc578163141a8dd814611c935781631e06a9ec14611c6d5781631e7c886914611c225781631f721d9014611afc578163233fe0ec14611abf578163287997ea14611a96578163317a229614611a775781633704c94f14611a585781633b698197146119bc5781634c906d751461189f5781634cf614a11461186e5781635a5e701a1461173d5781635c975abb1461171657816368d15bbf146116005781636be13c92146115d75781636ca2a3951461147a5781636f4c3e8c1461135f578163723fed311461133d57816375f4b8a21461128157816379ba5097146111c05781637afa1eed1461119757816386f6fef7146111695781638a3b87c6146110075781638bad5de914610fe15781638da5cb5b14610fb9578163965427c314610e6c57816398f309cc14610d475781639c69c78214610ce6578163b267cfa314610b64578163b480bfff14610a8c578163b52ddfbc146109eb578163bbdded0f146108dd578163c02420f214610884578163c168ae5714610798578163c1e877371461066d578163c36e5d0914610640578163ca4b208b14610617578163d13deea0146104df578163d23d433314610487578163e30c39781461045e578163ebefa86614610437578163f096245d1461035057508063f2fde38b146102e0578063f887ea40146102b85763f948ae291461022a57600080fd5b816003193601126102b4577f1a1293d7af3357cec67893722572b0342502edfe63a5fd97b5d68cb68321d9b190610276610271336000526003602052604060002054151590565b611f4c565b338352600760205261028c818420543490611f29565b3380855260076020908152838620929092559151918252349082015280604081015b0390a180f35b5080fd5b50346102b457816003193601126102b457600b5490516001600160a01b039091168152602090f35b823461034d57602036600319011261034d576102fa611e87565b610302612867565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b80fd5b82843461034d57602036600319011261034d576001600160a01b0380610374611e87565b1690610390610271836000526003602052604060002054151590565b813314908115610428575b811561041a575b811561040c575b50156103c15781526020928352819020549051908152f35b825162461bcd60e51b8152602081860152603160248201526000805160206129078339815191526044820152701ac81d1a19481d1bdd185b0818dbdd5b9d607a1b6064820152608490fd5b9050600a54163314856103a9565b8091508354163314906103a2565b809150600f541633149061039b565b5050346102b457816003193601126102b45760209060ff600f5460a01c1690519015158152f35b5050346102b457816003193601126102b45760015490516001600160a01b039091168152602090f35b833461034d57602036600319011261034d576104a1611e87565b6104a9612867565b600d80546001600160a01b0319166001600160a01b0392909216919091179055600f805460ff60a01b1916600160a01b17905580f35b91905034610613576020366003190112610613578135916104fe6128bf565b6105073361203d565b83116105bc5761051f8361051a3361203d565b612030565b3385526007602052828520558380808086335af161053b611ff4565b501561057a57505133815260208101919091527fc74ad6879c7740563cf7f39668cc9ad4010de80d20cbff857d745eeba33cbd109080604081016102ae565b6020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f7420776974686472617720636c69656e742066756e6473000000006044820152fd5b6020608492519162461bcd60e51b8352820152602c60248201527f496e73756666696369656e742046756e64733a2046756e64207769746864726160448201526b3bb4b73390313c903ab9b2b960a11b6064820152fd5b8280fd5b5050346102b457816003193601126102b457600f5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666610661611e87565b61203d565b9051908152f35b839150346102b45760203660031901126102b4576001600160a01b039081610693611e87565b16916106af610271846000526003602052604060002054151590565b823314908115610789575b811561077b575b811561076d575b501561071657606084808585815260056020522090806106e6611f98565b9280549384815260ff60026001840154938460208501520154161515938491015281519384526020840152820152f35b608490602085519162461bcd60e51b83528201526037602482015260008051602061290783398151915260448201527f6b2074686520737562736372697074696f6e20696e666f0000000000000000006064820152fd5b9050600a54163314856106c8565b8091508454163314906106c1565b809150600f54163314906106ba565b91905034610613576020366003190112610613578135916107c9610271336000526003602052604060002054151590565b600954831061081c575033808452600660209081528285208490559151908152908101919091527fab834dc04539ce8b6cdebe87cee599127f060c794ebb0dcc66655d6050dc676c9080604081016102ae565b6020608492519162461bcd60e51b8352820152603b60248201527f43616e6e6f74207365742061206c6f776572206c696d6974207468616e20746860448201527f65206c696d69742073657420627920746865206465706c6f79657200000000006064820152fd5b5050346102b457806003193601126102b4576020906108d46108a4611e87565b6108ac611ea2565b906108cf61027160018060a01b0383166000526003602052604060002054151590565b6121c0565b90519015158152f35b9050823461034d57602036600319011261034d576108f9611e87565b6001600160a01b03808216600081815260036020526040902054929492610921901515611f4c565b33149081156109dc575b81156109cf575b5015610982575091602092916109478161203d565b61095082612543565b1061095d575b5051908152f35b61097b91925061097561096f8261203d565b91612543565b90612030565b9083610956565b608490602085519162461bcd60e51b8352820152603360248201526000805160206129078339815191526044820152726b206566666563746976652062616c616e636560681b6064820152fd5b9050825416331485610932565b809150600f541633149061092b565b90503461061357602036600319011261061357610a06611e87565b610a0e612867565b6001600160a01b0316918215610a365750506001600160601b0360a01b600f541617600f5580f35b906020608492519162461bcd60e51b8352820152602a60248201527f446576656c6f70657220616464726573732063616e6e6f742062652061207a65604482015269726f206164647265737360b01b6064820152fd5b9190503461061357602036600319011261061357610aa8611e87565b9133845280602052610ac582852060018060a01b03851690612777565b15610b0b5750516001600160a01b0390911681524260208201527fb427cf1de9ad97d508ddd8d5635c1bc170353a52661b7b77e441474f7c442a7d9080604081016102ae565b6020608492519162461bcd60e51b8352820152602e60248201527f436f6e7472616374206973206e6f742077686974656c6973746564206f72206160448201526d1b1c9958591e481c995b5bdd995960921b6064820152fd5b839150346102b457826003193601126102b457610b7f611e87565b600a54602435926001600160a01b039182163303610c7d57610ba08361203d565b8411610c2057507f63216f1109e37913888a828960a8da002a7702656ade0492848dd2857aa8fe3693946102ae9183168087526007602052610be58583892054612030565b908752600760205281872055610bfd84600854611f29565b600855516001600160a01b03909216825260208201929092529081906040820190565b608490602087519162461bcd60e51b8352820152603160248201527f496e73756666696369656e742046756e64733a20436f6c6c656374696e6720666044820152703ab7323990313c9033b2b732b930ba37b960791b6064820152fd5b608490602087519162461bcd60e51b8352820152603960248201527f43616c6c6572206973206e6f7420746865206f776e65723a204f6e6c7920476560448201527f6e657261746f722063616e20636f6c6c6563742066756e6473000000000000006064820152fd5b5050346102b457816003193601126102b45760207f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610d24612867565b610d2c6128bf565b6001805460ff60a01b1916600160a01b17905551338152a180f35b82843461034d57602036600319011261034d57610d62611e87565b6001600160a01b03808216600081815260036020526040902054929392610d8a901515611f4c565b3314918215610e5d575b8215610e4f575b508115610e40575b8115610e32575b5015610dc95760209250610dc061096f8261203d565b10159051908152f35b815162461bcd60e51b8152602081850152603960248201527f556e617574686f72697a6564204163636573733a20416464726573732063616e60448201527f6e6f7420636865636b206d696e696d756d2062616c616e6365000000000000006064820152608490fd5b9050600b5416331484610daa565b809150600a5416331490610da3565b819250541633149085610d9b565b915080600f5416331491610d94565b9190503461061357602036600319011261061357610e88611e87565b91610e91612867565b6001600160a01b038316600081815260036020526040902054610eb5901515611f4c565b84808080610ec28861203d565b855af1610ecd611ff4565b5015610f7657610edc9061268d565b15610f225750516001600160a01b0390911681524260208201527f51e7e2c8606f03d2c1f0b012f6707ef7d99d1562a6c7d9eeca75f5b3af3980d59080604081016102ae565b6020608492519162461bcd60e51b8352820152602960248201527f436c69656e74206e6f742077686974656c6973746564206f7220616c726561646044820152681e481c995b5bdd995960ba1b6064820152fd5b506020606492519162461bcd60e51b8352820152601c60248201527f43616e6e6f74207472616e7366657220636c69656e742066756e6473000000006044820152fd5b5050346102b457816003193601126102b457905490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b457602090610666611002611e87565b612543565b839150346102b457816003193601126102b457600f546001600160a01b03919082163314801561115d575b156110e6575060025491611044612459565b9261104e8161215a565b916110588261215a565b93815b8381106110a1576110828761109d8a896110908a8351968796606088526060880190611eb8565b908682036020880152611ef5565b9184830390850152611ef5565b0390f35b806110d1836110b36110e1948b612196565b511680865260076020528a8620546110cb848a612196565b52612543565b6110db8289612196565b52612187565b61105b565b60a490602085519162461bcd60e51b8352820152604560248201527f556e617574686f72697a6564204163636573733a204f6e6c7920646576656c6f60448201527f706572206f72206465706c6f7965722063616e20636865636b207468652062616064820152646c616e636560d81b6084820152fd5b50818354163314611032565b5050346102b457806003193601126102b4576020906108d4611189611e87565b611191611ea2565b906121c0565b5050346102b457816003193601126102b457600a5490516001600160a01b039091168152602090f35b91905034610613578260031936011261061357600154916001600160a01b0391338385160361122c5750506001600160a01b031991821660015582543392811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152fd5b9190503461061357806003193601126106135761129c611e87565b91602435926112a9612867565b6001600160a01b03166000818152600360205260409020549091906112cf901515611f4c565b6202a300420180421161132a578411156112f457508352600560205282206001015580f35b606490602084519162461bcd60e51b8352820152601060248201526f496e76616c696420456e642054696d6560801b6044820152fd5b634e487b7160e01b865260118252602486fd5b8390346102b45760203660031901126102b457611358612867565b3560095580f35b90503461061357602090816003193601126114765761137c611e87565b611384612867565b6001600160a01b0316808552818352838520541561141f57845281528183209083600193848092818601915b6113e7575b50505050815491848155826113c8578480f35b84528320908101905b8181106113dd57808480f35b83815582016113d1565b855481101561141a57806113fe61141492886125a6565b90549060031b1c89528286528884812055612187565b836113b0565b6113b5565b50915162461bcd60e51b815291820152602c60248201527f436f6e747261637473206e6f742077686974656c6973746564206f7220616c7260448201526b1958591e481c995b5bdd995960a21b6064820152608490fd5b8380fd5b91905034610613576020366003190112610613578135611498612867565b600c546001600160a01b0316801561157a5760085480831161151f5785838194936114c583958495612030565b6008555af16114d2611ff4565b50156114dc578280f35b906020606492519162461bcd60e51b8352820152601f60248201527f43616e6e6f7420636c61696d2066726565206e6f646520657870656e736573006044820152fd5b835162461bcd60e51b8152602081870152602f60248201527f496e73756666696369656e742046756e64733a20436c61696d696e672066726560448201526e65206e6f646520657870656e73657360881b6064820152608490fd5b825162461bcd60e51b8152602081860152603160248201527f496e76616c696420416464726573733a20416464726573732063616e6e6f742060448201527062652061207a65726f206164647265737360781b6064820152608490fd5b5050346102b457816003193601126102b457600c5490516001600160a01b039091168152602090f35b919050346106135760203660031901126106135761161c611e87565b91611637610271336000526003602052604060002054151590565b823b156116dc573384528060205261165b8285209360018060a01b03168094612636565b1561169a57507fec3b8f7f6fc93e30f5a4d232044ffe225b0e16bfa3a35dd26929478b7b7cf5079181606092519133835260208301524290820152a180f35b6020606492519162461bcd60e51b8352820152601f60248201527f436f6e747261637420697320416c72656164792077686974656c6973746564006044820152fd5b6020606492519162461bcd60e51b83528201526015602482015274416464726573732063616e6e6f7420626520454f4160581b6044820152fd5b5050346102b457816003193601126102b45760209060ff60015460a01c1690519015158152f35b905034610613578160031936011261061357611757611e87565b90611760611ea2565b90611769612867565b823b151580611864575b15611816576001600160a01b03928316938415158061180b575b156117b65750506001600160601b0360a01b9283600a541617600a551690600b541617600b5580f35b906020608492519162461bcd60e51b8352820152602960248201527f436f6e747261637420616464726573732063616e6e6f742062652061207a65726044820152686f206164647265737360b81b6064820152fd5b50838316151561178d565b608490602085519162461bcd60e51b8352820152602260248201527f416464726573732063616e6e6f7420626520612077616c6c6574206164647265604482015261737360f01b6064820152fd5b50813b1515611773565b5050346102b457816003193601126102b45761109d9061188c612459565b9051918291602083526020830190611eb8565b839150346102b457826003193601126102b4576118ba611e87565b602435916118c6612867565b6001600160a01b0382166000818152600360205260409020549091906118ed901515611f4c565b6008549081851161196d5750946102ae9161192a857ff2e47447f313cd2dfd6619c01eb5086d0e611595137943f8d19508636ce61c769798612030565b60085580875260076020526119428583892054611f29565b908752600760205281872055519283928360209093929193604081019460018060a01b031681520152565b608490602088519162461bcd60e51b83528201526024808201527f496e73756666696369656e742066756e64733a20657865637574696e67207265604482015263199d5b9960e21b6064820152fd5b9050346106135782600319360112610613576119d6612867565b6001549060ff8260a01c1615611a1e575060ff60a01b1916600155513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b606490602084519162461bcd60e51b8352820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152fd5b5050346102b457816003193601126102b4576020906002549051908152f35b5050346102b457816003193601126102b4576020906009549051908152f35b5050346102b457816003193601126102b457600d5490516001600160a01b039091168152602090f35b5050346102b45760203660031901126102b4576020906108d46001600160a01b03611ae8611e87565b166000526003602052604060002054151590565b91905034610613578260031936011261061357600e546001600160a01b039081163303611bc857600f549260ff8460a01c1615611b855750916020917ff562f58226d62299459492ca2aa60f98cba368ce1faa18c20b931cb9c84d3a5d93600d541691826001600160601b0360a01b600c541617600c5560ff60a01b1916600f5551908152a180f35b606490602084519162461bcd60e51b8352820152601d60248201527f436f6c642077616c6c65742070726f706f7365206e6f742072656164790000006044820152fd5b815162461bcd60e51b8152602081850152602e60248201527f556e617574686f72697a6564204163636573733a204f6e6c7920417070726f7660448201526d65722063616e20636f6e6669726d60901b6064820152608490fd5b5050346102b45760203660031901126102b45761109d9061188c611c44611e87565b6001600160a01b038116600090815260036020526040902054611c68901515611f4c565b6122c6565b838060031936011261034d57611c81612867565b611c8d34600854611f29565b60085580f35b5050346102b457816003193601126102b457600e5490516001600160a01b039091168152602090f35b8383346102b457806003193601126102b457611cd6611e87565b6024359081151580920361147657611cec612867565b6001600160a01b0316600081815260036020526040902054909290611db657611d14836125be565b5062ed4e00420190814211611da357917f75b0a96771559886d7368303c13fc539a88faea45bbea23b0a72ac991d834a3a9391608093611d52611f98565b4281526002602082019184835283810192868452878b526005602052848b2091518255516001820155019051151560ff8019835416911617905580519384524260208501528301526060820152a180f35b634e487b7160e01b855260118652602485fd5b5162461bcd60e51b8152602081860152601d60248201527f436c69656e7420697320616c72656164792077686974656c69737465640000006044820152606490fd5b9150833461034d578060031936011261034d5754336001600160a01b0391821614908115611e79575b5015611e34576020836008549051908152f35b62461bcd60e51b8252602090820152602d602482015260008051602061290783398151915260448201526c6b2073757072612066756e647360981b6064820152608490fd5b9050600f5416331484611e21565b600435906001600160a01b0382168203611e9d57565b600080fd5b602435906001600160a01b0382168203611e9d57565b90815180825260208080930193019160005b828110611ed8575050505090565b83516001600160a01b031685529381019392810192600101611eca565b90815180825260208080930193019160005b828110611f15575050505090565b835185529381019392810192600101611f07565b91908201809211611f3657565b634e487b7160e01b600052601160045260246000fd5b15611f5357565b60405162461bcd60e51b815260206004820152601e60248201527f436c69656e742061646472657373206e6f742077686974656c697374656400006044820152606490fd5b604051906060820182811067ffffffffffffffff821117611fb857604052565b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f1916820167ffffffffffffffff811183821017611fb857604052565b3d1561202b573d9067ffffffffffffffff8211611fb85761201e601f8301601f1916602001611fce565b9182523d6000602084013e565b606090565b91908203918211611f3657565b6001600160a01b03908116600081815260036020526040902054909190612065901515611f4c565b813314908115612133575b8115612124575b8115612115575b8115612107575b501561209c57600052600760205260406000205490565b60405162461bcd60e51b815260206004820152603760248201527f556e617574686f72697a6564204163636573733a2041646472657373206e6f7460448201527f20616c6c6f77656420746f20636865636b2066756e64730000000000000000006064820152608490fd5b9050600b5416331438612085565b809150600a541633149061207e565b80915060005416331490612077565b809150600f5416331490612070565b67ffffffffffffffff8111611fb85760051b60200190565b9061216c61216783612142565b611fce565b828152809261217d601f1991612142565b0190602036910137565b6000198114611f365760010190565b80518210156121aa5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03908116600081815260036020526040902054909291906121e9901515611f4c565b82331480156122b9575b80156122ac575b801561229f575b8015612292575b1561223957612236926000526004602052604060002091169060019160005201602052604060002054151590565b90565b60405162461bcd60e51b815260206004820152603e602482015260008051602061290783398151915260448201527f6b20666f72207468652077686974656c697374656420636f6e747261637400006064820152608490fd5b5080600b54163314612208565b5080600a54163314612201565b50806000541633146121fa565b5080600f541633146121f3565b6001600160a01b0390811690338214801561244c575b801561243f575b156123da5781156123955790600081815260046020928184526040908184205461230c8161215a565b9685925b8284106123615750505015612326575050505090565b8051945091928401919067ffffffffffffffff83118584101761234e57505280825236813790565b634e487b7160e01b845260419052602483fd5b90919261238d908288528689528361237b82888b206125a6565b90549060031b1c166110db828c612196565b929190612310565b60405162461bcd60e51b815260206004820152601b60248201527f5573657220616464726573732063616e6e6f74206265207a65726f00000000006044820152606490fd5b60405162461bcd60e51b8152602060048201526043602482015260008051602061290783398151915260448201527f6b20746865206c697374206f662077686974656c697374656420636f6e74726160648201526263747360e81b608482015260a490fd5b50806000541633146122e3565b5080600f541633146122dc565b600f546001600160a01b0390811633148015612536575b156124d4576002908154906124848261215a565b926000805b84811061249857505050505090565b6124cf9083835284817f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0154166110db8289612196565b612489565b60405162461bcd60e51b815260206004820152603460248201527f556e617574686f72697a6564204163636573733a2043616e6e6f74206c6973746044820152732077686974656c697374656420636c69656e747360601b6064820152608490fd5b5080600054163314612470565b6001600160a01b03166000908152600660205260409020546009548082111561256a575090565b905090565b6002548110156121aa5760026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0190600090565b80548210156121aa5760005260206000200190600090565b60008181526003602052604081205461256a57600254600160401b81101561262257908261260e6125f78460016040960160025561256f565b819391549060031b91821b91600019901b19161790565b905560025492815260036020522055600190565b634e487b7160e01b82526041600452602482fd5b600082815260018201602052604090205461268657805490600160401b821015611fb8578261266f6125f78460018096018555846125a6565b905580549260005201602052604060002055600190565b5050600090565b6000818152600360205260408120549091908015612772576000199080820181811161275e576002549083820191821161274a57808203612716575b5050506002548015612702578101906126e18261256f565b909182549160031b1b19169055600255815260036020526040812055600190565b634e487b7160e01b84526031600452602484fd5b6127346127256125f79361256f565b90549060031b1c92839261256f565b90558452600360205260408420553880806126c9565b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b505090565b90600182019060009281845282602052604084205490811515600014612860576000199180830181811161284c5782549084820191821161283857808203612803575b505050805480156127ef578201916127d283836125a6565b909182549160031b1b191690555582526020526040812055600190565b634e487b7160e01b86526031600452602486fd5b6128236128136125f793866125a6565b90549060031b1c928392866125a6565b905586528460205260408620553880806127ba565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526011600452602487fd5b5050505090565b6000546001600160a01b0316330361287b57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b60ff60015460a01c166128ce57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fdfe556e617574686f72697a6564204163636573733a2043616e6e6f742063686563a264697066735822122019c531164674eda13eb2fbd01e06290c89bfc390a09f95b95d8b609e2b7f14cb64736f6c63430008130033

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

0000000000000000000000008b61f1c25483380cf1ecbac8c55c5b3b80f05b9d000000000000000000000000578dd059ec425f83cccc3149ed594d4e067a530700000000000000000000000097787e6a911480e1026b6f658f330f7b323a3c920000000000000000000000003b5f96986389f6bacf58d5b69425fab000d3551e000000000000000000000000000000000000000000000000002386f26fc10000

-----Decoded View---------------
Arg [0] : _approver (address): 0x8B61F1C25483380Cf1eCbaC8C55c5b3B80F05B9d
Arg [1] : _developer (address): 0x578DD059Ec425F83cCCC3149ed594d4e067A5307
Arg [2] : _newGenerator (address): 0x97787E6a911480e1026B6f658f330f7B323a3c92
Arg [3] : _newRouter (address): 0x3B5F96986389f6BaCF58d5b69425fab000D3551e
Arg [4] : _minBalanceLimitSupra (uint256): 10000000000000000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000008b61f1c25483380cf1ecbac8c55c5b3b80f05b9d
Arg [1] : 000000000000000000000000578dd059ec425f83cccc3149ed594d4e067a5307
Arg [2] : 00000000000000000000000097787e6a911480e1026b6f658f330f7b323a3c92
Arg [3] : 0000000000000000000000003b5f96986389f6bacf58d5b69425fab000d3551e
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://19c531164674eda13eb2fbd01e06290c89bfc390a09f95b95d8b609e2b7f14cb

Block Transaction 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.