Contract 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9

Contract Overview

Balance:
85 CRO

CRO Value:
$6.94 (@ $0.08/CRO)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x47a0a270e5cdfad7af62e3a213b2214301bef98a1d09f395514ca69b84d893f0Swap Exact Token...68839472023-02-09 12:06:1111 mins ago0x788478d2fb456d8fcaa03d8a5b9faa9b37824898 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.717282899534 4,816.888721606
0x7b140a8af225961ca3edf7e330b967b1787f7b7591fe1c1a99ec21aee4512dfcSwap Exact Token...68838292023-02-09 11:55:0623 mins ago0xc19680ce9cb6c03f85eaad035707c531481ac275 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.5167625493580
0x2176a7dea8278b6cadc922da0153e4b051877be1f356d5b18418ebb7ef4711b2Add Liquidity ET...68837522023-02-09 11:47:5130 mins ago0x8ce946723ef366f034ce4a37272a09ed3380091b IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9119.889636507233558 CRO1.125737922296 4,816.897821605
0x94f2fd0647baabfce4d93265f37ce4cc660ab69e92691f167bfbc6e652cf6ba2Swap Tokens For ...68836002023-02-09 11:33:3444 mins ago0x35ae0e1a7e45c5be4adafac757ab43ca1bb09806 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.7400073833220
0x99c0a5bbeec86d7eeb7bea2bb3a43332562bd036445bbc71a5f747e5ccf5bb8bAdd Liquidity68835872023-02-09 11:32:2045 mins ago0x70db57da6df74810f3b0fc64ca6c8f65a0604ddc IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.068591641019 4,815.905506471
0x285d7fd37c9609131e3ce84b978c57bdd1b47b9e3650cf19c59dd4171e6d3b2bSwap Exact Token...68835812023-02-09 11:31:4646 mins ago0x70db57da6df74810f3b0fc64ca6c8f65a0604ddc IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.683444453843 4,815.905786908
0x8acde14b6b6db28ba9acc71e7b7543910e11033c5a773cd136e12b0080662c10Swap Exact Token...68835782023-02-09 11:31:3046 mins ago0x70db57da6df74810f3b0fc64ca6c8f65a0604ddc IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.740079527398 4,815.905926825
0x25178a0e95362e6d3929eb36aad1ffaced8f08fe3486854e2de16e322c88466eAdd Liquidity68835572023-02-09 11:29:3148 mins ago0x70db57da6df74810f3b0fc64ca6c8f65a0604ddc IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.012809304842 4,815.906920151
0x3ec6fd5fb7185fbe5e5360c9bb5cfb20e74aa5987eea25e2eeabed57fcfc26f7Swap Exact ETH F...68835522023-02-09 11:29:0349 mins ago0x70db57da6df74810f3b0fc64ca6c8f65a0604ddc IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a93,100 CRO0.743051130847 4,815.907154973
0xac05387a8ebc092cc3d26abb878446036a51834885908e4675cfb2e966866105Swap Exact ETH F...68835412023-02-09 11:28:0050 mins ago0x70db57da6df74810f3b0fc64ca6c8f65a0604ddc IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a93,100 CRO0.609284558979 4,815.907670863
0x458287092d0d1d3f76e9dd747b808d7ff978187436edf00560c4b72188e6d6d2Add Liquidity68835002023-02-09 11:24:0954 mins ago0x374d4902246cbc20e7ededce0838e724aa6bb651 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.06868919539 4,816.909589704
0x131e91c315b4554b7002921c4e917056f2ed7b4c2e169140916653f1d2fa7de2Swap Exact Token...68834762023-02-09 11:21:5356 mins ago0x75682f1bf5e568a999c23d9753af307f85e215b7 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.660581499825 4,816.910701815
0x76b9600f32c48316b1c0f40882d1943a35b151779f4913a4e05ca6c2cdecb951Swap Exact Token...68834672023-02-09 11:21:0257 mins ago0x3f2e90f413af462558e703ad2d13c2f93adf6c45 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.961892844410
0xbe4582b4c7554790f13016d32a62a4a6adaeed7dddddf6c3e16a95b22ab2e4a5Add Liquidity ET...68834622023-02-09 11:20:3457 mins ago0x171c6910f9f0d529d12457c1001682c9fea5ca89 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9683.219219462254616 CRO1.125625476924 4,816.911345008
0xc207dc29acdc709f7552cf53f8bb3730172f79725846e0f0dcee3a49f614eed0Swap Exact Token...68834552023-02-09 11:19:5558 mins ago0x171c6910f9f0d529d12457c1001682c9fea5ca89 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.740234084842 4,816.911675639
0x60881a33edb01731896c24939442782aa70c6d76d56f170a485ae95d3dc24a54Swap Exact Token...68832792023-02-09 11:03:231 hr 14 mins ago0x1df8b267588ac0bb0c1d1ae280febe719a88509a IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.295829573820
0xcfed490386401c70cf3f49be63738fa9a4d111d1299e4a68164fa6cd880d2149Swap Exact Token...68832362023-02-09 10:59:191 hr 18 mins ago0xe06b27d177c53915aeb6c16e91c4ac3d5e6ea33f IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.742894600843 4,816.921925247
0x4b16c8d9c04b6612967b159c9b99882c1c1d22af7301ed32cc52ea48fb424299Swap ETH For Exa...68831912023-02-09 10:55:051 hr 23 mins ago0x1df8b267588ac0bb0c1d1ae280febe719a88509a IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a925.562403067049948 CRO0.7815770664870
0x6fb38363e4fce4daae53d8b274c3bbde1e478f22923a805d9f59bbca67ec1becRemove Liquidity...68831852023-02-09 10:54:311 hr 23 mins ago0xfb51c93ea2b0cfb84f2986c4dcb3fb1d89883498 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.080416854518 4,816.924307692
0x501b72368fe296fd03c40b1a362e87142a4b6dc8f4b80a1e7c0609178aee5e5fSwap ETH For Exa...68831742023-02-09 10:53:301 hr 24 mins ago0x1df8b267588ac0bb0c1d1ae280febe719a88509a IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9407.2111414492231 CRO0.8639787383150
0x506c424e859fc92868fae893062bd6f1427fe935841a06c55101d8ed49a273d9Add Liquidity ET...68831412023-02-09 10:50:231 hr 27 mins ago0xfd69871b6c57dd6583f051492b123723a80def52 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a94,200 CRO1.160517974842 4,816.926324968
0x9bfbdda667aa9b88fc11572fc9b8a0557173b90a5effc2fa7171f5276ef8d315Swap Exact Token...68829772023-02-09 10:34:561 hr 43 mins ago0x2aaa07a0a722ab93a27183277f5e92d50fc248f1 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.695690499057 4,816.93392504
0x1a6202a0742c8ce7d80ad771c17c656f1ef799298f8a9c92a8f1d09c640d13e3Swap Exact Token...68828472023-02-09 10:22:401 hr 55 mins ago0xe67fc03249bbdc92a0e57034e3898e9c67c35c81 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.985685578977 4,816.939822689
0x652c8ef474ee488d7504c8edcf0ddc95281b3898eb8efda978a0a91852612ae1Swap Exact Token...68828382023-02-09 10:21:481 hr 56 mins ago0x5a8dd9be8bd04cb17fdedab50276b862ef13813f IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.115314339462 4,816.940223988
0x422d74ff9d088a0171c8fe4c185e5ac0f65a99dffefa347134af94c6712923daSwap Exact Token...68828022023-02-09 10:18:261 hr 59 mins ago0xd6d5d58dcca84ff0fde0bd9d911080c4cf729a24 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.162443694532 4,816.9419309
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x47a0a270e5cdfad7af62e3a213b2214301bef98a1d09f395514ca69b84d893f068839472023-02-09 12:06:1111 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x788478d2fb456d8fcaa03d8a5b9faa9b37824898475.496879846900509547 CRO
0x47a0a270e5cdfad7af62e3a213b2214301bef98a1d09f395514ca69b84d893f068839472023-02-09 12:06:1111 mins ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9475.496879846900509547 CRO
0xe5dd11e8da44bafe3c6809e0e2167ef7e5a4084244c4335617562b3fc0530db468837542023-02-09 11:48:0230 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x929f79c932c76dfcfa572e1bf4ee2a05c0674b960.237607501726805982 CRO
0xe5dd11e8da44bafe3c6809e0e2167ef7e5a4084244c4335617562b3fc0530db468837542023-02-09 11:48:0230 mins ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90.237607501726805982 CRO
0x2176a7dea8278b6cadc922da0153e4b051877be1f356d5b18418ebb7ef4711b268837522023-02-09 11:47:5130 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token119.889636507233558119 CRO
0x4f2088c35404e79cea077db47320f499dcc88c9bdb2cf1bd273596eec2a8eaab68837412023-02-09 11:46:4931 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x929f79c932c76dfcfa572e1bf4ee2a05c0674b960.127137569129934751 CRO
0x4f2088c35404e79cea077db47320f499dcc88c9bdb2cf1bd273596eec2a8eaab68837412023-02-09 11:46:4931 mins ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90.127137569129934751 CRO
0x94f2fd0647baabfce4d93265f37ce4cc660ab69e92691f167bfbc6e652cf6ba268836002023-02-09 11:33:3444 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x35ae0e1a7e45c5be4adafac757ab43ca1bb09806100 CRO
0x94f2fd0647baabfce4d93265f37ce4cc660ab69e92691f167bfbc6e652cf6ba268836002023-02-09 11:33:3444 mins ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9100 CRO
0x8acde14b6b6db28ba9acc71e7b7543910e11033c5a773cd136e12b0080662c1068835782023-02-09 11:31:3046 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x70db57da6df74810f3b0fc64ca6c8f65a0604ddc220.546261709610199688 CRO
0x8acde14b6b6db28ba9acc71e7b7543910e11033c5a773cd136e12b0080662c1068835782023-02-09 11:31:3046 mins ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9220.546261709610199688 CRO
0x3ec6fd5fb7185fbe5e5360c9bb5cfb20e74aa5987eea25e2eeabed57fcfc26f768835522023-02-09 11:29:0349 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token3,100 CRO
0xac05387a8ebc092cc3d26abb878446036a51834885908e4675cfb2e96686610568835412023-02-09 11:28:0050 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token3,100 CRO
0xbe4582b4c7554790f13016d32a62a4a6adaeed7dddddf6c3e16a95b22ab2e4a568834622023-02-09 11:20:3457 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token683.219219462254616443 CRO
0xc207dc29acdc709f7552cf53f8bb3730172f79725846e0f0dcee3a49f614eed068834552023-02-09 11:19:5558 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x171c6910f9f0d529d12457c1001682c9fea5ca89682.016476579065958202 CRO
0xc207dc29acdc709f7552cf53f8bb3730172f79725846e0f0dcee3a49f614eed068834552023-02-09 11:19:5558 mins ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9682.016476579065958202 CRO
0x60881a33edb01731896c24939442782aa70c6d76d56f170a485ae95d3dc24a5468832792023-02-09 11:03:231 hr 14 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x1df8b267588ac0bb0c1d1ae280febe719a88509a413.014251804908535141 CRO
0x60881a33edb01731896c24939442782aa70c6d76d56f170a485ae95d3dc24a5468832792023-02-09 11:03:231 hr 14 mins ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9413.014251804908535141 CRO
0x891ad42b73ace6191d8abfbad984515e3fe6e7d6ec51f1b8f7b49877fe066f5b68832602023-02-09 11:01:351 hr 16 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x929f79c932c76dfcfa572e1bf4ee2a05c0674b960.850231540441643507 CRO
0x891ad42b73ace6191d8abfbad984515e3fe6e7d6ec51f1b8f7b49877fe066f5b68832602023-02-09 11:01:351 hr 16 mins ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90.850231540441643507 CRO
0x4b16c8d9c04b6612967b159c9b99882c1c1d22af7301ed32cc52ea48fb42429968831912023-02-09 10:55:051 hr 23 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x1df8b267588ac0bb0c1d1ae280febe719a88509a1.100773337815548036 CRO
0x4b16c8d9c04b6612967b159c9b99882c1c1d22af7301ed32cc52ea48fb42429968831912023-02-09 10:55:051 hr 23 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token24.461629729234400817 CRO
0x501b72368fe296fd03c40b1a362e87142a4b6dc8f4b80a1e7c0609178aee5e5f68831742023-02-09 10:53:301 hr 24 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x1df8b267588ac0bb0c1d1ae280febe719a88509a17.535408004990468425 CRO
0x501b72368fe296fd03c40b1a362e87142a4b6dc8f4b80a1e7c0609178aee5e5f68831742023-02-09 10:53:301 hr 24 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token389.675733444232631668 CRO
0x506c424e859fc92868fae893062bd6f1427fe935841a06c55101d8ed49a273d968831412023-02-09 10:50:231 hr 27 mins ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90xfd69871b6c57dd6583f051492b123723a80def521 basecro
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x4aE2bD26e60741890Edb9e5C7e984BB396eC26e3

Contract Name:
UniswapV2FactoryDiamond

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 800 runs

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

pragma solidity ^0.8.0;

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 conrtact 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 2 of 29 : IERC173Internal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 3 of 29 : IOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

interface IOwnable is IERC173 {}

File 4 of 29 : IOwnableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

interface IOwnableInternal is IERC173Internal {}

File 5 of 29 : ISafeOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

interface ISafeOwnable is 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 6 of 29 : ISafeOwnableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

interface ISafeOwnableInternal is IOwnableInternal {}

File 7 of 29 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @title Ownership access control based on ERC173
 */
abstract contract Ownable is IOwnable, OwnableInternal {
    using OwnableStorage for OwnableStorage.Layout;

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

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

File 8 of 29 : OwnableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

abstract contract OwnableInternal is IOwnableInternal {
    using OwnableStorage for OwnableStorage.Layout;

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

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

    function _transferOwnership(address account) internal virtual {
        OwnableStorage.layout().setOwner(account);
        emit OwnershipTransferred(msg.sender, account);
    }
}

File 9 of 29 : OwnableStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 10 of 29 : SafeOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { Ownable, OwnableStorage } 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 11 of 29 : SafeOwnableInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

abstract contract SafeOwnableInternal is ISafeOwnableInternal, OwnableInternal {
    using OwnableStorage for OwnableStorage.Layout;
    using SafeOwnableStorage for SafeOwnableStorage.Layout;

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

    /**
     * @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 {
        OwnableStorage.Layout storage l = OwnableStorage.layout();
        emit OwnershipTransferred(l.owner, msg.sender);
        l.setOwner(msg.sender);
        SafeOwnableStorage.layout().setNomineeOwner(address(0));
    }

    /**
     * @notice set nominee owner, granting permission to call acceptOwnership
     */
    function _transferOwnership(address account) internal virtual override {
        SafeOwnableStorage.layout().setNomineeOwner(account);
    }
}

File 12 of 29 : SafeOwnableStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 13 of 29 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { IERC165 } from './IERC165.sol';
import { ERC165Storage } from './ERC165Storage.sol';

/**
 * @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 14 of 29 : ERC165Storage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 15 of 29 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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 16 of 29 : DiamondBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 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 17 of 29 : DiamondBaseStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { AddressUtils } from '../../../utils/AddressUtils.sol';
import { IDiamondWritable } from '../writable/IDiamondWritable.sol';

/**
 * @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(
        IDiamondWritable.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,
        IDiamondWritable.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++) {
                IDiamondWritable.FacetCut memory facetCut = facetCuts[i];
                IDiamondWritable.FacetCutAction action = facetCut.action;

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

                if (action == IDiamondWritable.FacetCutAction.ADD) {
                    (selectorCount, selectorSlot) = l.addFacetSelectors(
                        selectorCount,
                        selectorSlot,
                        facetCut
                    );
                } else if (action == IDiamondWritable.FacetCutAction.REPLACE) {
                    l.replaceFacetSelectors(facetCut);
                } else if (action == IDiamondWritable.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,
        IDiamondWritable.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,
        IDiamondWritable.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,
        IDiamondWritable.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 18 of 29 : IDiamondBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

interface IDiamondBase is IProxy {}

File 19 of 29 : ISolidStateDiamond.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    /**
     * @notice get the address of the fallback contract
     * @return fallback address
     */
    function getFallbackAddress() external view returns (address);

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

File 20 of 29 : DiamondReadable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 21 of 29 : IDiamondReadable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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 22 of 29 : SolidStateDiamond.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { IOwnable, Ownable, OwnableInternal, OwnableStorage } from '../../access/ownable/Ownable.sol';
import { ISafeOwnable, SafeOwnable } from '../../access/ownable/SafeOwnable.sol';
import { IERC173 } from '../../access/IERC173.sol';
import { ERC165, IERC165, ERC165Storage } from '../../introspection/ERC165.sol';
import { DiamondBase, DiamondBaseStorage } from './base/DiamondBase.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,
    DiamondReadable,
    DiamondWritable,
    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 DiamondWritable

        selectors[0] = IDiamondWritable.diamondCut.selector;

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

        // register DiamondReadable

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

        erc165.setSupportedInterface(type(IDiamondReadable).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] = Ownable.transferOwnership.selector;
        selectors[9] = SafeOwnable.acceptOwnership.selector;

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

        // register Diamond

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

        // diamond cut

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

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

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

        // set owner

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

    receive() external payable {}

    /**
     * @inheritdoc ISolidStateDiamond
     */
    function getFallbackAddress() external view returns (address) {
        return DiamondBaseStorage.layout().fallbackAddress;
    }

    /**
     * @inheritdoc ISolidStateDiamond
     */
    function setFallbackAddress(address fallbackAddress) external onlyOwner {
        DiamondBaseStorage.layout().fallbackAddress = fallbackAddress;
    }

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

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

pragma solidity ^0.8.0;

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

/**
 * @title EIP-2535 "Diamond" proxy update contract
 */
abstract contract DiamondWritable is IDiamondWritable, OwnableInternal {
    using DiamondBaseStorage for DiamondBaseStorage.Layout;

    /**
     * @inheritdoc IDiamondWritable
     */
    function diamondCut(
        FacetCut[] calldata facetCuts,
        address target,
        bytes calldata data
    ) external onlyOwner {
        DiamondBaseStorage.layout().diamondCut(facetCuts, target, data);
    }
}

File 24 of 29 : IDiamondWritable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Diamond proxy upgrade interface
 * @dev see https://eips.ethereum.org/EIPS/eip-2535
 */
interface IDiamondWritable {
    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 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 25 of 29 : IProxy.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IProxy {
    fallback() external payable;
}

File 26 of 29 : Proxy.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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();

        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 27 of 29 : AddressUtils.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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 28 of 29 : UintUtils.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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 29 of 29 : UniswapV2FactoryDiamond.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

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

contract UniswapV2FactoryDiamond is SolidStateDiamond {}

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

Contract ABI

[{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"enum IDiamondWritable.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondWritable.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 IDiamondWritable.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"}],"internalType":"struct IDiamondWritable.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":"","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"}]

60806040523480156200001157600080fd5b506000620000296200048160201b62000ef81760201c565b60408051600c8082526101a08201909252919250600091906020820161018080368337019050509050631f931c1c60e01b816000815181106200007057620000706200103a565b6001600160e01b0319909216602092830291909101820152620000aa9083906307e4c70760e21b9060019062000f1c620004a5821b17901c565b637a0ed62760e01b81600181518110620000c857620000c86200103a565b6001600160e01b03199092166020928302919091019091015280516356fe50af60e11b90829060029081106200010257620001026200103a565b6001600160e01b03199092166020928302919091019091015280516314bbdacb60e21b90829060039081106200013c576200013c6200103a565b6001600160e01b03199092166020928302919091019091015280516366ffd66360e11b90829060049081106200017657620001766200103a565b6001600160e01b0319909216602092830291909101820152620001b09083906348e2b09360e01b9060019062000f1c620004a5821b17901c565b6301ffc9a760e01b81600581518110620001ce57620001ce6200103a565b6001600160e01b0319909216602092830291909101820152620002089083906301ffc9a760e01b9060019062000f1c620004a5821b17901c565b638da5cb5b60e01b816006815181106200022657620002266200103a565b6001600160e01b031990921660209283029190910190910152805163455a8a8560e11b90829060079081106200026057620002606200103a565b6001600160e01b031990921660209283029190910190910152805163f2fde38b60e01b90829060089081106200029a576200029a6200103a565b6001600160e01b03199092166020928302919091019091015280516379ba509760e01b9082906009908110620002d457620002d46200103a565b6001600160e01b03199092166020928302919091018201526200030e9083906307f5828d60e41b9060019062000f1c620004a5821b17901c565b632c40805960e01b81600a815181106200032c576200032c6200103a565b6001600160e01b0319909216602092830291909101909101528051639142376560e01b908290600b9081106200036657620003666200103a565b6001600160e01b03199290921660209283029190910190910152604080516001808252818301909252600091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816200039757905050604080516060810190915230815290915060208101600081526020018381525081600081518110620003fd57620003fd6200103a565b60200260200101819052506200044a81600060405180602001604052806000815250620004346200053360201b62000fa41760201c565b6200055760201b62000fc817909392919060201c565b6200047833620004646200078360201b620011a41760201c565b620007a760201b620011c81790919060201c565b505050620011df565b7f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e70590565b6001600160e01b03198083169003620005055760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e746572666163652069640000000060448201526064015b60405180910390fd5b6001600160e01b03199190911660009081526020929092526040909120805460ff1916911515919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9390565b600184015461ffff811690819060009060071615620005885750600381901c60009081526002870160205260409020545b60005b8651811015620006f1576000878281518110620005ac57620005ac6200103a565b60200260200101519050600081602001519050600082604001515111620006225760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b6064820152608401620004fc565b600081600281111562000639576200063962001050565b0362000668576200065d8585848d620007c460201b620011e517909392919060201c565b9095509350620006e6565b60018160028111156200067f576200067f62001050565b03620006a5576200069f828b6200099660201b6200139d1790919060201c565b620006e6565b6002816002811115620006bc57620006bc62001050565b03620006e657620006e08585848d62000bd760201b6200160017909392919060201c565b90955093505b50506001016200058b565b508282146200070e5760018701805461ffff191661ffff84161790555b60078216156200073157600382901c600090815260028801602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738686866040516200076693929190620010ba565b60405180910390a16200077a858562000ea5565b50505050505050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b81546001600160a01b0319166001600160a01b0391909116179055565b805160009081906001600160a01b03163014806200080057506200080083600001516001600160a01b03166200103460201b6200047c1760201c565b6200085a5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b6064820152608401620004fc565b60005b83604001515181101562000989576000846040015182815181106200088657620008866200103a565b6020908102919091018101516001600160e01b031981166000908152918a9052604090912054909150606081901c156200090f5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b6064820152608401620004fc565b85516001600160e01b0319838116600081815260208d90526040902060609390931b6001600160601b0319168b1790925560058a901b60e090811692831c91831c199990991617978190036200097957600389901c600090815260028b0160205260408120989098555b505050600195860195016200085d565b5093959294509192505050565b620009b981600001516001600160a01b03166200103460201b6200047c1760201c565b62000a175760405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c4143452074617267657420686173206044820152666e6f20636f646560c81b6064820152608401620004fc565b60005b81604001515181101562000bd25760008260400151828151811062000a435762000a436200103a565b6020908102919091018101516001600160e01b03198116600090815291869052604090912054909150606081901c8062000ac05760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401620004fc565b306001600160a01b0382160362000b145760405162461bcd60e51b81526020600482015260226024820152600080516020620033dc8339815191526044820152616c6560f01b6064820152608401620004fc565b84600001516001600160a01b0316816001600160a01b03160362000b8c5760405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201526719195b9d1a58d85b60c21b6064820152608401620004fc565b5083516001600160e01b031992909216600090815260208690526040902060609290921b6001600160601b0319166001600160601b039190911617905560010162000a1a565b505050565b805160009081906001600160a01b03161562000c4e5760405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201526e6265207a65726f206164647265737360881b6064820152608401620004fc565b600385901c6007861660005b85604001515181101562000e915760008660400151828151811062000c835762000c836200103a565b6020908102919091018101516001600160e01b031981166000908152918c9052604090912054909150606081901c62000cff5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401620004fc565b30606082901c0362000d4e5760405162461bcd60e51b81526020600482015260226024820152600080516020620033dc8339815191526044820152616c6560f01b6064820152608401620004fc565b600089900362000d7c57600019909401600081815260028c0160205260409020549850936007935062000d84565b600019909301925b600584901b89901b6000806001600160e01b03198084169086161462000dd7576001600160e01b03198316600090815260208f90526040902080546001600160601b0319166001600160601b0386161790555b50506001600160e01b03198316600090815260208d90526040812055611fff600383901c1660e0600584901b1687821462000e3c57600082815260028f016020526040902080546001600160e01b031980841c19909116908516831c17905562000e60565b80836001600160e01b031916901c816001600160e01b031960001b901c198d16179b505b8660000362000e7f57600088815260028f01602052604081208190559b505b50506001909301925062000c5a915050565b5060039190911b1796939550929350505050565b8051156001600160a01b038316151462000f195760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201526d696f6e20706172616d657465727360901b6064820152608401620004fc565b6001600160a01b0382161562001030576001600160a01b038216301462000fbe5762000f59826001600160a01b03166200103460201b6200047c1760201c565b62000fbe5760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201526d657420686173206e6f20636f646560901b6064820152608401620004fc565b6000826001600160a01b03168260405162000fda9190620011c1565b600060405180830381855af49150503d806000811462001017576040519150601f19603f3d011682016040523d82523d6000602084013e6200101c565b606091505b505090508062000bd2573d6000803e3d6000fd5b5050565b3b151590565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b60005b838110156200108357818101518382015260200162001069565b50506000910152565b60008151808452620010a681602086016020860162001066565b601f01601f19169290920160200192915050565b60006060808301818452808751808352608092508286019150828160051b8701016020808b0160005b848110156200118f57898403607f19018652815180516001600160a01b031685528381015189860190600381106200112b57634e487b7160e01b600052602160045260246000fd5b868601526040918201519186018a905281519081905290840190600090898701905b80831015620011795783516001600160e01b03191682529286019260019290920191908601906200114d565b50978501979550505090820190600101620010e3565b50506001600160a01b038a16908801528681036040880152620011b381896200108c565b9a9950505050505050505050565b60008251620011d581846020870162001066565b9190910192915050565b6121ed80620011ef6000396000f3fe6080604052600436106100cb5760003560e01c80638ab5150a11610074578063adfca15e1161004e578063adfca15e14610308578063cdffacc614610335578063f2fde38b1461038e576100d2565b80638ab5150a146102be5780638da5cb5b146102d357806391423765146102e8576100d2565b806352ef6b2c116100a557806352ef6b2c1461026557806379ba5097146102875780637a0ed6271461029c576100d2565b806301ffc9a7146101865780631f931c1c146101f45780632c40805914610214576100d2565b366100d257005b60006100dc6103ae565b90506001600160a01b0381163b6101605760405162461bcd60e51b815260206004820152602660248201527f50726f78793a20696d706c656d656e746174696f6e206d75737420626520636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e80801561017f573d6000f35b3d6000fd5b005b34801561019257600080fd5b506101df6101a1366004611bd0565b6001600160e01b03191660009081527f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e705602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561020057600080fd5b5061018461020f366004611c4b565b610482565b34801561022057600080fd5b507f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546001600160a01b03165b6040516001600160a01b0390911681526020016101eb565b34801561027157600080fd5b5061027a610558565b6040516101eb9190611cfd565b34801561029357600080fd5b5061018461072e565b3480156102a857600080fd5b506102b16107c6565b6040516101eb9190611d8f565b3480156102ca57600080fd5b5061024d610c21565b3480156102df57600080fd5b5061024d610c30565b3480156102f457600080fd5b50610184610303366004611e0c565b610c3a565b34801561031457600080fd5b50610328610323366004611e0c565b610cf4565b6040516101eb9190611e27565b34801561034157600080fd5b5061024d610350366004611bd0565b6001600160e01b03191660009081527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604090205460601c90565b34801561039a57600080fd5b506101846103a9366004611e0c565b610e73565b600080356001600160e01b03191681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9360208190526040822054819060601c80610475575060038201546001600160a01b0316806104755760405162461bcd60e51b815260206004820152603260248201527f4469616d6f6e64426173653a206e6f20666163657420666f756e6420666f722060448201527f66756e6374696f6e207369676e617475726500000000000000000000000000006064820152608401610157565b9392505050565b3b151590565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460546001600160a01b031633146104fb5760405162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a2073656e646572206d757374206265206f776e65720000006044820152606401610157565b6105516105088587611efd565b8484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105499250610fa4915050565b929190610fc8565b5050505050565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc94546060907f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc939061ffff1667ffffffffffffffff8111156105bb576105bb611e69565b6040519080825280602002602001820160405280156105e4578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610726576000818152600285016020526040812054905b6008811015610711578361062381612047565b600188015490955061ffff168511905061071157600581901b82901b6001600160e01b0319811660009081526020889052604081205460601c90805b888110156106b4578a818151811061067957610679612060565b60200260200101516001600160a01b0316836001600160a01b0316036106a257600191506106b4565b806106ac81612047565b91505061065f565b5080156106c3575050506106ff565b818a89815181106106d6576106d6612060565b6001600160a01b0390921660209283029190910190910152876106f881612047565b9850505050505b8061070981612047565b915050610610565b5050808061071e90612047565b9150506105ed565b505082525090565b6107366118e6565b6001600160a01b0316336001600160a01b0316146107bc5760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d6960448201527f6e6565206f776e657200000000000000000000000000000000000000000000006064820152608401610157565b6107c4611919565b565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc94546060907f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc939061ffff1667ffffffffffffffff81111561082957610829611e69565b60405190808252806020026020018201604052801561086f57816020015b6040805180820190915260008152606060208201528152602001906001900390816108475790505b50600182015490925060009061ffff1667ffffffffffffffff81111561089757610897611e69565b6040519080825280602002602001820160405280156108c0578160200160208202803683370190505b50905060008060005b600185015461ffff16821015610baf576000818152600286016020526040812054905b6008811015610b9a57836108ff81612047565b600189015490955061ffff1685119050610b9a57600581901b82901b6001600160e01b0319811660009081526020899052604081205460601c90805b88811015610a5857826001600160a01b03168c828151811061095f5761095f612060565b6020026020010151600001516001600160a01b031603610a4657838c828151811061098c5761098c612060565b6020026020010151602001518b83815181106109aa576109aa612060565b602002602001015160ff16815181106109c5576109c5612060565b60200260200101906001600160e01b03191690816001600160e01b0319168152505060ff8a82815181106109fb576109fb612060565b602002602001015160ff1610610a1057600080fd5b898181518110610a2257610a22612060565b602002602001018051809190610a3790612076565b60ff1690525060019150610a58565b80610a5081612047565b91505061093b565b508015610a6757505050610b88565b818b8981518110610a7a57610a7a612060565b60209081029190910101516001600160a01b03909116905260018a015461ffff1667ffffffffffffffff811115610ab357610ab3611e69565b604051908082528060200260200182016040528015610adc578160200160208202803683370190505b508b8981518110610aef57610aef612060565b602002602001015160200181905250828b8981518110610b1157610b11612060565b602002602001015160200151600081518110610b2f57610b2f612060565b60200260200101906001600160e01b03191690816001600160e01b031916815250506001898981518110610b6557610b65612060565b60ff9092166020928302919091019091015287610b8181612047565b9850505050505b80610b9281612047565b9150506108ec565b50508080610ba790612047565b9150506108c9565b5060005b82811015610c16576000848281518110610bcf57610bcf612060565b602002602001015160ff1690506000878381518110610bf057610bf0612060565b602002602001015160200151905081815250508080610c0e90612047565b915050610bb3565b508185525050505090565b6000610c2b6118e6565b905090565b6000610c2b6119c6565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460546001600160a01b03163314610cb35760405162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a2073656e646572206d757374206265206f776e65720000006044820152606401610157565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9680546001600160a01b0319166001600160a01b0392909216919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc94546060907f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc939061ffff1667ffffffffffffffff811115610d5757610d57611e69565b604051908082528060200260200182016040528015610d80578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610e69576000818152600285016020526040812054905b6008811015610e545783610dbf81612047565b600188015490955061ffff1685119050610e5457600581901b82901b6001600160e01b0319811660009081526020889052604090205460601c6001600160a01b038a1603610e415780888781518110610e1a57610e1a612060565b6001600160e01b03199092166020928302919091019091015285610e3d81612047565b9650505b5080610e4c81612047565b915050610dac565b50508080610e6190612047565b915050610d89565b5050825250919050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460546001600160a01b03163314610eec5760405162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a2073656e646572206d757374206265206f776e65720000006044820152606401610157565b610ef5816119ee565b50565b7f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e70590565b6001600160e01b03198083169003610f765760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e74657266616365206964000000006044820152606401610157565b6001600160e01b03199190911660009081526020929092526040909120805460ff1916911515919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9390565b600184015461ffff811690819060009060071615610ff85750600381901c60009081526002870160205260409020545b60005b865181101561111857600087828151811061101857611018612060565b6020026020010151905060008160200151905060008260400151511161108c5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b6064820152608401610157565b60008160028111156110a0576110a0612095565b036110bb576110b18a8686856111e5565b909550935061110e565b60018160028111156110cf576110cf612095565b036110e3576110de8a8361139d565b61110e565b60028160028111156110f7576110f7612095565b0361110e576111088a868685611600565b90955093505b5050600101610ffb565b508282146111345760018701805461ffff191661ffff84161790555b600782161561115657600382901c600090815260028801602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673868686604051611189939291906120fb565b60405180910390a161119b85856119f7565b50505050505050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b81546001600160a01b0319166001600160a01b0391909116179055565b805160009081906001600160a01b031630148061120c575082516001600160a01b03163b15155b6112645760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b6064820152608401610157565b60005b8360400151518110156113905760008460400151828151811061128c5761128c612060565b6020908102919091018101516001600160e01b031981166000908152918a9052604090912054909150606081901c156113135760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b6064820152608401610157565b85516001600160e01b0319838116600081815260208d90526040902060609390931b6bffffffffffffffffffffffff19168b1790925560058a901b60e090811692831c91831c1999909916179781900361138157600389901c600090815260028b0160205260408120989098555b50505060019586019501611267565b5093959294509192505050565b80516001600160a01b03163b61141b5760405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c41434520746172676574206861732060448201527f6e6f20636f6465000000000000000000000000000000000000000000000000006064820152608401610157565b60005b8160400151518110156115fb5760008260400151828151811061144357611443612060565b6020908102919091018101516001600160e01b03198116600090815291869052604090912054909150606081901c806114be5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610157565b306001600160a01b038216036115215760405162461bcd60e51b815260206004820152602260248201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d757461626044820152616c6560f01b6064820152608401610157565b84600001516001600160a01b0316816001600160a01b0316036115ac5760405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201527f64656e746963616c0000000000000000000000000000000000000000000000006064820152608401610157565b5083516001600160e01b031992909216600090815260208690526040902060609290921b6bffffffffffffffffffffffff19166bffffffffffffffffffffffff9190911617905560010161141e565b505050565b805160009081906001600160a01b0316156116835760405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201527f6265207a65726f206164647265737300000000000000000000000000000000006064820152608401610157565b600385901c6007861660005b8560400151518110156118d2576000866040015182815181106116b4576116b4612060565b6020908102919091018101516001600160e01b031981166000908152918c9052604090912054909150606081901c61172e5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610157565b30606082901c0361178c5760405162461bcd60e51b815260206004820152602260248201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d757461626044820152616c6560f01b6064820152608401610157565b60008990036117b857600019909401600081815260028c016020526040902054985093600793506117c0565b600019909301925b600584901b89901b6000806001600160e01b03198084169086161461181c576001600160e01b03198316600090815260208f90526040902080546bffffffffffffffffffffffff19166bffffffffffffffffffffffff86161790555b50506001600160e01b03198316600090815260208d90526040812055611fff600383901c1660e0600584901b1687821461187f57600082815260028f016020526040902080546001600160e01b031980841c19909116908516831c1790556118a3565b80836001600160e01b031916901c816001600160e01b031960001b901c198d16179b505b866000036118c157600088815260028f01602052604081208190559b505b50506001909301925061168f915050565b5060039190911b1796939550929350505050565b60007f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178905b546001600160a01b0316919050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460805460405133916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a380546001600160a01b03191633178155610ef560007f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178905b9081546001600160a01b0319166001600160a01b0391909116179055565b60007f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046061190a565b610ef581611b85565b8051156001600160a01b0383161514611a785760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201527f696f6e20706172616d65746572730000000000000000000000000000000000006064820152608401610157565b6001600160a01b03821615611b81576001600160a01b0382163014611b14576001600160a01b0382163b611b145760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201527f657420686173206e6f20636f64650000000000000000000000000000000000006064820152608401610157565b6000826001600160a01b031682604051611b2e91906121c4565b600060405180830381855af49150503d8060008114611b69576040519150601f19603f3d011682016040523d82523d6000602084013e611b6e565b606091505b50509050806115fb573d6000803e3d6000fd5b5050565b610ef581610ef5817f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178906119a8565b80356001600160e01b031981168114611bcb57600080fd5b919050565b600060208284031215611be257600080fd5b61047582611bb3565b80356001600160a01b0381168114611bcb57600080fd5b60008083601f840112611c1457600080fd5b50813567ffffffffffffffff811115611c2c57600080fd5b602083019150836020828501011115611c4457600080fd5b9250929050565b600080600080600060608688031215611c6357600080fd5b853567ffffffffffffffff80821115611c7b57600080fd5b818801915088601f830112611c8f57600080fd5b813581811115611c9e57600080fd5b8960208260051b8501011115611cb357600080fd5b60208301975080965050611cc960208901611beb565b94506040880135915080821115611cdf57600080fd5b50611cec88828901611c02565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b81811015611d3e5783516001600160a01b031683529284019291840191600101611d19565b50909695505050505050565b600081518084526020808501945080840160005b83811015611d845781516001600160e01b03191687529582019590820190600101611d5e565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611dfe57888303603f19018552815180516001600160a01b03168452870151878401879052611deb87850182611d4a565b9588019593505090860190600101611db6565b509098975050505050505050565b600060208284031215611e1e57600080fd5b61047582611beb565b6020808252825182820181905260009190848201906040850190845b81811015611d3e5783516001600160e01b03191683529284019291840191600101611e43565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611ea257611ea2611e69565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611ed157611ed1611e69565b604052919050565b600067ffffffffffffffff821115611ef357611ef3611e69565b5060051b60200190565b6000611f10611f0b84611ed9565b611ea8565b83815260208082019190600586811b860136811115611f2e57600080fd5b865b8181101561202457803567ffffffffffffffff80821115611f515760008081fd5b818a01915060608236031215611f675760008081fd5b611f6f611e7f565b611f7883611beb565b81528683013560038110611f8c5760008081fd5b8188015260408381013583811115611fa45760008081fd5b939093019236601f850112611fbb57600092508283fd5b83359250611fcb611f0b84611ed9565b83815292871b84018801928881019036851115611fe85760008081fd5b948901945b8486101561200d57611ffe86611bb3565b82529489019490890190611fed565b918301919091525088525050948301948301611f30565b5092979650505050505050565b634e487b7160e01b600052601160045260246000fd5b60006001820161205957612059612031565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff810361208c5761208c612031565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b60005b838110156120c65781810151838201526020016120ae565b50506000910152565b600081518084526120e78160208601602086016120ab565b601f01601f19169290920160200192915050565b6000606080830181845280875180835260808601915060808160051b87010192506020808a016000805b8481101561219457898703607f19018652825180516001600160a01b03168852848101516003811061216557634e487b7160e01b84526021600452602484fd5b8886015260409081015190880189905261218189890182611d4a565b9750509483019491830191600101612125565b5050506001600160a01b03891690870152505083810360408501526121b981866120cf565b979650505050505050565b600082516121d68184602087016120ab565b919091019291505056fea164736f6c6343000810000a4469616d6f6e64426173653a2073656c6563746f7220697320696d6d75746162

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.