ETH Price: $3,351.45 (+0.36%)

Contract

0x0000000000003D61b3d0a96B70b9c9006947759C
Transaction Hash
Method
Block
From
To
Create Basic Edi...1306771922025-01-15 14:59:2127 hrs ago1736953161IN
0x00000000...06947759C
0 ETH0.0000261958350.00000038
Create Basic Edi...1305829302025-01-13 10:37:173 days ago1736764637IN
0x00000000...06947759C
0 ETH0.000003821530.00010093
Create Basic Edi...1305828352025-01-13 10:34:073 days ago1736764447IN
0x00000000...06947759C
0 ETH0.0000023575140.00097086
Create Basic Edi...1305825692025-01-13 10:25:153 days ago1736763915IN
0x00000000...06947759C
0 ETH0.0000005168390.00047196
Create Basic Edi...1305824652025-01-13 10:21:473 days ago1736763707IN
0x00000000...06947759C
0 ETH0.000000586010.00010048
Create Basic Edi...1305434582025-01-12 12:41:334 days ago1736685693IN
0x00000000...06947759C
0 ETH0.0000000870750.0001007
Create Basic Edi...1305395912025-01-12 10:32:394 days ago1736677959IN
0x00000000...06947759C
0 ETH0.0000001047970.00010064
Create Basic Edi...1305329852025-01-12 6:52:274 days ago1736664747IN
0x00000000...06947759C
0 ETH0.0000004611820.00100056
Create Basic Edi...1305290382025-01-12 4:40:534 days ago1736656853IN
0x00000000...06947759C
0 ETH0.0000005379290.00100057
Create Basic Edi...1305045872025-01-11 15:05:515 days ago1736607951IN
0x00000000...06947759C
0 ETH0.0000004452870.00010045
Create Basic Edi...1305045452025-01-11 15:04:275 days ago1736607867IN
0x00000000...06947759C
0 ETH0.0000004886570.00010045
Create Basic Edi...1305002672025-01-11 12:41:515 days ago1736599311IN
0x00000000...06947759C
0 ETH0.000000171710.00010047
Create Basic Edi...1304996992025-01-11 12:22:555 days ago1736598175IN
0x00000000...06947759C
0 ETH0.0000002762830.00010047
Create Basic Edi...1304578012025-01-10 13:06:196 days ago1736514379IN
0x00000000...06947759C
0 ETH0.0000006788630.0010007
Create Basic Edi...1303783382025-01-08 16:57:338 days ago1736355453IN
0x00000000...06947759C
0 ETH0.0000085416820.00010037
Create Basic Edi...1303642642025-01-08 9:08:258 days ago1736327305IN
0x00000000...06947759C
0 ETH0.0000001537660.00010046
Create Basic Edi...1302494162025-01-05 17:20:0911 days ago1736097609IN
0x00000000...06947759C
0 ETH0.0000002641810.00010048
Create Basic Edi...1302040492025-01-04 16:07:5512 days ago1736006875IN
0x00000000...06947759C
0 ETH0.0000004081790.00010154
Create Basic Edi...1301802722025-01-04 2:55:2112 days ago1735959321IN
0x00000000...06947759C
0 ETH0.000003324360.00010108
Create Basic Edi...1300810212025-01-01 19:46:5914 days ago1735760819IN
0x00000000...06947759C
0 ETH0.0000009158160.00010038
Create Basic Edi...1300654132025-01-01 11:06:4315 days ago1735729603IN
0x00000000...06947759C
0 ETH0.000000161870.00010036
Create Basic Edi...1300262872024-12-31 13:22:3116 days ago1735651351IN
0x00000000...06947759C
0 ETH0.0000010828070.0010005
Create Basic Edi...1299733662024-12-30 7:58:2917 days ago1735545509IN
0x00000000...06947759C
0 ETH0.0000004910230.00010067
Create Basic Edi...1298218752024-12-26 19:48:4720 days ago1735242527IN
0x00000000...06947759C
0 ETH0.0000029905830.00100039
Create Basic Edi...1297906422024-12-26 2:27:4121 days ago1735180061IN
0x00000000...06947759C
0 ETH0.0000021725360.00100087
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
1306771922025-01-15 14:59:2127 hrs ago1736953161
0x00000000...06947759C
 Contract Creation0 ETH
1305829302025-01-13 10:37:173 days ago1736764637
0x00000000...06947759C
 Contract Creation0 ETH
1305828352025-01-13 10:34:073 days ago1736764447
0x00000000...06947759C
 Contract Creation0 ETH
1305825692025-01-13 10:25:153 days ago1736763915
0x00000000...06947759C
 Contract Creation0 ETH
1305824652025-01-13 10:21:473 days ago1736763707
0x00000000...06947759C
 Contract Creation0 ETH
1305434582025-01-12 12:41:334 days ago1736685693
0x00000000...06947759C
 Contract Creation0 ETH
1305395912025-01-12 10:32:394 days ago1736677959
0x00000000...06947759C
 Contract Creation0 ETH
1305329852025-01-12 6:52:274 days ago1736664747
0x00000000...06947759C
 Contract Creation0 ETH
1305290382025-01-12 4:40:534 days ago1736656853
0x00000000...06947759C
 Contract Creation0 ETH
1305045872025-01-11 15:05:515 days ago1736607951
0x00000000...06947759C
 Contract Creation0 ETH
1305045452025-01-11 15:04:275 days ago1736607867
0x00000000...06947759C
 Contract Creation0 ETH
1305002672025-01-11 12:41:515 days ago1736599311
0x00000000...06947759C
 Contract Creation0 ETH
1304996992025-01-11 12:22:555 days ago1736598175
0x00000000...06947759C
 Contract Creation0 ETH
1304578012025-01-10 13:06:196 days ago1736514379
0x00000000...06947759C
 Contract Creation0 ETH
1303783382025-01-08 16:57:338 days ago1736355453
0x00000000...06947759C
 Contract Creation0 ETH
1303642642025-01-08 9:08:258 days ago1736327305
0x00000000...06947759C
 Contract Creation0 ETH
1302494162025-01-05 17:20:0911 days ago1736097609
0x00000000...06947759C
 Contract Creation0 ETH
1302040492025-01-04 16:07:5512 days ago1736006875
0x00000000...06947759C
 Contract Creation0 ETH
1301802722025-01-04 2:55:2112 days ago1735959321
0x00000000...06947759C
 Contract Creation0 ETH
1300810212025-01-01 19:46:5914 days ago1735760819
0x00000000...06947759C
 Contract Creation0 ETH
1300654132025-01-01 11:06:4315 days ago1735729603
0x00000000...06947759C
 Contract Creation0 ETH
1300262872024-12-31 13:22:3116 days ago1735651351
0x00000000...06947759C
 Contract Creation0 ETH
1299733662024-12-30 7:58:2917 days ago1735545509
0x00000000...06947759C
 Contract Creation0 ETH
1298218752024-12-26 19:48:4720 days ago1735242527
0x00000000...06947759C
 Contract Creation0 ETH
1297906422024-12-26 2:27:4121 days ago1735180061
0x00000000...06947759C
 Contract Creation0 ETH
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MintFactory

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 250000 runs

Other Settings:
paris EvmVersion
File 1 of 11 : MintFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

import {IMetadataRenderer} from "create/interfaces/v1/IMetadataRenderer.sol";
import {LibClone} from "solady/utils/LibClone.sol";
import {Ownable} from "solady/auth/Ownable.sol";
import {Pausable} from "openzeppelin/security/Pausable.sol";
import {IMintFactory} from "create/interfaces/v1/IMintFactory.sol";
import {Mint721Configuration} from "create/interfaces/v1/Mint721Configuration.sol";
import {IMint721} from "create/interfaces/v1/IMint721.sol";

contract MintFactory is IMintFactory, Ownable, Pausable {
    /// @notice The mint module registry.
    address public mintModuleRegistry;
    /// @notice The implementation of Mint721 to be cloned here.
    address public mint721Implementation;

    error InvalidAddress();

    constructor() {
        _initializeOwner(tx.origin);
    }

    /// @inheritdoc IMintFactory
    function createBasicEdition(
        Mint721Configuration calldata mint721Configuration,
        IMetadataRenderer metadataRenderer,
        bytes calldata metadataRendererData,
        bytes32 salt,
        address[] calldata mintModuleAddresses,
        bytes[] calldata mintModuleData
    ) external returns (address contractAddress) {
        return _createBasicEdtion(
            mint721Configuration, metadataRenderer, metadataRendererData, salt, mintModuleAddresses, mintModuleData
        );
    }

    /// @inheritdoc IMintFactory
    function createBasicEdition_efficient_d3ea1b36(
        Mint721Configuration calldata mint721Configuration,
        IMetadataRenderer metadataRenderer,
        bytes calldata metadataRendererData,
        bytes32 salt,
        address[] calldata mintModuleAddresses,
        bytes[] calldata mintModuleData
    ) external returns (address contractAddress) {
        return _createBasicEdtion(
            mint721Configuration, metadataRenderer, metadataRendererData, salt, mintModuleAddresses, mintModuleData
        );
    }

    function _createBasicEdtion(
        Mint721Configuration calldata mint721Configuration,
        IMetadataRenderer metadataRenderer,
        bytes calldata metadataRendererData,
        bytes32 salt,
        address[] calldata mintModuleAddresses,
        bytes[] calldata mintModuleData
    ) internal whenNotPaused returns (address contractAddress) {
        if (address(bytes20(salt)) != msg.sender) revert InvalidSalt();

        contractAddress = LibClone.cloneDeterministic(mint721Implementation, salt);

        IMint721(contractAddress).initialize(
            mint721Configuration,
            mintModuleRegistry,
            metadataRenderer,
            metadataRendererData,
            mintModuleAddresses,
            mintModuleData,
            msg.sender
        );

        emit ContractCreated(contractAddress, msg.sender);
    }

    /// @inheritdoc IMintFactory
    function updateImplementations(address _mintModuleRegistry, address _mint721Implementation) external onlyOwner {
        if (_mintModuleRegistry == address(0) || _mint721Implementation == address(0)) {
            revert InvalidAddress();
        }

        mintModuleRegistry = _mintModuleRegistry;
        mint721Implementation = _mint721Implementation;
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }
}

File 2 of 11 : IMetadataRenderer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

interface IMetadataRenderer {
    /// @notice Retrieves the token URI for the specified token ID.
    /// @param tokenId The ID of the token.
    /// @return uri The URI of the token.
    function tokenURI(uint256 tokenId) external view returns (string memory uri);
}

File 3 of 11 : LibClone.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Minimal proxy library.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibClone.sol)
/// @author Minimal proxy by 0age (https://github.com/0age)
/// @author Clones with immutable args by wighawag, zefram.eth, Saw-mon & Natalie
/// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args)
///
/// @dev Minimal proxy:
/// Although the sw0nt pattern saves 5 gas over the erc-1167 pattern during runtime,
/// it is not supported out-of-the-box on Etherscan. Hence, we choose to use the 0age pattern,
/// which saves 4 gas over the erc-1167 pattern during runtime, and has the smallest bytecode.
///
/// @dev Minimal proxy (PUSH0 variant):
/// This is a new minimal proxy that uses the PUSH0 opcode introduced during Shanghai.
/// It is optimized first for minimal runtime gas, then for minimal bytecode.
/// The PUSH0 clone functions are intentionally postfixed with a jarring "_PUSH0" as
/// many EVM chains may not support the PUSH0 opcode in the early months after Shanghai.
/// Please use with caution.
///
/// @dev Clones with immutable args (CWIA):
/// The implementation of CWIA here implements a `receive()` method that emits the
/// `ReceiveETH(uint256)` event. This skips the `DELEGATECALL` when there is no calldata,
/// enabling us to accept hard gas-capped `sends` & `transfers` for maximum backwards
/// composability. The minimal proxy implementation does not offer this feature.
library LibClone {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Unable to deploy the clone.
    error DeploymentFailed();

    /// @dev The salt must start with either the zero address or the caller.
    error SaltDoesNotStartWithCaller();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  MINIMAL PROXY OPERATIONS                  */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Deploys a clone of `implementation`.
    function clone(address implementation) internal returns (address instance) {
        /// @solidity memory-safe-assembly
        assembly {
            /**
             * --------------------------------------------------------------------------+
             * CREATION (9 bytes)                                                        |
             * --------------------------------------------------------------------------|
             * Opcode     | Mnemonic          | Stack     | Memory                       |
             * --------------------------------------------------------------------------|
             * 60 runSize | PUSH1 runSize     | r         |                              |
             * 3d         | RETURNDATASIZE    | 0 r       |                              |
             * 81         | DUP2              | r 0 r     |                              |
             * 60 offset  | PUSH1 offset      | o r 0 r   |                              |
             * 3d         | RETURNDATASIZE    | 0 o r 0 r |                              |
             * 39         | CODECOPY          | 0 r       | [0..runSize): runtime code   |
             * f3         | RETURN            |           | [0..runSize): runtime code   |
             * --------------------------------------------------------------------------|
             * RUNTIME (44 bytes)                                                        |
             * --------------------------------------------------------------------------|
             * Opcode  | Mnemonic       | Stack                  | Memory                |
             * --------------------------------------------------------------------------|
             *                                                                           |
             * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |
             * 3d      | RETURNDATASIZE | 0                      |                       |
             * 3d      | RETURNDATASIZE | 0 0                    |                       |
             * 3d      | RETURNDATASIZE | 0 0 0                  |                       |
             * 3d      | RETURNDATASIZE | 0 0 0 0                |                       |
             *                                                                           |
             * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |
             * 36      | CALLDATASIZE   | cds 0 0 0 0            |                       |
             * 3d      | RETURNDATASIZE | 0 cds 0 0 0 0          |                       |
             * 3d      | RETURNDATASIZE | 0 0 cds 0 0 0 0        |                       |
             * 37      | CALLDATACOPY   | 0 0 0 0                | [0..cds): calldata    |
             *                                                                           |
             * ::: delegate call to the implementation contract :::::::::::::::::::::::: |
             * 36      | CALLDATASIZE   | cds 0 0 0 0            | [0..cds): calldata    |
             * 3d      | RETURNDATASIZE | 0 cds 0 0 0 0          | [0..cds): calldata    |
             * 73 addr | PUSH20 addr    | addr 0 cds 0 0 0 0     | [0..cds): calldata    |
             * 5a      | GAS            | gas addr 0 cds 0 0 0 0 | [0..cds): calldata    |
             * f4      | DELEGATECALL   | success 0 0            | [0..cds): calldata    |
             *                                                                           |
             * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |
             * 3d      | RETURNDATASIZE | rds success 0 0        | [0..cds): calldata    |
             * 3d      | RETURNDATASIZE | rds rds success 0 0    | [0..cds): calldata    |
             * 93      | SWAP4          | 0 rds success 0 rds    | [0..cds): calldata    |
             * 80      | DUP1           | 0 0 rds success 0 rds  | [0..cds): calldata    |
             * 3e      | RETURNDATACOPY | success 0 rds          | [0..rds): returndata  |
             *                                                                           |
             * 60 0x2a | PUSH1 0x2a     | 0x2a success 0 rds     | [0..rds): returndata  |
             * 57      | JUMPI          | 0 rds                  | [0..rds): returndata  |
             *                                                                           |
             * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * fd      | REVERT         |                        | [0..rds): returndata  |
             *                                                                           |
             * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * 5b      | JUMPDEST       | 0 rds                  | [0..rds): returndata  |
             * f3      | RETURN         |                        | [0..rds): returndata  |
             * --------------------------------------------------------------------------+
             */

            mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)
            mstore(0x14, implementation)
            mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)
            instance := create(0, 0x0c, 0x35)
            // If `instance` is zero, revert.
            if iszero(instance) {
                // Store the function selector of `DeploymentFailed()`.
                mstore(0x00, 0x30116425)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x21, 0)
        }
    }

    /// @dev Deploys a deterministic clone of `implementation` with `salt`.
    function cloneDeterministic(address implementation, bytes32 salt)
        internal
        returns (address instance)
    {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)
            mstore(0x14, implementation)
            mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)
            instance := create2(0, 0x0c, 0x35, salt)
            // If `instance` is zero, revert.
            if iszero(instance) {
                // Store the function selector of `DeploymentFailed()`.
                mstore(0x00, 0x30116425)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x21, 0)
        }
    }

    /// @dev Returns the initialization code hash of the clone of `implementation`.
    /// Used for mining vanity addresses with create2crunch.
    function initCodeHash(address implementation) internal pure returns (bytes32 hash) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)
            mstore(0x14, implementation)
            mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)
            hash := keccak256(0x0c, 0x35)
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x21, 0)
        }
    }

    /// @dev Returns the address of the deterministic clone of `implementation`,
    /// with `salt` by `deployer`.
    /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.
    function predictDeterministicAddress(address implementation, bytes32 salt, address deployer)
        internal
        pure
        returns (address predicted)
    {
        bytes32 hash = initCodeHash(implementation);
        predicted = predictDeterministicAddress(hash, salt, deployer);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*          MINIMAL PROXY OPERATIONS (PUSH0 VARIANT)          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Deploys a PUSH0 clone of `implementation`.
    function clone_PUSH0(address implementation) internal returns (address instance) {
        /// @solidity memory-safe-assembly
        assembly {
            /**
             * --------------------------------------------------------------------------+
             * CREATION (9 bytes)                                                        |
             * --------------------------------------------------------------------------|
             * Opcode     | Mnemonic          | Stack     | Memory                       |
             * --------------------------------------------------------------------------|
             * 60 runSize | PUSH1 runSize     | r         |                              |
             * 5f         | PUSH0             | 0 r       |                              |
             * 81         | DUP2              | r 0 r     |                              |
             * 60 offset  | PUSH1 offset      | o r 0 r   |                              |
             * 5f         | PUSH0             | 0 o r 0 r |                              |
             * 39         | CODECOPY          | 0 r       | [0..runSize): runtime code   |
             * f3         | RETURN            |           | [0..runSize): runtime code   |
             * --------------------------------------------------------------------------|
             * RUNTIME (45 bytes)                                                        |
             * --------------------------------------------------------------------------|
             * Opcode  | Mnemonic       | Stack                  | Memory                |
             * --------------------------------------------------------------------------|
             *                                                                           |
             * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |
             * 5f      | PUSH0          | 0                      |                       |
             * 5f      | PUSH0          | 0 0                    |                       |
             *                                                                           |
             * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |
             * 36      | CALLDATASIZE   | cds 0 0                |                       |
             * 5f      | PUSH0          | 0 cds 0 0              |                       |
             * 5f      | PUSH0          | 0 0 cds 0 0            |                       |
             * 37      | CALLDATACOPY   | 0 0                    | [0..cds): calldata    |
             *                                                                           |
             * ::: delegate call to the implementation contract :::::::::::::::::::::::: |
             * 36      | CALLDATASIZE   | cds 0 0                | [0..cds): calldata    |
             * 5f      | PUSH0          | 0 cds 0 0              | [0..cds): calldata    |
             * 73 addr | PUSH20 addr    | addr 0 cds 0 0         | [0..cds): calldata    |
             * 5a      | GAS            | gas addr 0 cds 0 0     | [0..cds): calldata    |
             * f4      | DELEGATECALL   | success                | [0..cds): calldata    |
             *                                                                           |
             * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |
             * 3d      | RETURNDATASIZE | rds success            | [0..cds): calldata    |
             * 5f      | PUSH0          | 0 rds success          | [0..cds): calldata    |
             * 5f      | PUSH0          | 0 0 rds success        | [0..cds): calldata    |
             * 3e      | RETURNDATACOPY | success                | [0..rds): returndata  |
             *                                                                           |
             * 60 0x29 | PUSH1 0x29     | 0x29 success           | [0..rds): returndata  |
             * 57      | JUMPI          |                        | [0..rds): returndata  |
             *                                                                           |
             * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * 3d      | RETURNDATASIZE | rds                    | [0..rds): returndata  |
             * 5f      | PUSH0          | 0 rds                  | [0..rds): returndata  |
             * fd      | REVERT         |                        | [0..rds): returndata  |
             *                                                                           |
             * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * 5b      | JUMPDEST       |                        | [0..rds): returndata  |
             * 3d      | RETURNDATASIZE | rds                    | [0..rds): returndata  |
             * 5f      | PUSH0          | 0 rds                  | [0..rds): returndata  |
             * f3      | RETURN         |                        | [0..rds): returndata  |
             * --------------------------------------------------------------------------+
             */

            mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16
            mstore(0x14, implementation) // 20
            mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9
            instance := create(0, 0x0e, 0x36)
            // If `instance` is zero, revert.
            if iszero(instance) {
                // Store the function selector of `DeploymentFailed()`.
                mstore(0x00, 0x30116425)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x24, 0)
        }
    }

    /// @dev Deploys a deterministic PUSH0 clone of `implementation` with `salt`.
    function cloneDeterministic_PUSH0(address implementation, bytes32 salt)
        internal
        returns (address instance)
    {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16
            mstore(0x14, implementation) // 20
            mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9
            instance := create2(0, 0x0e, 0x36, salt)
            // If `instance` is zero, revert.
            if iszero(instance) {
                // Store the function selector of `DeploymentFailed()`.
                mstore(0x00, 0x30116425)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x24, 0)
        }
    }

    /// @dev Returns the initialization code hash of the PUSH0 clone of `implementation`.
    /// Used for mining vanity addresses with create2crunch.
    function initCodeHash_PUSH0(address implementation) internal pure returns (bytes32 hash) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16
            mstore(0x14, implementation) // 20
            mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9
            hash := keccak256(0x0e, 0x36)
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x24, 0)
        }
    }

    /// @dev Returns the address of the deterministic PUSH0 clone of `implementation`,
    /// with `salt` by `deployer`.
    /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.
    function predictDeterministicAddress_PUSH0(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        bytes32 hash = initCodeHash_PUSH0(implementation);
        predicted = predictDeterministicAddress(hash, salt, deployer);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*           CLONES WITH IMMUTABLE ARGS OPERATIONS            */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Deploys a minimal proxy with `implementation`,
    /// using immutable arguments encoded in `data`.
    ///
    /// Note: This implementation of CWIA differs from the original implementation.
    /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.
    function clone(address implementation, bytes memory data) internal returns (address instance) {
        assembly {
            // Compute the boundaries of the data and cache the memory slots around it.
            let mBefore3 := mload(sub(data, 0x60))
            let mBefore2 := mload(sub(data, 0x40))
            let mBefore1 := mload(sub(data, 0x20))
            let dataLength := mload(data)
            let dataEnd := add(add(data, 0x20), dataLength)
            let mAfter1 := mload(dataEnd)

            // +2 bytes for telling how much data there is appended to the call.
            let extraLength := add(dataLength, 2)
            // The `creationSize` is `extraLength + 108`
            // The `runSize` is `creationSize - 10`.

            /**
             * ---------------------------------------------------------------------------------------------------+
             * CREATION (10 bytes)                                                                                |
             * ---------------------------------------------------------------------------------------------------|
             * Opcode     | Mnemonic          | Stack     | Memory                                                |
             * ---------------------------------------------------------------------------------------------------|
             * 61 runSize | PUSH2 runSize     | r         |                                                       |
             * 3d         | RETURNDATASIZE    | 0 r       |                                                       |
             * 81         | DUP2              | r 0 r     |                                                       |
             * 60 offset  | PUSH1 offset      | o r 0 r   |                                                       |
             * 3d         | RETURNDATASIZE    | 0 o r 0 r |                                                       |
             * 39         | CODECOPY          | 0 r       | [0..runSize): runtime code                            |
             * f3         | RETURN            |           | [0..runSize): runtime code                            |
             * ---------------------------------------------------------------------------------------------------|
             * RUNTIME (98 bytes + extraLength)                                                                   |
             * ---------------------------------------------------------------------------------------------------|
             * Opcode   | Mnemonic       | Stack                    | Memory                                      |
             * ---------------------------------------------------------------------------------------------------|
             *                                                                                                    |
             * ::: if no calldata, emit event & return w/o `DELEGATECALL` ::::::::::::::::::::::::::::::::::::::: |
             * 36       | CALLDATASIZE   | cds                      |                                             |
             * 60 0x2c  | PUSH1 0x2c     | 0x2c cds                 |                                             |
             * 57       | JUMPI          |                          |                                             |
             * 34       | CALLVALUE      | cv                       |                                             |
             * 3d       | RETURNDATASIZE | 0 cv                     |                                             |
             * 52       | MSTORE         |                          | [0..0x20): callvalue                        |
             * 7f sig   | PUSH32 0x9e..  | sig                      | [0..0x20): callvalue                        |
             * 59       | MSIZE          | 0x20 sig                 | [0..0x20): callvalue                        |
             * 3d       | RETURNDATASIZE | 0 0x20 sig               | [0..0x20): callvalue                        |
             * a1       | LOG1           |                          | [0..0x20): callvalue                        |
             * 00       | STOP           |                          | [0..0x20): callvalue                        |
             * 5b       | JUMPDEST       |                          |                                             |
             *                                                                                                    |
             * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * 36       | CALLDATASIZE   | cds                      |                                             |
             * 3d       | RETURNDATASIZE | 0 cds                    |                                             |
             * 3d       | RETURNDATASIZE | 0 0 cds                  |                                             |
             * 37       | CALLDATACOPY   |                          | [0..cds): calldata                          |
             *                                                                                                    |
             * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * 3d       | RETURNDATASIZE | 0                        | [0..cds): calldata                          |
             * 3d       | RETURNDATASIZE | 0 0                      | [0..cds): calldata                          |
             * 3d       | RETURNDATASIZE | 0 0 0                    | [0..cds): calldata                          |
             * 3d       | RETURNDATASIZE | 0 0 0 0                  | [0..cds): calldata                          |
             * 61 extra | PUSH2 extra    | e 0 0 0 0                | [0..cds): calldata                          |
             *                                                                                                    |
             * ::: copy extra data to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * 80       | DUP1           | e e 0 0 0 0              | [0..cds): calldata                          |
             * 60 0x62  | PUSH1 0x62     | 0x62 e e 0 0 0 0         | [0..cds): calldata                          |
             * 36       | CALLDATASIZE   | cds 0x62 e e 0 0 0 0     | [0..cds): calldata                          |
             * 39       | CODECOPY       | e 0 0 0 0                | [0..cds): calldata, [cds..cds+e): extraData |
             *                                                                                                    |
             * ::: delegate call to the implementation contract ::::::::::::::::::::::::::::::::::::::::::::::::: |
             * 36       | CALLDATASIZE   | cds e 0 0 0 0            | [0..cds): calldata, [cds..cds+e): extraData |
             * 01       | ADD            | cds+e 0 0 0 0            | [0..cds): calldata, [cds..cds+e): extraData |
             * 3d       | RETURNDATASIZE | 0 cds+e 0 0 0 0          | [0..cds): calldata, [cds..cds+e): extraData |
             * 73 addr  | PUSH20 addr    | addr 0 cds+e 0 0 0 0     | [0..cds): calldata, [cds..cds+e): extraData |
             * 5a       | GAS            | gas addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |
             * f4       | DELEGATECALL   | success 0 0              | [0..cds): calldata, [cds..cds+e): extraData |
             *                                                                                                    |
             * ::: copy return data to memory ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * 3d       | RETURNDATASIZE | rds success 0 0          | [0..cds): calldata, [cds..cds+e): extraData |
             * 3d       | RETURNDATASIZE | rds rds success 0 0      | [0..cds): calldata, [cds..cds+e): extraData |
             * 93       | SWAP4          | 0 rds success 0 rds      | [0..cds): calldata, [cds..cds+e): extraData |
             * 80       | DUP1           | 0 0 rds success 0 rds    | [0..cds): calldata, [cds..cds+e): extraData |
             * 3e       | RETURNDATACOPY | success 0 rds            | [0..rds): returndata                        |
             *                                                                                                    |
             * 60 0x60  | PUSH1 0x60     | 0x60 success 0 rds       | [0..rds): returndata                        |
             * 57       | JUMPI          | 0 rds                    | [0..rds): returndata                        |
             *                                                                                                    |
             * ::: revert ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * fd       | REVERT         |                          | [0..rds): returndata                        |
             *                                                                                                    |
             * ::: return ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
             * 5b       | JUMPDEST       | 0 rds                    | [0..rds): returndata                        |
             * f3       | RETURN         |                          | [0..rds): returndata                        |
             * ---------------------------------------------------------------------------------------------------+
             */
            // Write the bytecode before the data.
            mstore(data, 0x5af43d3d93803e606057fd5bf3)
            // Write the address of the implementation.
            mstore(sub(data, 0x0d), implementation)
            // Write the rest of the bytecode.
            mstore(
                sub(data, 0x21),
                or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)
            )
            // `keccak256("ReceiveETH(uint256)")`
            mstore(
                sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff
            )
            mstore(
                // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.
                // The actual EVM limit may be smaller and may change over time.
                sub(data, add(0x59, lt(extraLength, 0xff9e))),
                or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)
            )
            mstore(dataEnd, shl(0xf0, extraLength))

            // Create the instance.
            instance := create(0, sub(data, 0x4c), add(extraLength, 0x6c))

            // If `instance` is zero, revert.
            if iszero(instance) {
                // Store the function selector of `DeploymentFailed()`.
                mstore(0x00, 0x30116425)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            // Restore the overwritten memory surrounding `data`.
            mstore(dataEnd, mAfter1)
            mstore(data, dataLength)
            mstore(sub(data, 0x20), mBefore1)
            mstore(sub(data, 0x40), mBefore2)
            mstore(sub(data, 0x60), mBefore3)
        }
    }

    /// @dev Deploys a deterministic clone of `implementation`,
    /// using immutable arguments encoded in `data`, with `salt`.
    ///
    /// Note: This implementation of CWIA differs from the original implementation.
    /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.
    function cloneDeterministic(address implementation, bytes memory data, bytes32 salt)
        internal
        returns (address instance)
    {
        assembly {
            // Compute the boundaries of the data and cache the memory slots around it.
            let mBefore3 := mload(sub(data, 0x60))
            let mBefore2 := mload(sub(data, 0x40))
            let mBefore1 := mload(sub(data, 0x20))
            let dataLength := mload(data)
            let dataEnd := add(add(data, 0x20), dataLength)
            let mAfter1 := mload(dataEnd)

            // +2 bytes for telling how much data there is appended to the call.
            let extraLength := add(dataLength, 2)

            // Write the bytecode before the data.
            mstore(data, 0x5af43d3d93803e606057fd5bf3)
            // Write the address of the implementation.
            mstore(sub(data, 0x0d), implementation)
            // Write the rest of the bytecode.
            mstore(
                sub(data, 0x21),
                or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)
            )
            // `keccak256("ReceiveETH(uint256)")`
            mstore(
                sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff
            )
            mstore(
                // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.
                // The actual EVM limit may be smaller and may change over time.
                sub(data, add(0x59, lt(extraLength, 0xff9e))),
                or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)
            )
            mstore(dataEnd, shl(0xf0, extraLength))

            // Create the instance.
            instance := create2(0, sub(data, 0x4c), add(extraLength, 0x6c), salt)

            // If `instance` is zero, revert.
            if iszero(instance) {
                // Store the function selector of `DeploymentFailed()`.
                mstore(0x00, 0x30116425)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            // Restore the overwritten memory surrounding `data`.
            mstore(dataEnd, mAfter1)
            mstore(data, dataLength)
            mstore(sub(data, 0x20), mBefore1)
            mstore(sub(data, 0x40), mBefore2)
            mstore(sub(data, 0x60), mBefore3)
        }
    }

    /// @dev Returns the initialization code hash of the clone of `implementation`
    /// using immutable arguments encoded in `data`.
    /// Used for mining vanity addresses with create2crunch.
    function initCodeHash(address implementation, bytes memory data)
        internal
        pure
        returns (bytes32 hash)
    {
        assembly {
            // Compute the boundaries of the data and cache the memory slots around it.
            let mBefore3 := mload(sub(data, 0x60))
            let mBefore2 := mload(sub(data, 0x40))
            let mBefore1 := mload(sub(data, 0x20))
            let dataLength := mload(data)
            let dataEnd := add(add(data, 0x20), dataLength)
            let mAfter1 := mload(dataEnd)

            // Do a out-of-gas revert if `dataLength` is too big. 0xffff - 0x02 - 0x62 = 0xff9b.
            // The actual EVM limit may be smaller and may change over time.
            returndatacopy(returndatasize(), returndatasize(), gt(dataLength, 0xff9b))

            // +2 bytes for telling how much data there is appended to the call.
            let extraLength := add(dataLength, 2)

            // Write the bytecode before the data.
            mstore(data, 0x5af43d3d93803e606057fd5bf3)
            // Write the address of the implementation.
            mstore(sub(data, 0x0d), implementation)
            // Write the rest of the bytecode.
            mstore(
                sub(data, 0x21),
                or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)
            )
            // `keccak256("ReceiveETH(uint256)")`
            mstore(
                sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff
            )
            mstore(
                sub(data, 0x5a),
                or(shl(0x78, add(extraLength, 0x62)), 0x6100003d81600a3d39f336602c57343d527f)
            )
            mstore(dataEnd, shl(0xf0, extraLength))

            // Compute and store the bytecode hash.
            hash := keccak256(sub(data, 0x4c), add(extraLength, 0x6c))

            // Restore the overwritten memory surrounding `data`.
            mstore(dataEnd, mAfter1)
            mstore(data, dataLength)
            mstore(sub(data, 0x20), mBefore1)
            mstore(sub(data, 0x40), mBefore2)
            mstore(sub(data, 0x60), mBefore3)
        }
    }

    /// @dev Returns the address of the deterministic clone of
    /// `implementation` using immutable arguments encoded in `data`, with `salt`, by `deployer`.
    /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.
    function predictDeterministicAddress(
        address implementation,
        bytes memory data,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        bytes32 hash = initCodeHash(implementation, data);
        predicted = predictDeterministicAddress(hash, salt, deployer);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                      OTHER OPERATIONS                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the address when a contract with initialization code hash,
    /// `hash`, is deployed with `salt`, by `deployer`.
    /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.
    function predictDeterministicAddress(bytes32 hash, bytes32 salt, address deployer)
        internal
        pure
        returns (address predicted)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and store the bytecode hash.
            mstore8(0x00, 0xff) // Write the prefix.
            mstore(0x35, hash)
            mstore(0x01, shl(96, deployer))
            mstore(0x15, salt)
            predicted := keccak256(0x00, 0x55)
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x35, 0)
        }
    }

    /// @dev Reverts if `salt` does not start with either the zero address or the caller.
    function checkStartsWithCaller(bytes32 salt) internal view {
        /// @solidity memory-safe-assembly
        assembly {
            // If the salt does not start with the zero address or the caller.
            if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) {
                // Store the function selector of `SaltDoesNotStartWithCaller()`.
                mstore(0x00, 0x2f634836)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }
        }
    }
}

File 4 of 11 : Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The caller is not authorized to call the function.
    error Unauthorized();

    /// @dev The `newOwner` cannot be the zero address.
    error NewOwnerIsZeroAddress();

    /// @dev The `pendingOwner` does not have a valid handover request.
    error NoHandoverRequest();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ownership is transferred from `oldOwner` to `newOwner`.
    /// This event is intentionally kept the same as OpenZeppelin's Ownable to be
    /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
    /// despite it not being as lightweight as a single argument event.
    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);

    /// @dev An ownership handover to `pendingOwner` has been requested.
    event OwnershipHandoverRequested(address indexed pendingOwner);

    /// @dev The ownership handover to `pendingOwner` has been canceled.
    event OwnershipHandoverCanceled(address indexed pendingOwner);

    /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
    uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
        0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;

    /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
        0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;

    /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
        0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The owner slot is given by: `not(_OWNER_SLOT_NOT)`.
    /// It is intentionally chosen to be a high value
    /// to avoid collision with lower slots.
    /// The choice of manual storage layout is to enable compatibility
    /// with both regular and upgradeable contracts.
    uint256 private constant _OWNER_SLOT_NOT = 0x8b78c6d8;

    /// The ownership handover slot of `newOwner` is given by:
    /// ```
    ///     mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
    ///     let handoverSlot := keccak256(0x00, 0x20)
    /// ```
    /// It stores the expiry timestamp of the two-step ownership handover.
    uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     INTERNAL FUNCTIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Initializes the owner directly without authorization guard.
    /// This function must be called upon initialization,
    /// regardless of whether the contract is upgradeable or not.
    /// This is to enable generalization to both regular and upgradeable contracts,
    /// and to save gas in case the initial owner is not the caller.
    /// For performance reasons, this function will not check if there
    /// is an existing owner.
    function _initializeOwner(address newOwner) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Clean the upper 96 bits.
            newOwner := shr(96, shl(96, newOwner))
            // Store the new value.
            sstore(not(_OWNER_SLOT_NOT), newOwner)
            // Emit the {OwnershipTransferred} event.
            log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
        }
    }

    /// @dev Sets the owner directly without authorization guard.
    function _setOwner(address newOwner) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let ownerSlot := not(_OWNER_SLOT_NOT)
            // Clean the upper 96 bits.
            newOwner := shr(96, shl(96, newOwner))
            // Emit the {OwnershipTransferred} event.
            log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
            // Store the new value.
            sstore(ownerSlot, newOwner)
        }
    }

    /// @dev Throws if the sender is not the owner.
    function _checkOwner() internal view virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // If the caller is not the stored owner, revert.
            if iszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) {
                mstore(0x00, 0x82b42900) // `Unauthorized()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Returns how long a two-step ownership handover is valid for in seconds.
    /// Override to return a different value if needed.
    /// Made internal to conserve bytecode. Wrap it in a public function if needed.
    function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
        return 48 * 3600;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  PUBLIC UPDATE FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Allows the owner to transfer the ownership to `newOwner`.
    function transferOwnership(address newOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(shl(96, newOwner)) {
                mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
                revert(0x1c, 0x04)
            }
        }
        _setOwner(newOwner);
    }

    /// @dev Allows the owner to renounce their ownership.
    function renounceOwnership() public payable virtual onlyOwner {
        _setOwner(address(0));
    }

    /// @dev Request a two-step ownership handover to the caller.
    /// The request will automatically expire in 48 hours (172800 seconds) by default.
    function requestOwnershipHandover() public payable virtual {
        unchecked {
            uint256 expires = block.timestamp + _ownershipHandoverValidFor();
            /// @solidity memory-safe-assembly
            assembly {
                // Compute and set the handover slot to `expires`.
                mstore(0x0c, _HANDOVER_SLOT_SEED)
                mstore(0x00, caller())
                sstore(keccak256(0x0c, 0x20), expires)
                // Emit the {OwnershipHandoverRequested} event.
                log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
            }
        }
    }

    /// @dev Cancels the two-step ownership handover to the caller, if any.
    function cancelOwnershipHandover() public payable virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x20), 0)
            // Emit the {OwnershipHandoverCanceled} event.
            log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
        }
    }

    /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
    /// Reverts if there is no existing ownership handover requested by `pendingOwner`.
    function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            let handoverSlot := keccak256(0x0c, 0x20)
            // If the handover does not exist, or has expired.
            if gt(timestamp(), sload(handoverSlot)) {
                mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
                revert(0x1c, 0x04)
            }
            // Set the handover slot to 0.
            sstore(handoverSlot, 0)
        }
        _setOwner(pendingOwner);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   PUBLIC READ FUNCTIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the owner of the contract.
    function owner() public view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(not(_OWNER_SLOT_NOT))
        }
    }

    /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
    function ownershipHandoverExpiresAt(address pendingOwner)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the handover slot.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            // Load the handover slot.
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         MODIFIERS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Marks a function as only callable by the owner.
    modifier onlyOwner() virtual {
        _checkOwner();
        _;
    }
}

File 5 of 11 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 6 of 11 : IMintFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

import {BasicMintConfiguration} from "create/interfaces/v1/BasicMintConfiguration.sol";
import {Mint721Configuration} from "create/interfaces/v1/Mint721Configuration.sol";
import {IPFSEditionRendererConfiguration} from "create/interfaces/v1/IPFSEditionRendererConfiguration.sol";
import {IMetadataRenderer} from "create/interfaces/v1/IMetadataRenderer.sol";

interface IMintFactoryEvents {
    /// @notice Emitted when a new contract is created.
    /// @param _contract The address of the newly created contract.
    /// @param _creator The address who created the contract.
    event ContractCreated(address indexed _contract, address indexed _creator);
}

interface IMintFactory is IMintFactoryEvents {
    error InvalidSalt();

    /// @notice Creates a new basic edition mint with the specified configurations.
    /// @dev Uses the CREATE2 opcode with `salt` to create a contract.
    /// `salt` should start with `msg.sender` and can be followed by any unique byte sequence.
    /// After the creation, the `ContractCreated` event is emitted.
    /// @param mint721Configuration The initial configuration for the NFT collection.
    /// @param metadataRenderer The metadata renderer contract address.
    /// @param metadataRendererData The configuration data for the metadata renderer, or 0 bytes if none.
    /// @param salt The CREATE2 salt used for predictable contract addressing. Must start with `msg.sender`.
    /// @param mintModuleAddresses The initial approved mint modules.
    /// @param mintModuleData The configuration data for the mint modules.
    /// @return contractAddress The address of the newly created contract.
    function createBasicEdition(
        Mint721Configuration calldata mint721Configuration,
        IMetadataRenderer metadataRenderer,
        bytes calldata metadataRendererData,
        bytes32 salt,
        address[] calldata mintModuleAddresses,
        bytes[] calldata mintModuleData
    ) external returns (address contractAddress);

    /// @notice Creates a new basic edition mint with the specified configurations.
    /// @dev This is a functionally identical to `createBasicEdition`, but the four byte selector is 00000000.
    /// Uses the CREATE2 opcode with `salt` to create a contract.
    /// `salt` should start with `msg.sender` and can be followed by any unique byte sequence.
    /// After the creation, the `ContractCreated` event is emitted.
    /// @param mint721Configuration The initial configuration for the NFT collection.
    /// @param metadataRenderer The metadata renderer contract address.
    /// @param metadataRendererData The configuration data for the metadata renderer, or 0 bytes if none.
    /// @param salt The CREATE2 salt used for predictable contract addressing. Must start with `msg.sender`.
    /// @param mintModuleAddresses The initial approved mint modules.
    /// @param mintModuleData The configuration data for the mint modules.
    /// @return contractAddress The address of the newly created contract.
    function createBasicEdition_efficient_d3ea1b36(
        Mint721Configuration calldata mint721Configuration,
        IMetadataRenderer metadataRenderer,
        bytes calldata metadataRendererData,
        bytes32 salt,
        address[] calldata mintModuleAddresses,
        bytes[] calldata mintModuleData
    ) external returns (address contractAddress);

    /// @notice Updates the contract implementations.
    /// @dev Can only be called by the protocol admin.
    /// @param mintModuleRegistry The new MintModuleRegistry contract address.
    /// @param mint721Implementation The new Mint721 contract address.
    function updateImplementations(address mintModuleRegistry, address mint721Implementation) external;
}

File 7 of 11 : Mint721Configuration.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

struct Mint721Configuration {
    /// @notice NFT collection name
    string name;
    /// @notice NFT collection symbol
    string symbol;
}

File 8 of 11 : IMint721.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

import {Mint721Configuration} from "./Mint721Configuration.sol";
import {IMetadataRenderer} from "./IMetadataRenderer.sol";

interface IMint721 {
    /// @notice Initializes a new Mint721 contract with the provided configuration.
    /// @dev `mintModules` and `mintModulesData` must have the same cardinality.
    /// @param configuration The configuration data.
    /// @param mintModuleRegistry The mint module registry.
    /// @param metadataRenderer The metadata renderer.
    /// @param metadataRendererConfig The configuration data for the metadata renderer, or none if not required.
    /// @param mintModules The initial approved mint modules.
    /// @param mintModuleData The configuration data for the mint modules.
    /// @param creator The creator of the contract.
    function initialize(
        Mint721Configuration calldata configuration,
        address mintModuleRegistry,
        IMetadataRenderer metadataRenderer,
        bytes calldata metadataRendererConfig,
        address[] calldata mintModules,
        bytes[] calldata mintModuleData,
        address creator
    ) external;
}

File 9 of 11 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 10 of 11 : BasicMintConfiguration.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

struct BasicMintConfiguration {
    /// @notice Purchase cost per token.
    uint256 price;
    /// @notice UNIX timestamp of mint start.
    uint64 mintStart;
    /// @notice UNIX timestamp of mint end, or zero if open-ended.
    uint64 mintEnd;
    /// @notice Maximum token purchase limit per wallet, or zero if no limit.
    uint32 maxPerWallet;
    /// @notice Maximum tokens mintable per transaction, or zero if no limit.
    uint32 maxPerTransaction;
    /// @notice Maximum tokens mintable by this module, or zero if no limit.
    uint32 maxForModule;
    /// @notice Maximum tokens that can be minted in total, or zero if no max.
    uint32 maxSupply;
}

File 11 of 11 : IPFSEditionRendererConfiguration.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

struct IPFSEditionRendererConfiguration {
    /// @notice Name of the token
    string tokenName;
    /// @notice Description of the token
    string tokenDescription;
    /// @notice IPFS hash for token's image content
    string imageIPFSHash;
    /// @notice IPFS hash for token's animated content (if any)
    /// If empty, no animated content is associated with the token
    string animationIPFSHash;
    /// @notice Mime type for token's animated content (if any)
    string animationMimeType;
}

Settings
{
  "remappings": [
    "ERC721A/=lib/ERC721A/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/",
    "solmate/=lib/solmate/src/",
    "solady/=lib/solady/src/",
    "fundrop/=src/Fundrop/",
    "operator-filter-registry/=lib/operator-filter-registry/src/",
    "base64/=lib/base64/",
    "create/=src/Create/",
    "erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "erc721a-upgradeable/=lib/erc721a-upgradeable/contracts/",
    "openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 250000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidSalt","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":true,"internalType":"address","name":"_creator","type":"address"}],"name":"ContractCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct Mint721Configuration","name":"mint721Configuration","type":"tuple"},{"internalType":"contract IMetadataRenderer","name":"metadataRenderer","type":"address"},{"internalType":"bytes","name":"metadataRendererData","type":"bytes"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address[]","name":"mintModuleAddresses","type":"address[]"},{"internalType":"bytes[]","name":"mintModuleData","type":"bytes[]"}],"name":"createBasicEdition","outputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct Mint721Configuration","name":"mint721Configuration","type":"tuple"},{"internalType":"contract IMetadataRenderer","name":"metadataRenderer","type":"address"},{"internalType":"bytes","name":"metadataRendererData","type":"bytes"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address[]","name":"mintModuleAddresses","type":"address[]"},{"internalType":"bytes[]","name":"mintModuleData","type":"bytes[]"}],"name":"createBasicEdition_efficient_d3ea1b36","outputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mint721Implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintModuleRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mintModuleRegistry","type":"address"},{"internalType":"address","name":"_mint721Implementation","type":"address"}],"name":"updateImplementations","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506000805460ff1916905561002432610029565b610065565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b610d68806100746000396000f3fe6080604052600436106100e35760003560e01c8063715018a61161008a5780639b2088b8116100595780639b2088b8146100e8578063f04e283e1461024c578063f2fde38b1461025f578063fee81cf41461027257600080fd5b8063715018a6146101c95780638456cb59146101d15780638859632c146101e65780638da5cb5b1461021857600080fd5b806354d1f13d116100c657806354d1f13d146101515780635a254858146101595780635ba975eb146101795780635c975abb146101a657600080fd5b80156100e857806325692962146101325780633f4ba83a1461013c575b600080fd5b3480156100f457600080fd5b506101086101033660046109c3565b6102b3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61013a6102d4565b005b34801561014857600080fd5b5061013a610324565b61013a610336565b34801561016557600080fd5b5061013a610174366004610a9e565b610372565b34801561018557600080fd5b506001546101089073ffffffffffffffffffffffffffffffffffffffff1681565b3480156101b257600080fd5b5060005460ff166040519015158152602001610129565b61013a61045c565b3480156101dd57600080fd5b5061013a61046e565b3480156101f257600080fd5b5060005461010890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561022457600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754610108565b61013a61025a366004610ad7565b61047e565b61013a61026d366004610ad7565b6104be565b34801561027e57600080fd5b506102a561028d366004610ad7565b63389a75e1600c908152600091909152602090205490565b604051908152602001610129565b60006102c68a8a8a8a8a8a8a8a8a6104e5565b9a9950505050505050505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b61032c610642565b610334610678565b565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b61037a610642565b73ffffffffffffffffffffffffffffffffffffffff821615806103b1575073ffffffffffffffffffffffffffffffffffffffff8116155b156103e8576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff94851602179055600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b610464610642565b61033460006106f5565b610476610642565b61033461075b565b610486610642565b63389a75e1600c52806000526020600c2080544211156104ae57636f5e88186000526004601cfd5b600090556104bb816106f5565b50565b6104c6610642565b8060601b6104dc57637448fbae6000526004601cfd5b6104bb816106f5565b60006104ef6107b6565b606086901c331461052c576040517f81e69d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015461054f9073ffffffffffffffffffffffffffffffffffffffff1687610828565b6000546040517fc06b659300000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff8084169263c06b6593926105c0928f9261010090920416908e908e908e908d908d908d908d903390600401610c05565b600060405180830381600087803b1580156105da57600080fd5b505af11580156105ee573d6000803e3d6000fd5b505060405133925073ffffffffffffffffffffffffffffffffffffffff841691507f2d49c67975aadd2d389580b368cfff5b49965b0bd5da33c144922ce01e7a4d7b90600090a39998505050505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314610334576382b429006000526004601cfd5b61068061087f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6107636107b6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586106cb3390565b60005460ff1615610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064015b60405180910390fd5b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806108745763301164256000526004601cfd5b600060215292915050565b60005460ff16610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161081f565b6000604082840312156108fd57600080fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff811681146104bb57600080fd5b803561093081610903565b919050565b60008083601f84011261094757600080fd5b50813567ffffffffffffffff81111561095f57600080fd5b60208301915083602082850101111561097757600080fd5b9250929050565b60008083601f84011261099057600080fd5b50813567ffffffffffffffff8111156109a857600080fd5b6020830191508360208260051b850101111561097757600080fd5b600080600080600080600080600060c08a8c0312156109e157600080fd5b893567ffffffffffffffff808211156109f957600080fd5b610a058d838e016108eb565b9a50610a1360208d01610925565b995060408c0135915080821115610a2957600080fd5b610a358d838e01610935565b909950975060608c0135965060808c0135915080821115610a5557600080fd5b610a618d838e0161097e565b909650945060a08c0135915080821115610a7a57600080fd5b50610a878c828d0161097e565b915080935050809150509295985092959850929598565b60008060408385031215610ab157600080fd5b8235610abc81610903565b91506020830135610acc81610903565b809150509250929050565b600060208284031215610ae957600080fd5b8135610af481610903565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610b3057600080fd5b830160208101925035905067ffffffffffffffff811115610b5057600080fd5b80360382131561097757600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b87811015610bf8578284038952610bd98288610afb565b610be4868284610b5f565b9a87019a9550505090840190600101610bc2565b5091979650505050505050565b60e081526000610c158c8d610afb565b604060e0850152610c2b61012085018284610b5f565b9150506020610c3c818f018f610afb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2086850301610100870152610c72848284610b5f565b9350505073ffffffffffffffffffffffffffffffffffffffff808e1682860152808d1660408601528483036060860152610cad838c8e610b5f565b85810360808701528981528a9350820160005b8a811015610ce7578435610cd381610903565b831682529383019390830190600101610cc0565b5085810360a0870152610cfb81898b610ba8565b945050505050610d2360c083018473ffffffffffffffffffffffffffffffffffffffff169052565b9b9a505050505050505050505056fea2646970667358221220fb362129763a27321eb8b8a91c7b0ddc41f8d30e8e52417aed4eaa6d5743d69764736f6c63430008150033

Deployed Bytecode

0x6080604052600436106100e35760003560e01c8063715018a61161008a5780639b2088b8116100595780639b2088b8146100e8578063f04e283e1461024c578063f2fde38b1461025f578063fee81cf41461027257600080fd5b8063715018a6146101c95780638456cb59146101d15780638859632c146101e65780638da5cb5b1461021857600080fd5b806354d1f13d116100c657806354d1f13d146101515780635a254858146101595780635ba975eb146101795780635c975abb146101a657600080fd5b80156100e857806325692962146101325780633f4ba83a1461013c575b600080fd5b3480156100f457600080fd5b506101086101033660046109c3565b6102b3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61013a6102d4565b005b34801561014857600080fd5b5061013a610324565b61013a610336565b34801561016557600080fd5b5061013a610174366004610a9e565b610372565b34801561018557600080fd5b506001546101089073ffffffffffffffffffffffffffffffffffffffff1681565b3480156101b257600080fd5b5060005460ff166040519015158152602001610129565b61013a61045c565b3480156101dd57600080fd5b5061013a61046e565b3480156101f257600080fd5b5060005461010890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561022457600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754610108565b61013a61025a366004610ad7565b61047e565b61013a61026d366004610ad7565b6104be565b34801561027e57600080fd5b506102a561028d366004610ad7565b63389a75e1600c908152600091909152602090205490565b604051908152602001610129565b60006102c68a8a8a8a8a8a8a8a8a6104e5565b9a9950505050505050505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b61032c610642565b610334610678565b565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b61037a610642565b73ffffffffffffffffffffffffffffffffffffffff821615806103b1575073ffffffffffffffffffffffffffffffffffffffff8116155b156103e8576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff94851602179055600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b610464610642565b61033460006106f5565b610476610642565b61033461075b565b610486610642565b63389a75e1600c52806000526020600c2080544211156104ae57636f5e88186000526004601cfd5b600090556104bb816106f5565b50565b6104c6610642565b8060601b6104dc57637448fbae6000526004601cfd5b6104bb816106f5565b60006104ef6107b6565b606086901c331461052c576040517f81e69d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015461054f9073ffffffffffffffffffffffffffffffffffffffff1687610828565b6000546040517fc06b659300000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff8084169263c06b6593926105c0928f9261010090920416908e908e908e908d908d908d908d903390600401610c05565b600060405180830381600087803b1580156105da57600080fd5b505af11580156105ee573d6000803e3d6000fd5b505060405133925073ffffffffffffffffffffffffffffffffffffffff841691507f2d49c67975aadd2d389580b368cfff5b49965b0bd5da33c144922ce01e7a4d7b90600090a39998505050505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314610334576382b429006000526004601cfd5b61068061087f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6107636107b6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586106cb3390565b60005460ff1615610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064015b60405180910390fd5b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806108745763301164256000526004601cfd5b600060215292915050565b60005460ff16610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161081f565b6000604082840312156108fd57600080fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff811681146104bb57600080fd5b803561093081610903565b919050565b60008083601f84011261094757600080fd5b50813567ffffffffffffffff81111561095f57600080fd5b60208301915083602082850101111561097757600080fd5b9250929050565b60008083601f84011261099057600080fd5b50813567ffffffffffffffff8111156109a857600080fd5b6020830191508360208260051b850101111561097757600080fd5b600080600080600080600080600060c08a8c0312156109e157600080fd5b893567ffffffffffffffff808211156109f957600080fd5b610a058d838e016108eb565b9a50610a1360208d01610925565b995060408c0135915080821115610a2957600080fd5b610a358d838e01610935565b909950975060608c0135965060808c0135915080821115610a5557600080fd5b610a618d838e0161097e565b909650945060a08c0135915080821115610a7a57600080fd5b50610a878c828d0161097e565b915080935050809150509295985092959850929598565b60008060408385031215610ab157600080fd5b8235610abc81610903565b91506020830135610acc81610903565b809150509250929050565b600060208284031215610ae957600080fd5b8135610af481610903565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610b3057600080fd5b830160208101925035905067ffffffffffffffff811115610b5057600080fd5b80360382131561097757600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b87811015610bf8578284038952610bd98288610afb565b610be4868284610b5f565b9a87019a9550505090840190600101610bc2565b5091979650505050505050565b60e081526000610c158c8d610afb565b604060e0850152610c2b61012085018284610b5f565b9150506020610c3c818f018f610afb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2086850301610100870152610c72848284610b5f565b9350505073ffffffffffffffffffffffffffffffffffffffff808e1682860152808d1660408601528483036060860152610cad838c8e610b5f565b85810360808701528981528a9350820160005b8a811015610ce7578435610cd381610903565b831682529383019390830190600101610cc0565b5085810360a0870152610cfb81898b610ba8565b945050505050610d2360c083018473ffffffffffffffffffffffffffffffffffffffff169052565b9b9a505050505050505050505056fea2646970667358221220fb362129763a27321eb8b8a91c7b0ddc41f8d30e8e52417aed4eaa6d5743d69764736f6c63430008150033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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