Contract 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9

Contract Overview

Balance:
85 CRO

CRO Value:
$10.45 (@ $0.12/CRO)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x1b9f06234e885e6c280634ebe7a0388087e4bd2e512b42f1ae3ce4dc1e6a2e59Add Liquidity ET...124813382024-02-09 17:38:4970 days 17 hrs ago0x8417896121c43302400bfa63acc3009d74ce66ec IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9100 CRO2.46468280
0xd50a6899d18ae7da614190c5c11a4b76d35e98dad3d9ae5413aa8b513ae0b5e0Add Liquidity ET...123416192024-01-31 15:25:3779 days 19 hrs ago0x8417896121c43302400bfa63acc3009d74ce66ec IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a930 CRO2.75061380
0x8e315b33621b6b3d7c1ca1d3e58b6e52bfabcf234ed663c6b12e035805487fcaAdd Liquidity ET...112470372023-11-21 11:03:58150 days 23 hrs ago0xf6cfc7f80d977c2651c62211296dab111b3b914f IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9124.036901341315249 CRO0.922558528354 4,618.05722701
0x539e60d9f2ac5782a3f3ec2c9a10468f128147f915ecf65c65499a8240d991bdAdd Liquidity ET...107960482023-10-23 2:21:24180 days 8 hrs agoCronos ID Name bones.cro IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90.213703023045203 CRO0.771103743290
0x4d9f3b1ed1af0eeb5e723d430843426321481b73b40796f4cef435b36634e5b6Add Liquidity ET...106987542023-10-16 18:05:39186 days 16 hrs agoCronos ID Name xyroal.cro IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a961.410021501204737 CRO1.011155937187 4,640.969804784
0x27fb09a11dd8847c9e0f420059643c8bdcf59d867dfe0ead5fc5e479a70f23f3Add Liquidity ET...104912632023-10-03 4:44:34200 days 5 hrs agoCronos ID Name rebelpunk.cro IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90.020077929625218 CRO1.0002813016860
0xa03240900a6b0ee1ad5328fbca84e6dfa9d349ecf37d6575b50e7b32c1154746Add Liquidity ET...103825402023-09-26 2:26:02207 days 8 hrs agoCronos ID Name bones.cro IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a918.228042093083512 CRO4.3455598721280
0x6a069ddd1a41bc533a645f998b0e81c86953a6b3d9a81ea3fdaf5b79f220f9dcAdd Liquidity ET...103825082023-09-26 2:23:01207 days 8 hrs agoCronos ID Name bones.cro IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a92.068609980177668 CRO2.9620937703420
0xbef0cbfb90da36c38b1c07270086ff273189f902cd0115a59edf4f865c5d9a17Add Liquidity ET...103133922023-09-21 14:09:49211 days 20 hrs ago0x8417896121c43302400bfa63acc3009d74ce66ec IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a91,000 CRO1.2164476070380
0x537422833d8b5ba9635907fdc5d4f2e06dc268098ce767d0f4d19c517296d190Add Liquidity ET...103128362023-09-21 13:17:34211 days 21 hrs ago0x87cf748198d910cbeacfde4f43b49f53590db19e IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a91,000 CRO1.1012504392480
0x7b88c1f17e88e5b20bc1911f8103b5d0f9dd5e9435bda1654c623cb2eb432441Add Liquidity ET...102887282023-09-19 23:34:36213 days 11 hrs ago0xf6cfc7f80d977c2651c62211296dab111b3b914f IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9170.068311813686239 CRO1.015532490781 4,661.057164542
0x8b91baa338a75157e3d6ae3463e82e9e7942c82c28ca02a0c01ad77c8c0a4bffAdd Liquidity ET...102703782023-09-18 18:51:45214 days 15 hrs ago0x87cf748198d910cbeacfde4f43b49f53590db19e IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a910 CRO1.1561216306560
0x77e62d1a27755147461bf1184efd73a5fb7c9a7aab165dbb0e3ec618d4f13f29Add Liquidity ET...102039322023-09-14 10:48:55218 days 23 hrs ago0x5c7d91de3bf6ef7436892ecd4738b9eca8c3da90 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a910 CRO1.12308215013 4,989.90163162
0x23a31a7819d7168e6b8946f130aae6d8f91e77f2d0d370ab5d6b8c7ba6fde82eAdd Liquidity101739392023-09-12 11:51:15220 days 22 hrs agoCronos ID Name ngchung.cro IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.9820597218330
0x18290492ab44462e7f172afa62df3045ba176237c9659167722fdb9a403fb093Add Liquidity99785352023-08-30 18:03:01233 days 16 hrs agoCronos ID Name ngchung.cro IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.9065931523090
0x3fbe4c74bc0aacd675c950ea7ca921ef6e3a315cfbdcbb70b14de699541d2327Add Liquidity ET...99650682023-08-29 20:59:11234 days 13 hrs ago0xc81f93cd8f572466388830072e16f5afaefefacb IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a919.033007270866415 CRO0.941248637803 4,675.780479198
0x59fad216446bb818e71affcb07707656a5718d6c4dbfd8033def2215b9ba2e6fAdd Liquidity ET...97459892023-08-15 13:49:46248 days 20 hrs agoCronos ID Name xyroal.cro IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a985.304986568607779 CRO1.020648915601 4,684.260864941
0x57451431a0f1a870b259e79723ca18cbd30526ac34972fa18952655e866d046eSwap Exact Token...87262382023-06-10 1:56:26315 days 8 hrs ago0x19836a441002a773174a022dc283a4dd6114e0f7 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.9253655708020
0x573ad524dd1e907a3e163926ffbf31103a64e889aeac5c90f6632191f798c9b5Swap Exact ETH F...87262312023-06-10 1:55:45315 days 8 hrs ago0x19836a441002a773174a022dc283a4dd6114e0f7 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a973.741008583955576 CRO0.9622846775170
0xada07c60f04a246130ec669a141888dec72b9a0ab4732387f8e78556f8b07a1bSwap Exact Token...86431282023-06-04 15:04:21320 days 19 hrs ago0xc05e3657e5b56850c42557348d5fde947d6fe801 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.6875802072660
0x3b8df3c09c0f75fe4f3e866d6577249e99aad4d74e6f9028840edaa7138cd4faSwap Exact Token...86431222023-06-04 15:03:47320 days 19 hrs ago0xa74f8a5d952d3af06139e1bd6662137730533f42 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.664967867770
0x553180ffd1d777f7584b044f5a8945445720e994ecaf86c1ee7246b4a23c5190Swap Exact Token...85321112023-05-28 8:17:23328 days 2 hrs ago0xf57c2d2a6f5c44be26be17c9ec33cef652f527a1 IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.274885903350
0x21b118bcb9c96e26c691fd9e8961c903d41a9888a11beadf79ec889516910606Swap Exact Token...84352052023-05-21 23:43:19334 days 10 hrs ago0x303fd0a17e8f6f01b06dffa64736fbced50634aa IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.6663125481450
0x27b02efea82b3359ae448919eddacb222352ce104a614bc36fb4144ec5278ee0Swap Exact Token...83530482023-05-16 14:22:17339 days 20 hrs ago0xb3b40bfa812f24c1bea73d905c0982622356794c IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO0.627762328511 4,750.448955046
0x2d89183401ca1d3f5d5c1514eb0e6f400b238a100c33d84d2aea6f217f3d3fa5Add Liquidity82407552023-05-09 5:52:01347 days 4 hrs agoCronos ID Name miacrypto.cro IN  0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90 CRO1.5286981008410
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x88b9d6dc13dfeb73ec99cc63f5ca24a1f4af9018e43e10a889d919c595e41b96131647722024-03-25 0:48:0926 days 9 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 0x1c3755958472b573af3ad9b6a9deac415056e8e5164.56784004047724091 CRO
0x88b9d6dc13dfeb73ec99cc63f5ca24a1f4af9018e43e10a889d919c595e41b96131647722024-03-25 0:48:0926 days 9 hrs ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9164.56784004047724091 CRO
0x552eea344277d2212500f5ff2aebe4ca3d3345abe1311d87a70431d536388150131646652024-03-25 0:38:0826 days 10 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 0x1c3755958472b573af3ad9b6a9deac415056e8e5156.216863949791590042 CRO
0x552eea344277d2212500f5ff2aebe4ca3d3345abe1311d87a70431d536388150131646652024-03-25 0:38:0826 days 10 hrs ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9156.216863949791590042 CRO
0xd0d2ca90fe0a51128b4929f7645eba91228d33f005edd232799bcd4b6ce4a5d6126593442024-02-21 7:51:0259 days 2 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 0x1c3755958472b573af3ad9b6a9deac415056e8e572.146939018023755254 CRO
0xd0d2ca90fe0a51128b4929f7645eba91228d33f005edd232799bcd4b6ce4a5d6126593442024-02-21 7:51:0259 days 2 hrs ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a972.146939018023755254 CRO
0x1b9f06234e885e6c280634ebe7a0388087e4bd2e512b42f1ae3ce4dc1e6a2e59124813382024-02-09 17:38:4970 days 17 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x8417896121c43302400bfa63acc3009d74ce66ec0.00000000000054024 CRO
0x1b9f06234e885e6c280634ebe7a0388087e4bd2e512b42f1ae3ce4dc1e6a2e59124813382024-02-09 17:38:4970 days 17 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token99.99999999999945976 CRO
0x6b16663e94bb435fcc4d05f6e3ce5f5365bf291abd9cb86acf672f6b381cacc7124201602024-02-05 18:04:5574 days 16 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token90 CRO
0x6b16663e94bb435fcc4d05f6e3ce5f5365bf291abd9cb86acf672f6b381cacc7124201602024-02-05 18:04:5574 days 16 hrs ago 0x1c3755958472b573af3ad9b6a9deac415056e8e5 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a990 CRO
0xd50a6899d18ae7da614190c5c11a4b76d35e98dad3d9ae5413aa8b513ae0b5e0123416192024-01-31 15:25:3779 days 19 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a90x8417896121c43302400bfa63acc3009d74ce66ec0.000000000000125795 CRO
0xd50a6899d18ae7da614190c5c11a4b76d35e98dad3d9ae5413aa8b513ae0b5e0123416192024-01-31 15:25:3779 days 19 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token29.999999999999874205 CRO
0xd9e66a402ba77e9596bae65557e732da9188a26be6a0efdf4b990095dfc6af22122503952024-01-25 16:55:4185 days 17 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 0x1c3755958472b573af3ad9b6a9deac415056e8e5121.687560869017277633 CRO
0xd9e66a402ba77e9596bae65557e732da9188a26be6a0efdf4b990095dfc6af22122503952024-01-25 16:55:4185 days 17 hrs ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9121.687560869017277633 CRO
0x952336860d106f61746b006a5159c74f00e6839a5bc2601f9caf6088b29df9f5121507852024-01-19 5:39:4992 days 5 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token70 CRO
0x952336860d106f61746b006a5159c74f00e6839a5bc2601f9caf6088b29df9f5121507852024-01-19 5:39:4992 days 5 hrs ago 0x1c3755958472b573af3ad9b6a9deac415056e8e5 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a970 CRO
0x125ed96728c80d0f3d026c2343c64748a8703b7118d227a6126cdc5e33ec08d2118010092023-12-27 11:56:23114 days 22 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 0x1c3755958472b573af3ad9b6a9deac415056e8e5145.034440767326886489 CRO
0x125ed96728c80d0f3d026c2343c64748a8703b7118d227a6126cdc5e33ec08d2118010092023-12-27 11:56:23114 days 22 hrs ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9145.034440767326886489 CRO
0xc0c4b8a9360160d2ae4d3267bd6580ae1afe0a01e34e75f7252ff0fb5ce5f734117334702023-12-23 2:42:50119 days 7 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 0x1c3755958472b573af3ad9b6a9deac415056e8e5453.388627867560017523 CRO
0xc0c4b8a9360160d2ae4d3267bd6580ae1afe0a01e34e75f7252ff0fb5ce5f734117334702023-12-23 2:42:50119 days 7 hrs ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9453.388627867560017523 CRO
0xd3b87ad1566ccc1da974056310e19f71b2498b118d29aae033757135f4ff3f2e116346402023-12-16 16:29:25125 days 18 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 0x1c3755958472b573af3ad9b6a9deac415056e8e5466.999597488704973694 CRO
0xd3b87ad1566ccc1da974056310e19f71b2498b118d29aae033757135f4ff3f2e116346402023-12-16 16:29:25125 days 18 hrs ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9466.999597488704973694 CRO
0xc36413af8a314340e141a27ef05e21f45e2d10ecbd2f484f3cf3697da4ecf22d116346002023-12-16 16:25:45125 days 18 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 0x1c3755958472b573af3ad9b6a9deac415056e8e5241.245739239458814557 CRO
0xc36413af8a314340e141a27ef05e21f45e2d10ecbd2f484f3cf3697da4ecf22d116346002023-12-16 16:25:45125 days 18 hrs ago Cronos: WCRO Token 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9241.245739239458814557 CRO
0x8e315b33621b6b3d7c1ca1d3e58b6e52bfabcf234ed663c6b12e035805487fca112470372023-11-21 11:03:58150 days 23 hrs ago 0x6c3a0e2e78848274b7e3346b8ef8a4cbb2fee2a9 Cronos: WCRO Token124.036901341315249842 CRO
[ Download CSV Export 
Index Block
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
This contract matches the deployed Bytecode of the Source Code for Contract 0x4aE2bD26e60741890Edb9e5C7e984BB396eC26e3
The constructor portion of the code might be different and could alter the actual behaviour of the contract

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

Deployed Bytecode

0x6080604052600436106100cb5760003560e01c80638ab5150a11610074578063adfca15e1161004e578063adfca15e14610308578063cdffacc614610335578063f2fde38b1461038e576100d2565b80638ab5150a146102be5780638da5cb5b146102d357806391423765146102e8576100d2565b806352ef6b2c116100a557806352ef6b2c1461026557806379ba5097146102875780637a0ed6271461029c576100d2565b806301ffc9a7146101865780631f931c1c146101f45780632c40805914610214576100d2565b366100d257005b60006100dc6103ae565b90506001600160a01b0381163b6101605760405162461bcd60e51b815260206004820152602660248201527f50726f78793a20696d706c656d656e746174696f6e206d75737420626520636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e80801561017f573d6000f35b3d6000fd5b005b34801561019257600080fd5b506101df6101a1366004611bd0565b6001600160e01b03191660009081527f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e705602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561020057600080fd5b5061018461020f366004611c4b565b610482565b34801561022057600080fd5b507f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc96546001600160a01b03165b6040516001600160a01b0390911681526020016101eb565b34801561027157600080fd5b5061027a610558565b6040516101eb9190611cfd565b34801561029357600080fd5b5061018461072e565b3480156102a857600080fd5b506102b16107c6565b6040516101eb9190611d8f565b3480156102ca57600080fd5b5061024d610c21565b3480156102df57600080fd5b5061024d610c30565b3480156102f457600080fd5b50610184610303366004611e0c565b610c3a565b34801561031457600080fd5b50610328610323366004611e0c565b610cf4565b6040516101eb9190611e27565b34801561034157600080fd5b5061024d610350366004611bd0565b6001600160e01b03191660009081527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc93602052604090205460601c90565b34801561039a57600080fd5b506101846103a9366004611e0c565b610e73565b600080356001600160e01b03191681527f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9360208190526040822054819060601c80610475575060038201546001600160a01b0316806104755760405162461bcd60e51b815260206004820152603260248201527f4469616d6f6e64426173653a206e6f20666163657420666f756e6420666f722060448201527f66756e6374696f6e207369676e617475726500000000000000000000000000006064820152608401610157565b9392505050565b3b151590565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460546001600160a01b031633146104fb5760405162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a2073656e646572206d757374206265206f776e65720000006044820152606401610157565b6105516105088587611efd565b8484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506105499250610fa4915050565b929190610fc8565b5050505050565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc94546060907f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc939061ffff1667ffffffffffffffff8111156105bb576105bb611e69565b6040519080825280602002602001820160405280156105e4578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610726576000818152600285016020526040812054905b6008811015610711578361062381612047565b600188015490955061ffff168511905061071157600581901b82901b6001600160e01b0319811660009081526020889052604081205460601c90805b888110156106b4578a818151811061067957610679612060565b60200260200101516001600160a01b0316836001600160a01b0316036106a257600191506106b4565b806106ac81612047565b91505061065f565b5080156106c3575050506106ff565b818a89815181106106d6576106d6612060565b6001600160a01b0390921660209283029190910190910152876106f881612047565b9850505050505b8061070981612047565b915050610610565b5050808061071e90612047565b9150506105ed565b505082525090565b6107366118e6565b6001600160a01b0316336001600160a01b0316146107bc5760405162461bcd60e51b815260206004820152602960248201527f536166654f776e61626c653a2073656e646572206d757374206265206e6f6d6960448201527f6e6565206f776e657200000000000000000000000000000000000000000000006064820152608401610157565b6107c4611919565b565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc94546060907f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc939061ffff1667ffffffffffffffff81111561082957610829611e69565b60405190808252806020026020018201604052801561086f57816020015b6040805180820190915260008152606060208201528152602001906001900390816108475790505b50600182015490925060009061ffff1667ffffffffffffffff81111561089757610897611e69565b6040519080825280602002602001820160405280156108c0578160200160208202803683370190505b50905060008060005b600185015461ffff16821015610baf576000818152600286016020526040812054905b6008811015610b9a57836108ff81612047565b600189015490955061ffff1685119050610b9a57600581901b82901b6001600160e01b0319811660009081526020899052604081205460601c90805b88811015610a5857826001600160a01b03168c828151811061095f5761095f612060565b6020026020010151600001516001600160a01b031603610a4657838c828151811061098c5761098c612060565b6020026020010151602001518b83815181106109aa576109aa612060565b602002602001015160ff16815181106109c5576109c5612060565b60200260200101906001600160e01b03191690816001600160e01b0319168152505060ff8a82815181106109fb576109fb612060565b602002602001015160ff1610610a1057600080fd5b898181518110610a2257610a22612060565b602002602001018051809190610a3790612076565b60ff1690525060019150610a58565b80610a5081612047565b91505061093b565b508015610a6757505050610b88565b818b8981518110610a7a57610a7a612060565b60209081029190910101516001600160a01b03909116905260018a015461ffff1667ffffffffffffffff811115610ab357610ab3611e69565b604051908082528060200260200182016040528015610adc578160200160208202803683370190505b508b8981518110610aef57610aef612060565b602002602001015160200181905250828b8981518110610b1157610b11612060565b602002602001015160200151600081518110610b2f57610b2f612060565b60200260200101906001600160e01b03191690816001600160e01b031916815250506001898981518110610b6557610b65612060565b60ff9092166020928302919091019091015287610b8181612047565b9850505050505b80610b9281612047565b9150506108ec565b50508080610ba790612047565b9150506108c9565b5060005b82811015610c16576000848281518110610bcf57610bcf612060565b602002602001015160ff1690506000878381518110610bf057610bf0612060565b602002602001015160200151905081815250508080610c0e90612047565b915050610bb3565b508185525050505090565b6000610c2b6118e6565b905090565b6000610c2b6119c6565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460546001600160a01b03163314610cb35760405162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a2073656e646572206d757374206265206f776e65720000006044820152606401610157565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9680546001600160a01b0319166001600160a01b0392909216919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc94546060907f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc939061ffff1667ffffffffffffffff811115610d5757610d57611e69565b604051908082528060200260200182016040528015610d80578160200160208202803683370190505b50915060008060005b600184015461ffff16821015610e69576000818152600285016020526040812054905b6008811015610e545783610dbf81612047565b600188015490955061ffff1685119050610e5457600581901b82901b6001600160e01b0319811660009081526020889052604090205460601c6001600160a01b038a1603610e415780888781518110610e1a57610e1a612060565b6001600160e01b03199092166020928302919091019091015285610e3d81612047565b9650505b5080610e4c81612047565b915050610dac565b50508080610e6190612047565b915050610d89565b5050825250919050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460546001600160a01b03163314610eec5760405162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a2073656e646572206d757374206265206f776e65720000006044820152606401610157565b610ef5816119ee565b50565b7f326d0c59a7612f6a9919e2a8ee333c80ba689d8ba2634de89c85cbb04832e70590565b6001600160e01b03198083169003610f765760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e74657266616365206964000000006044820152606401610157565b6001600160e01b03199190911660009081526020929092526040909120805460ff1916911515919091179055565b7f177481ac65e4292921c69f62d1cc7f57541261e5d61c8175cf4e36a01c9bfc9390565b600184015461ffff811690819060009060071615610ff85750600381901c60009081526002870160205260409020545b60005b865181101561111857600087828151811061101857611018612060565b6020026020010151905060008160200151905060008260400151511161108c5760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a206e6f2073656c6563746f7273207370656369666044820152621a595960ea1b6064820152608401610157565b60008160028111156110a0576110a0612095565b036110bb576110b18a8686856111e5565b909550935061110e565b60018160028111156110cf576110cf612095565b036110e3576110de8a8361139d565b61110e565b60028160028111156110f7576110f7612095565b0361110e576111088a868685611600565b90955093505b5050600101610ffb565b508282146111345760018701805461ffff191661ffff84161790555b600782161561115657600382901c600090815260028801602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673868686604051611189939291906120fb565b60405180910390a161119b85856119f7565b50505050505050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046090565b81546001600160a01b0319166001600160a01b0391909116179055565b805160009081906001600160a01b031630148061120c575082516001600160a01b03163b15155b6112645760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a204144442074617267657420686173206e6f20636044820152626f646560e81b6064820152608401610157565b60005b8360400151518110156113905760008460400151828151811061128c5761128c612060565b6020908102919091018101516001600160e01b031981166000908152918a9052604090912054909150606081901c156113135760405162461bcd60e51b815260206004820152602360248201527f4469616d6f6e64426173653a2073656c6563746f7220616c726561647920616460448201526219195960ea1b6064820152608401610157565b85516001600160e01b0319838116600081815260208d90526040902060609390931b6bffffffffffffffffffffffff19168b1790925560058a901b60e090811692831c91831c1999909916179781900361138157600389901c600090815260028b0160205260408120989098555b50505060019586019501611267565b5093959294509192505050565b80516001600160a01b03163b61141b5760405162461bcd60e51b815260206004820152602760248201527f4469616d6f6e64426173653a205245504c41434520746172676574206861732060448201527f6e6f20636f6465000000000000000000000000000000000000000000000000006064820152608401610157565b60005b8160400151518110156115fb5760008260400151828151811061144357611443612060565b6020908102919091018101516001600160e01b03198116600090815291869052604090912054909150606081901c806114be5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610157565b306001600160a01b038216036115215760405162461bcd60e51b815260206004820152602260248201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d757461626044820152616c6560f01b6064820152608401610157565b84600001516001600160a01b0316816001600160a01b0316036115ac5760405162461bcd60e51b815260206004820152602860248201527f4469616d6f6e64426173653a205245504c41434520746172676574206973206960448201527f64656e746963616c0000000000000000000000000000000000000000000000006064820152608401610157565b5083516001600160e01b031992909216600090815260208690526040902060609290921b6bffffffffffffffffffffffff19166bffffffffffffffffffffffff9190911617905560010161141e565b505050565b805160009081906001600160a01b0316156116835760405162461bcd60e51b815260206004820152602f60248201527f4469616d6f6e64426173653a2052454d4f564520746172676574206d7573742060448201527f6265207a65726f206164647265737300000000000000000000000000000000006064820152608401610157565b600385901c6007861660005b8560400151518110156118d2576000866040015182815181106116b4576116b4612060565b6020908102919091018101516001600160e01b031981166000908152918c9052604090912054909150606081901c61172e5760405162461bcd60e51b815260206004820152601f60248201527f4469616d6f6e64426173653a2073656c6563746f72206e6f7420666f756e64006044820152606401610157565b30606082901c0361178c5760405162461bcd60e51b815260206004820152602260248201527f4469616d6f6e64426173653a2073656c6563746f7220697320696d6d757461626044820152616c6560f01b6064820152608401610157565b60008990036117b857600019909401600081815260028c016020526040902054985093600793506117c0565b600019909301925b600584901b89901b6000806001600160e01b03198084169086161461181c576001600160e01b03198316600090815260208f90526040902080546bffffffffffffffffffffffff19166bffffffffffffffffffffffff86161790555b50506001600160e01b03198316600090815260208d90526040812055611fff600383901c1660e0600584901b1687821461187f57600082815260028f016020526040902080546001600160e01b031980841c19909116908516831c1790556118a3565b80836001600160e01b031916901c816001600160e01b031960001b901c198d16179b505b866000036118c157600088815260028f01602052604081208190559b505b50506001909301925061168f915050565b5060039190911b1796939550929350505050565b60007f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178905b546001600160a01b0316919050565b7f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f671680460805460405133916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a380546001600160a01b03191633178155610ef560007f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178905b9081546001600160a01b0319166001600160a01b0391909116179055565b60007f8a22373512790c48b83a1fe2efdd2888d4a917bcdc24d0adf63e60f67168046061190a565b610ef581611b85565b8051156001600160a01b0383161514611a785760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e76616c696420696e697469616c697a617460448201527f696f6e20706172616d65746572730000000000000000000000000000000000006064820152608401610157565b6001600160a01b03821615611b81576001600160a01b0382163014611b14576001600160a01b0382163b611b145760405162461bcd60e51b815260206004820152602e60248201527f4469616d6f6e64426173653a20696e697469616c697a6174696f6e207461726760448201527f657420686173206e6f20636f64650000000000000000000000000000000000006064820152608401610157565b6000826001600160a01b031682604051611b2e91906121c4565b600060405180830381855af49150503d8060008114611b69576040519150601f19603f3d011682016040523d82523d6000602084013e611b6e565b606091505b50509050806115fb573d6000803e3d6000fd5b5050565b610ef581610ef5817f24aa1f7b31fd188a8d3ecfb06bc55c806040e59b03bd4396283442fce66178906119a8565b80356001600160e01b031981168114611bcb57600080fd5b919050565b600060208284031215611be257600080fd5b61047582611bb3565b80356001600160a01b0381168114611bcb57600080fd5b60008083601f840112611c1457600080fd5b50813567ffffffffffffffff811115611c2c57600080fd5b602083019150836020828501011115611c4457600080fd5b9250929050565b600080600080600060608688031215611c6357600080fd5b853567ffffffffffffffff80821115611c7b57600080fd5b818801915088601f830112611c8f57600080fd5b813581811115611c9e57600080fd5b8960208260051b8501011115611cb357600080fd5b60208301975080965050611cc960208901611beb565b94506040880135915080821115611cdf57600080fd5b50611cec88828901611c02565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b81811015611d3e5783516001600160a01b031683529284019291840191600101611d19565b50909695505050505050565b600081518084526020808501945080840160005b83811015611d845781516001600160e01b03191687529582019590820190600101611d5e565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611dfe57888303603f19018552815180516001600160a01b03168452870151878401879052611deb87850182611d4a565b9588019593505090860190600101611db6565b509098975050505050505050565b600060208284031215611e1e57600080fd5b61047582611beb565b6020808252825182820181905260009190848201906040850190845b81811015611d3e5783516001600160e01b03191683529284019291840191600101611e43565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611ea257611ea2611e69565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611ed157611ed1611e69565b604052919050565b600067ffffffffffffffff821115611ef357611ef3611e69565b5060051b60200190565b6000611f10611f0b84611ed9565b611ea8565b83815260208082019190600586811b860136811115611f2e57600080fd5b865b8181101561202457803567ffffffffffffffff80821115611f515760008081fd5b818a01915060608236031215611f675760008081fd5b611f6f611e7f565b611f7883611beb565b81528683013560038110611f8c5760008081fd5b8188015260408381013583811115611fa45760008081fd5b939093019236601f850112611fbb57600092508283fd5b83359250611fcb611f0b84611ed9565b83815292871b84018801928881019036851115611fe85760008081fd5b948901945b8486101561200d57611ffe86611bb3565b82529489019490890190611fed565b918301919091525088525050948301948301611f30565b5092979650505050505050565b634e487b7160e01b600052601160045260246000fd5b60006001820161205957612059612031565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff810361208c5761208c612031565b60010192915050565b634e487b7160e01b600052602160045260246000fd5b60005b838110156120c65781810151838201526020016120ae565b50506000910152565b600081518084526120e78160208601602086016120ab565b601f01601f19169290920160200192915050565b6000606080830181845280875180835260808601915060808160051b87010192506020808a016000805b8481101561219457898703607f19018652825180516001600160a01b03168852848101516003811061216557634e487b7160e01b84526021600452602484fd5b8886015260409081015190880189905261218189890182611d4a565b9750509483019491830191600101612125565b5050506001600160a01b03891690870152505083810360408501526121b981866120cf565b979650505050505050565b600082516121d68184602087016120ab565b919091019291505056fea164736f6c6343000810000a

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