ETH Price: $3,493.31 (+0.57%)
 

Overview

Max Total Supply

1,000,000 THRO

Holders

261

Total Transfers

-

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
NewThroneThroDiamond

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 42 : IOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IERC173 } from '../../interfaces/IERC173.sol';
import { IOwnableInternal } from './IOwnableInternal.sol';

interface IOwnable is IOwnableInternal, IERC173 {}

File 2 of 42 : IOwnableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IERC173Internal } from '../../interfaces/IERC173Internal.sol';

interface IOwnableInternal is IERC173Internal {
    error Ownable__NotOwner();
    error Ownable__NotTransitiveOwner();
}

File 3 of 42 : ISafeOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IOwnable } from './IOwnable.sol';
import { ISafeOwnableInternal } from './ISafeOwnableInternal.sol';

interface ISafeOwnable is ISafeOwnableInternal, IOwnable {
    /**
     * @notice get the nominated owner who has permission to call acceptOwnership
     */
    function nomineeOwner() external view returns (address);

    /**
     * @notice accept transfer of contract ownership
     */
    function acceptOwnership() external;
}

File 4 of 42 : ISafeOwnableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IOwnableInternal } from './IOwnableInternal.sol';

interface ISafeOwnableInternal is IOwnableInternal {
    error SafeOwnable__NotNomineeOwner();
}

File 5 of 42 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IERC173 } from '../../interfaces/IERC173.sol';
import { IOwnable } from './IOwnable.sol';
import { OwnableInternal } from './OwnableInternal.sol';

/**
 * @title Ownership access control based on ERC173
 */
abstract contract Ownable is IOwnable, OwnableInternal {
    /**
     * @inheritdoc IERC173
     */
    function owner() public view virtual returns (address) {
        return _owner();
    }

    /**
     * @inheritdoc IERC173
     */
    function transferOwnership(address account) public virtual onlyOwner {
        _transferOwnership(account);
    }
}

File 6 of 42 : OwnableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IERC173 } from '../../interfaces/IERC173.sol';
import { AddressUtils } from '../../utils/AddressUtils.sol';
import { IOwnableInternal } from './IOwnableInternal.sol';
import { OwnableStorage } from './OwnableStorage.sol';

abstract contract OwnableInternal is IOwnableInternal {
    using AddressUtils for address;

    modifier onlyOwner() {
        if (msg.sender != _owner()) revert Ownable__NotOwner();
        _;
    }

    modifier onlyTransitiveOwner() {
        if (msg.sender != _transitiveOwner())
            revert Ownable__NotTransitiveOwner();
        _;
    }

    function _owner() internal view virtual returns (address) {
        return OwnableStorage.layout().owner;
    }

    function _transitiveOwner() internal view virtual returns (address owner) {
        owner = _owner();

        while (owner.isContract()) {
            try IERC173(owner).owner() returns (address transitiveOwner) {
                owner = transitiveOwner;
            } catch {
                break;
            }
        }
    }

    function _transferOwnership(address account) internal virtual {
        _setOwner(account);
    }

    function _setOwner(address account) internal virtual {
        OwnableStorage.Layout storage l = OwnableStorage.layout();
        emit OwnershipTransferred(l.owner, account);
        l.owner = account;
    }
}

File 7 of 42 : OwnableStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

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

File 8 of 42 : SafeOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { Ownable } from './Ownable.sol';
import { ISafeOwnable } from './ISafeOwnable.sol';
import { OwnableInternal } from './OwnableInternal.sol';
import { SafeOwnableInternal } from './SafeOwnableInternal.sol';

/**
 * @title Ownership access control based on ERC173 with ownership transfer safety check
 */
abstract contract SafeOwnable is ISafeOwnable, Ownable, SafeOwnableInternal {
    /**
     * @inheritdoc ISafeOwnable
     */
    function nomineeOwner() public view virtual returns (address) {
        return _nomineeOwner();
    }

    /**
     * @inheritdoc ISafeOwnable
     */
    function acceptOwnership() public virtual onlyNomineeOwner {
        _acceptOwnership();
    }

    function _transferOwnership(
        address account
    ) internal virtual override(OwnableInternal, SafeOwnableInternal) {
        super._transferOwnership(account);
    }
}

File 9 of 42 : SafeOwnableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { ISafeOwnableInternal } from './ISafeOwnableInternal.sol';
import { OwnableInternal } from './OwnableInternal.sol';
import { SafeOwnableStorage } from './SafeOwnableStorage.sol';

abstract contract SafeOwnableInternal is ISafeOwnableInternal, OwnableInternal {
    modifier onlyNomineeOwner() {
        if (msg.sender != _nomineeOwner())
            revert SafeOwnable__NotNomineeOwner();
        _;
    }

    /**
     * @notice get the nominated owner who has permission to call acceptOwnership
     */
    function _nomineeOwner() internal view virtual returns (address) {
        return SafeOwnableStorage.layout().nomineeOwner;
    }

    /**
     * @notice accept transfer of contract ownership
     */
    function _acceptOwnership() internal virtual {
        _setOwner(msg.sender);
        delete SafeOwnableStorage.layout().nomineeOwner;
    }

    /**
     * @notice grant permission to given address to claim contract ownership
     */
    function _transferOwnership(address account) internal virtual override {
        _setNomineeOwner(account);
    }

    /**
     * @notice set nominee owner
     */
    function _setNomineeOwner(address account) internal virtual {
        SafeOwnableStorage.layout().nomineeOwner = account;
    }
}

File 10 of 42 : SafeOwnableStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

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

File 11 of 42 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IERC165Internal } from './IERC165Internal.sol';

/**
 * @title ERC165 interface registration interface
 * @dev see https://eips.ethereum.org/EIPS/eip-165
 */
interface IERC165 is IERC165Internal {
    /**
     * @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 12 of 42 : IERC165Internal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

/**
 * @title ERC165 interface registration interface
 */
interface IERC165Internal {

}

File 13 of 42 : IERC173.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IERC173Internal } from './IERC173Internal.sol';

/**
 * @title Contract ownership standard interface
 * @dev see https://eips.ethereum.org/EIPS/eip-173
 */
interface IERC173 is IERC173Internal {
    /**
     * @notice get the ERC173 contract owner
     * @return contract 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 14 of 42 : IERC173Internal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

/**
 * @title Partial ERC173 interface needed by internal functions
 */
interface IERC173Internal {
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
}

File 15 of 42 : ERC165Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IERC165 } from '../../../interfaces/IERC165.sol';
import { IERC165Base } from './IERC165Base.sol';
import { ERC165BaseInternal } from './ERC165BaseInternal.sol';
import { ERC165BaseStorage } from './ERC165BaseStorage.sol';

/**
 * @title ERC165 implementation
 */
abstract contract ERC165Base is IERC165Base, ERC165BaseInternal {
    /**
     * @inheritdoc IERC165
     */
    function supportsInterface(bytes4 interfaceId) public view returns (bool) {
        return _supportsInterface(interfaceId);
    }
}

File 16 of 42 : ERC165BaseInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IERC165BaseInternal } from './IERC165BaseInternal.sol';
import { ERC165BaseStorage } from './ERC165BaseStorage.sol';

/**
 * @title ERC165 implementation
 */
abstract contract ERC165BaseInternal is IERC165BaseInternal {
    /**
     * @notice indicates whether an interface is already supported based on the interfaceId
     * @param interfaceId id of interface to check
     * @return bool indicating whether interface is supported
     */
    function _supportsInterface(
        bytes4 interfaceId
    ) internal view virtual returns (bool) {
        return ERC165BaseStorage.layout().supportedInterfaces[interfaceId];
    }

    /**
     * @notice sets status of interface support
     * @param interfaceId id of interface to set status for
     * @param status boolean indicating whether interface will be set as supported
     */
    function _setSupportsInterface(
        bytes4 interfaceId,
        bool status
    ) internal virtual {
        if (interfaceId == 0xffffffff) revert ERC165Base__InvalidInterfaceId();
        ERC165BaseStorage.layout().supportedInterfaces[interfaceId] = status;
    }
}

File 17 of 42 : ERC165BaseStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

library ERC165BaseStorage {
    struct Layout {
        mapping(bytes4 => bool) supportedInterfaces;
    }

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

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

File 18 of 42 : IERC165Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { IERC165 } from '../../../interfaces/IERC165.sol';
import { IERC165BaseInternal } from './IERC165BaseInternal.sol';

interface IERC165Base is IERC165, IERC165BaseInternal {}

File 19 of 42 : IERC165BaseInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { IERC165Internal } from '../../../interfaces/IERC165Internal.sol';

interface IERC165BaseInternal is IERC165Internal {
    error ERC165Base__InvalidInterfaceId();
}

File 20 of 42 : DiamondBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { Proxy } from '../../Proxy.sol';
import { IDiamondBase } from './IDiamondBase.sol';
import { DiamondBaseStorage } from './DiamondBaseStorage.sol';

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

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

File 21 of 42 : DiamondBaseStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

/**
 * @dev derived from https://github.com/mudgen/diamond-2 (MIT license)
 */
library DiamondBaseStorage {
    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 internal constant STORAGE_SLOT =
        keccak256('solidstate.contracts.storage.DiamondBase');

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

File 22 of 42 : IDiamondBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IProxy } from '../../IProxy.sol';

interface IDiamondBase is IProxy {}

File 23 of 42 : DiamondFallback.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { OwnableInternal } from '../../../access/ownable/OwnableInternal.sol';
import { DiamondBase } from '../base/DiamondBase.sol';
import { DiamondBaseStorage } from '../base/DiamondBaseStorage.sol';
import { IDiamondFallback } from './IDiamondFallback.sol';

/**
 * @title Fallback feature for EIP-2535 "Diamond" proxy
 */
abstract contract DiamondFallback is
    IDiamondFallback,
    OwnableInternal,
    DiamondBase
{
    /**
     * @inheritdoc IDiamondFallback
     */
    function getFallbackAddress()
        external
        view
        returns (address fallbackAddress)
    {
        fallbackAddress = _getFallbackAddress();
    }

    /**
     * @inheritdoc IDiamondFallback
     */
    function setFallbackAddress(address fallbackAddress) external onlyOwner {
        _setFallbackAddress(fallbackAddress);
    }

    /**
     * @inheritdoc DiamondBase
     * @notice query custom fallback address is no implementation is found
     */
    function _getImplementation()
        internal
        view
        virtual
        override
        returns (address implementation)
    {
        implementation = super._getImplementation();

        if (implementation == address(0)) {
            implementation = _getFallbackAddress();
        }
    }

    /**
     * @notice query the address of the fallback implementation
     * @return fallbackAddress address of fallback implementation
     */
    function _getFallbackAddress()
        internal
        view
        virtual
        returns (address fallbackAddress)
    {
        fallbackAddress = DiamondBaseStorage.layout().fallbackAddress;
    }

    /**
     * @notice set the address of the fallback implementation
     * @param fallbackAddress address of fallback implementation
     */
    function _setFallbackAddress(address fallbackAddress) internal virtual {
        DiamondBaseStorage.layout().fallbackAddress = fallbackAddress;
    }
}

File 24 of 42 : IDiamondFallback.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IDiamondBase } from '../base/IDiamondBase.sol';

interface IDiamondFallback is IDiamondBase {
    /**
     * @notice query the address of the fallback implementation
     * @return fallbackAddress address of fallback implementation
     */
    function getFallbackAddress()
        external
        view
        returns (address fallbackAddress);

    /**
     * @notice set the address of the fallback implementation
     * @param fallbackAddress address of fallback implementation
     */
    function setFallbackAddress(address fallbackAddress) external;
}

File 25 of 42 : ISolidStateDiamond.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { ISafeOwnable } from '../../access/ownable/ISafeOwnable.sol';
import { IERC165 } from '../../interfaces/IERC165.sol';
import { IDiamondBase } from './base/IDiamondBase.sol';
import { IDiamondFallback } from './fallback/IDiamondFallback.sol';
import { IDiamondReadable } from './readable/IDiamondReadable.sol';
import { IDiamondWritable } from './writable/IDiamondWritable.sol';

interface ISolidStateDiamond is
    IDiamondBase,
    IDiamondFallback,
    IDiamondReadable,
    IDiamondWritable,
    ISafeOwnable,
    IERC165
{
    receive() external payable;
}

File 26 of 42 : DiamondReadable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { DiamondBaseStorage } from '../base/DiamondBaseStorage.sol';
import { IDiamondReadable } from './IDiamondReadable.sol';

/**
 * @title EIP-2535 "Diamond" proxy introspection contract
 * @dev derived from https://github.com/mudgen/diamond-2 (MIT license)
 */
abstract contract DiamondReadable is IDiamondReadable {
    /**
     * @inheritdoc IDiamondReadable
     */
    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 IDiamondReadable
     */
    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 IDiamondReadable
     */
    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 IDiamondReadable
     */
    function facetAddress(
        bytes4 selector
    ) external view returns (address facet) {
        facet = address(bytes20(DiamondBaseStorage.layout().facets[selector]));
    }
}

File 27 of 42 : IDiamondReadable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

/**
 * @title Diamond proxy introspection interface
 * @dev see https://eips.ethereum.org/EIPS/eip-2535
 */
interface IDiamondReadable {
    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 28 of 42 : SolidStateDiamond.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IOwnable, Ownable, OwnableInternal } from '../../access/ownable/Ownable.sol';
import { ISafeOwnable, SafeOwnable } from '../../access/ownable/SafeOwnable.sol';
import { IERC165 } from '../../interfaces/IERC165.sol';
import { IERC173 } from '../../interfaces/IERC173.sol';
import { ERC165Base, ERC165BaseStorage } from '../../introspection/ERC165/base/ERC165Base.sol';
import { DiamondBase } from './base/DiamondBase.sol';
import { DiamondFallback, IDiamondFallback } from './fallback/DiamondFallback.sol';
import { DiamondReadable, IDiamondReadable } from './readable/DiamondReadable.sol';
import { DiamondWritable, IDiamondWritable } from './writable/DiamondWritable.sol';
import { ISolidStateDiamond } from './ISolidStateDiamond.sol';

/**
 * @title SolidState "Diamond" proxy reference implementation
 */
abstract contract SolidStateDiamond is
    ISolidStateDiamond,
    DiamondBase,
    DiamondFallback,
    DiamondReadable,
    DiamondWritable,
    SafeOwnable,
    ERC165Base
{
    constructor() {
        bytes4[] memory selectors = new bytes4[](12);
        uint256 selectorIndex;

        // register DiamondFallback

        selectors[selectorIndex++] = IDiamondFallback
            .getFallbackAddress
            .selector;
        selectors[selectorIndex++] = IDiamondFallback
            .setFallbackAddress
            .selector;

        _setSupportsInterface(type(IDiamondFallback).interfaceId, true);

        // register DiamondWritable

        selectors[selectorIndex++] = IDiamondWritable.diamondCut.selector;

        _setSupportsInterface(type(IDiamondWritable).interfaceId, true);

        // register DiamondReadable

        selectors[selectorIndex++] = IDiamondReadable.facets.selector;
        selectors[selectorIndex++] = IDiamondReadable
            .facetFunctionSelectors
            .selector;
        selectors[selectorIndex++] = IDiamondReadable.facetAddresses.selector;
        selectors[selectorIndex++] = IDiamondReadable.facetAddress.selector;

        _setSupportsInterface(type(IDiamondReadable).interfaceId, true);

        // register ERC165

        selectors[selectorIndex++] = IERC165.supportsInterface.selector;

        _setSupportsInterface(type(IERC165).interfaceId, true);

        // register SafeOwnable

        selectors[selectorIndex++] = Ownable.owner.selector;
        selectors[selectorIndex++] = SafeOwnable.nomineeOwner.selector;
        selectors[selectorIndex++] = Ownable.transferOwnership.selector;
        selectors[selectorIndex++] = SafeOwnable.acceptOwnership.selector;

        _setSupportsInterface(type(IERC173).interfaceId, true);

        // diamond cut

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

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

        _diamondCut(facetCuts, address(0), '');

        // set owner

        _setOwner(msg.sender);
    }

    receive() external payable {}

    function _transferOwnership(
        address account
    ) internal virtual override(OwnableInternal, SafeOwnable) {
        super._transferOwnership(account);
    }

    /**
     * @inheritdoc DiamondFallback
     */
    function _getImplementation()
        internal
        view
        override(DiamondBase, DiamondFallback)
        returns (address implementation)
    {
        implementation = super._getImplementation();
    }
}

File 29 of 42 : DiamondWritable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { OwnableInternal } from '../../../access/ownable/OwnableInternal.sol';
import { IDiamondWritable } from './IDiamondWritable.sol';
import { DiamondWritableInternal } from './DiamondWritableInternal.sol';

/**
 * @title EIP-2535 "Diamond" proxy update contract
 */
abstract contract DiamondWritable is
    IDiamondWritable,
    DiamondWritableInternal,
    OwnableInternal
{
    /**
     * @inheritdoc IDiamondWritable
     */
    function diamondCut(
        FacetCut[] calldata facetCuts,
        address target,
        bytes calldata data
    ) external onlyOwner {
        _diamondCut(facetCuts, target, data);
    }
}

File 30 of 42 : DiamondWritableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { AddressUtils } from '../../../utils/AddressUtils.sol';
import { DiamondBaseStorage } from '../base/DiamondBaseStorage.sol';
import { IDiamondWritableInternal } from './IDiamondWritableInternal.sol';

abstract contract DiamondWritableInternal is IDiamondWritableInternal {
    using AddressUtils for address;

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

    /**
     * @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[] memory facetCuts,
        address target,
        bytes memory data
    ) internal virtual {
        DiamondBaseStorage.Layout storage l = DiamondBaseStorage.layout();

        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++) {
                FacetCut memory facetCut = facetCuts[i];
                FacetCutAction action = facetCut.action;

                if (facetCut.selectors.length == 0)
                    revert DiamondWritable__SelectorNotSpecified();

                if (action == FacetCutAction.ADD) {
                    (selectorCount, selectorSlot) = _addFacetSelectors(
                        l,
                        selectorCount,
                        selectorSlot,
                        facetCut
                    );
                } else if (action == FacetCutAction.REPLACE) {
                    _replaceFacetSelectors(l, facetCut);
                } else if (action == FacetCutAction.REMOVE) {
                    (selectorCount, selectorSlot) = _removeFacetSelectors(
                        l,
                        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(
        DiamondBaseStorage.Layout storage l,
        uint256 selectorCount,
        bytes32 selectorSlot,
        FacetCut memory facetCut
    ) internal returns (uint256, bytes32) {
        unchecked {
            if (
                facetCut.target != address(this) &&
                !facetCut.target.isContract()
            ) revert DiamondWritable__TargetHasNoCode();

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

                if (address(bytes20(oldFacet)) != address(0))
                    revert DiamondWritable__SelectorAlreadyAdded();

                // 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(
        DiamondBaseStorage.Layout storage l,
        uint256 selectorCount,
        bytes32 selectorSlot,
        FacetCut memory facetCut
    ) internal returns (uint256, bytes32) {
        unchecked {
            if (facetCut.target != address(0))
                revert DiamondWritable__RemoveTargetNotZeroAddress();

            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];

                if (address(bytes20(oldFacet)) == address(0))
                    revert DiamondWritable__SelectorNotFound();

                if (address(bytes20(oldFacet)) == address(this))
                    revert DiamondWritable__SelectorIsImmutable();

                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(
        DiamondBaseStorage.Layout storage l,
        FacetCut memory facetCut
    ) internal {
        unchecked {
            if (!facetCut.target.isContract())
                revert DiamondWritable__TargetHasNoCode();

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

                if (oldFacetAddress == address(0))
                    revert DiamondWritable__SelectorNotFound();
                if (oldFacetAddress == address(this))
                    revert DiamondWritable__SelectorIsImmutable();
                if (oldFacetAddress == facetCut.target)
                    revert DiamondWritable__ReplaceTargetIsIdentical();

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

    function _initialize(address target, bytes memory data) private {
        if ((target == address(0)) != (data.length == 0))
            revert DiamondWritable__InvalidInitializationParameters();

        if (target != address(0)) {
            if (target != address(this)) {
                if (!target.isContract())
                    revert DiamondWritable__TargetHasNoCode();
            }

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

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

File 31 of 42 : IDiamondWritable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IDiamondWritableInternal } from './IDiamondWritableInternal.sol';

/**
 * @title Diamond proxy upgrade interface
 * @dev see https://eips.ethereum.org/EIPS/eip-2535
 */
interface IDiamondWritable is IDiamondWritableInternal {
    /**
     * @notice update diamond facets and optionally execute arbitrary initialization function
     * @param facetCuts array of structured Diamond facet update data
     * @param target optional target of initialization delegatecall
     * @param data optional initialization function call data
     */
    function diamondCut(
        FacetCut[] calldata facetCuts,
        address target,
        bytes calldata data
    ) external;
}

File 32 of 42 : IDiamondWritableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

interface IDiamondWritableInternal {
    enum FacetCutAction {
        ADD,
        REPLACE,
        REMOVE
    }

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

    error DiamondWritable__InvalidInitializationParameters();
    error DiamondWritable__RemoveTargetNotZeroAddress();
    error DiamondWritable__ReplaceTargetIsIdentical();
    error DiamondWritable__SelectorAlreadyAdded();
    error DiamondWritable__SelectorIsImmutable();
    error DiamondWritable__SelectorNotFound();
    error DiamondWritable__SelectorNotSpecified();
    error DiamondWritable__TargetHasNoCode();

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

File 33 of 42 : IProxy.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

interface IProxy {
    error Proxy__ImplementationIsNotContract();

    fallback() external payable;
}

File 34 of 42 : Proxy.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { AddressUtils } from '../utils/AddressUtils.sol';
import { IProxy } from './IProxy.sol';

/**
 * @title Base proxy contract
 */
abstract contract Proxy is IProxy {
    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();

        if (!implementation.isContract())
            revert Proxy__ImplementationIsNotContract();

        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 35 of 42 : IPausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IPausableInternal } from './IPausableInternal.sol';

interface IPausable is IPausableInternal {
    /**
     * @notice query whether contract is paused
     * @return status whether contract is paused
     */
    function paused() external view returns (bool status);
}

File 36 of 42 : IPausableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

interface IPausableInternal {
    error Pausable__Paused();
    error Pausable__NotPaused();

    event Paused(address account);
    event Unpaused(address account);
}

File 37 of 42 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IPausable } from './IPausable.sol';
import { PausableInternal } from './PausableInternal.sol';

/**
 * @title Pausable security control module.
 */
abstract contract Pausable is IPausable, PausableInternal {
    /**
     * @inheritdoc IPausable
     */
    function paused() external view virtual returns (bool status) {
        status = _paused();
    }
}

File 38 of 42 : PausableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { IPausableInternal } from './IPausableInternal.sol';
import { PausableStorage } from './PausableStorage.sol';

/**
 * @title Internal functions for Pausable security control module.
 */
abstract contract PausableInternal is IPausableInternal {
    modifier whenNotPaused() {
        if (_paused()) revert Pausable__Paused();
        _;
    }

    modifier whenPaused() {
        if (!_paused()) revert Pausable__NotPaused();
        _;
    }

    /**
     * @notice query whether contract is paused
     * @return status whether contract is paused
     */
    function _paused() internal view virtual returns (bool status) {
        status = PausableStorage.layout().paused;
    }

    /**
     * @notice Triggers paused state, when contract is unpaused.
     */
    function _pause() internal virtual whenNotPaused {
        PausableStorage.layout().paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @notice Triggers unpaused state, when contract is paused.
     */
    function _unpause() internal virtual whenPaused {
        delete PausableStorage.layout().paused;
        emit Unpaused(msg.sender);
    }
}

File 39 of 42 : PausableStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

library PausableStorage {
    struct Layout {
        bool paused;
    }

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

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

File 40 of 42 : AddressUtils.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

import { UintUtils } from './UintUtils.sol';

library AddressUtils {
    using UintUtils for uint256;

    error AddressUtils__InsufficientBalance();
    error AddressUtils__NotContract();
    error AddressUtils__SendValueFailed();

    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 }('');
        if (!success) revert AddressUtils__SendValueFailed();
    }

    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) {
        if (value > address(this).balance)
            revert AddressUtils__InsufficientBalance();
        return _functionCallWithValue(target, data, value, error);
    }

    /**
     * @notice execute arbitrary external call with limited gas usage and amount of copied return data
     * @dev derived from https://github.com/nomad-xyz/ExcessivelySafeCall (MIT License)
     * @param target recipient of call
     * @param gasAmount gas allowance for call
     * @param value native token value to include in call
     * @param maxCopy maximum number of bytes to copy from return data
     * @param data encoded call data
     * @return success whether call is successful
     * @return returnData copied return data
     */
    function excessivelySafeCall(
        address target,
        uint256 gasAmount,
        uint256 value,
        uint16 maxCopy,
        bytes memory data
    ) internal returns (bool success, bytes memory returnData) {
        returnData = new bytes(maxCopy);

        assembly {
            // execute external call via assembly to avoid automatic copying of return data
            success := call(
                gasAmount,
                target,
                value,
                add(data, 0x20),
                mload(data),
                0,
                0
            )

            // determine whether to limit amount of data to copy
            let toCopy := returndatasize()

            if gt(toCopy, maxCopy) {
                toCopy := maxCopy
            }

            // store the length of the copied bytes
            mstore(returnData, toCopy)

            // copy the bytes from returndata[0:toCopy]
            returndatacopy(add(returnData, 0x20), 0, toCopy)
        }
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory error
    ) private returns (bytes memory) {
        if (!isContract(target)) revert AddressUtils__NotContract();

        (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 41 of 42 : UintUtils.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.8;

/**
 * @title utility functions for uint256 operations
 * @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts/ (MIT license)
 */
library UintUtils {
    error UintUtils__InsufficientHexLength();

    bytes16 private constant HEX_SYMBOLS = '0123456789abcdef';

    function add(uint256 a, int256 b) internal pure returns (uint256) {
        return b < 0 ? sub(a, -b) : a + uint256(b);
    }

    function sub(uint256 a, int256 b) internal pure returns (uint256) {
        return b < 0 ? add(a, -b) : a - uint256(b);
    }

    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;
            }
        }

        if (value != 0) revert UintUtils__InsufficientHexLength();

        return string(buffer);
    }
}

File 42 of 42 : NewThroneThroDiamond.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import {SolidStateDiamond} from "@solidstate/contracts/proxy/diamond/SolidStateDiamond.sol";
import {Pausable} from "@solidstate/contracts/security/pausable/Pausable.sol";

contract NewThroneThroDiamond is SolidStateDiamond, Pausable {}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "viaIR": true,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"DiamondWritable__InvalidInitializationParameters","type":"error"},{"inputs":[],"name":"DiamondWritable__RemoveTargetNotZeroAddress","type":"error"},{"inputs":[],"name":"DiamondWritable__ReplaceTargetIsIdentical","type":"error"},{"inputs":[],"name":"DiamondWritable__SelectorAlreadyAdded","type":"error"},{"inputs":[],"name":"DiamondWritable__SelectorIsImmutable","type":"error"},{"inputs":[],"name":"DiamondWritable__SelectorNotFound","type":"error"},{"inputs":[],"name":"DiamondWritable__SelectorNotSpecified","type":"error"},{"inputs":[],"name":"DiamondWritable__TargetHasNoCode","type":"error"},{"inputs":[],"name":"ERC165Base__InvalidInterfaceId","type":"error"},{"inputs":[],"name":"Ownable__NotOwner","type":"error"},{"inputs":[],"name":"Ownable__NotTransitiveOwner","type":"error"},{"inputs":[],"name":"Pausable__NotPaused","type":"error"},{"inputs":[],"name":"Pausable__Paused","type":"error"},{"inputs":[],"name":"Proxy__ImplementationIsNotContract","type":"error"},{"inputs":[],"name":"SafeOwnable__NotNomineeOwner","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondWritableInternal.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondWritableInternal.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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondWritableInternal.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct IDiamondWritableInternal.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 IDiamondReadable.Facet[]","name":"diamondFacets","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFallbackAddress","outputs":[{"internalType":"address","name":"fallbackAddress","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":[],"name":"paused","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"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"}]

60806040523462000337576200031c6200001862000378565b620000336200002782620003bc565b632c40805960e01b9052565b6200004e6200004282620003d0565b639142376560e01b9052565b632f40adcf60e21b600052600080516020620025c58339815191526020527fea929569903c3e19530358310fcaf1a971b387fd41008d81b0a7f1275e915a5c805460ff19166001179055620000b3620000a782620003e1565b6307e4c70760e21b9052565b6307e4c70760e21b600052600080516020620025c58339815191526020527ffd29538739e576e7ec1eb8c7e901cca011aae0deb8fb2c6280a4c2300add457d805460ff19166001179055620001186200010c82620003f2565b637a0ed62760e01b9052565b62000133620001278262000403565b6356fe50af60e11b9052565b6200014e620001428262000414565b6314bbdacb60e21b9052565b620001696200015d8262000425565b6366ffd66360e11b9052565b6348e2b09360e01b600052600080516020620025c58339815191526020527fb36cab0dec645683c2d905d6b41349479e1d7f665c3cff144fecc78944a31d5b805460ff19166001179055620001ce620001c28262000436565b6301ffc9a760e01b9052565b6301ffc9a760e01b600052600080516020620025c58339815191526020527f3df35b507c5de77f483b4e9b5c258409299a2e6dc816fa76a389e598628b08a5805460ff1916600117905562000233620002278262000448565b638da5cb5b60e01b9052565b6200024e62000242826200045a565b63455a8a8560e11b9052565b620002696200025d826200046c565b63f2fde38b60e01b9052565b6200028462000278826200047e565b6379ba509760e01b9052565b6307f5828d60e41b600052600080516020620025c58339815191526020527fa9832637661075437d81882814f92cc614421ae9c04c71ce67957179f7086c18805460ff19166001179055620002d8620004a5565b90620002e362000352565b30815290600060208301526040820152620002fe82620003bc565b526200030a81620003bc565b50620003156200052c565b90620006ed565b620003273362000550565b604051611750908162000e758239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190606082016001600160401b038111838210176200037257604052565b6200033c565b604051906101a082016001600160401b038111838210176200037257604052600c8252610180366020840137565b634e487b7160e01b600052603260045260246000fd5b805115620003ca5760200190565b620003a6565b805160011015620003ca5760400190565b805160021015620003ca5760600190565b805160031015620003ca5760800190565b805160041015620003ca5760a00190565b805160051015620003ca5760c00190565b805160061015620003ca5760e00190565b805160071015620003ca576101000190565b805160081015620003ca576101200190565b805160091015620003ca576101400190565b8051600a1015620003ca576101600190565b8051600b1015620003ca576101800190565b8051821015620003ca5760209160051b010190565b6040805191908281016001600160401b0381118482101762000372578152600183528291600091825b602080821015620005025790602091620004e762000352565b908682528681830152606085830152828901015201620004ce565b50505091925050565b600311156200051657565b634e487b7160e01b600052602160045260246000fd5b60405190602082016001600160401b03811183821017620003725760405260008252565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460805490916001600160a01b039081169190829082167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a01b031916179055565b919082519283825260005b848110620005e7575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201620005c5565b919091606092838201848352815180915260809485840191868160051b860101966020809501936000915b8383106200065357505050505050906000620006509493928201526040818403910152620005ba565b90565b909192939498607f198882030183528951908681019060018060a01b038351168152888301516003811015620005165784828b9594939286809401528a604080960151958201528451809452019201906000905b808210620006c85750505090806001929b0193019301919493929062000627565b82516001600160e01b03191684528a94938401939092019160019190910190620006a7565b9190916200071762000710600080516020620025e58339815191525461ffff1690565b61ffff1690565b90819260009460078416620008b5575b6000935b8351851015620008035762000741858562000490565b5190602082015162000753816200050b565b6040808401515115620007f357506200076c816200050b565b806200078e5750906001976200078292620008e5565b9690945b01936200072b565b6200079d81979392976200050b565b60018103620007bb575090620007b560019262000d3d565b62000786565b80620007c96002926200050b565b14620007da575b5060019062000786565b600197620007e9929662000a98565b96909490620007d0565b5163eb6c3aeb60e01b8152600490fd5b819450957f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673939192966200085f96810362000890575b6007811662000861575b50506200085660405192839283620005fc565b0390a162000e56565b565b620008879060031c60005260008051602062002625833981519152602052604060002090565b55388062000843565b600080516020620025e5833981519152805461ffff191661ffff831617905562000839565b9450620008dd8360031c60005260008051602062002625833981519152602052604060002090565b549462000727565b82519091906001600160a01b03166001600160a01b038116301415908162000a8d575b5062000a7b5760009384925b604080860151805186101562000a6f576200093486620009429262000490565b516001600160e01b03191690565b906200099b6200098f620009896200097b8563ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b546001600160601b03191690565b60601c90565b6001600160a01b031690565b62000a5f5750855182906001600160601b031990620009ce906001600160a01b03165b60601b6001600160601b03191690565b1617620009fc8263ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b5560e090818360051b169463ffffffff60e01b809216861c91861c191617931462000a2f575b6001938401930162000914565b9162000a568360031c60005260008051602062002625833981519152602052604060002090565b55849162000a22565b51634923a77160e11b8152600490fd5b50509250925092509190565b604051633ddc5cab60e21b8152600490fd5b3b1590503862000908565b82519293929091906001600160a01b031662000d2b5790600780821691600390600090821c5b60409586890151805184101562000d1c57620009348462000adf9262000490565b9562000b0c8763ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b54978860601c801562000d0b57301462000cfb57508162000ce8575050600019019062000b518260005260008051602062002625833981519152602052604060002090565b5494849687915b60e063ffffffff811b92600062000ba3858c600598891b1b1694868116860362000c645763ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b5580881c611fff16941b169185841462000c51579062000c09929162000be18560005260008051602062002625833981519152602052604060002090565b5491831c921c1916179160005260008051602062002625833981519152602052604060002090565b555b851562000c20575b6001019094939462000abe565b9350600062000c478260005260008051602062002625833981519152602052604060002090565b5560009362000c13565b9180949893501c921c1916179362000c0b565b62000ca562000c986200097b8863ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b6001600160601b03191690565b6001600160e01b031987811660009081526000805160206200260583398151915260205260408082206001600160601b0389169490941790935592168252902090565b6000190196909591929187919062000b58565b5163e983573160e01b8152600490fd5b81516337e25a9760e11b8152600490fd5b5097509394505090501b179190565b604051633ab3490960e21b8152600490fd5b80516001600160a01b03163b1562000a7b5760005b604080830151805183101562000e5057620009348362000d729262000490565b9062000d9f8263ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b54908160601c801562000d0b5730811462000e3f57855162000dca906001600160a01b03166200098f565b1462000e2f57508351600193929162000e279162000df69062000c98906001600160a01b0316620009be565b90858060601b0316179163ffffffff60e01b1660005260008051602062002605833981519152602052604060002090565b550162000d52565b516330baabf360e11b8152600490fd5b815163e983573160e01b8152600490fd5b50505050565b511560010362000e6257565b6040516326df4ccd60e01b8152600490fdfe60806040526004361015610015575b36610bf857005b60003560e01c806301ffc9a7146100e55780631f931c1c146100e05780632c408059146100db57806352ef6b2c146100d65780635c975abb146100d157806379ba5097146100cc5780637a0ed627146100c75780638ab5150a146100c25780638da5cb5b146100bd57806391423765146100b8578063adfca15e146100b3578063cdffacc6146100ae5763f2fde38b0361000e57610b50565b610af3565b6109e1565b61091a565b6108e4565b61089c565b61061f565b6104bc565b61047a565b6102f0565b610264565b6101e8565b61011b565b600435906001600160e01b03198216820361010157565b600080fd5b35906001600160e01b03198216820361010157565b34610101576020366003190112610101576001600160e01b031961013d6100ea565b166000527ffc606c433378e3a7e0a6a531deac289b66caa1b4aa8554fd4ab2c6f1570f92d8602052602060ff604060002054166040519015158152f35b602435906001600160a01b038216820361010157565b600435906001600160a01b038216820361010157565b35906001600160a01b038216820361010157565b9181601f840112156101015782359167ffffffffffffffff8311610101576020838186019501011161010157565b346101015760603660031901126101015760043567ffffffffffffffff808211610101573660238301121561010157816004013591818311610101573660248460051b830101116101015761023b61017a565b604435928311610101576102629361025960249436906004016101ba565b94909301610e5d565b005b34610101576000366003190112610101577f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546040516001600160a01b039091168152602090f35b6020908160408183019282815285518094520193019160005b8281106102d3575050505090565b83516001600160a01b0316855293810193928101926001016102c5565b34610101576000806003193601126104775761032661031f6000805160206116db8339815191525461ffff1690565b61ffff1690565b9061033082610d88565b908080815b858210610351578385526040518061034d87826102ac565b0390f35b61035a81610dda565b5483905b60088210610377575b505061037290610dc6565b610335565b91959396909261038690610dc6565b9481861161046a576103bf6103b96103ab63ffffffff60e01b868860051b1b16610bc0565b546001600160601b03191690565b60601c90565b886001600160a01b038216815b848110610421575b505061041657816103fe610403926103ef610409958a610e31565b6001600160a01b039091169052565b610dc6565b93610dc6565b909693959194929461035e565b509261040990610dc6565b61044a61043e610431838c610e31565b516001600160a01b031690565b6001600160a01b031690565b821461045e5761045990610dc6565b6103cc565b505050600138806103d4565b9492819794969250610367565b80fd5b3461010157600036600319011261010157602060ff7f68721c0bbf2c02a4d65000340d1370666be06a630022208d4baa9bd7a4b6fea854166040519015158152f35b3461010157600080600319360112610477577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789080546001600160a01b03908181163303610553576000805160206116fb833981519152805492339084167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08780a36001600160a01b03199283163317905516905580f35b60405163efd1052d60e01b8152600490fd5b90815180825260208080930193019160005b828110610585575050505090565b83516001600160e01b03191685529381019392810192600101610577565b602080820190808352835180925260409283810182858560051b8401019601946000925b8584106105d8575050505050505090565b90919293949596858061060e600193603f1986820301885286838d51878060a01b03815116845201519181858201520190610565565b9901940194019295949391906105c7565b34610101576000806003193601126104775761064e61031f6000805160206116db8339815191525461ffff1690565b61065781610d1f565b9061066181610d88565b92809181825b8282106106c5575050505b81811061068a578183526040518061034d85826105a3565b806106ab6106a561069e6106c09488610e31565b5160ff1690565b60ff1690565b60206106b78387610e31565b51015152610dc6565b610672565b6106ce81610dda565b5484905b600882106106eb575b50506106e690610dc6565b610667565b90939196926106fc90989598610dc6565b9582871161088f5763ffffffff60e01b828660051b1b166107226103b96103ab83610bc0565b8a6001600160a01b038216815b8581106107d9575b50506107cd57916107a56107b8926107666107be95610756858b610e31565b516001600160a01b039091169052565b61079561077288610d88565b60209081610780878d610e31565b51015261078d858b610e31565b510151610e1f565b6001600160e01b03199091169052565b6103fe6107b2828a610e31565b60019052565b94610dc6565b909794979691939592966106d2565b5050936107be90610dc6565b8a858a846107fb61043e6107ed8785610e31565b51516001600160a01b031690565b146108115750505061080c90610dc6565b61072f565b6108869550838095506108779361085361087294610795602061083a61087e9a61069e98610e31565b51015161084d6106a561069e8888610e31565b90610e31565b61086d60ff8061086661069e8686610e31565b1610610e45565b610e31565b610e4c565b918b610e31565b9060ff169052565b60013880610737565b95929691939794976106db565b34610101576000366003190112610101577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890546040516001600160a01b039091168152602090f35b34610101576000366003190112610101576000805160206116fb833981519152546040516001600160a01b039091168152602090f35b3461010157602036600319011261010157610933610190565b6000805160206116fb833981519152546001600160a01b03908116330361098a577f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9680546001600160a01b03191691909216179055005b604051632f7a8ee160e01b8152600490fd5b6020908160408183019282815285518094520193019160005b8281106109c3575050505090565b83516001600160e01b031916855293810193928101926001016109b5565b34610101576020366003190112610101576109fa610190565b610a1761031f6000805160206116db8339815191525461ffff1690565b90610a2182610d88565b9060009081906001600160a01b0316815b858310610a4a578385526040518061034d878261099c565b610a5381610dda565b546000905b60088210610a71575b5050610a6c90610dc6565b610a32565b91969095929493610a8190610dc6565b95818711610ae55763ffffffff60e01b838260051b1b16610aaa61043e6103b96103ab84610bc0565b8714610ac8575b50610abb90610dc6565b9096919593949295610a58565b856103fe610ade92610795610abb959989610e31565b9490610ab1565b819792509593949295610a61565b34610101576020366003190112610101576001600160e01b0319610b156100ea565b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052602060406000205460601c604051908152f35b3461010157602036600319011261010157610b69610190565b6000805160206116fb833981519152546001600160a01b03908116330361098a577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789080546001600160a01b03191691909216179055005b63ffffffff60e01b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b600080356001600160e01b03191681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604090205460601c8015610c75575b803b15610c635760008091368280378136915af43d6000803e15610c5e573d6000f35b3d6000fd5b6040516321f27f0d60e21b8152600490fd5b507f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546001600160a01b0316610c3b565b634e487b7160e01b600052604160045260246000fd5b604051906060820182811067ffffffffffffffff821117610cdc57604052565b610ca6565b6040519190601f01601f1916820167ffffffffffffffff811183821017610cdc57604052565b67ffffffffffffffff8111610cdc5760051b60200190565b90610d31610d2c83610d07565b610ce1565b8281528092610d42601f1991610d07565b016000805b828110610d545750505050565b604090815182810181811067ffffffffffffffff821117610cdc576020935283815282606081830152828701015201610d47565b90610d95610d2c83610d07565b8281528092610da6601f1991610d07565b0190602036910137565b634e487b7160e01b600052601160045260246000fd5b6000198114610dd55760010190565b610db0565b6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b634e487b7160e01b600052603260045260246000fd5b805115610e2c5760200190565b610e09565b8051821015610e2c5760209160051b010190565b1561010157565b60ff1660ff8114610dd55760010190565b6000805160206116fb8339815191525493959491936001600160a01b0316330361098a57610e8d610d2c85610d07565b9081948083526020809301600591821b8301923684116101015780915b848310610ecf57505050505050610ecd9394610ec7913691610fb6565b91611113565b565b67ffffffffffffffff833581811161010157830160608136031261010157610ef5610cbc565b91610eff826101a6565b835288820135600381101561010157898401526040918281013591821161010157019036601f8301121561010157813591610f3c610d2c84610d07565b928a808583815201918a1b8301019136831161010157918b80969492979593015b818110610f77575050849550820152815201920191610eaa565b9193958091939597610f8884610106565b8152019101918b959391969492610f5d565b67ffffffffffffffff8111610cdc57601f01601f191660200190565b929192610fc5610d2c83610f9a565b938285528282011161010157816000926020928387013784010152565b60031115610fec57565b634e487b7160e01b600052602160045260246000fd5b919082519283825260005b84811061102e575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161100d565b93929091936060928382019380835281518095526080830160808660051b85010195602080940192600080915b8383106110a4575050505050506110a194956110949183019060018060a01b03169052565b6040818403910152611002565b90565b909192939498607f1988820301865289519060018060a01b0382511681528782015160038110156110ff576110f160019385848c9594868096015281604080940151938201520190610565565b9b019601949301919061106f565b634e487b7160e01b85526021600452602485fd5b92909261113361031f6000805160206116db8339815191525461ffff1690565b91829360009560078516611294575b6000945b8451861015611205576111598686610e31565b5190602082015161116981610fe2565b60408084015151156111f5575061117f81610fe2565b8061119d575090600198611192926112a9565b9790955b0194611146565b6111aa8198939298610fe2565b600181036111c45750906111bf60019261156c565b611196565b806111d0600292610fe2565b146111df575b50600190611196565b6001986111ec92976113cd565b979095906111d6565b5163eb6c3aeb60e01b8152600490fd5b819491929550967f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6739397610ecd978103611271575b6007811661125d575b50506112558560405193849384611042565b0390a161165f565b6112699060031c610dda565b553880611243565b6000805160206116db833981519152805461ffff191661ffff831617905561123a565b95506112a28460031c610dda565b5495611142565b82519091906001600160a01b03166001600160a01b03811630141590816113c3575b506113b15760009384925b60408086015180518610156113a5576112f28661130092610e31565b516001600160e01b03191690565b9061131361043e6103b96103ab85610bc0565b6113955750855182906001600160601b031990611344906001600160a01b03165b60601b6001600160601b03191690565b161761134f82610bc0565b5560e090818360051b169463ffffffff60e01b809216861c91861c1916179314611380575b600193840193016112d6565b9161138d8360031c610dda565b558491611374565b51634923a77160e11b8152600490fd5b50509250925092509190565b604051633ddc5cab60e21b8152600490fd5b3b159050386112cb565b82519293929091906001600160a01b031661155a5790600780821691600390600090821c5b60409586890151805184101561154b576112f28461140f92610e31565b9561141987610bc0565b54978860601c801561153a57301461152a575081611518575050600019019061144182610dda565b5494849687915b60e063ffffffff811b92600061146f858c600598891b1b169486811686036114dd57610bc0565b5580881c611fff16941b16918584146114cb57906114a0929161149185610dda565b5491831c921c19161791610dda565b555b85156114b5575b600101909493946113f2565b935060006114c282610dda565b556000936114a9565b9180949893501c921c191617936114a2565b6114f96114ec6103ab88610bc0565b6001600160601b03191690565b6bffffffffffffffffffffffff85161761151287610bc0565b55610bc0565b60001901969095919291879190611448565b5163e983573160e01b8152600490fd5b81516337e25a9760e11b8152600490fd5b5097509394505090501b179190565b604051633ab3490960e21b8152600490fd5b80516001600160a01b03163b156113b15760005b6040808301518051831015611633576112f28361159c92610e31565b906115a682610bc0565b54908160601c801561153a573081146116225785516115cd906001600160a01b031661043e565b1461161257508351600193929161160b916bffffffffffffffffffffffff90611602906114ec906001600160a01b0316611334565b91161791610bc0565b5501611580565b516330baabf360e11b8152600490fd5b815163e983573160e01b8152600490fd5b50505050565b3d1561165a573d9061164d610d2c83610f9a565b9182523d6000602084013e565b606090565b81516001600160a01b038216908115901581036116c8571561168057505050565b30036116b0575b816000929160208493519201905af461169e611639565b50156116a657565b3d6000803e3d6000fd5b803b61168757604051633ddc5cab60e21b8152600490fd5b6040516326df4ccd60e01b8152600490fdfe177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc948a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460a26469706673582212206d64f9faa948d4750c95d7cff36ad9edf9fc3b1dcf7ae5749089c22ac35e1bc664736f6c63430008130033fc606c433378e3a7e0a6a531deac289b66caa1b4aa8554fd4ab2c6f1570f92d8177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc94177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95

Deployed Bytecode

0x60806040526004361015610015575b36610bf857005b60003560e01c806301ffc9a7146100e55780631f931c1c146100e05780632c408059146100db57806352ef6b2c146100d65780635c975abb146100d157806379ba5097146100cc5780637a0ed627146100c75780638ab5150a146100c25780638da5cb5b146100bd57806391423765146100b8578063adfca15e146100b3578063cdffacc6146100ae5763f2fde38b0361000e57610b50565b610af3565b6109e1565b61091a565b6108e4565b61089c565b61061f565b6104bc565b61047a565b6102f0565b610264565b6101e8565b61011b565b600435906001600160e01b03198216820361010157565b600080fd5b35906001600160e01b03198216820361010157565b34610101576020366003190112610101576001600160e01b031961013d6100ea565b166000527ffc606c433378e3a7e0a6a531deac289b66caa1b4aa8554fd4ab2c6f1570f92d8602052602060ff604060002054166040519015158152f35b602435906001600160a01b038216820361010157565b600435906001600160a01b038216820361010157565b35906001600160a01b038216820361010157565b9181601f840112156101015782359167ffffffffffffffff8311610101576020838186019501011161010157565b346101015760603660031901126101015760043567ffffffffffffffff808211610101573660238301121561010157816004013591818311610101573660248460051b830101116101015761023b61017a565b604435928311610101576102629361025960249436906004016101ba565b94909301610e5d565b005b34610101576000366003190112610101577f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546040516001600160a01b039091168152602090f35b6020908160408183019282815285518094520193019160005b8281106102d3575050505090565b83516001600160a01b0316855293810193928101926001016102c5565b34610101576000806003193601126104775761032661031f6000805160206116db8339815191525461ffff1690565b61ffff1690565b9061033082610d88565b908080815b858210610351578385526040518061034d87826102ac565b0390f35b61035a81610dda565b5483905b60088210610377575b505061037290610dc6565b610335565b91959396909261038690610dc6565b9481861161046a576103bf6103b96103ab63ffffffff60e01b868860051b1b16610bc0565b546001600160601b03191690565b60601c90565b886001600160a01b038216815b848110610421575b505061041657816103fe610403926103ef610409958a610e31565b6001600160a01b039091169052565b610dc6565b93610dc6565b909693959194929461035e565b509261040990610dc6565b61044a61043e610431838c610e31565b516001600160a01b031690565b6001600160a01b031690565b821461045e5761045990610dc6565b6103cc565b505050600138806103d4565b9492819794969250610367565b80fd5b3461010157600036600319011261010157602060ff7f68721c0bbf2c02a4d65000340d1370666be06a630022208d4baa9bd7a4b6fea854166040519015158152f35b3461010157600080600319360112610477577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789080546001600160a01b03908181163303610553576000805160206116fb833981519152805492339084167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08780a36001600160a01b03199283163317905516905580f35b60405163efd1052d60e01b8152600490fd5b90815180825260208080930193019160005b828110610585575050505090565b83516001600160e01b03191685529381019392810192600101610577565b602080820190808352835180925260409283810182858560051b8401019601946000925b8584106105d8575050505050505090565b90919293949596858061060e600193603f1986820301885286838d51878060a01b03815116845201519181858201520190610565565b9901940194019295949391906105c7565b34610101576000806003193601126104775761064e61031f6000805160206116db8339815191525461ffff1690565b61065781610d1f565b9061066181610d88565b92809181825b8282106106c5575050505b81811061068a578183526040518061034d85826105a3565b806106ab6106a561069e6106c09488610e31565b5160ff1690565b60ff1690565b60206106b78387610e31565b51015152610dc6565b610672565b6106ce81610dda565b5484905b600882106106eb575b50506106e690610dc6565b610667565b90939196926106fc90989598610dc6565b9582871161088f5763ffffffff60e01b828660051b1b166107226103b96103ab83610bc0565b8a6001600160a01b038216815b8581106107d9575b50506107cd57916107a56107b8926107666107be95610756858b610e31565b516001600160a01b039091169052565b61079561077288610d88565b60209081610780878d610e31565b51015261078d858b610e31565b510151610e1f565b6001600160e01b03199091169052565b6103fe6107b2828a610e31565b60019052565b94610dc6565b909794979691939592966106d2565b5050936107be90610dc6565b8a858a846107fb61043e6107ed8785610e31565b51516001600160a01b031690565b146108115750505061080c90610dc6565b61072f565b6108869550838095506108779361085361087294610795602061083a61087e9a61069e98610e31565b51015161084d6106a561069e8888610e31565b90610e31565b61086d60ff8061086661069e8686610e31565b1610610e45565b610e31565b610e4c565b918b610e31565b9060ff169052565b60013880610737565b95929691939794976106db565b34610101576000366003190112610101577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce6617890546040516001600160a01b039091168152602090f35b34610101576000366003190112610101576000805160206116fb833981519152546040516001600160a01b039091168152602090f35b3461010157602036600319011261010157610933610190565b6000805160206116fb833981519152546001600160a01b03908116330361098a577f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9680546001600160a01b03191691909216179055005b604051632f7a8ee160e01b8152600490fd5b6020908160408183019282815285518094520193019160005b8281106109c3575050505090565b83516001600160e01b031916855293810193928101926001016109b5565b34610101576020366003190112610101576109fa610190565b610a1761031f6000805160206116db8339815191525461ffff1690565b90610a2182610d88565b9060009081906001600160a01b0316815b858310610a4a578385526040518061034d878261099c565b610a5381610dda565b546000905b60088210610a71575b5050610a6c90610dc6565b610a32565b91969095929493610a8190610dc6565b95818711610ae55763ffffffff60e01b838260051b1b16610aaa61043e6103b96103ab84610bc0565b8714610ac8575b50610abb90610dc6565b9096919593949295610a58565b856103fe610ade92610795610abb959989610e31565b9490610ab1565b819792509593949295610a61565b34610101576020366003190112610101576001600160e01b0319610b156100ea565b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052602060406000205460601c604051908152f35b3461010157602036600319011261010157610b69610190565b6000805160206116fb833981519152546001600160a01b03908116330361098a577f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce661789080546001600160a01b03191691909216179055005b63ffffffff60e01b166000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604060002090565b600080356001600160e01b03191681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604090205460601c8015610c75575b803b15610c635760008091368280378136915af43d6000803e15610c5e573d6000f35b3d6000fd5b6040516321f27f0d60e21b8152600490fd5b507f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546001600160a01b0316610c3b565b634e487b7160e01b600052604160045260246000fd5b604051906060820182811067ffffffffffffffff821117610cdc57604052565b610ca6565b6040519190601f01601f1916820167ffffffffffffffff811183821017610cdc57604052565b67ffffffffffffffff8111610cdc5760051b60200190565b90610d31610d2c83610d07565b610ce1565b8281528092610d42601f1991610d07565b016000805b828110610d545750505050565b604090815182810181811067ffffffffffffffff821117610cdc576020935283815282606081830152828701015201610d47565b90610d95610d2c83610d07565b8281528092610da6601f1991610d07565b0190602036910137565b634e487b7160e01b600052601160045260246000fd5b6000198114610dd55760010190565b610db0565b6000527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc95602052604060002090565b634e487b7160e01b600052603260045260246000fd5b805115610e2c5760200190565b610e09565b8051821015610e2c5760209160051b010190565b1561010157565b60ff1660ff8114610dd55760010190565b6000805160206116fb8339815191525493959491936001600160a01b0316330361098a57610e8d610d2c85610d07565b9081948083526020809301600591821b8301923684116101015780915b848310610ecf57505050505050610ecd9394610ec7913691610fb6565b91611113565b565b67ffffffffffffffff833581811161010157830160608136031261010157610ef5610cbc565b91610eff826101a6565b835288820135600381101561010157898401526040918281013591821161010157019036601f8301121561010157813591610f3c610d2c84610d07565b928a808583815201918a1b8301019136831161010157918b80969492979593015b818110610f77575050849550820152815201920191610eaa565b9193958091939597610f8884610106565b8152019101918b959391969492610f5d565b67ffffffffffffffff8111610cdc57601f01601f191660200190565b929192610fc5610d2c83610f9a565b938285528282011161010157816000926020928387013784010152565b60031115610fec57565b634e487b7160e01b600052602160045260246000fd5b919082519283825260005b84811061102e575050826000602080949584010152601f8019910116010190565b60208183018101518483018201520161100d565b93929091936060928382019380835281518095526080830160808660051b85010195602080940192600080915b8383106110a4575050505050506110a194956110949183019060018060a01b03169052565b6040818403910152611002565b90565b909192939498607f1988820301865289519060018060a01b0382511681528782015160038110156110ff576110f160019385848c9594868096015281604080940151938201520190610565565b9b019601949301919061106f565b634e487b7160e01b85526021600452602485fd5b92909261113361031f6000805160206116db8339815191525461ffff1690565b91829360009560078516611294575b6000945b8451861015611205576111598686610e31565b5190602082015161116981610fe2565b60408084015151156111f5575061117f81610fe2565b8061119d575090600198611192926112a9565b9790955b0194611146565b6111aa8198939298610fe2565b600181036111c45750906111bf60019261156c565b611196565b806111d0600292610fe2565b146111df575b50600190611196565b6001986111ec92976113cd565b979095906111d6565b5163eb6c3aeb60e01b8152600490fd5b819491929550967f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6739397610ecd978103611271575b6007811661125d575b50506112558560405193849384611042565b0390a161165f565b6112699060031c610dda565b553880611243565b6000805160206116db833981519152805461ffff191661ffff831617905561123a565b95506112a28460031c610dda565b5495611142565b82519091906001600160a01b03166001600160a01b03811630141590816113c3575b506113b15760009384925b60408086015180518610156113a5576112f28661130092610e31565b516001600160e01b03191690565b9061131361043e6103b96103ab85610bc0565b6113955750855182906001600160601b031990611344906001600160a01b03165b60601b6001600160601b03191690565b161761134f82610bc0565b5560e090818360051b169463ffffffff60e01b809216861c91861c1916179314611380575b600193840193016112d6565b9161138d8360031c610dda565b558491611374565b51634923a77160e11b8152600490fd5b50509250925092509190565b604051633ddc5cab60e21b8152600490fd5b3b159050386112cb565b82519293929091906001600160a01b031661155a5790600780821691600390600090821c5b60409586890151805184101561154b576112f28461140f92610e31565b9561141987610bc0565b54978860601c801561153a57301461152a575081611518575050600019019061144182610dda565b5494849687915b60e063ffffffff811b92600061146f858c600598891b1b169486811686036114dd57610bc0565b5580881c611fff16941b16918584146114cb57906114a0929161149185610dda565b5491831c921c19161791610dda565b555b85156114b5575b600101909493946113f2565b935060006114c282610dda565b556000936114a9565b9180949893501c921c191617936114a2565b6114f96114ec6103ab88610bc0565b6001600160601b03191690565b6bffffffffffffffffffffffff85161761151287610bc0565b55610bc0565b60001901969095919291879190611448565b5163e983573160e01b8152600490fd5b81516337e25a9760e11b8152600490fd5b5097509394505090501b179190565b604051633ab3490960e21b8152600490fd5b80516001600160a01b03163b156113b15760005b6040808301518051831015611633576112f28361159c92610e31565b906115a682610bc0565b54908160601c801561153a573081146116225785516115cd906001600160a01b031661043e565b1461161257508351600193929161160b916bffffffffffffffffffffffff90611602906114ec906001600160a01b0316611334565b91161791610bc0565b5501611580565b516330baabf360e11b8152600490fd5b815163e983573160e01b8152600490fd5b50505050565b3d1561165a573d9061164d610d2c83610f9a565b9182523d6000602084013e565b606090565b81516001600160a01b038216908115901581036116c8571561168057505050565b30036116b0575b816000929160208493519201905af461169e611639565b50156116a657565b3d6000803e3d6000fd5b803b61168757604051633ddc5cab60e21b8152600490fd5b6040516326df4ccd60e01b8152600490fdfe177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc948a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460a26469706673582212206d64f9faa948d4750c95d7cff36ad9edf9fc3b1dcf7ae5749089c22ac35e1bc664736f6c63430008130033

[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.