ETH Price: $4,006.97 (+3.04%)

Contract

0x015110343EDF8deBA22262AE6b745620d61069B2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Unlock Nfts213570042024-12-08 9:54:117 days ago1733651651IN
0x01511034...0d61069B2
0 ETH0.0003703711.29489295
Unlock Nfts213569822024-12-08 9:49:477 days ago1733651387IN
0x01511034...0d61069B2
0 ETH0.0003627911.06380088
Unlock Nfts213569782024-12-08 9:48:597 days ago1733651339IN
0x01511034...0d61069B2
0 ETH0.0003710311.3151539
Unlock Nfts213569742024-12-08 9:48:117 days ago1733651291IN
0x01511034...0d61069B2
0 ETH0.0003594810.96298108
Unlock Nfts213569722024-12-08 9:47:477 days ago1733651267IN
0x01511034...0d61069B2
0 ETH0.0003388310.33324537
Unlock Nfts213569682024-12-08 9:46:597 days ago1733651219IN
0x01511034...0d61069B2
0 ETH0.0003692911.26213471
Unlock Nfts213569502024-12-08 9:43:237 days ago1733651003IN
0x01511034...0d61069B2
0 ETH0.0009772711.81036252
Unlock Nfts211001732024-11-02 13:11:4743 days ago1730553107IN
0x01511034...0d61069B2
0 ETH0.000204036.22215477
Unlock Nfts211001672024-11-02 13:10:3543 days ago1730553035IN
0x01511034...0d61069B2
0 ETH0.000194735.93868342
Unlock Nfts211000832024-11-02 12:53:3543 days ago1730552015IN
0x01511034...0d61069B2
0 ETH0.000191745.84752188
Unlock Nfts211000742024-11-02 12:51:4743 days ago1730551907IN
0x01511034...0d61069B2
0 ETH0.000218866.67466131
Unlock Nfts208061482024-09-22 12:34:4784 days ago1727008487IN
0x01511034...0d61069B2
0 ETH0.0003394310.35157845
Unlock Nfts204317022024-08-01 5:47:23136 days ago1722491243IN
0x01511034...0d61069B2
0 ETH0.000359665.48255639
Lock Nfts203299782024-07-18 0:57:59151 days ago1721264279IN
0x01511034...0d61069B2
0 ETH0.000671357.2272548
Lock Nfts203299712024-07-18 0:56:35151 days ago1721264195IN
0x01511034...0d61069B2
0 ETH0.000714237.3110926
Unlock Nfts202975892024-07-13 12:28:47155 days ago1720873727IN
0x01511034...0d61069B2
0 ETH0.0000662.01303515
Unlock Nfts202975782024-07-13 12:26:35155 days ago1720873595IN
0x01511034...0d61069B2
0 ETH0.000053381.62809153
Unlock Nfts202975192024-07-13 12:14:35155 days ago1720872875IN
0x01511034...0d61069B2
0 ETH0.000052461.6
Unlock Nfts201112912024-06-17 11:45:23181 days ago1718624723IN
0x01511034...0d61069B2
0 ETH0.000520896.29501077
Unlock Nfts199895042024-05-31 11:25:47198 days ago1717154747IN
0x01511034...0d61069B2
0 ETH0.0008876210.72698142
Unlock Nfts199077292024-05-20 1:02:35210 days ago1716166955IN
0x01511034...0d61069B2
0 ETH0.000124143.78589908
Unlock Nfts199076172024-05-20 0:40:11210 days ago1716165611IN
0x01511034...0d61069B2
0 ETH0.000173485.29063094
Unlock Nfts199012692024-05-19 3:21:35210 days ago1716088895IN
0x01511034...0d61069B2
0 ETH0.000098373
Unlock Nfts199012642024-05-19 3:20:35210 days ago1716088835IN
0x01511034...0d61069B2
0 ETH0.000097442.97160632
Unlock Nfts198896942024-05-17 12:28:59212 days ago1715948939IN
0x01511034...0d61069B2
0 ETH0.0003550910.82901405
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XANACentralLockDiamond

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-27
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/**
 * @title Contract ownership standard interface
 * @dev see https://eips.ethereum.org/EIPS/eip-173
 */
interface IERC173 {
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @notice get the ERC173 contract owner
     * @return conract owner
     */
    function owner() external view returns (address);

    /**
     * @notice transfer contract ownership to new account
     * @param account address of new owner
     */
    function transferOwnership(address account) external;
}


// File @solidstate/contracts/access/[email protected]
library OwnableStorage {
    struct Layout {
        address owner;
    }

    bytes32 internal constant STORAGE_SLOT =
        keccak256('solidstate.contracts.storage.Ownable');

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }

    function setOwner(Layout storage l, address owner) internal {
        l.owner = owner;
    }
}


// File @solidstate/contracts/access/[email protected]
abstract contract OwnableInternal {
    using OwnableStorage for OwnableStorage.Layout;

    modifier onlyOwner() {
        require(
            msg.sender == OwnableStorage.layout().owner,
            'Ownable: sender must be owner'
        );
        _;
    }
}


// File @solidstate/contracts/access/[email protected]
/**
 * @title Ownership access control based on ERC173
 */
abstract contract Ownable is IERC173, OwnableInternal {
    using OwnableStorage for OwnableStorage.Layout;

    /**
     * @inheritdoc IERC173
     */
    function owner() public view virtual returns (address) {
        return OwnableStorage.layout().owner;
    }

    /**
     * @inheritdoc IERC173
     */
    function transferOwnership(address account) public virtual onlyOwner {
        OwnableStorage.layout().setOwner(account);
        emit OwnershipTransferred(msg.sender, account);
    }
}


// File @solidstate/contracts/access/[email protected]
library SafeOwnableStorage {
    struct Layout {
        address nomineeOwner;
    }

    bytes32 internal constant STORAGE_SLOT =
        keccak256('solidstate.contracts.storage.SafeOwnable');

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }

    function setNomineeOwner(Layout storage l, address nomineeOwner) internal {
        l.nomineeOwner = nomineeOwner;
    }
}


// File @solidstate/contracts/access/[email protected]
abstract contract SafeOwnableInternal {
    using SafeOwnableStorage for SafeOwnableStorage.Layout;

    modifier onlyNomineeOwner() {
        require(
            msg.sender == SafeOwnableStorage.layout().nomineeOwner,
            'SafeOwnable: sender must be nominee owner'
        );
        _;
    }
}


// File @solidstate/contracts/access/[email protected]
/**
 * @title Ownership access control based on ERC173 with ownership transfer safety check
 */
abstract contract SafeOwnable is Ownable, SafeOwnableInternal {
    using OwnableStorage for OwnableStorage.Layout;
    using SafeOwnableStorage for SafeOwnableStorage.Layout;

    function nomineeOwner() public view virtual returns (address) {
        return SafeOwnableStorage.layout().nomineeOwner;
    }

    /**
     * @inheritdoc Ownable
     * @dev ownership transfer must be accepted by beneficiary before transfer is complete
     */
    function transferOwnership(address account)
        public
        virtual
        override
        onlyOwner
    {
        SafeOwnableStorage.layout().setNomineeOwner(account);
    }

    /**
     * @notice accept transfer of contract ownership
     */
    function acceptOwnership() public virtual onlyNomineeOwner {
        OwnableStorage.Layout storage l = OwnableStorage.layout();
        emit OwnershipTransferred(l.owner, msg.sender);
        l.setOwner(msg.sender);
        SafeOwnableStorage.layout().setNomineeOwner(address(0));
    }
}


// File @solidstate/contracts/introspection/[email protected]
library ERC165Storage {
    struct Layout {
        mapping(bytes4 => bool) supportedInterfaces;
    }

    bytes32 internal constant STORAGE_SLOT =
        keccak256('solidstate.contracts.storage.ERC165');

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }

    function isSupportedInterface(Layout storage l, bytes4 interfaceId)
        internal
        view
        returns (bool)
    {
        return l.supportedInterfaces[interfaceId];
    }

    function setSupportedInterface(
        Layout storage l,
        bytes4 interfaceId,
        bool status
    ) internal {
        require(interfaceId != 0xffffffff, 'ERC165: invalid interface id');
        l.supportedInterfaces[interfaceId] = status;
    }
}


// File @solidstate/contracts/introspection/[email protected]
/**
 * @title ERC165 interface registration interface
 * @dev see https://eips.ethereum.org/EIPS/eip-165
 */
interface IERC165 {
    /**
     * @notice query whether contract has registered support for given interface
     * @param interfaceId interface id
     * @return bool whether interface is supported
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @solidstate/contracts/introspection/[email protected]
/**
 * @title ERC165 implementation
 */
abstract contract ERC165 is IERC165 {
    using ERC165Storage for ERC165Storage.Layout;

    /**
     * @inheritdoc IERC165
     */
    function supportsInterface(bytes4 interfaceId) public view returns (bool) {
        return ERC165Storage.layout().isSupportedInterface(interfaceId);
    }
}


// File @solidstate/contracts/proxy/diamond/[email protected]
/**
 * @title Diamond proxy upgrade interface
 * @dev see https://eips.ethereum.org/EIPS/eip-2535
 */
interface IDiamondCuttable {
    enum FacetCutAction {
        ADD,
        REPLACE,
        REMOVE
    }

    event DiamondCut(FacetCut[] facetCuts, address target, bytes data);

    struct FacetCut {
        address target;
        FacetCutAction action;
        bytes4[] selectors;
    }

    /**
     * @notice update diamond facets and optionally execute arbitrary initialization function
     * @param facetCuts facet addresses, actions, and function selectors
     * @param target initialization function target
     * @param data initialization function call data
     */
    function diamondCut(
        FacetCut[] calldata facetCuts,
        address target,
        bytes calldata data
    ) external;
}


// File @solidstate/contracts/utils/[email protected]
/**
 * @title utility functions for uint256 operations
 * @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts/ (MIT license)
 */
library UintUtils {
    bytes16 private constant HEX_SYMBOLS = '0123456789abcdef';

    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return '0';
        }

        uint256 temp = value;
        uint256 digits;

        while (temp != 0) {
            digits++;
            temp /= 10;
        }

        bytes memory buffer = new bytes(digits);

        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }

        return string(buffer);
    }

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return '0x00';
        }

        uint256 length = 0;

        for (uint256 temp = value; temp != 0; temp >>= 8) {
            unchecked {
                length++;
            }
        }

        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = '0';
        buffer[1] = 'x';

        unchecked {
            for (uint256 i = 2 * length + 1; i > 1; --i) {
                buffer[i] = HEX_SYMBOLS[value & 0xf];
                value >>= 4;
            }
        }

        require(value == 0, 'UintUtils: hex length insufficient');

        return string(buffer);
    }
}


// File @solidstate/contracts/utils/[email protected]
library AddressUtils {
    using UintUtils for uint256;

    function toString(address account) internal pure returns (string memory) {
        return uint256(uint160(account)).toHexString(20);
    }

    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable account, uint256 amount) internal {
        (bool success, ) = account.call{ value: amount }('');
        require(success, 'AddressUtils: failed to send value');
    }

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionCall(target, data, 'AddressUtils: failed low-level call');
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory error
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, error);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                'AddressUtils: failed low-level call with value'
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory error
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            'AddressUtils: insufficient balance for call'
        );
        return _functionCallWithValue(target, data, value, error);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory error
    ) private returns (bytes memory) {
        require(
            isContract(target),
            'AddressUtils: function call to non-contract'
        );

        (bool success, bytes memory returnData) = target.call{ value: value }(
            data
        );

        if (success) {
            return returnData;
        } else if (returnData.length > 0) {
            assembly {
                let returnData_size := mload(returnData)
                revert(add(32, returnData), returnData_size)
            }
        } else {
            revert(error);
        }
    }
}


// File @solidstate/contracts/proxy/diamond/[email protected]
/**
 * @dev derived from https://github.com/mudgen/diamond-2 (MIT license)
 */
library DiamondBaseStorage {
    using AddressUtils for address;
    using DiamondBaseStorage for DiamondBaseStorage.Layout;

    struct Layout {
        // function selector => (facet address, selector slot position)
        mapping(bytes4 => bytes32) facets;
        // total number of selectors registered
        uint16 selectorCount;
        // array of selector slots with 8 selectors per slot
        mapping(uint256 => bytes32) selectorSlots;
        address fallbackAddress;
    }

    bytes32 constant CLEAR_ADDRESS_MASK =
        bytes32(uint256(0xffffffffffffffffffffffff));
    bytes32 constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224));

    bytes32 internal constant STORAGE_SLOT =
        keccak256('solidstate.contracts.storage.DiamondBase');

    event DiamondCut(
        IDiamondCuttable.FacetCut[] facetCuts,
        address target,
        bytes data
    );

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }

    /**
     * @notice update functions callable on Diamond proxy
     * @param l storage layout
     * @param facetCuts array of structured Diamond facet update data
     * @param target optional recipient of initialization delegatecall
     * @param data optional initialization call data
     */
    function diamondCut(
        Layout storage l,
        IDiamondCuttable.FacetCut[] memory facetCuts,
        address target,
        bytes memory data
    ) internal {
        unchecked {
            uint256 originalSelectorCount = l.selectorCount;
            uint256 selectorCount = originalSelectorCount;
            bytes32 selectorSlot;

            // Check if last selector slot is not full
            if (selectorCount & 7 > 0) {
                // get last selectorSlot
                selectorSlot = l.selectorSlots[selectorCount >> 3];
            }

            for (uint256 i; i < facetCuts.length; i++) {
                IDiamondCuttable.FacetCut memory facetCut = facetCuts[i];
                IDiamondCuttable.FacetCutAction action = facetCut.action;

                require(
                    facetCut.selectors.length > 0,
                    'DiamondBase: no selectors specified'
                );

                if (action == IDiamondCuttable.FacetCutAction.ADD) {
                    (selectorCount, selectorSlot) = l.addFacetSelectors(
                        selectorCount,
                        selectorSlot,
                        facetCut
                    );
                } else if (action == IDiamondCuttable.FacetCutAction.REPLACE) {
                    l.replaceFacetSelectors(facetCut);
                } else if (action == IDiamondCuttable.FacetCutAction.REMOVE) {
                    (selectorCount, selectorSlot) = l.removeFacetSelectors(
                        selectorCount,
                        selectorSlot,
                        facetCut
                    );
                }
            }

            if (selectorCount != originalSelectorCount) {
                l.selectorCount = uint16(selectorCount);
            }

            // If last selector slot is not full
            if (selectorCount & 7 > 0) {
                l.selectorSlots[selectorCount >> 3] = selectorSlot;
            }

            emit DiamondCut(facetCuts, target, data);
            initialize(target, data);
        }
    }

    function addFacetSelectors(
        Layout storage l,
        uint256 selectorCount,
        bytes32 selectorSlot,
        IDiamondCuttable.FacetCut memory facetCut
    ) internal returns (uint256, bytes32) {
        unchecked {
            require(
                facetCut.target == address(this) ||
                    facetCut.target.isContract(),
                'DiamondBase: ADD target has no code'
            );

            for (uint256 i; i < facetCut.selectors.length; i++) {
                bytes4 selector = facetCut.selectors[i];
                bytes32 oldFacet = l.facets[selector];

                require(
                    address(bytes20(oldFacet)) == address(0),
                    'DiamondBase: selector already added'
                );

                // add facet for selector
                l.facets[selector] =
                    bytes20(facetCut.target) |
                    bytes32(selectorCount);
                uint256 selectorInSlotPosition = (selectorCount & 7) << 5;

                // clear selector position in slot and add selector
                selectorSlot =
                    (selectorSlot &
                        ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) |
                    (bytes32(selector) >> selectorInSlotPosition);

                // if slot is full then write it to storage
                if (selectorInSlotPosition == 224) {
                    l.selectorSlots[selectorCount >> 3] = selectorSlot;
                    selectorSlot = 0;
                }

                selectorCount++;
            }

            return (selectorCount, selectorSlot);
        }
    }

    function removeFacetSelectors(
        Layout storage l,
        uint256 selectorCount,
        bytes32 selectorSlot,
        IDiamondCuttable.FacetCut memory facetCut
    ) internal returns (uint256, bytes32) {
        unchecked {
            require(
                facetCut.target == address(0),
                'DiamondBase: REMOVE target must be zero address'
            );

            uint256 selectorSlotCount = selectorCount >> 3;
            uint256 selectorInSlotIndex = selectorCount & 7;

            for (uint256 i; i < facetCut.selectors.length; i++) {
                bytes4 selector = facetCut.selectors[i];
                bytes32 oldFacet = l.facets[selector];

                require(
                    address(bytes20(oldFacet)) != address(0),
                    'DiamondBase: selector not found'
                );

                require(
                    address(bytes20(oldFacet)) != address(this),
                    'DiamondBase: selector is immutable'
                );

                if (selectorSlot == 0) {
                    selectorSlotCount--;
                    selectorSlot = l.selectorSlots[selectorSlotCount];
                    selectorInSlotIndex = 7;
                } else {
                    selectorInSlotIndex--;
                }

                bytes4 lastSelector;
                uint256 oldSelectorsSlotCount;
                uint256 oldSelectorInSlotPosition;

                // adding a block here prevents stack too deep error
                {
                    // replace selector with last selector in l.facets
                    lastSelector = bytes4(
                        selectorSlot << (selectorInSlotIndex << 5)
                    );

                    if (lastSelector != selector) {
                        // update last selector slot position info
                        l.facets[lastSelector] =
                            (oldFacet & CLEAR_ADDRESS_MASK) |
                            bytes20(l.facets[lastSelector]);
                    }

                    delete l.facets[selector];
                    uint256 oldSelectorCount = uint16(uint256(oldFacet));
                    oldSelectorsSlotCount = oldSelectorCount >> 3;
                    oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5;
                }

                if (oldSelectorsSlotCount != selectorSlotCount) {
                    bytes32 oldSelectorSlot = l.selectorSlots[
                        oldSelectorsSlotCount
                    ];

                    // clears the selector we are deleting and puts the last selector in its place.
                    oldSelectorSlot =
                        (oldSelectorSlot &
                            ~(CLEAR_SELECTOR_MASK >>
                                oldSelectorInSlotPosition)) |
                        (bytes32(lastSelector) >> oldSelectorInSlotPosition);

                    // update storage with the modified slot
                    l.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot;
                } else {
                    // clears the selector we are deleting and puts the last selector in its place.
                    selectorSlot =
                        (selectorSlot &
                            ~(CLEAR_SELECTOR_MASK >>
                                oldSelectorInSlotPosition)) |
                        (bytes32(lastSelector) >> oldSelectorInSlotPosition);
                }

                if (selectorInSlotIndex == 0) {
                    delete l.selectorSlots[selectorSlotCount];
                    selectorSlot = 0;
                }
            }

            selectorCount = (selectorSlotCount << 3) | selectorInSlotIndex;

            return (selectorCount, selectorSlot);
        }
    }

    function replaceFacetSelectors(
        Layout storage l,
        IDiamondCuttable.FacetCut memory facetCut
    ) internal {
        unchecked {
            require(
                facetCut.target.isContract(),
                'DiamondBase: REPLACE target has no code'
            );

            for (uint256 i; i < facetCut.selectors.length; i++) {
                bytes4 selector = facetCut.selectors[i];
                bytes32 oldFacet = l.facets[selector];
                address oldFacetAddress = address(bytes20(oldFacet));

                require(
                    oldFacetAddress != address(0),
                    'DiamondBase: selector not found'
                );

                require(
                    oldFacetAddress != address(this),
                    'DiamondBase: selector is immutable'
                );

                require(
                    oldFacetAddress != facetCut.target,
                    'DiamondBase: REPLACE target is identical'
                );

                // replace old facet address
                l.facets[selector] =
                    (oldFacet & CLEAR_ADDRESS_MASK) |
                    bytes20(facetCut.target);
            }
        }
    }

    function initialize(address target, bytes memory data) private {
        require(
            (target == address(0)) == (data.length == 0),
            'DiamondBase: invalid initialization parameters'
        );

        if (target != address(0)) {
            if (target != address(this)) {
                require(
                    target.isContract(),
                    'DiamondBase: initialization target has no code'
                );
            }

            (bool success, ) = target.delegatecall(data);

            if (!success) {
                assembly {
                    returndatacopy(0, 0, returndatasize())
                    revert(0, returndatasize())
                }
            }
        }
    }
}


// File @solidstate/contracts/proxy/diamond/[email protected]
/**
 * @title Diamond proxy introspection interface
 * @dev see https://eips.ethereum.org/EIPS/eip-2535
 */
interface IDiamondLoupe {
    struct Facet {
        address target;
        bytes4[] selectors;
    }

    /**
     * @notice get all facets and their selectors
     * @return diamondFacets array of structured facet data
     */
    function facets() external view returns (Facet[] memory diamondFacets);

    /**
     * @notice get all selectors for given facet address
     * @param facet address of facet to query
     * @return selectors array of function selectors
     */
    function facetFunctionSelectors(address facet)
        external
        view
        returns (bytes4[] memory selectors);

    /**
     * @notice get addresses of all facets used by diamond
     * @return addresses array of facet addresses
     */
    function facetAddresses()
        external
        view
        returns (address[] memory addresses);

    /**
     * @notice get the address of the facet associated with given selector
     * @param selector function selector to query
     * @return facet facet address (zero address if not found)
     */
    function facetAddress(bytes4 selector)
        external
        view
        returns (address facet);
}


// File @solidstate/contracts/proxy/[email protected]
/**
 * @title Base proxy contract
 */
abstract contract Proxy {
    using AddressUtils for address;

    /**
     * @notice delegate all calls to implementation contract
     * @dev reverts if implementation address contains no code, for compatibility with metamorphic contracts
     * @dev memory location in use by assembly may be unsafe in other contexts
     */
    fallback() external payable virtual {
        address implementation = _getImplementation();

        require(
            implementation.isContract(),
            'Proxy: implementation must be contract'
        );

        assembly {
            calldatacopy(0, 0, calldatasize())
            let result := delegatecall(
                gas(),
                implementation,
                0,
                calldatasize(),
                0,
                0
            )
            returndatacopy(0, 0, returndatasize())

            switch result
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    /**
     * @notice get logic implementation address
     * @return implementation address
     */
    function _getImplementation() internal virtual returns (address);
}


// File @solidstate/contracts/proxy/diamond/[email protected]
/**
 * @title EIP-2535 "Diamond" proxy base contract
 * @dev see https://eips.ethereum.org/EIPS/eip-2535
 */
abstract contract DiamondBase is Proxy {
    /**
     * @inheritdoc Proxy
     */
    function _getImplementation() internal view override returns (address) {
        // inline storage layout retrieval uses less gas
        DiamondBaseStorage.Layout storage l;
        bytes32 slot = DiamondBaseStorage.STORAGE_SLOT;
        assembly {
            l.slot := slot
        }

        address implementation = address(bytes20(l.facets[msg.sig]));

        if (implementation == address(0)) {
            implementation = l.fallbackAddress;
            require(
                implementation != address(0),
                'DiamondBase: no facet found for function signature'
            );
        }

        return implementation;
    }
}


// File @solidstate/contracts/proxy/diamond/[email protected]
/**
 * @title EIP-2535 "Diamond" proxy update contract
 */
abstract contract DiamondCuttable is IDiamondCuttable, OwnableInternal {
    using DiamondBaseStorage for DiamondBaseStorage.Layout;

    /**
     * @notice update functions callable on Diamond proxy
     * @param facetCuts array of structured Diamond facet update data
     * @param target optional recipient of initialization delegatecall
     * @param data optional initialization call data
     */
    function diamondCut(
        FacetCut[] calldata facetCuts,
        address target,
        bytes calldata data
    ) external onlyOwner {
        DiamondBaseStorage.layout().diamondCut(facetCuts, target, data);
    }
}


// File @solidstate/contracts/proxy/diamond/[email protected]
/**
 * @title EIP-2535 "Diamond" proxy introspection contract
 * @dev derived from https://github.com/mudgen/diamond-2 (MIT license)
 */
abstract contract DiamondLoupe is IDiamondLoupe {
    /**
     * @inheritdoc IDiamondLoupe
     */
    function facets() external view returns (Facet[] memory diamondFacets) {
        DiamondBaseStorage.Layout storage l = DiamondBaseStorage.layout();

        diamondFacets = new Facet[](l.selectorCount);

        uint8[] memory numFacetSelectors = new uint8[](l.selectorCount);
        uint256 numFacets;
        uint256 selectorIndex;

        // loop through function selectors
        for (uint256 slotIndex; selectorIndex < l.selectorCount; slotIndex++) {
            bytes32 slot = l.selectorSlots[slotIndex];

            for (
                uint256 selectorSlotIndex;
                selectorSlotIndex < 8;
                selectorSlotIndex++
            ) {
                selectorIndex++;

                if (selectorIndex > l.selectorCount) {
                    break;
                }

                bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));
                address facet = address(bytes20(l.facets[selector]));

                bool continueLoop;

                for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) {
                    if (diamondFacets[facetIndex].target == facet) {
                        diamondFacets[facetIndex].selectors[
                            numFacetSelectors[facetIndex]
                        ] = selector;
                        // probably will never have more than 256 functions from one facet contract
                        require(numFacetSelectors[facetIndex] < 255);
                        numFacetSelectors[facetIndex]++;
                        continueLoop = true;
                        break;
                    }
                }

                if (continueLoop) {
                    continue;
                }

                diamondFacets[numFacets].target = facet;
                diamondFacets[numFacets].selectors = new bytes4[](
                    l.selectorCount
                );
                diamondFacets[numFacets].selectors[0] = selector;
                numFacetSelectors[numFacets] = 1;
                numFacets++;
            }
        }

        for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) {
            uint256 numSelectors = numFacetSelectors[facetIndex];
            bytes4[] memory selectors = diamondFacets[facetIndex].selectors;

            // setting the number of selectors
            assembly {
                mstore(selectors, numSelectors)
            }
        }

        // setting the number of facets
        assembly {
            mstore(diamondFacets, numFacets)
        }
    }

    /**
     * @inheritdoc IDiamondLoupe
     */
    function facetFunctionSelectors(address facet)
        external
        view
        returns (bytes4[] memory selectors)
    {
        DiamondBaseStorage.Layout storage l = DiamondBaseStorage.layout();

        selectors = new bytes4[](l.selectorCount);

        uint256 numSelectors;
        uint256 selectorIndex;

        // loop through function selectors
        for (uint256 slotIndex; selectorIndex < l.selectorCount; slotIndex++) {
            bytes32 slot = l.selectorSlots[slotIndex];

            for (
                uint256 selectorSlotIndex;
                selectorSlotIndex < 8;
                selectorSlotIndex++
            ) {
                selectorIndex++;

                if (selectorIndex > l.selectorCount) {
                    break;
                }

                bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));

                if (facet == address(bytes20(l.facets[selector]))) {
                    selectors[numSelectors] = selector;
                    numSelectors++;
                }
            }
        }

        // set the number of selectors in the array
        assembly {
            mstore(selectors, numSelectors)
        }
    }

    /**
     * @inheritdoc IDiamondLoupe
     */
    function facetAddresses()
        external
        view
        returns (address[] memory addresses)
    {
        DiamondBaseStorage.Layout storage l = DiamondBaseStorage.layout();

        addresses = new address[](l.selectorCount);
        uint256 numFacets;
        uint256 selectorIndex;

        for (uint256 slotIndex; selectorIndex < l.selectorCount; slotIndex++) {
            bytes32 slot = l.selectorSlots[slotIndex];

            for (
                uint256 selectorSlotIndex;
                selectorSlotIndex < 8;
                selectorSlotIndex++
            ) {
                selectorIndex++;

                if (selectorIndex > l.selectorCount) {
                    break;
                }

                bytes4 selector = bytes4(slot << (selectorSlotIndex << 5));
                address facet = address(bytes20(l.facets[selector]));

                bool continueLoop;

                for (uint256 facetIndex; facetIndex < numFacets; facetIndex++) {
                    if (facet == addresses[facetIndex]) {
                        continueLoop = true;
                        break;
                    }
                }

                if (continueLoop) {
                    continue;
                }

                addresses[numFacets] = facet;
                numFacets++;
            }
        }

        // set the number of facet addresses in the array
        assembly {
            mstore(addresses, numFacets)
        }
    }

    /**
     * @inheritdoc IDiamondLoupe
     */
    function facetAddress(bytes4 selector)
        external
        view
        returns (address facet)
    {
        facet = address(bytes20(DiamondBaseStorage.layout().facets[selector]));
    }
}


// File @solidstate/contracts/proxy/diamond/[email protected]
/**
 * @notice SolidState "Diamond" proxy reference implementation
 */
abstract contract Diamond is
    DiamondBase,
    DiamondCuttable,
    DiamondLoupe,
    SafeOwnable,
    ERC165
{
    using DiamondBaseStorage for DiamondBaseStorage.Layout;
    using ERC165Storage for ERC165Storage.Layout;
    using OwnableStorage for OwnableStorage.Layout;

    constructor() {
        ERC165Storage.Layout storage erc165 = ERC165Storage.layout();
        bytes4[] memory selectors = new bytes4[](12);

        // register DiamondCuttable

        selectors[0] = IDiamondCuttable.diamondCut.selector;

        erc165.setSupportedInterface(type(IDiamondCuttable).interfaceId, true);

        // register DiamondLoupe

        selectors[1] = IDiamondLoupe.facets.selector;
        selectors[2] = IDiamondLoupe.facetFunctionSelectors.selector;
        selectors[3] = IDiamondLoupe.facetAddresses.selector;
        selectors[4] = IDiamondLoupe.facetAddress.selector;

        erc165.setSupportedInterface(type(IDiamondLoupe).interfaceId, true);

        // register ERC165

        selectors[5] = IERC165.supportsInterface.selector;

        erc165.setSupportedInterface(type(IERC165).interfaceId, true);

        // register SafeOwnable

        selectors[6] = Ownable.owner.selector;
        selectors[7] = SafeOwnable.nomineeOwner.selector;
        selectors[8] = SafeOwnable.transferOwnership.selector;
        selectors[9] = SafeOwnable.acceptOwnership.selector;

        erc165.setSupportedInterface(type(IERC173).interfaceId, true);

        // register Diamond

        selectors[10] = Diamond.getFallbackAddress.selector;
        selectors[11] = Diamond.setFallbackAddress.selector;

        // diamond cut

        FacetCut[] memory facetCuts = new FacetCut[](1);

        facetCuts[0] = FacetCut({
            target: address(this),
            action: IDiamondCuttable.FacetCutAction.ADD,
            selectors: selectors
        });

        DiamondBaseStorage.layout().diamondCut(facetCuts, address(0), '');

        // set owner

        OwnableStorage.layout().setOwner(msg.sender);
    }

    receive() external payable {}

    /**
     * @notice get the address of the fallback contract
     * @return fallback address
     */
    function getFallbackAddress() external view returns (address) {
        return DiamondBaseStorage.layout().fallbackAddress;
    }

    /**
     * @notice set the address of the fallback contract
     * @param fallbackAddress fallback address
     */
    function setFallbackAddress(address fallbackAddress) external onlyOwner {
        DiamondBaseStorage.layout().fallbackAddress = fallbackAddress;
    }
}


contract XANACentralLockDiamond is Diamond {}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondCuttable.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondCuttable.FacetCut[]","name":"facetCuts","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"DiamondCut","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondCuttable.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct IDiamondCuttable.FacetCut[]","name":"facetCuts","type":"tuple[]"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"facetAddress","outputs":[{"internalType":"address","name":"facet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facetAddresses","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"facetFunctionSelectors","outputs":[{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"facets","outputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct IDiamondLoupe.Facet[]","name":"diamondFacets","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFallbackAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nomineeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fallbackAddress","type":"address"}],"name":"setFallbackAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506000620000296200048160201b62000d831760201c565b60408051600c8082526101a08201909252919250600091906020820161018080368337019050509050631f931c1c60e01b816000815181106200007057620000706200103a565b6001600160e01b0319909216602092830291909101820152620000aa9083906307e4c70760e21b9060019062000da7620004a5821b17901c565b637a0ed62760e01b81600181518110620000c857620000c86200103a565b6001600160e01b03199092166020928302919091019091015280516356fe50af60e11b90829060029081106200010257620001026200103a565b6001600160e01b03199092166020928302919091019091015280516314bbdacb60e21b90829060039081106200013c576200013c6200103a565b6001600160e01b03199092166020928302919091019091015280516366ffd66360e11b90829060049081106200017657620001766200103a565b6001600160e01b0319909216602092830291909101820152620001b09083906348e2b09360e01b9060019062000da7620004a5821b17901c565b6301ffc9a760e01b81600581518110620001ce57620001ce6200103a565b6001600160e01b0319909216602092830291909101820152620002089083906301ffc9a760e01b9060019062000da7620004a5821b17901c565b638da5cb5b60e01b816006815181106200022657620002266200103a565b6001600160e01b031990921660209283029190910190910152805163455a8a8560e11b90829060079081106200026057620002606200103a565b6001600160e01b031990921660209283029190910190910152805163f2fde38b60e01b90829060089081106200029a576200029a6200103a565b6001600160e01b03199092166020928302919091019091015280516379ba509760e01b9082906009908110620002d457620002d46200103a565b6001600160e01b03199092166020928302919091018201526200030e9083906307f5828d60e41b9060019062000da7620004a5821b17901c565b632c40805960e01b81600a815181106200032c576200032c6200103a565b6001600160e01b0319909216602092830291909101909101528051639142376560e01b908290600b9081106200036657620003666200103a565b6001600160e01b03199290921660209283029190910190910152604080516001808252818301909252600091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816200039757905050604080516060810190915230815290915060208101600081526020018381525081600081518110620003fd57620003fd6200103a565b60200260200101819052506200044a81600060405180602001604052806000815250620004346200053360201b62000e2f1760201c565b6200055760201b62000e5317909392919060201c565b6200047833620004646200078360201b6200102f1760201c565b620007a760201b620010531790919060201c565b505050620011df565b7f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e70590565b6001600160e01b03198083169003620005055760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e746572666163652069640000000060448201526064015b60405180910390fd5b6001600160e01b03199190911660009081526020929092526040909120805460ff1916911515919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9390565b600184015461ffff811690819060009060071615620005885750600381901c60009081526002870160205260409020545b60005b8651811015620006f1576000878281518110620005ac57620005ac6200103a565b60200260200101519050600081602001519050600082604001515111620006225760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b6064820152608401620004fc565b600081600281111562000639576200063962001050565b0362000668576200065d8585848d620007c460201b6200107017909392919060201c565b9095509350620006e6565b60018160028111156200067f576200067f62001050565b03620006a5576200069f828b6200099660201b620012231790919060201c565b620006e6565b6002816002811115620006bc57620006bc62001050565b03620006e657620006e08585848d62000bd760201b6200141b17909392919060201c565b90955093505b50506001016200058b565b508282146200070e5760018701805461ffff191661ffff84161790555b60078216156200073157600382901c600090815260028801602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738686866040516200076693929190620010ba565b60405180910390a16200077a858562000ea5565b50505050505050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b81546001600160a01b0319166001600160a01b0391909116179055565b805160009081906001600160a01b03163014806200080057506200080083600001516001600160a01b03166200103460201b620003a41760201c565b6200085a5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b6064820152608401620004fc565b60005b83604001515181101562000989576000846040015182815181106200088657620008866200103a565b6020908102919091018101516001600160e01b031981166000908152918a9052604090912054909150606081901c156200090f5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b6064820152608401620004fc565b85516001600160e01b0319838116600081815260208d90526040902060609390931b6001600160601b0319168b1790925560058a901b60e090811692831c91831c199990991617978190036200097957600389901c600090815260028b0160205260408120989098555b505050600195860195016200085d565b5093959294509192505050565b620009b981600001516001600160a01b03166200103460201b620003a41760201c565b62000a175760405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c4143452074617267657420686173206044820152666e6f20636f646560c81b6064820152608401620004fc565b60005b81604001515181101562000bd25760008260400151828151811062000a435762000a436200103a565b6020908102919091018101516001600160e01b03198116600090815291869052604090912054909150606081901c8062000ac05760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401620004fc565b306001600160a01b0382160362000b145760405162461bcd60e51b815260206004820152602260248201526000805160206200310e8339815191526044820152616c6560f01b6064820152608401620004fc565b84600001516001600160a01b0316816001600160a01b03160362000b8c5760405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201526719195b9d1a58d85b60c21b6064820152608401620004fc565b5083516001600160e01b031992909216600090815260208690526040902060609290921b6001600160601b0319166001600160601b039190911617905560010162000a1a565b505050565b805160009081906001600160a01b03161562000c4e5760405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201526e6265207a65726f206164647265737360881b6064820152608401620004fc565b600385901c6007861660005b85604001515181101562000e915760008660400151828151811062000c835762000c836200103a565b6020908102919091018101516001600160e01b031981166000908152918c9052604090912054909150606081901c62000cff5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401620004fc565b30606082901c0362000d4e5760405162461bcd60e51b815260206004820152602260248201526000805160206200310e8339815191526044820152616c6560f01b6064820152608401620004fc565b600089900362000d7c57600019909401600081815260028c0160205260409020549850936007935062000d84565b600019909301925b600584901b89901b6000806001600160e01b03198084169086161462000dd7576001600160e01b03198316600090815260208f90526040902080546001600160601b0319166001600160601b0386161790555b50506001600160e01b03198316600090815260208d90526040812055611fff600383901c1660e0600584901b1687821462000e3c57600082815260028f016020526040902080546001600160e01b031980841c19909116908516831c17905562000e60565b80836001600160e01b031916901c816001600160e01b031960001b901c198d16179b505b8660000362000e7f57600088815260028f01602052604081208190559b505b50506001909301925062000c5a915050565b5060039190911b1796939550929350505050565b8051156001600160a01b038316151462000f195760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201526d696f6e20706172616d657465727360901b6064820152608401620004fc565b6001600160a01b0382161562001030576001600160a01b038216301462000fbe5762000f59826001600160a01b03166200103460201b620003a41760201c565b62000fbe5760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201526d657420686173206e6f20636f646560901b6064820152608401620004fc565b6000826001600160a01b03168260405162000fda9190620011c1565b600060405180830381855af49150503d806000811462001017576040519150601f19603f3d011682016040523d82523d6000602084013e6200101c565b606091505b505090508062000bd2573d6000803e3d6000fd5b5050565b3b151590565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60005b838110156200108357818101518382015260200162001069565b50506000910152565b60008151808452620010a681602086016020860162001066565b601f01601f19169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b848110156200118f57898403607f19018652815180516001600160a01b031685528381015189860190600381106200112b57634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015620011795783516001600160e01b03191682529286019260019290920191908601906200114d565b50978501979550505090820190600101620010e3565b50506001600160a01b038a16908801528681036040880152620011b381896200108c565b9a9950505050505050505050565b60008251620011d581846020870162001066565b9190910192915050565b611f1f80620011ef6000396000f3fe6080604052600436106100ab5760003560e01c80638ab5150a116100645780638ab5150a1461022a5780638da5cb5b1461023f5780639142376514610254578063adfca15e14610274578063cdffacc6146102a1578063f2fde38b146102c1576100b2565b806301ffc9a71461014f5780631f931c1c146101845780632c408059146101a457806352ef6b2c146101d157806379ba5097146101f35780637a0ed62714610208576100b2565b366100b257005b60006100bc6102e1565b90506001600160a01b0381163b6101295760405162461bcd60e51b815260206004820152602660248201527f50726f78793a20696d706c656d656e746174696f6e206d75737420626520636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610148573d6000f35b3d6000fd5b005b34801561015b57600080fd5b5061016f61016a366004611840565b6103aa565b60405190151581526020015b60405180910390f35b34801561019057600080fd5b5061014d61019f3660046118bb565b6103df565b3480156101b057600080fd5b506101b961046c565b6040516001600160a01b03909116815260200161017b565b3480156101dd57600080fd5b506101e6610488565b60405161017b919061196d565b3480156101ff57600080fd5b5061014d61062b565b34801561021457600080fd5b5061021d610712565b60405161017b91906119ff565b34801561023657600080fd5b506101b9610b3a565b34801561024b57600080fd5b506101b9610b5b565b34801561026057600080fd5b5061014d61026f366004611a7c565b610b65565b34801561028057600080fd5b5061029461028f366004611a7c565b610bc2565b60405161017b9190611a97565b3480156102ad57600080fd5b506101b96102bc366004611840565b610d0e565b3480156102cd57600080fd5b5061014d6102dc366004611a7c565b610d3b565b600080356001600160e01b03191681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9360208190526040822054819060601c8061039d575060038201546001600160a01b03168061039d5760405162461bcd60e51b815260206004820152603260248201527f4469616d6f6e64426173653a206e6f20666163657420666f756e6420666f722060448201527166756e6374696f6e207369676e617475726560701b6064820152608401610120565b9392505050565b3b151590565b60006103d9826103b8610d83565b906001600160e01b0319166000908152602091909152604090205460ff1690565b92915050565b6103e761102f565b546001600160a01b0316331461040f5760405162461bcd60e51b815260040161012090611ad9565b61046561041c8587611ba4565b8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061045d9250610e2f915050565b929190610e53565b5050505050565b6000610476610e2f565b600301546001600160a01b0316919050565b60606000610494610e2f565b600181015490915061ffff1667ffffffffffffffff8111156104b8576104b8611b10565b6040519080825280602002602001820160405280156104e1578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610623576000818152600285016020526040812054905b600881101561060e578361052081611cee565b600188015490955061ffff168511905061060e57600581901b82901b6001600160e01b0319811660009081526020889052604081205460601c90805b888110156105b1578a818151811061057657610576611d07565b60200260200101516001600160a01b0316836001600160a01b03160361059f57600191506105b1565b806105a981611cee565b91505061055c565b5080156105c0575050506105fc565b818a89815181106105d3576105d3611d07565b6001600160a01b0390921660209283029190910190910152876105f581611cee565b9850505050505b8061060681611cee565b91505061050d565b5050808061061b90611cee565b9150506104ea565b505082525090565b600080516020611eca833981519152546001600160a01b031633146106a45760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d696044820152683732b29037bbb732b960b91b6064820152608401610120565b60006106ae61102f565b805460405191925033916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36106f48133611053565b61070f6000600080516020611eca8339815191525b90611053565b50565b6060600061071e610e2f565b600181015490915061ffff1667ffffffffffffffff81111561074257610742611b10565b60405190808252806020026020018201604052801561078857816020015b6040805180820190915260008152606060208201528152602001906001900390816107605790505b50600182015490925060009061ffff1667ffffffffffffffff8111156107b0576107b0611b10565b6040519080825280602002602001820160405280156107d9578160200160208202803683370190505b50905060008060005b600185015461ffff16821015610ac8576000818152600286016020526040812054905b6008811015610ab3578361081881611cee565b600189015490955061ffff1685119050610ab357600581901b82901b6001600160e01b0319811660009081526020899052604081205460601c90805b8881101561097157826001600160a01b03168c828151811061087857610878611d07565b6020026020010151600001516001600160a01b03160361095f57838c82815181106108a5576108a5611d07565b6020026020010151602001518b83815181106108c3576108c3611d07565b602002602001015160ff16815181106108de576108de611d07565b60200260200101906001600160e01b03191690816001600160e01b0319168152505060ff8a828151811061091457610914611d07565b602002602001015160ff161061092957600080fd5b89818151811061093b5761093b611d07565b60200260200101805180919061095090611d1d565b60ff1690525060019150610971565b8061096981611cee565b915050610854565b50801561098057505050610aa1565b818b898151811061099357610993611d07565b60209081029190910101516001600160a01b03909116905260018a015461ffff1667ffffffffffffffff8111156109cc576109cc611b10565b6040519080825280602002602001820160405280156109f5578160200160208202803683370190505b508b8981518110610a0857610a08611d07565b602002602001015160200181905250828b8981518110610a2a57610a2a611d07565b602002602001015160200151600081518110610a4857610a48611d07565b60200260200101906001600160e01b03191690816001600160e01b031916815250506001898981518110610a7e57610a7e611d07565b60ff9092166020928302919091019091015287610a9a81611cee565b9850505050505b80610aab81611cee565b915050610805565b50508080610ac090611cee565b9150506107e2565b5060005b82811015610b2f576000848281518110610ae857610ae8611d07565b602002602001015160ff1690506000878381518110610b0957610b09611d07565b602002602001015160200151905081815250508080610b2790611cee565b915050610acc565b508185525050505090565b6000600080516020611eca8339815191525b546001600160a01b0316919050565b6000610b4c61102f565b610b6d61102f565b546001600160a01b03163314610b955760405162461bcd60e51b815260040161012090611ad9565b80610b9e610e2f565b60030180546001600160a01b0319166001600160a01b039290921691909117905550565b60606000610bce610e2f565b600181015490915061ffff1667ffffffffffffffff811115610bf257610bf2611b10565b604051908082528060200260200182016040528015610c1b578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610d04576000818152600285016020526040812054905b6008811015610cef5783610c5a81611cee565b600188015490955061ffff1685119050610cef57600581901b82901b6001600160e01b0319811660009081526020889052604090205460601c6001600160a01b038a1603610cdc5780888781518110610cb557610cb5611d07565b6001600160e01b03199092166020928302919091019091015285610cd881611cee565b9650505b5080610ce781611cee565b915050610c47565b50508080610cfc90611cee565b915050610c24565b5050825250919050565b6000610d18610e2f565b6001600160e01b0319909216600090815260209290925250604090205460601c90565b610d4361102f565b546001600160a01b03163314610d6b5760405162461bcd60e51b815260040161012090611ad9565b61070f81600080516020611eca833981519152610709565b7f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e70590565b6001600160e01b03198083169003610e015760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e74657266616365206964000000006044820152606401610120565b6001600160e01b03199190911660009081526020929092526040909120805460ff1916911515919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9390565b600184015461ffff811690819060009060071615610e835750600381901c60009081526002870160205260409020545b60005b8651811015610fa3576000878281518110610ea357610ea3611d07565b60200260200101519050600081602001519050600082604001515111610f175760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b6064820152608401610120565b6000816002811115610f2b57610f2b611d3c565b03610f4657610f3c8a868685611070565b9095509350610f99565b6001816002811115610f5a57610f5a611d3c565b03610f6e57610f698a83611223565b610f99565b6002816002811115610f8257610f82611d3c565b03610f9957610f938a86868561141b565b90955093505b5050600101610e86565b50828214610fbf5760018701805461ffff191661ffff84161790555b6007821615610fe157600382901c600090815260028801602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67386868660405161101493929190611da2565b60405180910390a161102685856116b3565b50505050505050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b81546001600160a01b0319166001600160a01b0391909116179055565b805160009081906001600160a01b0316301480611097575082516001600160a01b03163b15155b6110ef5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b6064820152608401610120565b60005b8360400151518110156112165760008460400151828151811061111757611117611d07565b6020908102919091018101516001600160e01b031981166000908152918a9052604090912054909150606081901c1561119e5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b6064820152608401610120565b85516001600160e01b0319838116600081815260208d90526040902060609390931b6001600160601b0319168b1790925560058a901b60e090811692831c91831c1999909916179781900361120757600389901c600090815260028b0160205260408120989098555b505050600195860195016110f2565b5093959294509192505050565b80516001600160a01b03163b61128b5760405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c4143452074617267657420686173206044820152666e6f20636f646560c81b6064820152608401610120565b60005b816040015151811015611416576000826040015182815181106112b3576112b3611d07565b6020908102919091018101516001600160e01b03198116600090815291869052604090912054909150606081901c8061132e5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610120565b306001600160a01b038216036113565760405162461bcd60e51b815260040161012090611e6b565b84600001516001600160a01b0316816001600160a01b0316036113cc5760405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201526719195b9d1a58d85b60c21b6064820152608401610120565b5083516001600160e01b031992909216600090815260208690526040902060609290921b6001600160601b0319166bffffffffffffffffffffffff9190911617905560010161128e565b505050565b805160009081906001600160a01b0316156114905760405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201526e6265207a65726f206164647265737360881b6064820152608401610120565b600385901c6007861660005b85604001515181101561169f576000866040015182815181106114c1576114c1611d07565b6020908102919091018101516001600160e01b031981166000908152918c9052604090912054909150606081901c61153b5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610120565b30606082901c0361155e5760405162461bcd60e51b815260040161012090611e6b565b600089900361158a57600019909401600081815260028c01602052604090205498509360079350611592565b600019909301925b600584901b89901b6000806001600160e01b0319808416908616146115e9576001600160e01b03198316600090815260208f90526040902080546001600160601b0319166bffffffffffffffffffffffff86161790555b50506001600160e01b03198316600090815260208d90526040812055611fff600383901c1660e0600584901b1687821461164c57600082815260028f016020526040902080546001600160e01b031980841c19909116908516831c179055611670565b80836001600160e01b031916901c816001600160e01b031960001b901c198d16179b505b8660000361168e57600088815260028f01602052604081208190559b505b50506001909301925061149c915050565b5060039190911b1796939550929350505050565b8051156001600160a01b03831615146117255760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201526d696f6e20706172616d657465727360901b6064820152608401610120565b6001600160a01b0382161561181f576001600160a01b03821630146117b2576001600160a01b0382163b6117b25760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201526d657420686173206e6f20636f646560901b6064820152608401610120565b6000826001600160a01b0316826040516117cc9190611ead565b600060405180830381855af49150503d8060008114611807576040519150601f19603f3d011682016040523d82523d6000602084013e61180c565b606091505b5050905080611416573d6000803e3d6000fd5b5050565b80356001600160e01b03198116811461183b57600080fd5b919050565b60006020828403121561185257600080fd5b61039d82611823565b80356001600160a01b038116811461183b57600080fd5b60008083601f84011261188457600080fd5b50813567ffffffffffffffff81111561189c57600080fd5b6020830191508360208285010111156118b457600080fd5b9250929050565b6000806000806000606086880312156118d357600080fd5b853567ffffffffffffffff808211156118eb57600080fd5b818801915088601f8301126118ff57600080fd5b81358181111561190e57600080fd5b8960208260051b850101111561192357600080fd5b602083019750809650506119396020890161185b565b9450604088013591508082111561194f57600080fd5b5061195c88828901611872565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b818110156119ae5783516001600160a01b031683529284019291840191600101611989565b50909695505050505050565b600081518084526020808501945080840160005b838110156119f45781516001600160e01b031916875295820195908201906001016119ce565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611a6e57888303603f19018552815180516001600160a01b03168452870151878401879052611a5b878501826119ba565b9588019593505090860190600101611a26565b509098975050505050505050565b600060208284031215611a8e57600080fd5b61039d8261185b565b6020808252825182820181905260009190848201906040850190845b818110156119ae5783516001600160e01b03191683529284019291840191600101611ab3565b6020808252601d908201527f4f776e61626c653a2073656e646572206d757374206265206f776e6572000000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611b4957611b49611b10565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611b7857611b78611b10565b604052919050565b600067ffffffffffffffff821115611b9a57611b9a611b10565b5060051b60200190565b6000611bb7611bb284611b80565b611b4f565b83815260208082019190600586811b860136811115611bd557600080fd5b865b81811015611ccb57803567ffffffffffffffff80821115611bf85760008081fd5b818a01915060608236031215611c0e5760008081fd5b611c16611b26565b611c1f8361185b565b81528683013560038110611c335760008081fd5b8188015260408381013583811115611c4b5760008081fd5b939093019236601f850112611c6257600092508283fd5b83359250611c72611bb284611b80565b83815292871b84018801928881019036851115611c8f5760008081fd5b948901945b84861015611cb457611ca586611823565b82529489019490890190611c94565b918301919091525088525050948301948301611bd7565b5092979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611d0057611d00611cd8565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103611d3357611d33611cd8565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b60005b83811015611d6d578181015183820152602001611d55565b50506000910152565b60008151808452611d8e816020860160208601611d52565b601f01601f19169290920160200192915050565b6000606080830181845280875180835260808601915060808160051b87010192506020808a016000805b84811015611e3b57898703607f19018652825180516001600160a01b031688528481015160038110611e0c57634e487b7160e01b84526021600452602484fd5b88860152604090810151908801899052611e28898901826119ba565b9750509483019491830191600101611dcc565b5050506001600160a01b0389169087015250508381036040850152611e608186611d76565b979650505050505050565b60208082526022908201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d757461626040820152616c6560f01b606082015260800190565b60008251611ebf818460208701611d52565b919091019291505056fe24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890a2646970667358221220317d3dcbd7997e60203f110d847f3020f52eedc93a9ba23dd1355c0a7b331d9564736f6c634300081100334469616d6f6e64426173653a2073656c6563746f7220697320696d6d75746162

Deployed Bytecode

0x6080604052600436106100ab5760003560e01c80638ab5150a116100645780638ab5150a1461022a5780638da5cb5b1461023f5780639142376514610254578063adfca15e14610274578063cdffacc6146102a1578063f2fde38b146102c1576100b2565b806301ffc9a71461014f5780631f931c1c146101845780632c408059146101a457806352ef6b2c146101d157806379ba5097146101f35780637a0ed62714610208576100b2565b366100b257005b60006100bc6102e1565b90506001600160a01b0381163b6101295760405162461bcd60e51b815260206004820152602660248201527f50726f78793a20696d706c656d656e746174696f6e206d75737420626520636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e808015610148573d6000f35b3d6000fd5b005b34801561015b57600080fd5b5061016f61016a366004611840565b6103aa565b60405190151581526020015b60405180910390f35b34801561019057600080fd5b5061014d61019f3660046118bb565b6103df565b3480156101b057600080fd5b506101b961046c565b6040516001600160a01b03909116815260200161017b565b3480156101dd57600080fd5b506101e6610488565b60405161017b919061196d565b3480156101ff57600080fd5b5061014d61062b565b34801561021457600080fd5b5061021d610712565b60405161017b91906119ff565b34801561023657600080fd5b506101b9610b3a565b34801561024b57600080fd5b506101b9610b5b565b34801561026057600080fd5b5061014d61026f366004611a7c565b610b65565b34801561028057600080fd5b5061029461028f366004611a7c565b610bc2565b60405161017b9190611a97565b3480156102ad57600080fd5b506101b96102bc366004611840565b610d0e565b3480156102cd57600080fd5b5061014d6102dc366004611a7c565b610d3b565b600080356001600160e01b03191681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9360208190526040822054819060601c8061039d575060038201546001600160a01b03168061039d5760405162461bcd60e51b815260206004820152603260248201527f4469616d6f6e64426173653a206e6f20666163657420666f756e6420666f722060448201527166756e6374696f6e207369676e617475726560701b6064820152608401610120565b9392505050565b3b151590565b60006103d9826103b8610d83565b906001600160e01b0319166000908152602091909152604090205460ff1690565b92915050565b6103e761102f565b546001600160a01b0316331461040f5760405162461bcd60e51b815260040161012090611ad9565b61046561041c8587611ba4565b8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061045d9250610e2f915050565b929190610e53565b5050505050565b6000610476610e2f565b600301546001600160a01b0316919050565b60606000610494610e2f565b600181015490915061ffff1667ffffffffffffffff8111156104b8576104b8611b10565b6040519080825280602002602001820160405280156104e1578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610623576000818152600285016020526040812054905b600881101561060e578361052081611cee565b600188015490955061ffff168511905061060e57600581901b82901b6001600160e01b0319811660009081526020889052604081205460601c90805b888110156105b1578a818151811061057657610576611d07565b60200260200101516001600160a01b0316836001600160a01b03160361059f57600191506105b1565b806105a981611cee565b91505061055c565b5080156105c0575050506105fc565b818a89815181106105d3576105d3611d07565b6001600160a01b0390921660209283029190910190910152876105f581611cee565b9850505050505b8061060681611cee565b91505061050d565b5050808061061b90611cee565b9150506104ea565b505082525090565b600080516020611eca833981519152546001600160a01b031633146106a45760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d696044820152683732b29037bbb732b960b91b6064820152608401610120565b60006106ae61102f565b805460405191925033916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36106f48133611053565b61070f6000600080516020611eca8339815191525b90611053565b50565b6060600061071e610e2f565b600181015490915061ffff1667ffffffffffffffff81111561074257610742611b10565b60405190808252806020026020018201604052801561078857816020015b6040805180820190915260008152606060208201528152602001906001900390816107605790505b50600182015490925060009061ffff1667ffffffffffffffff8111156107b0576107b0611b10565b6040519080825280602002602001820160405280156107d9578160200160208202803683370190505b50905060008060005b600185015461ffff16821015610ac8576000818152600286016020526040812054905b6008811015610ab3578361081881611cee565b600189015490955061ffff1685119050610ab357600581901b82901b6001600160e01b0319811660009081526020899052604081205460601c90805b8881101561097157826001600160a01b03168c828151811061087857610878611d07565b6020026020010151600001516001600160a01b03160361095f57838c82815181106108a5576108a5611d07565b6020026020010151602001518b83815181106108c3576108c3611d07565b602002602001015160ff16815181106108de576108de611d07565b60200260200101906001600160e01b03191690816001600160e01b0319168152505060ff8a828151811061091457610914611d07565b602002602001015160ff161061092957600080fd5b89818151811061093b5761093b611d07565b60200260200101805180919061095090611d1d565b60ff1690525060019150610971565b8061096981611cee565b915050610854565b50801561098057505050610aa1565b818b898151811061099357610993611d07565b60209081029190910101516001600160a01b03909116905260018a015461ffff1667ffffffffffffffff8111156109cc576109cc611b10565b6040519080825280602002602001820160405280156109f5578160200160208202803683370190505b508b8981518110610a0857610a08611d07565b602002602001015160200181905250828b8981518110610a2a57610a2a611d07565b602002602001015160200151600081518110610a4857610a48611d07565b60200260200101906001600160e01b03191690816001600160e01b031916815250506001898981518110610a7e57610a7e611d07565b60ff9092166020928302919091019091015287610a9a81611cee565b9850505050505b80610aab81611cee565b915050610805565b50508080610ac090611cee565b9150506107e2565b5060005b82811015610b2f576000848281518110610ae857610ae8611d07565b602002602001015160ff1690506000878381518110610b0957610b09611d07565b602002602001015160200151905081815250508080610b2790611cee565b915050610acc565b508185525050505090565b6000600080516020611eca8339815191525b546001600160a01b0316919050565b6000610b4c61102f565b610b6d61102f565b546001600160a01b03163314610b955760405162461bcd60e51b815260040161012090611ad9565b80610b9e610e2f565b60030180546001600160a01b0319166001600160a01b039290921691909117905550565b60606000610bce610e2f565b600181015490915061ffff1667ffffffffffffffff811115610bf257610bf2611b10565b604051908082528060200260200182016040528015610c1b578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610d04576000818152600285016020526040812054905b6008811015610cef5783610c5a81611cee565b600188015490955061ffff1685119050610cef57600581901b82901b6001600160e01b0319811660009081526020889052604090205460601c6001600160a01b038a1603610cdc5780888781518110610cb557610cb5611d07565b6001600160e01b03199092166020928302919091019091015285610cd881611cee565b9650505b5080610ce781611cee565b915050610c47565b50508080610cfc90611cee565b915050610c24565b5050825250919050565b6000610d18610e2f565b6001600160e01b0319909216600090815260209290925250604090205460601c90565b610d4361102f565b546001600160a01b03163314610d6b5760405162461bcd60e51b815260040161012090611ad9565b61070f81600080516020611eca833981519152610709565b7f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e70590565b6001600160e01b03198083169003610e015760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e74657266616365206964000000006044820152606401610120565b6001600160e01b03199190911660009081526020929092526040909120805460ff1916911515919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9390565b600184015461ffff811690819060009060071615610e835750600381901c60009081526002870160205260409020545b60005b8651811015610fa3576000878281518110610ea357610ea3611d07565b60200260200101519050600081602001519050600082604001515111610f175760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b6064820152608401610120565b6000816002811115610f2b57610f2b611d3c565b03610f4657610f3c8a868685611070565b9095509350610f99565b6001816002811115610f5a57610f5a611d3c565b03610f6e57610f698a83611223565b610f99565b6002816002811115610f8257610f82611d3c565b03610f9957610f938a86868561141b565b90955093505b5050600101610e86565b50828214610fbf5760018701805461ffff191661ffff84161790555b6007821615610fe157600382901c600090815260028801602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67386868660405161101493929190611da2565b60405180910390a161102685856116b3565b50505050505050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b81546001600160a01b0319166001600160a01b0391909116179055565b805160009081906001600160a01b0316301480611097575082516001600160a01b03163b15155b6110ef5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b6064820152608401610120565b60005b8360400151518110156112165760008460400151828151811061111757611117611d07565b6020908102919091018101516001600160e01b031981166000908152918a9052604090912054909150606081901c1561119e5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b6064820152608401610120565b85516001600160e01b0319838116600081815260208d90526040902060609390931b6001600160601b0319168b1790925560058a901b60e090811692831c91831c1999909916179781900361120757600389901c600090815260028b0160205260408120989098555b505050600195860195016110f2565b5093959294509192505050565b80516001600160a01b03163b61128b5760405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c4143452074617267657420686173206044820152666e6f20636f646560c81b6064820152608401610120565b60005b816040015151811015611416576000826040015182815181106112b3576112b3611d07565b6020908102919091018101516001600160e01b03198116600090815291869052604090912054909150606081901c8061132e5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610120565b306001600160a01b038216036113565760405162461bcd60e51b815260040161012090611e6b565b84600001516001600160a01b0316816001600160a01b0316036113cc5760405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201526719195b9d1a58d85b60c21b6064820152608401610120565b5083516001600160e01b031992909216600090815260208690526040902060609290921b6001600160601b0319166bffffffffffffffffffffffff9190911617905560010161128e565b505050565b805160009081906001600160a01b0316156114905760405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201526e6265207a65726f206164647265737360881b6064820152608401610120565b600385901c6007861660005b85604001515181101561169f576000866040015182815181106114c1576114c1611d07565b6020908102919091018101516001600160e01b031981166000908152918c9052604090912054909150606081901c61153b5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610120565b30606082901c0361155e5760405162461bcd60e51b815260040161012090611e6b565b600089900361158a57600019909401600081815260028c01602052604090205498509360079350611592565b600019909301925b600584901b89901b6000806001600160e01b0319808416908616146115e9576001600160e01b03198316600090815260208f90526040902080546001600160601b0319166bffffffffffffffffffffffff86161790555b50506001600160e01b03198316600090815260208d90526040812055611fff600383901c1660e0600584901b1687821461164c57600082815260028f016020526040902080546001600160e01b031980841c19909116908516831c179055611670565b80836001600160e01b031916901c816001600160e01b031960001b901c198d16179b505b8660000361168e57600088815260028f01602052604081208190559b505b50506001909301925061149c915050565b5060039190911b1796939550929350505050565b8051156001600160a01b03831615146117255760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201526d696f6e20706172616d657465727360901b6064820152608401610120565b6001600160a01b0382161561181f576001600160a01b03821630146117b2576001600160a01b0382163b6117b25760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201526d657420686173206e6f20636f646560901b6064820152608401610120565b6000826001600160a01b0316826040516117cc9190611ead565b600060405180830381855af49150503d8060008114611807576040519150601f19603f3d011682016040523d82523d6000602084013e61180c565b606091505b5050905080611416573d6000803e3d6000fd5b5050565b80356001600160e01b03198116811461183b57600080fd5b919050565b60006020828403121561185257600080fd5b61039d82611823565b80356001600160a01b038116811461183b57600080fd5b60008083601f84011261188457600080fd5b50813567ffffffffffffffff81111561189c57600080fd5b6020830191508360208285010111156118b457600080fd5b9250929050565b6000806000806000606086880312156118d357600080fd5b853567ffffffffffffffff808211156118eb57600080fd5b818801915088601f8301126118ff57600080fd5b81358181111561190e57600080fd5b8960208260051b850101111561192357600080fd5b602083019750809650506119396020890161185b565b9450604088013591508082111561194f57600080fd5b5061195c88828901611872565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b818110156119ae5783516001600160a01b031683529284019291840191600101611989565b50909695505050505050565b600081518084526020808501945080840160005b838110156119f45781516001600160e01b031916875295820195908201906001016119ce565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611a6e57888303603f19018552815180516001600160a01b03168452870151878401879052611a5b878501826119ba565b9588019593505090860190600101611a26565b509098975050505050505050565b600060208284031215611a8e57600080fd5b61039d8261185b565b6020808252825182820181905260009190848201906040850190845b818110156119ae5783516001600160e01b03191683529284019291840191600101611ab3565b6020808252601d908201527f4f776e61626c653a2073656e646572206d757374206265206f776e6572000000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611b4957611b49611b10565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611b7857611b78611b10565b604052919050565b600067ffffffffffffffff821115611b9a57611b9a611b10565b5060051b60200190565b6000611bb7611bb284611b80565b611b4f565b83815260208082019190600586811b860136811115611bd557600080fd5b865b81811015611ccb57803567ffffffffffffffff80821115611bf85760008081fd5b818a01915060608236031215611c0e5760008081fd5b611c16611b26565b611c1f8361185b565b81528683013560038110611c335760008081fd5b8188015260408381013583811115611c4b5760008081fd5b939093019236601f850112611c6257600092508283fd5b83359250611c72611bb284611b80565b83815292871b84018801928881019036851115611c8f5760008081fd5b948901945b84861015611cb457611ca586611823565b82529489019490890190611c94565b918301919091525088525050948301948301611bd7565b5092979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611d0057611d00611cd8565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103611d3357611d33611cd8565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b60005b83811015611d6d578181015183820152602001611d55565b50506000910152565b60008151808452611d8e816020860160208601611d52565b601f01601f19169290920160200192915050565b6000606080830181845280875180835260808601915060808160051b87010192506020808a016000805b84811015611e3b57898703607f19018652825180516001600160a01b031688528481015160038110611e0c57634e487b7160e01b84526021600452602484fd5b88860152604090810151908801899052611e28898901826119ba565b9750509483019491830191600101611dcc565b5050506001600160a01b0389169087015250508381036040850152611e608186611d76565b979650505050505050565b60208082526022908201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d757461626040820152616c6560f01b606082015260800190565b60008251611ebf818460208701611d52565b919091019291505056fe24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890a2646970667358221220317d3dcbd7997e60203f110d847f3020f52eedc93a9ba23dd1355c0a7b331d9564736f6c63430008110033

Deployed Bytecode Sourcemap

36162:45:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24648:22;24673:20;:18;:20::i;:::-;24648:45;-1:-1:-1;;;;;;24728:25:0;;9259:20;24706:115;;;;-1:-1:-1;;;24706:115:0;;216:2:1;24706:115:0;;;198:21:1;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:1;;;338:36;391:19;;24706:115:0;;;;;;;;;24877:14;24874:1;24871;24858:34;25081:1;25061;25028:14;25008:1;24975:14;24951:5;24920:177;25132:16;25129:1;25126;25111:38;25172:6;25192:68;;;;25311:16;25308:1;25301:27;25192:68;25228:16;25225:1;25218:27;25165:178;;5988:156;;;;;;;;;;-1:-1:-1;5988:156:0;;;;;:::i;:::-;;:::i;:::-;;;953:14:1;;946:22;928:41;;916:2;901:18;5988:156:0;;;;;;;;27048:223;;;;;;;;;;-1:-1:-1;27048:223:0;;;;;:::i;:::-;;:::i;35739:131::-;;;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;2797:32:1;;;2779:51;;2767:2;2752:18;35739:131:0;2633:203:1;31571:1524:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4026:291::-;;;;;;;;;;;;;:::i;27598:2619::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3482:128::-;;;;;;;;;;;;;:::i;1807:110::-;;;;;;;;;;;;;:::i;36001:152::-;;;;;;;;;;-1:-1:-1;36001:152:0;;;;;:::i;:::-;;:::i;30277:1234::-;;;;;;;;;;-1:-1:-1;30277:1234:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33155:198::-;;;;;;;;;;-1:-1:-1;33155:198:0;;;;;:::i;:::-;;:::i;3756:190::-;;;;;;;;;;-1:-1:-1;3756:190:0;;;;;:::i;:::-;;:::i;25821:668::-;25883:7;26175;;-1:-1:-1;;;;;;26175:7:0;26166:17;;12401:53;26166:17;;;;;;;;12401:53;;26150:35;;;26198:250;;-1:-1:-1;26264:17:0;;;;-1:-1:-1;;;;;26264:17:0;;26296:140;;;;-1:-1:-1;;;26296:140:0;;6089:2:1;26296:140:0;;;6071:21:1;6128:2;6108:18;;;6101:30;6167:34;6147:18;;;6140:62;-1:-1:-1;;;6218:18:1;;;6211:48;6276:19;;26296:140:0;5887:414:1;26296:140:0;26467:14;25821:668;-1:-1:-1;;;25821:668:0:o;9127:196::-;9259:20;9307:8;;;9127:196::o;5988:156::-;6056:4;6080:56;6124:11;6080:22;:20;:22::i;:::-;:43;-1:-1:-1;;;;;;4936:34:0;4907:4;4936:34;;;;;;;;;;;;;;;4789:189;6080:56;6073:63;5988:156;-1:-1:-1;;5988:156:0:o;27048:223::-;1410:23;:21;:23::i;:::-;:29;-1:-1:-1;;;;;1410:29:0;1396:10;:43;1374:122;;;;-1:-1:-1;;;1374:122:0;;;;;;;:::i;:::-;27200:63:::1;;27239:9:::0;;27200:63:::1;:::i;:::-;27250:6;27258:4;;27200:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27200:27:0::1;::::0;-1:-1:-1;27200:25:0::1;::::0;-1:-1:-1;;27200:27:0:i:1;:::-;:38:::0;:63;;:38:::1;:63::i;:::-;27048:223:::0;;;;;:::o;35739:131::-;35792:7;35819:27;:25;:27::i;:::-;:43;;;-1:-1:-1;;;;;35819:43:0;;35739:131;-1:-1:-1;35739:131:0:o;31571:1524::-;31647:26;31691:35;31729:27;:25;:27::i;:::-;31795:15;;;;31691:65;;-1:-1:-1;31795:15:0;;31781:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31781:30:0;;31769:42;;31822:17;31850:21;31889:17;31884:1070;31924:15;;;;;;31908:31;;31884:1070;;;31969:12;31984:26;;;:15;;;:26;;;;;;;32027:916;32114:1;32094:17;:21;32027:916;;;32188:15;;;;:::i;:::-;32244;;;;32188;;-1:-1:-1;32244:15:0;;32228:31;;;-1:-1:-1;32284:5:0;32224:85;32384:1;32363:22;;;32354:32;;;-1:-1:-1;;;;;;32438:18:0;;32329:15;32438:18;;;;;;;;;;;32422:36;;;32329:15;32517:243;32555:9;32542:10;:22;32517:243;;;32616:9;32626:10;32616:21;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;32607:30:0;:5;-1:-1:-1;;;;;32607:30:0;;32603:138;;32681:4;32666:19;;32712:5;;32603:138;32566:12;;;;:::i;:::-;;;;32517:243;;;;32784:12;32780:69;;;32821:8;;;;;32780:69;32892:5;32869:9;32879;32869:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32869:28:0;;;:20;;;;;;;;;;;:28;32916:11;;;;:::i;:::-;;;;32169:774;;;32027:916;32134:19;;;;:::i;:::-;;;;32027:916;;;;31954:1000;31941:11;;;;;:::i;:::-;;;;31884:1070;;;-1:-1:-1;;33049:28:0;;-1:-1:-1;33056:9:0;31571:1524::o;4026:291::-;-1:-1:-1;;;;;;;;;;;2998:40:0;-1:-1:-1;;;;;2998:40:0;2984:10;:54;2962:145;;;;-1:-1:-1;;;2962:145:0;;10649:2:1;2962:145:0;;;10631:21:1;10688:2;10668:18;;;10661:30;10727:34;10707:18;;;10700:62;-1:-1:-1;;;10778:18:1;;;10771:39;10827:19;;2962:145:0;10447:405:1;2962:145:0;4096:31:::1;4130:23;:21;:23::i;:::-;4190:7:::0;;4169:41:::1;::::0;4190:7;;-1:-1:-1;4199:10:0::1;::::0;-1:-1:-1;;;;;4190:7:0;;::::1;::::0;4169:41:::1;::::0;4190:7:::1;::::0;4169:41:::1;4221:22;:1:::0;4232:10:::1;4221;:22::i;:::-;4254:55;4306:1;-1:-1:-1::0;;;;;;;;;;;4254:27:0::1;:43:::0;::::1;:55::i;:::-;4085:232;4026:291::o:0;27598:2619::-;27639:28;27680:35;27718:27;:25;:27::i;:::-;27786:15;;;;27680:65;;-1:-1:-1;27786:15:0;;27774:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;27774:28:0;;;;;;;;;;;;;;;-1:-1:-1;27862:15:0;;;;27758:44;;-1:-1:-1;27815:32:0;;27862:15;;27850:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27850:28:0;;27815:63;;27889:17;27917:21;28000:17;27995:1725;28035:15;;;;;;28019:31;;27995:1725;;;28080:12;28095:26;;;:15;;;:26;;;;;;;28138:1571;28225:1;28205:17;:21;28138:1571;;;28299:15;;;;:::i;:::-;28355;;;;28299;;-1:-1:-1;28355:15:0;;28339:31;;;-1:-1:-1;28395:5:0;28335:85;28495:1;28474:22;;;28465:32;;;-1:-1:-1;;;;;;28549:18:0;;28440:15;28549:18;;;;;;;;;;;28533:36;;;28440:15;28628:644;28666:9;28653:10;:22;28628:644;;;28754:5;-1:-1:-1;;;;;28718:41:0;:13;28732:10;28718:25;;;;;;;;:::i;:::-;;;;;;;:32;;;-1:-1:-1;;;;;28718:41:0;;28714:539;;28913:8;28788:13;28802:10;28788:25;;;;;;;;:::i;:::-;;;;;;;:35;;;28854:17;28872:10;28854:29;;;;;;;;:::i;:::-;;;;;;;28788:122;;;;;;;;;;:::i;:::-;;;;;;:133;-1:-1:-1;;;;;28788:133:0;;;;-1:-1:-1;;;;;28788:133:0;;;;;;29089:3;29057:17;29075:10;29057:29;;;;;;;;:::i;:::-;;;;;;;:35;;;29049:44;;;;;;29120:17;29138:10;29120:29;;;;;;;;:::i;:::-;;;;;;:31;;;;;;;;:::i;:::-;;;;;-1:-1:-1;29193:4:0;;-1:-1:-1;29224:5:0;;28714:539;28677:12;;;;:::i;:::-;;;;28628:644;;;;29296:12;29292:69;;;29333:8;;;;;29292:69;29415:5;29381:13;29395:9;29381:24;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;29381:39:0;;;;;29511:15;;;;;;29476:69;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29476:69:0;;29439:13;29453:9;29439:24;;;;;;;;:::i;:::-;;;;;;;:34;;:106;;;;29604:8;29564:13;29578:9;29564:24;;;;;;;;:::i;:::-;;;;;;;:34;;;29599:1;29564:37;;;;;;;;:::i;:::-;;;;;;:48;-1:-1:-1;;;;;29564:48:0;;;;-1:-1:-1;;;;;29564:48:0;;;;;;29662:1;29631:17;29649:9;29631:28;;;;;;;;:::i;:::-;:32;;;;:28;;;;;;;;;;;:32;29682:11;;;;:::i;:::-;;;;28280:1429;;;28138:1571;28245:19;;;;:::i;:::-;;;;28138:1571;;;;28065:1655;28052:11;;;;;:::i;:::-;;;;27995:1725;;;;29737:18;29732:358;29770:9;29757:10;:22;29732:358;;;29810:20;29833:17;29851:10;29833:29;;;;;;;;:::i;:::-;;;;;;;29810:52;;;;29877:25;29905:13;29919:10;29905:25;;;;;;;;:::i;:::-;;;;;;;:35;;;29877:63;;30051:12;30040:9;30033:31;30014:65;;29781:12;;;;;:::i;:::-;;;;29732:358;;;;30189:9;30174:13;30167:32;30152:58;;;;27598:2619;:::o;3482:128::-;3535:7;-1:-1:-1;;;;;;;;;;;3562:27:0;:40;-1:-1:-1;;;;;3562:40:0;;3482:128;-1:-1:-1;3482:128:0:o;1807:110::-;1853:7;1880:23;:21;:23::i;36001:152::-;1410:23;:21;:23::i;:::-;:29;-1:-1:-1;;;;;1410:29:0;1396:10;:43;1374:122;;;;-1:-1:-1;;;1374:122:0;;;;;;;:::i;:::-;36130:15:::1;36084:27;:25;:27::i;:::-;:43;;:61:::0;;-1:-1:-1;;;;;;36084:61:0::1;-1:-1:-1::0;;;;;36084:61:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;36001:152:0:o;30277:1234::-;30374:25;30417:35;30455:27;:25;:27::i;:::-;30520:15;;;;30417:65;;-1:-1:-1;30520:15:0;;30507:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30507:29:0;;30495:41;;30549:20;30580:21;30663:17;30658:715;30698:15;;;;;;30682:31;;30658:715;;;30743:12;30758:26;;;:15;;;:26;;;;;;;30801:561;30888:1;30868:17;:21;30801:561;;;30962:15;;;;:::i;:::-;31018;;;;30962;;-1:-1:-1;31018:15:0;;31002:31;;;-1:-1:-1;31058:5:0;30998:85;31158:1;31137:22;;;31128:32;;;-1:-1:-1;;;;;;31211:18:0;;31103:15;31211:18;;;;;;;;;;;31195:36;;-1:-1:-1;;;;;31186:45:0;;;31182:165;;31282:8;31256:9;31266:12;31256:23;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;31256:34:0;;;:23;;;;;;;;;;;:34;31313:14;;;;:::i;:::-;;;;31182:165;-1:-1:-1;30908:19:0;;;;:::i;:::-;;;;30801:561;;;;30728:645;30715:11;;;;;:::i;:::-;;;;30658:715;;;-1:-1:-1;;31462:31:0;;-1:-1:-1;31469:9:0;30277:1234;-1:-1:-1;30277:1234:0:o;33155:198::-;33244:13;33299:27;:25;:27::i;:::-;-1:-1:-1;;;;;;33299:44:0;;;:34;:44;;;;;;;;-1:-1:-1;33299:44:0;;;;33283:62;;;33155:198::o;3756:190::-;1410:23;:21;:23::i;:::-;:29;-1:-1:-1;;;;;1410:29:0;1396:10;:43;1374:122;;;;-1:-1:-1;;;1374:122:0;;;;;;;:::i;:::-;3886:52:::1;3930:7:::0;-1:-1:-1;;;;;;;;;;;3886:27:0::1;2442:164:::0;4617;4560:48;;4617:164::o;4986:264::-;-1:-1:-1;;;;;;5130:25:0;;;;;5122:66;;;;-1:-1:-1;;;5122:66:0;;11239:2:1;5122:66:0;;;11221:21:1;11278:2;11258:18;;;11251:30;11317;11297:18;;;11290:58;11365:18;;5122:66:0;11037:352:1;5122:66:0;-1:-1:-1;;;;;;5199:34:0;;;;:21;:34;;;;;;;;;;;;:43;;-1:-1:-1;;5199:43:0;;;;;;;;;;4986:264::o;12589:164::-;12401:53;;12589:164::o;13067:2119::-;13306:15;;;;;;;;;;13274:29;;13509:1;13493:17;:21;13489:154;;-1:-1:-1;13625:1:0;13608:18;;;13592:35;;;;:15;;;:35;;;;;;13489:154;13664:9;13659:1101;13679:9;:16;13675:1;:20;13659:1101;;;13721:41;13765:9;13775:1;13765:12;;;;;;;;:::i;:::-;;;;;;;13721:56;;13796:38;13837:8;:15;;;13796:56;;13931:1;13903:8;:18;;;:25;:29;13873:138;;;;-1:-1:-1;;;13873:138:0;;11596:2:1;13873:138:0;;;11578:21:1;11635:2;11615:18;;;11608:30;11674:34;11654:18;;;11647:62;-1:-1:-1;;;11725:18:1;;;11718:33;11768:19;;13873:138:0;11394:399:1;13873:138:0;14046:35;14036:6;:45;;;;;;;;:::i;:::-;;14032:713;;14138:156;:1;14184:13;14224:12;14263:8;14138:19;:156::i;:::-;14106:188;;-1:-1:-1;14106:188:0;-1:-1:-1;14032:713:0;;;14334:39;14324:6;:49;;;;;;;;:::i;:::-;;14320:425;;14398:33;:1;14422:8;14398:23;:33::i;:::-;14320:425;;;14471:38;14461:6;:48;;;;;;;;:::i;:::-;;14457:288;;14566:159;:1;14615:13;14655:12;14694:8;14566:22;:159::i;:::-;14534:191;;-1:-1:-1;14534:191:0;-1:-1:-1;14457:288:0;-1:-1:-1;;13697:3:0;;13659:1101;;;;14797:21;14780:13;:38;14776:118;;14839:15;;;:39;;-1:-1:-1;;14839:39:0;;;;;;;14776:118;14980:1;14964:17;;:21;14960:112;;15039:1;15022:18;;;15006:35;;;;:15;;;:35;;;;;:50;;;14960:112;15093:35;15104:9;15115:6;15123:4;15093:35;;;;;;;;:::i;:::-;;;;;;;;15143:24;15154:6;15162:4;15143:10;:24::i;:::-;13249:1930;;;13067:2119;;;;:::o;905:164::-;847:49;;905:164::o;1077:94::-;1148:15;;-1:-1:-1;;;;;;1148:15:0;-1:-1:-1;;;;;1148:15:0;;;;;;;1077:94::o;15194:1691::-;15468:15;;15388:7;;;;-1:-1:-1;;;;;15468:32:0;15495:4;15468:32;;:85;;-1:-1:-1;15525:15:0;;-1:-1:-1;;;;;15525:26:0;9259:20;9307:8;;15525:28;15442:182;;;;-1:-1:-1;;;15442:182:0;;14293:2:1;15442:182:0;;;14275:21:1;14332:2;14312:18;;;14305:30;14371:34;14351:18;;;14344:62;-1:-1:-1;;;14422:18:1;;;14415:33;14465:19;;15442:182:0;14091:399:1;15442:182:0;15646:9;15641:1173;15661:8;:18;;;:25;15657:1;:29;15641:1173;;;15712:15;15730:8;:18;;;15749:1;15730:21;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;15789:18:0;;15770:16;15789:18;;;;;;;;;;;;15730:21;;-1:-1:-1;15858:26:0;;;;:40;15828:149;;;;-1:-1:-1;;;15828:149:0;;14697:2:1;15828:149:0;;;14679:21:1;14736:2;14716:18;;;14709:30;14775:34;14755:18;;;14748:62;-1:-1:-1;;;14826:18:1;;;14819:33;14869:19;;15828:149:0;14495:399:1;15828:149:0;16091:15;;-1:-1:-1;;;;;;16041:18:0;;;16131:22;16041:18;;;;;;;;;;16083:24;;;;;-1:-1:-1;;;;;;16083:70:0;;;16041:112;;;16228:1;16205:24;;;;;;;16470:43;;;16398:45;;;16396:48;16356:88;;;;16355:159;;16600:29;;;16596:167;;16687:1;16670:18;;;16654:35;;;;:15;;;:35;;;;;:50;;;;16596:167;-1:-1:-1;;;16783:15:0;;;;;15688:3;15641:1173;;;-1:-1:-1;16838:13:0;;16853:12;;-1:-1:-1;15194:1691:0;;-1:-1:-1;;;15194:1691:0:o;20766:1252::-;20954:15;;-1:-1:-1;;;;;20954:26:0;9259:20;20928:129;;;;-1:-1:-1;;;20928:129:0;;15101:2:1;20928:129:0;;;15083:21:1;15140:2;15120:18;;;15113:30;15179:34;15159:18;;;15152:62;-1:-1:-1;;;15230:18:1;;;15223:37;15277:19;;20928:129:0;14899:403:1;20928:129:0;21079:9;21074:926;21094:8;:18;;;:25;21090:1;:29;21074:926;;;21145:15;21163:8;:18;;;21182:1;21163:21;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;21222:18:0;;21203:16;21222:18;;;;;;;;;;;;21163:21;;-1:-1:-1;21285:26:0;;;;;21332:134;;;;-1:-1:-1;;;21332:134:0;;15509:2:1;21332:134:0;;;15491:21:1;15548:2;15528:18;;;15521:30;15587:33;15567:18;;;15560:61;15638:18;;21332:134:0;15307:355:1;21332:134:0;21544:4;-1:-1:-1;;;;;21517:32:0;;;21487:140;;;;-1:-1:-1;;;21487:140:0;;;;;;;:::i;:::-;21697:8;:15;;;-1:-1:-1;;;;;21678:34:0;:15;-1:-1:-1;;;;;21678:34:0;;21648:148;;;;-1:-1:-1;;;21648:148:0;;16272:2:1;21648:148:0;;;16254:21:1;16311:2;16291:18;;;16284:30;16350:34;16330:18;;;16323:62;-1:-1:-1;;;16401:18:1;;;16394:38;16449:19;;21648:148:0;16070:404:1;21648:148:0;-1:-1:-1;21968:15:0;;-1:-1:-1;;;;;;21863:18:0;;;;21968:15;21863:18;;;;;;;;;;21960:24;;;;;-1:-1:-1;;;;;;21905:79:0;;21906:29;;;;21905:79;21863:121;;21121:3;;21074:926;;;;20766:1252;;:::o;16893:3865::-;17170:15;;17090:7;;;;-1:-1:-1;;;;;17170:29:0;;17144:138;;;;-1:-1:-1;;;17144:138:0;;16681:2:1;17144:138:0;;;16663:21:1;16720:2;16700:18;;;16693:30;16759:34;16739:18;;;16732:62;-1:-1:-1;;;16810:18:1;;;16803:45;16865:19;;17144:138:0;16479:411:1;17144:138:0;17344:1;17327:18;;;17406:1;17390:17;;17299:25;17424:3184;17444:8;:18;;;:25;17440:1;:29;17424:3184;;;17495:15;17513:8;:18;;;17532:1;17513:21;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;;17572:18:0;;17553:16;17572:18;;;;;;;;;;;;17513:21;;-1:-1:-1;17641:26:0;;;;17611:145;;;;-1:-1:-1;;;17611:145:0;;15509:2:1;17611:145:0;;;15491:21:1;15548:2;15528:18;;;15521:30;15587:33;15567:18;;;15560:61;15638:18;;17611:145:0;15307:355:1;17611:145:0;17845:4;17807:26;;;;:43;17777:151;;;;-1:-1:-1;;;17777:151:0;;;;;;;:::i;:::-;17969:1;17953:17;;;17949:273;;-1:-1:-1;;17995:19:0;;;18052:34;;;;:15;;;:34;;;;;;;-1:-1:-1;17995:19:0;18131:1;;-1:-1:-1;17949:273:0;;;-1:-1:-1;;18181:21:0;;;;17949:273;18635:1;18612:24;;;18595:42;;;18242:19;;-1:-1:-1;;;;;;18689:24:0;;;;;;;18685:297;;-1:-1:-1;;;;;;18935:22:0;;:8;:22;;;;;;;;;;;;-1:-1:-1;;;;;;18864:94:0;;18865:29;;18864:94;18810:148;;18685:297;-1:-1:-1;;;;;;;;19013:18:0;;:8;:18;;;;;;;;;;19006:25;19153:21;19173:1;19153:21;;;;19225:27;19251:1;19225:27;;;;19296:42;;;19292:1128;;19363:23;19389:86;;;:15;;;:86;;;;;;;-1:-1:-1;;;;;;19694:81:0;;;19692:84;19645:131;;;19806:21;;;:50;;19644:213;19944:56;;19292:1128;;;20374:25;20357:12;-1:-1:-1;;;;;20349:21:0;;:50;;20293:25;-1:-1:-1;;;;;;12307:35:0;;20237:81;;20235:84;20191:12;:128;20190:210;20150:250;;19292:1128;20444:19;20467:1;20444:24;20440:153;;20500:34;;;;:15;;;:34;;;;;20493:41;;;20500:34;-1:-1:-1;20440:153:0;-1:-1:-1;;17471:3:0;;;;;-1:-1:-1;17424:3184:0;;-1:-1:-1;;17424:3184:0;;-1:-1:-1;20662:1:0;20641:22;;;;20640:46;;20726:12;;-1:-1:-1;16893:3865:0;;-1:-1:-1;;;;16893:3865:0:o;22026:752::-;22149:11;;:16;-1:-1:-1;;;;;22123:20:0;;;22122:44;22100:140;;;;-1:-1:-1;;;22100:140:0;;17097:2:1;22100:140:0;;;17079:21:1;17136:2;17116:18;;;17109:30;17175:34;17155:18;;;17148:62;-1:-1:-1;;;17226:18:1;;;17219:44;17280:19;;22100:140:0;16895:410:1;22100:140:0;-1:-1:-1;;;;;22257:20:0;;;22253:518;;-1:-1:-1;;;;;22298:23:0;;22316:4;22298:23;22294:203;;-1:-1:-1;;;;;22372:17:0;;9259:20;22342:139;;;;-1:-1:-1;;;22342:139:0;;17512:2:1;22342:139:0;;;17494:21:1;17551:2;17531:18;;;17524:30;17590:34;17570:18;;;17563:62;-1:-1:-1;;;17641:18:1;;;17634:44;17695:19;;22342:139:0;17310:410:1;22342:139:0;22514:12;22532:6;-1:-1:-1;;;;;22532:19:0;22552:4;22532:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22513:44;;;22579:7;22574:186;;22660:16;22657:1;;22639:38;22709:16;22657:1;22699:27;22253:518;22026:752;;:::o;421:173:1:-;488:20;;-1:-1:-1;;;;;;537:32:1;;527:43;;517:71;;584:1;581;574:12;517:71;421:173;;;:::o;599:184::-;657:6;710:2;698:9;689:7;685:23;681:32;678:52;;;726:1;723;716:12;678:52;749:28;767:9;749:28;:::i;980:173::-;1048:20;;-1:-1:-1;;;;;1097:31:1;;1087:42;;1077:70;;1143:1;1140;1133:12;1158:347;1209:8;1219:6;1273:3;1266:4;1258:6;1254:17;1250:27;1240:55;;1291:1;1288;1281:12;1240:55;-1:-1:-1;1314:20:1;;1357:18;1346:30;;1343:50;;;1389:1;1386;1379:12;1343:50;1426:4;1418:6;1414:17;1402:29;;1478:3;1471:4;1462:6;1454;1450:19;1446:30;1443:39;1440:59;;;1495:1;1492;1485:12;1440:59;1158:347;;;;;:::o;1510:1009::-;1652:6;1660;1668;1676;1684;1737:2;1725:9;1716:7;1712:23;1708:32;1705:52;;;1753:1;1750;1743:12;1705:52;1793:9;1780:23;1822:18;1863:2;1855:6;1852:14;1849:34;;;1879:1;1876;1869:12;1849:34;1917:6;1906:9;1902:22;1892:32;;1962:7;1955:4;1951:2;1947:13;1943:27;1933:55;;1984:1;1981;1974:12;1933:55;2024:2;2011:16;2050:2;2042:6;2039:14;2036:34;;;2066:1;2063;2056:12;2036:34;2121:7;2114:4;2104:6;2101:1;2097:14;2093:2;2089:23;2085:34;2082:47;2079:67;;;2142:1;2139;2132:12;2079:67;2173:4;2169:2;2165:13;2155:23;;2197:6;2187:16;;;2222:40;2256:4;2245:9;2241:20;2222:40;:::i;:::-;2212:50;;2315:2;2304:9;2300:18;2287:32;2271:48;;2344:2;2334:8;2331:16;2328:36;;;2360:1;2357;2350:12;2328:36;;2399:60;2451:7;2440:8;2429:9;2425:24;2399:60;:::i;:::-;1510:1009;;;;-1:-1:-1;1510:1009:1;;-1:-1:-1;2478:8:1;;2373:86;1510:1009;-1:-1:-1;;;1510:1009:1:o;2841:658::-;3012:2;3064:21;;;3134:13;;3037:18;;;3156:22;;;2983:4;;3012:2;3235:15;;;;3209:2;3194:18;;;2983:4;3278:195;3292:6;3289:1;3286:13;3278:195;;;3357:13;;-1:-1:-1;;;;;3353:39:1;3341:52;;3448:15;;;;3413:12;;;;3389:1;3307:9;3278:195;;;-1:-1:-1;3490:3:1;;2841:658;-1:-1:-1;;;;;;2841:658:1:o;3504:461::-;3556:3;3594:5;3588:12;3621:6;3616:3;3609:19;3647:4;3676:2;3671:3;3667:12;3660:19;;3713:2;3706:5;3702:14;3734:1;3744:196;3758:6;3755:1;3752:13;3744:196;;;3823:13;;-1:-1:-1;;;;;;3819:40:1;3807:53;;3880:12;;;;3915:15;;;;3780:1;3773:9;3744:196;;;-1:-1:-1;3956:3:1;;3504:461;-1:-1:-1;;;;;3504:461:1:o;3970:1059::-;4158:4;4187:2;4227;4216:9;4212:18;4257:2;4246:9;4239:21;4280:6;4315;4309:13;4346:6;4338;4331:22;4372:2;4362:12;;4405:2;4394:9;4390:18;4383:25;;4467:2;4457:6;4454:1;4450:14;4439:9;4435:30;4431:39;4505:2;4497:6;4493:15;4526:1;4536:464;4550:6;4547:1;4544:13;4536:464;;;4615:22;;;-1:-1:-1;;4611:36:1;4599:49;;4671:13;;4716:9;;-1:-1:-1;;;;;4712:35:1;4697:51;;4787:11;;4781:18;4819:15;;;4812:27;;;4862:58;4904:15;;;4781:18;4862:58;:::i;:::-;4978:12;;;;4852:68;-1:-1:-1;;4943:15:1;;;;4572:1;4565:9;4536:464;;;-1:-1:-1;5017:6:1;;3970:1059;-1:-1:-1;;;;;;;;3970:1059:1:o;5034:186::-;5093:6;5146:2;5134:9;5125:7;5121:23;5117:32;5114:52;;;5162:1;5159;5152:12;5114:52;5185:29;5204:9;5185:29;:::i;5225:657::-;5394:2;5446:21;;;5516:13;;5419:18;;;5538:22;;;5365:4;;5394:2;5617:15;;;;5591:2;5576:18;;;5365:4;5660:196;5674:6;5671:1;5668:13;5660:196;;;5739:13;;-1:-1:-1;;;;;;5735:40:1;5723:53;;5831:15;;;;5796:12;;;;5696:1;5689:9;5660:196;;6306:353;6508:2;6490:21;;;6547:2;6527:18;;;6520:30;6586:31;6581:2;6566:18;;6559:59;6650:2;6635:18;;6306:353::o;6664:127::-;6725:10;6720:3;6716:20;6713:1;6706:31;6756:4;6753:1;6746:15;6780:4;6777:1;6770:15;6796:253;6868:2;6862:9;6910:4;6898:17;;6945:18;6930:34;;6966:22;;;6927:62;6924:88;;;6992:18;;:::i;:::-;7028:2;7021:22;6796:253;:::o;7054:275::-;7125:2;7119:9;7190:2;7171:13;;-1:-1:-1;;7167:27:1;7155:40;;7225:18;7210:34;;7246:22;;;7207:62;7204:88;;;7272:18;;:::i;:::-;7308:2;7301:22;7054:275;;-1:-1:-1;7054:275:1:o;7334:191::-;7402:4;7435:18;7427:6;7424:30;7421:56;;;7457:18;;:::i;:::-;-1:-1:-1;7502:1:1;7498:14;7514:4;7494:25;;7334:191::o;7530:2508::-;7698:9;7733:72;7749:55;7797:6;7749:55;:::i;:::-;7733:72;:::i;:::-;7839:19;;;7877:4;7897:12;;;;7827:3;7928:1;7963:15;;;7952:27;;8002:14;7991:26;;7988:46;;;8030:1;8027;8020:12;7988:46;8054:5;8068:1937;8084:6;8079:3;8076:15;8068:1937;;;8170:3;8157:17;8197:18;8247:2;8234:11;8231:19;8228:109;;;8291:1;8320:2;8316;8309:14;8228:109;8371:11;8364:5;8360:23;8350:33;;8428:4;8423:2;8407:14;8403:23;8399:34;8396:124;;;8474:1;8503:2;8499;8492:14;8396:124;8548:22;;:::i;:::-;8599;8618:2;8599:22;:::i;:::-;8590:7;8583:39;8671:2;8667;8663:11;8650:25;8710:1;8701:7;8698:14;8688:112;;8754:1;8783:2;8779;8772:14;8688:112;8820:16;;;8813:33;8869:2;8911:11;;;8898:25;8939:14;;;8936:104;;;8994:1;9023:2;9019;9012:14;8936:104;9064:15;;;;;9122:14;9115:4;9106:14;;9102:35;9092:136;;9180:1;9169:12;;9210:3;9205;9198:16;9092:136;9265:3;9252:17;9241:28;;9295:69;9311:52;9359:3;9311:52;:::i;9295:69::-;9408:18;;;9504:12;;;9495:22;;9491:31;;;9448:14;;;;9551;9538:28;;9535:121;;;9608:1;9638:3;9633;9626:16;9535:121;9682:12;;;;9707:179;9725:8;9718:5;9715:19;9707:179;;;9807:24;9825:5;9807:24;:::i;:::-;9793:39;;9746:14;;;;9858;;;;9707:179;;;9906:16;;;9899:31;;;;-1:-1:-1;9943:20:1;;-1:-1:-1;;9983:12:1;;;;8101;;8068:1937;;;-1:-1:-1;10027:5:1;;7530:2508;-1:-1:-1;;;;;;;7530:2508:1:o;10043:127::-;10104:10;10099:3;10095:20;10092:1;10085:31;10135:4;10132:1;10125:15;10159:4;10156:1;10149:15;10175:135;10214:3;10235:17;;;10232:43;;10255:18;;:::i;:::-;-1:-1:-1;10302:1:1;10291:13;;10175:135::o;10315:127::-;10376:10;10371:3;10367:20;10364:1;10357:31;10407:4;10404:1;10397:15;10431:4;10428:1;10421:15;10857:175;10894:3;10938:4;10931:5;10927:16;10967:4;10958:7;10955:17;10952:43;;10975:18;;:::i;:::-;11024:1;11011:15;;10857:175;-1:-1:-1;;10857:175:1:o;11798:127::-;11859:10;11854:3;11850:20;11847:1;11840:31;11890:4;11887:1;11880:15;11914:4;11911:1;11904:15;11930:250;12015:1;12025:113;12039:6;12036:1;12033:13;12025:113;;;12115:11;;;12109:18;12096:11;;;12089:39;12061:2;12054:10;12025:113;;;-1:-1:-1;;12172:1:1;12154:16;;12147:27;11930:250::o;12185:270::-;12226:3;12264:5;12258:12;12291:6;12286:3;12279:19;12307:76;12376:6;12369:4;12364:3;12360:14;12353:4;12346:5;12342:16;12307:76;:::i;:::-;12437:2;12416:15;-1:-1:-1;;12412:29:1;12403:39;;;;12444:4;12399:50;;12185:270;-1:-1:-1;;12185:270:1:o;12460:1626::-;12726:4;12755:2;12795;12784:9;12780:18;12825:2;12814:9;12807:21;12848:6;12883;12877:13;12914:6;12906;12899:22;12952:3;12941:9;12937:19;12930:26;;13015:3;13005:6;13002:1;12998:14;12987:9;12983:30;12979:40;12965:54;;13038:4;13077:2;13069:6;13065:15;13098:1;13119;13129:786;13145:6;13140:3;13137:15;13129:786;;;13214:22;;;-1:-1:-1;;13210:37:1;13198:50;;13271:13;;13316:9;;-1:-1:-1;;;;;13312:35:1;13297:51;;13387:11;;;13381:18;13439:1;13422:19;;13412:170;;-1:-1:-1;;;13473:31:1;;13531:4;13528:1;13521:15;13563:4;13480:1;13553:15;13412:170;13602:15;;;13595:37;13655:4;13700:11;;;13694:18;13732:15;;;13725:27;;;13775:60;13819:15;;;13694:18;13775:60;:::i;:::-;13765:70;-1:-1:-1;;13893:12:1;;;;13858:15;;;;13171:1;13162:11;13129:786;;;-1:-1:-1;;;;;;;;2590:31:1;;13951:18;;;2578:44;-1:-1:-1;;14008:22:1;;;14001:4;13986:20;;13979:52;14048:32;14012:6;14065;14048:32;:::i;:::-;14040:40;12460:1626;-1:-1:-1;;;;;;;12460:1626:1:o;15667:398::-;15869:2;15851:21;;;15908:2;15888:18;;;15881:30;15947:34;15942:2;15927:18;;15920:62;-1:-1:-1;;;16013:2:1;15998:18;;15991:32;16055:3;16040:19;;15667:398::o;17725:287::-;17854:3;17892:6;17886:13;17908:66;17967:6;17962:3;17955:4;17947:6;17943:17;17908:66;:::i;:::-;17990:16;;;;;17725:287;-1:-1:-1;;17725:287:1:o

Swarm Source

ipfs://317d3dcbd7997e60203f110d847f3020f52eedc93a9ba23dd1355c0a7b331d95

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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