ETH Price: $2,062.46 (+0.32%)

Contract

0x7B6Da80F3F07f3A52a247F4Ea168a972112C746F

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Parent Transaction Hash Block From To
2051412025-01-24 21:00:5360 days ago1737752453  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x4a08d3F6...eAaB35d19
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
MagicDropCloneFactory

Compiler Version
v0.8.24+commit.e11b9ed9

ZkSolc Version
v1.5.7

Optimization Enabled:
Yes with Mode 3

Other Settings:
paris EvmVersion
File 1 of 8 : MagicDropCloneFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;

import {Ownable} from "solady/src/auth/Ownable.sol";
import {TokenStandard} from "./common/Structs.sol";
import {MagicDropTokenImplRegistry} from "./MagicDropTokenImplRegistry.sol";
import {ZKProxy} from "./ZKProxy.sol";

/// @title MagicDropCloneFactory
/// @notice A zksync compatible factory contract for creating and managing clones of MagicDrop contracts
contract MagicDropCloneFactory is Ownable {
    /*==============================================================
    =                           CONSTANTS                          =
    ==============================================================*/

    MagicDropTokenImplRegistry private _registry;
    bytes4 private constant INITIALIZE_SELECTOR = bytes4(keccak256("initialize(string,string,address)"));

    /*==============================================================
    =                             EVENTS                           =
    ==============================================================*/

    event MagicDropFactoryInitialized();
    event NewContractInitialized(
        address contractAddress, address initialOwner, uint32 implId, TokenStandard standard, string name, string symbol
    );
    event Withdrawal(address to, uint256 amount);

    /*==============================================================
    =                             ERRORS                           =
    ==============================================================*/

    error InitializationFailed();
    error RegistryAddressCannotBeZero();
    error InsufficientDeploymentFee();
    error WithdrawalFailed();
    error InitialOwnerCannotBeZero();

    /*==============================================================
    =                          CONSTRUCTOR                         =
    ==============================================================*/

    /// @param initialOwner The address of the initial owner
    /// @param registry The address of the registry contract
    constructor(address initialOwner, address registry) public {
        if (registry == address(0)) {
            revert RegistryAddressCannotBeZero();
        }

        _registry = MagicDropTokenImplRegistry(registry);
        _initializeOwner(initialOwner);

        emit MagicDropFactoryInitialized();
    }

    /*==============================================================
    =                      PUBLIC WRITE METHODS                    =
    ==============================================================*/

    /// @notice Creates a new deterministic clone of a MagicDrop contract
    /// @param name The name of the new contract
    /// @param symbol The symbol of the new contract
    /// @param standard The token standard of the new contract
    /// @param initialOwner The initial owner of the new contract
    /// @param implId The implementation ID
    /// @param salt A unique salt for deterministic address generation
    /// @return The address of the newly created contract
    function createContractDeterministic(
        string calldata name,
        string calldata symbol,
        TokenStandard standard,
        address payable initialOwner,
        uint32 implId,
        bytes32 salt
    ) external payable returns (address) {
        address impl;
        // Retrieve the implementation address from the registry
        if (implId == 0) {
            impl = _registry.getDefaultImplementation(standard);
        } else {
            impl = _registry.getImplementation(standard, implId);
        }

        if (initialOwner == address(0)) {
            revert InitialOwnerCannotBeZero();
        }

        // Retrieve the deployment fee for the implementation and ensure the caller has sent the correct amount
        uint256 deploymentFee = _registry.getDeploymentFee(standard, implId);
        if (msg.value < deploymentFee) {
            revert InsufficientDeploymentFee();
        }

        // Create a deterministic clone of the implementation contract
        address instance = address(new ZKProxy{salt: salt}(impl));

        // Initialize the newly created contract
        (bool success,) = instance.call(abi.encodeWithSelector(INITIALIZE_SELECTOR, name, symbol, initialOwner));
        if (!success) {
            revert InitializationFailed();
        }

        emit NewContractInitialized({
            contractAddress: instance,
            initialOwner: initialOwner,
            implId: implId,
            standard: standard,
            name: name,
            symbol: symbol
        });

        return instance;
    }

    /// @notice Creates a new clone of a MagicDrop contract
    /// @param name The name of the new contract
    /// @param symbol The symbol of the new contract
    /// @param standard The token standard of the new contract
    /// @param initialOwner The initial owner of the new contract
    /// @param implId The implementation ID
    /// @return The address of the newly created contract
    function createContract(
        string calldata name,
        string calldata symbol,
        TokenStandard standard,
        address payable initialOwner,
        uint32 implId
    ) external payable returns (address) {
        address impl;
        // Retrieve the implementation address from the registry
        if (implId == 0) {
            impl = _registry.getDefaultImplementation(standard);
        } else {
            impl = _registry.getImplementation(standard, implId);
        }

        if (initialOwner == address(0)) {
            revert InitialOwnerCannotBeZero();
        }

        // Retrieve the deployment fee for the implementation and ensure the caller has sent the correct amount
        uint256 deploymentFee = _registry.getDeploymentFee(standard, implId);
        if (msg.value < deploymentFee) {
            revert InsufficientDeploymentFee();
        }

        // Create a non-deterministic clone of the implementation contract
        address instance = address(new ZKProxy(impl));

        // Initialize the newly created contract
        (bool success,) = instance.call(abi.encodeWithSelector(INITIALIZE_SELECTOR, name, symbol, initialOwner));
        if (!success) {
            revert InitializationFailed();
        }

        emit NewContractInitialized({
            contractAddress: instance,
            initialOwner: initialOwner,
            implId: implId,
            standard: standard,
            name: name,
            symbol: symbol
        });

        return instance;
    }

    /*==============================================================
    =                      PUBLIC VIEW METHODS                     =
    ==============================================================*/

    /// @notice Retrieves the address of the registry contract
    /// @return The address of the registry contract
    function getRegistry() external view returns (address) {
        return address(_registry);
    }

    /*==============================================================
    =                      ADMIN OPERATIONS                        =
    ==============================================================*/

    /// @notice Withdraws the contract's balance
    function withdraw(address to) external onlyOwner {
        (bool success,) = to.call{value: address(this).balance}("");
        if (!success) {
            revert WithdrawalFailed();
        }

        emit Withdrawal(to, address(this).balance);
    }

    /// @dev Overriden to prevent double-initialization of the owner.
    function _guardInitializeOwner() internal pure virtual override returns (bool) {
        return true;
    }

    /// @notice Receives ETH
    receive() external payable {}

    /// @notice Fallback function to receive ETH
    fallback() external payable {}
}

File 2 of 8 : MagicDropTokenImplRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;

import {Ownable} from "solady/src/auth/Ownable.sol";
import {UUPSUpgradeable} from "solady/src/utils/UUPSUpgradeable.sol";
import {IMagicDropTokenImplRegistry, TokenStandard} from "./interfaces/IMagicDropTokenImplRegistry.sol";
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";

/// @title MagicDropTokenImplRegistry
/// @dev A registry for managing token implementation addresses for different token standards.
/// This contract is upgradeable and uses the UUPS pattern.
contract MagicDropTokenImplRegistry is UUPSUpgradeable, Ownable, IMagicDropTokenImplRegistry {
    /*==============================================================
    =                            STRUCTS                           =
    ==============================================================*/

    struct RegistryData {
        bytes4 interfaceId;
        uint32 nextImplId;
        uint32 defaultImplId;
        mapping(uint256 => address) implementations;
        mapping(uint256 => uint256) deploymentFees; //implementationId => deploymentFee
    }

    struct RegistryStorage {
        mapping(TokenStandard => RegistryData) tokenStandardData;
    }

    /*==============================================================
    =                            STORAGE                           =
    ==============================================================*/

    // keccak256(abi.encode(uint256(keccak256("magicdrop.registry.MagicDropTokenImplRegistry")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant MAGICDROP_REGISTRY_STORAGE =
        0xfd008fcd1deb21680f735a35fafc51691c5fb3daec313cfea4dc62938bee9000;

    /*==============================================================
    =                            EVENTS                            =
    ==============================================================*/

    event ImplementationRegistered(TokenStandard standard, address impl, uint32 implId, uint256 deploymentFee);
    event ImplementationUnregistered(TokenStandard standard, uint32 implId);
    event DefaultImplementationSet(TokenStandard standard, uint32 implId);
    event DeploymentFeeSet(TokenStandard standard, uint32 implId, uint256 deploymentFee);

    /*==============================================================
    =                            ERRORS                            =
    ==============================================================*/

    error InvalidImplementation();
    error ImplementationDoesNotSupportStandard();
    error UnsupportedTokenStandard();
    error DefaultImplementationNotRegistered();

    /*==============================================================
    =                          CONSTRUCTOR                         =
    ==============================================================*/

    /// @param initialOwner The address of the initial owner
    constructor(address initialOwner) public {
        _initializeOwner(initialOwner);

        // Initialize nextImplId and interface IDs for each token standard
        RegistryStorage storage $ = _loadRegistryStorage();
        $.tokenStandardData[TokenStandard.ERC721].nextImplId = 1;
        $.tokenStandardData[TokenStandard.ERC721].interfaceId = 0x80ac58cd; // ERC721 interface ID

        $.tokenStandardData[TokenStandard.ERC1155].nextImplId = 1;
        $.tokenStandardData[TokenStandard.ERC1155].interfaceId = 0xd9b67a26; // ERC1155 interface ID
    }

    /*==============================================================
    =                      PUBLIC VIEW METHODS                     =
    ==============================================================*/

    /// @dev Retrieves the implementation address for a given token standard and implementation ID.
    /// @param standard The token standard (ERC721, ERC1155).
    /// @param implId The ID of the implementation.
    /// @notice Reverts if the implementation is not registered.
    /// @return implAddress The address of the implementation contract.
    function getImplementation(TokenStandard standard, uint32 implId) external view returns (address implAddress) {
        assembly {
            // Compute s1 = keccak256(abi.encode(standard, MAGICDROP_REGISTRY_STORAGE))
            mstore(0x00, standard)
            mstore(0x20, MAGICDROP_REGISTRY_STORAGE)
            let s1 := keccak256(0x00, 0x40)

            // Compute storage slot for implementations[implId]
            mstore(0x00, implId)
            mstore(0x20, add(s1, 1))
            let implSlot := keccak256(0x00, 0x40)
            implAddress := sload(implSlot)

            // Revert if the implementation is not registered
            if iszero(implAddress) {
                mstore(0x00, 0x68155f9a) // revert InvalidImplementation()
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Gets the default implementation ID for a given token standard
    /// @param standard The token standard (ERC721, ERC1155)
    /// @notice Reverts if the default implementation is not registered.
    /// @return defaultImplId The default implementation ID for the given standard
    function getDefaultImplementationID(TokenStandard standard) external view returns (uint32 defaultImplId) {
        assembly {
            // Compute storage slot for tokenStandardData[standard]
            mstore(0x00, standard)
            mstore(0x20, MAGICDROP_REGISTRY_STORAGE)
            let slot := keccak256(0x00, 0x40)

            // Extract 'defaultImplId' by shifting and masking
            // Shift right by 64 bits to bring 'defaultImplId' to bits 0-31
            let shiftedData := shr(64, sload(slot))
            // Mask to extract the lower 32 bits
            defaultImplId := and(shiftedData, 0xffffffff)

            // Check if defaultImplId is 0 and revert if so
            if iszero(defaultImplId) {
                // revert DefaultImplementationNotRegistered()
                mstore(0x00, 0x161378fc)
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Gets the default implementation address for a given token standard
    /// @param standard The token standard (ERC721, ERC1155)
    /// @notice Reverts if the default implementation is not registered.
    /// @return implAddress The default implementation address for the given standard
    function getDefaultImplementation(TokenStandard standard) external view returns (address implAddress) {
        assembly {
            mstore(0x00, standard)
            mstore(0x20, MAGICDROP_REGISTRY_STORAGE)
            let slot := keccak256(0x00, 0x40)

            // Extract 'defaultImplId' by shifting and masking
            // Shift right by 64 bits to bring 'defaultImplId' to bits 0-31
            let shiftedData := shr(64, sload(slot))
            // Mask to extract the lower 32 bits
            let defaultImplId := and(shiftedData, 0xffffffff)

            // Revert if the default implementation is not registered
            if iszero(defaultImplId) {
                // revert DefaultImplementationNotRegistered()
                mstore(0x00, 0x161378fc)
                revert(0x1c, 0x04)
            }

            // Compute storage slot for implementations[defaultImplId]
            mstore(0x00, defaultImplId)
            mstore(0x20, add(slot, 1))
            let implSlot := keccak256(0x00, 0x40)
            implAddress := sload(implSlot)
        }
    }

    /// @dev Gets the deployment fee for a given token standard
    /// @param standard The token standard (ERC721, ERC1155, ERC20)
    /// @param implId The implementation ID
    /// @return deploymentFee The deployment fee for the given standard
    function getDeploymentFee(TokenStandard standard, uint32 implId) external view returns (uint256 deploymentFee) {
        assembly {
            mstore(0x00, standard)
            mstore(0x20, MAGICDROP_REGISTRY_STORAGE)
            let slot := keccak256(0x00, 0x40)

            mstore(0x00, implId)
            mstore(0x20, add(slot, 2))
            let implSlot := keccak256(0x00, 0x40)
            deploymentFee := sload(implSlot)
        }
    }

    /*==============================================================
    =                       INTERNAL HELPERS                       =
    ==============================================================*/

    /// @dev Loads the registry storage.
    /// @return $ The registry storage.
    function _loadRegistryStorage() internal pure returns (RegistryStorage storage $) {
        assembly {
            $.slot := MAGICDROP_REGISTRY_STORAGE
        }
    }

    /*==============================================================
    =                      ADMIN OPERATIONS                        =
    ==============================================================*/

    /// @dev Registers a new implementation for a given token standard.
    /// @param standard The token standard (ERC721, ERC1155, ERC20).
    /// @param impl The address of the implementation contract.
    /// @param isDefault Whether the implementation should be set as the default implementation
    /// @param deploymentFee The deployment fee for the implementation
    /// @notice Only the contract owner can call this function.
    /// @notice Reverts if an implementation with the same name is already registered.
    /// @return The ID of the newly registered implementation
    function registerImplementation(TokenStandard standard, address impl, bool isDefault, uint256 deploymentFee)
        external
        onlyOwner
        returns (uint32)
    {
        RegistryStorage storage $ = _loadRegistryStorage();
        bytes4 interfaceId = $.tokenStandardData[standard].interfaceId;
        if (interfaceId == 0) {
            revert UnsupportedTokenStandard();
        }

        if (!IERC165(impl).supportsInterface(interfaceId)) {
            revert ImplementationDoesNotSupportStandard();
        }

        uint32 implId = $.tokenStandardData[standard].nextImplId;
        $.tokenStandardData[standard].implementations[implId] = impl;
        $.tokenStandardData[standard].nextImplId = implId + 1;
        $.tokenStandardData[standard].deploymentFees[implId] = deploymentFee;
        emit ImplementationRegistered(standard, impl, implId, deploymentFee);
        emit DeploymentFeeSet(standard, implId, deploymentFee);

        if (isDefault) {
            $.tokenStandardData[standard].defaultImplId = implId;
            emit DefaultImplementationSet(standard, implId);
        }

        return implId;
    }

    /// @dev Unregisters an implementation for a given token standard.
    /// @param standard The token standard (ERC721, ERC1155).
    /// @param implId The ID of the implementation to unregister.
    /// @notice Only the contract owner can call this function.
    /// @notice Reverts if the implementation is not registered.
    function unregisterImplementation(TokenStandard standard, uint32 implId) external onlyOwner {
        RegistryStorage storage $ = _loadRegistryStorage();
        address implData = $.tokenStandardData[standard].implementations[implId];

        if (implData == address(0)) {
            revert InvalidImplementation();
        }

        $.tokenStandardData[standard].implementations[implId] = address(0);

        if ($.tokenStandardData[standard].defaultImplId == implId) {
            $.tokenStandardData[standard].defaultImplId = 0;
            emit DefaultImplementationSet(standard, 0);
        }

        emit ImplementationUnregistered(standard, implId);
    }

    /// @dev Sets the default implementation ID for a given token standard
    /// @param standard The token standard (ERC721, ERC1155, ERC20)
    /// @param implId The ID of the implementation to set as default
    /// @notice Reverts if the implementation is not registered.
    /// @notice Only the contract owner can call this function
    function setDefaultImplementation(TokenStandard standard, uint32 implId) external onlyOwner {
        RegistryStorage storage $ = _loadRegistryStorage();
        address implData = $.tokenStandardData[standard].implementations[implId];

        if (implData == address(0)) {
            revert InvalidImplementation();
        }

        $.tokenStandardData[standard].defaultImplId = implId;

        emit DefaultImplementationSet(standard, implId);
    }

    /// @dev Sets the deployment fee for an implementation
    /// @param standard The token standard (ERC721, ERC1155, ERC20)
    /// @param implId The implementation ID
    /// @param deploymentFee The deployment fee to set
    /// @notice Only the contract owner can call this function
    function setDeploymentFee(TokenStandard standard, uint32 implId, uint256 deploymentFee) external onlyOwner {
        RegistryStorage storage $ = _loadRegistryStorage();
        $.tokenStandardData[standard].deploymentFees[implId] = deploymentFee;
        emit DeploymentFeeSet(standard, implId, deploymentFee);
    }

    /// @dev Internal function to authorize an upgrade.
    /// @param newImplementation Address of the new implementation.
    /// @notice Only the contract owner can upgrade the contract.
    function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}

    /// @dev Overriden to prevent double-initialization of the owner.
    function _guardInitializeOwner() internal pure virtual override returns (bool) {
        return true;
    }
}

File 3 of 8 : ZKProxy.sol
pragma solidity ^0.8.22;

// This is a ZKSync compatible proxy and a replacement for OZ Clones
contract ZKProxy {
    address immutable implementation;

    constructor(address _implementation) {
        implementation = _implementation;
    }

    fallback() external payable {
        address impl = implementation;
        assembly {
            // The pointer to the free memory slot
            let ptr := mload(0x40)
            // Copy function signature and arguments from calldata at zero position into memory at pointer position
            calldatacopy(ptr, 0, calldatasize())
            // Delegatecall method of the implementation contract returns 0 on error
            let result := delegatecall(gas(), impl, ptr, calldatasize(), 0, 0)
            // Get the size of the last return data
            let size := returndatasize()
            // Copy the size length of bytes from return data at zero position to pointer position
            returndatacopy(ptr, 0, size)
            // Depending on the result value
            switch result
            case 0 {
                // End execution and revert state changes
                revert(ptr, size)
            }
            default {
                // Return data with length of size at pointers position
                return(ptr, size)
            }
        }
    }
}

File 4 of 8 : Structs.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;

enum TokenStandard {
    ERC721,
    ERC1155,
    ERC20
}

struct MintStageInfo {
    uint80 price;
    uint80 mintFee;
    uint32 walletLimit; // 0 for unlimited
    bytes32 merkleRoot; // 0x0 for no presale enforced
    uint24 maxStageSupply; // 0 for unlimited
    uint256 startTimeUnixSeconds;
    uint256 endTimeUnixSeconds;
}

struct MintStageInfo1155 {
    uint80[] price;
    uint80[] mintFee;
    uint32[] walletLimit; // 0 for unlimited
    bytes32[] merkleRoot; // 0x0 for no presale enforced
    uint24[] maxStageSupply; // 0 for unlimited
    uint256 startTimeUnixSeconds;
    uint256 endTimeUnixSeconds;
}

struct SetupConfig {
    /// @dev The maximum number of tokens that can be minted.
    ///      - Can be decreased if current supply < new max supply
    ///      - Cannot be increased once set
    uint256 maxSupply;
    /// @dev The maximum number of tokens that can be minted per wallet
    /// @notice A value of 0 indicates unlimited mints per wallet
    uint256 walletLimit;
    /// @dev The base URI of the token.
    string baseURI;
    /// @dev The contract URI of the token.
    string contractURI;
    /// @dev The mint stages of the token.
    MintStageInfo[] stages;
    /// @dev The payout recipient of the token.
    address payoutRecipient;
    /// @dev The royalty recipient of the token.
    address royaltyRecipient;
    /// @dev The royalty basis points of the token.
    uint96 royaltyBps;
}

File 5 of 8 : IMagicDropTokenImplRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;

import {TokenStandard} from "../common/Structs.sol";

interface IMagicDropTokenImplRegistry {
    function registerImplementation(TokenStandard standard, address impl, bool isDefault, uint256 deploymentFee)
        external
        returns (uint32);
    function unregisterImplementation(TokenStandard standard, uint32 implId) external;
    function getImplementation(TokenStandard standard, uint32 implId) external view returns (address);
    function getDeploymentFee(TokenStandard standard, uint32 implId) external view returns (uint256);
    function setDeploymentFee(TokenStandard standard, uint32 implId, uint256 deploymentFee) external;
}

File 6 of 8 : 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();

    /// @dev Cannot double-initialize.
    error AlreadyInitialized();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           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:
    /// `bytes32(~uint256(uint32(bytes4(keccak256("_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.
    bytes32 internal constant _OWNER_SLOT =
        0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;

    /// 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 Override to return true to make `_initializeOwner` prevent double-initialization.
    function _guardInitializeOwner() internal pure virtual returns (bool guard) {}

    /// @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 {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                if sload(ownerSlot) {
                    mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
                    revert(0x1c, 0x04)
                }
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(_OWNER_SLOT, 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 {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // 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, or(newOwner, shl(255, iszero(newOwner))))
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // 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(_OWNER_SLOT))) {
                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(_OWNER_SLOT)
        }
    }

    /// @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 7 of 8 : UUPSUpgradeable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice UUPS proxy mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/UUPSUpgradeable.sol)
/// @author Modified from OpenZeppelin
/// (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/utils/UUPSUpgradeable.sol)
///
/// @dev Note:
/// - This implementation is intended to be used with ERC1967 proxies.
/// See: `LibClone.deployERC1967` and related functions.
/// - This implementation is NOT compatible with legacy OpenZeppelin proxies
/// which do not store the implementation at `_ERC1967_IMPLEMENTATION_SLOT`.
abstract contract UUPSUpgradeable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The upgrade failed.
    error UpgradeFailed();

    /// @dev The call is from an unauthorized call context.
    error UnauthorizedCallContext();

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

    /// @dev For checking if the context is a delegate call.
    uint256 private immutable __self = uint256(uint160(address(this)));

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

    /// @dev Emitted when the proxy's implementation is upgraded.
    event Upgraded(address indexed implementation);

    /// @dev `keccak256(bytes("Upgraded(address)"))`.
    uint256 private constant _UPGRADED_EVENT_SIGNATURE =
        0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b;

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

    /// @dev The ERC-1967 storage slot for the implementation in the proxy.
    /// `uint256(keccak256("eip1967.proxy.implementation")) - 1`.
    bytes32 internal constant _ERC1967_IMPLEMENTATION_SLOT =
        0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

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

    /// @dev Please override this function to check if `msg.sender` is authorized
    /// to upgrade the proxy to `newImplementation`, reverting if not.
    /// ```
    ///     function _authorizeUpgrade(address) internal override onlyOwner {}
    /// ```
    function _authorizeUpgrade(address newImplementation) internal virtual;

    /// @dev Returns the storage slot used by the implementation,
    /// as specified in [ERC1822](https://eips.ethereum.org/EIPS/eip-1822).
    ///
    /// Note: The `notDelegated` modifier prevents accidental upgrades to
    /// an implementation that is a proxy contract.
    function proxiableUUID() public view virtual notDelegated returns (bytes32) {
        // This function must always return `_ERC1967_IMPLEMENTATION_SLOT` to comply with ERC1967.
        return _ERC1967_IMPLEMENTATION_SLOT;
    }

    /// @dev Upgrades the proxy's implementation to `newImplementation`.
    /// Emits a {Upgraded} event.
    ///
    /// Note: Passing in empty `data` skips the delegatecall to `newImplementation`.
    function upgradeToAndCall(address newImplementation, bytes calldata data)
        public
        payable
        virtual
        onlyProxy
    {
        _authorizeUpgrade(newImplementation);
        /// @solidity memory-safe-assembly
        assembly {
            newImplementation := shr(96, shl(96, newImplementation)) // Clears upper 96 bits.
            mstore(0x00, returndatasize())
            mstore(0x01, 0x52d1902d) // `proxiableUUID()`.
            let s := _ERC1967_IMPLEMENTATION_SLOT
            // Check if `newImplementation` implements `proxiableUUID` correctly.
            if iszero(eq(mload(staticcall(gas(), newImplementation, 0x1d, 0x04, 0x01, 0x20)), s)) {
                mstore(0x01, 0x55299b49) // `UpgradeFailed()`.
                revert(0x1d, 0x04)
            }
            // Emit the {Upgraded} event.
            log2(codesize(), 0x00, _UPGRADED_EVENT_SIGNATURE, newImplementation)
            sstore(s, newImplementation) // Updates the implementation.

            // Perform a delegatecall to `newImplementation` if `data` is non-empty.
            if data.length {
                // Forwards the `data` to `newImplementation` via delegatecall.
                let m := mload(0x40)
                calldatacopy(m, data.offset, data.length)
                if iszero(delegatecall(gas(), newImplementation, m, data.length, codesize(), 0x00))
                {
                    // Bubble up the revert if the call reverts.
                    returndatacopy(m, 0x00, returndatasize())
                    revert(m, returndatasize())
                }
            }
        }
    }

    /// @dev Requires that the execution is performed through a proxy.
    modifier onlyProxy() {
        uint256 s = __self;
        /// @solidity memory-safe-assembly
        assembly {
            // To enable use cases with an immutable default implementation in the bytecode,
            // (see: ERC6551Proxy), we don't require that the proxy address must match the
            // value stored in the implementation slot, which may not be initialized.
            if eq(s, address()) {
                mstore(0x00, 0x9f03a026) // `UnauthorizedCallContext()`.
                revert(0x1c, 0x04)
            }
        }
        _;
    }

    /// @dev Requires that the execution is NOT performed via delegatecall.
    /// This is the opposite of `onlyProxy`.
    modifier notDelegated() {
        uint256 s = __self;
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(eq(s, address())) {
                mstore(0x00, 0x9f03a026) // `UnauthorizedCallContext()`.
                revert(0x1c, 0x04)
            }
        }
        _;
    }
}

File 8 of 8 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": true,
    "mode": "3"
  },
  "outputSelection": {
    "*": {
      "*": [
        "abi",
        "metadata"
      ],
      "": [
        "ast"
      ]
    }
  },
  "detectMissingLibraries": false,
  "forceEVMLA": false,
  "enableEraVMExtensions": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"registry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"InitialOwnerCannotBeZero","type":"error"},{"inputs":[],"name":"InitializationFailed","type":"error"},{"inputs":[],"name":"InsufficientDeploymentFee","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"RegistryAddressCannotBeZero","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"WithdrawalFailed","type":"error"},{"anonymous":false,"inputs":[],"name":"MagicDropFactoryInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"initialOwner","type":"address"},{"indexed":false,"internalType":"uint32","name":"implId","type":"uint32"},{"indexed":false,"internalType":"enum TokenStandard","name":"standard","type":"uint8"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"NewContractInitialized","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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"enum TokenStandard","name":"standard","type":"uint8"},{"internalType":"address payable","name":"initialOwner","type":"address"},{"internalType":"uint32","name":"implId","type":"uint32"}],"name":"createContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"enum TokenStandard","name":"standard","type":"uint8"},{"internalType":"address payable","name":"initialOwner","type":"address"},{"internalType":"uint32","name":"implId","type":"uint32"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"createContractDeterministic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getRegistry","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":"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":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x0003000000000002000d0000000000020000006003100270000001ca033001970002000000310355000100000001035500000001002001900000001e0000c13d0000008002000039000000400020043f000000040030008c000000b30000413d000000000201043b000000e002200270000001d90020009c0000004e0000a13d000001da0020009c0000006e0000213d000001de0020009c000000b50000613d000001df0020009c000000bd0000613d000001e00020009c000000b30000c13d0000000001000416000000000001004b000002810000c13d000001cf01000041000000000101041a000000b90000013d0000000002000416000000000002004b000002810000c13d0000001f02300039000001cb022001970000008002200039000000400020043f0000001f0430018f000001cc0530019800000080025000390000002f0000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b0000002b0000c13d000000000004004b0000003c0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000400030008c000002810000413d000000800600043d000001cd0060009c000002810000213d000000a00100043d000001cd0010009c000002810000213d000000000001004b000002180000c13d000000400100043d000001d7020000410000000000210435000001ca0010009c000001ca010080410000004001100210000001d8011001c70000072700010430000001e10020009c000000850000a13d000001e20020009c000000d30000613d000001e30020009c000001420000613d000001e40020009c000000b30000c13d000001e7010000410000000c0010043f0000000001000411000000000010043f0000000001000414000001ca0010009c000001ca01008041000000c001100210000001ea011001c70000801002000039072507200000040f0000000100200190000002810000613d000000000101043b000000000001041b0000000001000414000001ca0010009c000001ca01008041000000c001100210000001d3011001c70000800d020000390000000203000039000001ee04000041000000af0000013d000001db0020009c000001660000613d000001dc0020009c000001940000613d000001dd0020009c000000b30000c13d000000240030008c000002810000413d0000000002000416000000000002004b000002810000c13d0000000401100370000000000101043b000001cd0010009c000002810000213d000001e7020000410000000c0020043f000000000010043f0725070e0000040f000000000101041a000000800010043f000001e801000041000007260001042e000001e50020009c000001a50000613d000001e60020009c000000b30000c13d000001e7010000410000000c0010043f0000000001000411000000000010043f000001eb0100004100000000001004430000000001000414000001ca0010009c000001ca01008041000000c001100210000001ec011001c70000800b02000039072507200000040f0000000100200190000002830000613d000000000101043b000d00000001001d0000000001000414000001ca0010009c000001ca01008041000000c001100210000001ea011001c70000801002000039072507200000040f0000000100200190000002810000613d000000000101043b0000000d02000029000002060220009a000000000021041b0000000001000414000001ca0010009c000001ca01008041000000c001100210000001d3011001c70000800d020000390000000203000039000002070400004100000000050004110725071b0000040f0000000100200190000002810000613d0000000001000019000007260001042e0000000001000416000000000001004b000002810000c13d000000000100041a000001cd01100197000000800010043f000001e801000041000007260001042e000001cf01000041000000000501041a0000000001000411000000000051004b000002140000c13d0000000001000414000001ca0010009c000001ca01008041000000c001100210000001d3011001c70000800d020000390000000303000039000001d40400004100000000060000190725071b0000040f0000000100200190000002810000613d000001d201000041000001cf02000041000000000012041b0000000001000019000007260001042e000000a40030008c000002810000413d0000000402100370000000000202043b000001f20020009c000002810000213d0000002304200039000000000034004b000002810000813d0000000404200039000000000441034f000000000504043b000001f20050009c000002810000213d00000024072000390000000002750019000000000032004b000002810000213d0000002402100370000000000202043b000001f20020009c000002810000213d0000002304200039000000000034004b000002810000813d0000000404200039000000000441034f000000000404043b000001f20040009c000002810000213d00000024062000390000000002640019000000000032004b000002810000213d0000004402100370000000000302043b000000020030008c000002810000213d0000006402100370000000000202043b000d00000002001d000001cd0020009c000002810000213d0000008401100370000000000101043b000c00000001001d000001ca0010009c000002810000213d000700000007001d000800000006001d000900000005001d000a00000004001d000000000100041a000001cd021001970000000c0000006b000002ae0000c13d000001f801000041000000800010043f000000840030043f0000000001000414000000040020008c000002b60000613d000001ca0010009c000001ca01008041000000c001100210000001f9011001c7072507200000040f0000006003100270000001ca03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000001250000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000001210000c13d000000000006004b000001320000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000100200190000002ed0000c13d0000001f0530018f000001cc06300198000000400200043d00000000046200190000035e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000013d0000c13d0000035e0000013d000000240030008c000002810000413d0000000002000416000000000002004b000002810000c13d0000000401100370000000000301043b000001cd0030009c000002810000213d000001cf01000041000000000101041a0000000002000411000000000012004b000002140000c13d000d00000003001d000001f0010000410000000000100443000000000100041000000004001004430000000001000414000001ca0010009c000001ca01008041000000c001100210000001f1011001c70000800a02000039072507200000040f0000000100200190000002830000613d000000000301043b00000000010004140000000d04000029000000040040008c000002450000c13d000000010200003900000000010000310000025a0000013d000000240030008c000002810000413d0000000401100370000000000301043b000001cd0030009c000002810000213d000001cf01000041000000000101041a0000000002000411000000000012004b000002140000c13d000001e7010000410000000c0010043f000000000030043f0000000001000414000001ca0010009c000001ca01008041000000c001100210000001ea011001c70000801002000039000d00000003001d072507200000040f0000000100200190000002810000613d000000000101043b000b00000001001d000000000101041a000c00000001001d000001eb0100004100000000001004430000000001000414000001ca0010009c000001ca01008041000000c001100210000001ec011001c70000800b02000039072507200000040f0000000100200190000002830000613d000000000101043b0000000c0010006c0000024c0000a13d000001ed01000041000000000010043f000001d1010000410000072700010430000000240030008c000002810000413d0000000401100370000000000101043b000001cd0010009c000002810000213d000001cf02000041000000000202041a0000000003000411000000000023004b000002140000c13d000000000001004b0000024f0000c13d000001e901000041000000000010043f000001d1010000410000072700010430000000c40030008c000002810000413d0000000402100370000000000202043b000001f20020009c000002810000213d0000002304200039000000000034004b000002810000813d0000000404200039000000000441034f000000000504043b000001f20050009c000002810000213d00000024072000390000000002750019000000000032004b000002810000213d0000002402100370000000000202043b000001f20020009c000002810000213d0000002304200039000000000034004b000002810000813d0000000404200039000000000441034f000000000404043b000001f20040009c000002810000213d00000024062000390000000002640019000000000032004b000002810000213d0000004402100370000000000302043b000000020030008c000002810000213d0000006402100370000000000202043b000d00000002001d000001cd0020009c000002810000213d0000008401100370000000000101043b000c00000001001d000001ca0010009c000002810000213d000700000007001d000800000006001d000900000005001d000a00000004001d000000000100041a000001cd021001970000000c0000006b000002bb0000c13d000001f801000041000000800010043f000000840030043f0000000001000414000000040020008c000002c30000613d000001ca0010009c000001ca01008041000000c001100210000001f9011001c7072507200000040f0000006003100270000001ca03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000001f70000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b000001f30000c13d000000000006004b000002040000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000100200190000003340000c13d0000001f0530018f000001cc06300198000000400200043d00000000046200190000035e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000020f0000c13d0000035e0000013d000001ef01000041000000000010043f000001d1010000410000072700010430000000000200041a000001ce02200197000000000112019f000000000010041b000001cf01000041000000000201041a000000000002004b000002410000c13d000000000006004b0000000002000019000001d202006041000000000262019f000000000021041b0000000001000414000001ca0010009c000001ca01008041000000c001100210000001d3011001c70000800d020000390000000303000039000001d40400004100000000050000190725071b0000040f0000000100200190000002810000613d0000000001000414000001ca0010009c000001ca01008041000000c001100210000001d3011001c70000800d020000390000000103000039000001d5040000410725071b0000040f0000000100200190000002810000613d000000200100003900000100001004430000012000000443000001d601000041000007260001042e000001d001000041000000000010043f000001d1010000410000072700010430000001ca0010009c000001ca01008041000000c001100210000000000003004b000002520000c13d0000000002040019000002550000013d0000000b01000029000000000001041b0000000d01000029072506f40000040f0000000001000019000007260001042e000001d3011001c7000080090200003900000000050000190725071b0000040f00020000000103550000006001100270000001ca0010019d000001ca01100197000000000001004b000002840000c13d0000000100200190000002ab0000613d000001f0010000410000000000100443000000000100041000000004001004430000000001000414000001ca0010009c000001ca01008041000000c001100210000001f1011001c70000800a02000039072507200000040f0000000100200190000002830000613d0000000d02000029000001cd02200197000000000101043b000000400300043d000000200430003900000000001404350000000000230435000001ca0030009c000001ca0300804100000040013002100000000002000414000001ca0020009c000001ca02008041000000c002200210000000000112019f000001f4011001c70000800d020000390000000103000039000001f5040000410725071b0000040f0000000100200190000000b30000c13d00000000010000190000072700010430000000000001042f0000001f041000390000020b044001970000003f044000390000020b05400197000000400400043d0000000005540019000000000045004b00000000060000390000000106004039000001f20050009c000006e70000213d0000000100600190000006e70000c13d000000400050043f00000000061404360000020b031001980000001f0410018f000000000136001900000002050003670000029d0000613d000000000705034f000000007807043c0000000006860436000000000016004b000002990000c13d000000000004004b0000025c0000613d000000000335034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f00000000003104350000025c0000013d000000400100043d000001f302000041000000480000013d000001f601000041000000800010043f000000840030043f0000000c01000029000000a40010043f0000000001000414000000040020008c000002c80000c13d0000000003000031000000200030008c00000020040000390000000004034019000002ed0000013d000001f601000041000000800010043f000000840030043f0000000c01000029000000a40010043f0000000001000414000000040020008c0000030f0000c13d0000000003000031000000200030008c00000020040000390000000004034019000003340000013d000001ca0010009c000001ca01008041000000c001100210000001f7011001c7072507200000040f0000006003100270000001ca03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000000800a000039000002dc0000613d000000000801034f000000008908043c000000000a9a043600000000005a004b000002d80000c13d000000000006004b000002e90000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000100200190000003470000613d0000001f01400039000000600110018f00000080011001bf000b00000001001d000000400010043f000000200030008c000002810000413d000000800100043d000600000001001d000001cd0010009c000002810000213d0000000d0000006b000003410000613d000000000200041a000001fa010000410000000b03000029000000000113043600000044030000390000000103300367000000000303043b000000020030008c0000037a0000213d000001cd022001970000000b0600002900000024046000390000000c050000290000000000540435000000040460003900000000003404350000000003000414000000040020008c0000038c0000c13d000000400010043f000003bb0000013d000001ca0010009c000001ca01008041000000c001100210000001f7011001c7072507200000040f0000006003100270000001ca03300197000000200030008c000000200400003900000000040340190000001f0640018f000000200740019000000080057001bf000003230000613d0000008008000039000000000901034f000000009a09043c0000000008a80436000000000058004b0000031f0000c13d000000000006004b000003300000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000100200190000003530000613d0000001f01400039000000600110018f00000080011001bf000b00000001001d000000400010043f000000200030008c000002810000413d000000800100043d000600000001001d000001cd0010009c000002810000213d0000000d0000006b000003710000c13d00000205010000410000000b0200002900000000001204350000004001200210000001d8011001c700000727000104300000001f0530018f000001cc06300198000000400200043d00000000046200190000035e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000034e0000c13d0000035e0000013d0000001f0530018f000001cc06300198000000400200043d00000000046200190000035e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000035a0000c13d000000000005004b0000036b0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001ca0020009c000001ca020080410000004002200210000000000112019f0000072700010430000000000200041a000001fa010000410000000b03000029000000000113043600000044030000390000000103300367000000000303043b000000030030008c000003800000413d0000020901000041000000000010043f0000002101000039000000040010043f0000020a010000410000072700010430000001cd022001970000000b0600002900000024046000390000000c050000290000000000540435000000040460003900000000003404350000000003000414000000040020008c000003e10000c13d000000400010043f000004100000013d000001ca0030009c000001ca03008041000000c0013002100000000b03000029000b00000003001d0000004003300210000000000113019f000001fb011001c7072507200000040f0000006003100270000001ca03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000003a40000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000003a00000c13d000000000006004b000003b10000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f000200000001035500000001002001900000043d0000613d0000001f01400039000000600110018f0000000b01100029000000400010043f000000200030008c000002810000413d0000000b0200002900000000020204330000000003000416000000000023004b0000004002100210000004160000413d0000008403100039000000060400002900000000004304350000002403100039000001fc0400004100000000004304350000006403100039000000000400041400000020050000390000000000530435000000440310003900000060050000390000000000530435000001fd03000041000000000031043500000004011000390000000000010435000001ca0040009c000001ca04008041000000c001400210000000000112019f000001fe011001c700008006020000390725071b0000040f0000000100200190000004550000613d000000000501043b000000000005004b000004890000c13d00000002010003670000000002000031000004590000013d000001ca0030009c000001ca03008041000000c0013002100000000b03000029000b00000003001d0000004003300210000000000113019f000001fb011001c7072507200000040f0000006003100270000001ca03300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000003f90000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b000003f50000c13d000000000006004b000004060000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000000003001f00020000000103550000000100200190000004490000613d0000001f01400039000000600110018f0000000b01100029000000400010043f000000200030008c000002810000413d0000000b0200002900000000020204330000000003000416000000000023004b00000040021002100000041a0000813d00000204030000410000000000310435000001d8012001c700000727000104300000008403100039000000060400002900000000004304350000002403100039000001fc040000410000000000430435000000a4030000390000000103300367000000000303043b00000064041000390000000005000414000000200600003900000000006404350000004404100039000000600600003900000000006404350000020804000041000000000041043500000004011000390000000000310435000001ca0050009c000001ca05008041000000c001500210000000000112019f000001fe011001c700008006020000390725071b0000040f0000000100200190000004650000613d000000000501043b000000000005004b0000051a0000c13d00000002010003670000000002000031000004690000013d0000001f0530018f000001cc06300198000000400200043d00000000046200190000035e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004440000c13d0000035e0000013d0000001f0530018f000001cc06300198000000400200043d00000000046200190000035e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004500000c13d0000035e0000013d00020000000103550000006002100270000001ca0020019d000001ca022001970000020b052001980000001f0620018f000000400300043d0000000004530019000004740000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000004600000c13d000004740000013d00020000000103550000006002100270000001ca0020019d000001ca022001970000020b052001980000001f0620018f000000400300043d0000000004530019000004740000613d000000000701034f0000000008030019000000007907043c0000000008980436000000000048004b000004700000c13d000000000006004b000004810000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f0000000000140435000001ca0020009c000001ca020080410000006001200210000001ca0030009c000001ca030080410000004002300210000000000112019f0000072700010430000000400600043d0000002004600039000001ff0100004100000000001404350000008401600039000000090300002900000000003104350000002407600039000000600100003900000000001704350000020b01300198000b001f00300193000000a403600039000500000001001d000000000813001900000001010003670000000709100360000004a10000613d000000000a09034f000000000b03001900000000ac0a043c000000000bcb043600000000008b004b0000049d0000c13d0000000b0000006b000004af0000613d00000005099003600000000b0a000029000000030aa00210000000000b080433000000000bab01cf000000000bab022f000000000909043b000001000aa000890000000009a9022f0000000009a901cf0000000009b9019f00000000009804350000000909000029000000000893001900000000000804350000001f089000390003020b0080019b000000030330002900000000077300490000004408600039000000000078043500000008091003600000000a0800002900000000078304360000020b0a8001980006001f0080019300040000000a001d0000000008a70019000004c60000613d000000000a09034f000000000b07001900000000ac0a043c000000000bcb043600000000008b004b000004c20000c13d000000060000006b000004d40000613d0000000409900360000000060a000029000000030aa00210000000000b080433000000000bab01cf000000000bab022f000000000909043b000001000aa000890000000009a9022f0000000009a901cf0000000009b9019f00000000009804350000000a090000290000000008970019000000000008043500000064086000390000000d0a0000290000000000a804350000001f089000390002020b0080019b00000002086000690000000007780019000000000383001900000000003604350000001f037000390000020b073001970000000003670019000000000073004b00000000070000390000000107004039000001f20030009c000006e70000213d0000000100700190000006e70000c13d000000400030043f00000000070604330000000006000414000001cd05500197000100000005001d000000040050008c000005ab0000c13d0000000004000032000005e60000613d0000001f054000390000020b055001970000003f055000390000020b065001970000000005360019000000000065004b00000000060000390000000106004039000001f20050009c000006e70000213d0000000100600190000006e70000c13d000000400050043f00000000064304360000020b034001980000001f0440018f000000000236001900000002050003670000050b0000613d000000000705034f000000007807043c0000000006860436000000000026004b000005070000c13d000000000004004b000005180000613d000000000335034f0000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000400300043d000005e60000013d000000400600043d0000002004600039000001ff0100004100000000001404350000008401600039000000090300002900000000003104350000002407600039000000600100003900000000001704350000020b01300198000b001f00300193000000a403600039000500000001001d000000000813001900000001010003670000000709100360000005320000613d000000000a09034f000000000b03001900000000ac0a043c000000000bcb043600000000008b004b0000052e0000c13d0000000b0000006b000005400000613d00000005099003600000000b0a000029000000030aa00210000000000b080433000000000bab01cf000000000bab022f000000000909043b000001000aa000890000000009a9022f0000000009a901cf0000000009b9019f00000000009804350000000909000029000000000893001900000000000804350000001f089000390003020b0080019b000000030330002900000000077300490000004408600039000000000078043500000008091003600000000a0800002900000000078304360000020b0a8001980006001f0080019300040000000a001d0000000008a70019000005570000613d000000000a09034f000000000b07001900000000ac0a043c000000000bcb043600000000008b004b000005530000c13d000000060000006b000005650000613d0000000409900360000000060a000029000000030aa00210000000000b080433000000000bab01cf000000000bab022f000000000909043b000001000aa000890000000009a9022f0000000009a901cf0000000009b9019f00000000009804350000000a090000290000000008970019000000000008043500000064086000390000000d0a0000290000000000a804350000001f089000390002020b0080019b00000002086000690000000007780019000000000383001900000000003604350000001f037000390000020b073001970000000003670019000000000073004b00000000070000390000000107004039000001f20030009c000006e70000213d0000000100700190000006e70000c13d000000400030043f00000000070604330000000006000414000001cd05500197000100000005001d000000040050008c000006400000c13d00000000040000320000067b0000613d0000001f054000390000020b055001970000003f055000390000020b065001970000000005360019000000000065004b00000000060000390000000106004039000001f20050009c000006e70000213d0000000100600190000006e70000c13d000000400050043f00000000064304360000020b034001980000001f0440018f000000000236001900000002050003670000059c0000613d000000000705034f000000007807043c0000000006860436000000000026004b000005980000c13d000000000004004b000005a90000613d000000000335034f0000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000400300043d0000067b0000013d000001ca0040009c000001ca040080410000004001400210000001ca0070009c000001ca070080410000006002700210000000000112019f000001ca0060009c000001ca06008041000000c002600210000000000121019f00000001020000290725071b0000040f00020000000103550000006003100270000001ca0030019d000001ca03300198000005e20000613d0000001f04300039000001cb044001970000003f044000390000020004400197000000400500043d0000000004450019000000000054004b00000000060000390000000106004039000001f20040009c000006e70000213d0000000100600190000006e70000c13d000000400040043f0000001f0430018f0000000006350436000001cc053001980000000003560019000005d50000613d000000000701034f000000007807043c0000000006860436000000000036004b000005d10000c13d000000000004004b000005e20000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000400300043d0000000100200190000006ed0000613d00000001010003670000004402100370000000000202043b00000040043000390000000c05000029000000000054043500000020043000390000000d05000029000000000054043500000001040000290000000000430435000000020020008c0000037a0000213d000000c004300039000000090500002900000000005404350000008004300039000000c0050000390000000000540435000000600430003900000000002404350000000705100360000000e0023000390000000504200029000000050000006b000006050000613d000000000605034f0000000007020019000000006806043c0000000007870436000000000047004b000006010000c13d0000000b0000006b000006130000613d00000005055003600000000b060000290000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000904200029000000000004043500000003022000290000000004320049000000a00530003900000000004504350000000a04000029000000000242043600000008041003600000000401200029000000040000006b000006250000613d000000000504034f0000000006020019000000005705043c0000000006760436000000000016004b000006210000c13d000000060000006b000006330000613d000000040440036000000006050000290000000305500210000000000601043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004104350000000a01200029000000000001043500000002013000690000000001210019000001ca0010009c000001ca010080410000006001100210000001ca0030009c000001ca030080410000004002300210000000000121019f0000000002000414000006d40000013d000001ca0040009c000001ca040080410000004001400210000001ca0070009c000001ca070080410000006002700210000000000112019f000001ca0060009c000001ca06008041000000c002600210000000000121019f00000001020000290725071b0000040f00020000000103550000006003100270000001ca0030019d000001ca03300198000006770000613d0000001f04300039000001cb044001970000003f044000390000020004400197000000400500043d0000000004450019000000000054004b00000000060000390000000106004039000001f20040009c000006e70000213d0000000100600190000006e70000c13d000000400040043f0000001f0430018f0000000006350436000001cc0530019800000000035600190000066a0000613d000000000701034f000000007807043c0000000006860436000000000036004b000006660000c13d000000000004004b000006770000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000000400300043d0000000100200190000006ed0000613d00000001010003670000004402100370000000000202043b00000040043000390000000c05000029000000000054043500000020043000390000000d05000029000000000054043500000001040000290000000000430435000000020020008c0000037a0000213d000000c004300039000000090500002900000000005404350000008004300039000000c0050000390000000000540435000000600430003900000000002404350000000705100360000000e0023000390000000504200029000000050000006b0000069a0000613d000000000605034f0000000007020019000000006806043c0000000007870436000000000047004b000006960000c13d0000000b0000006b000006a80000613d00000005055003600000000b060000290000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f00000000005404350000000904200029000000000004043500000003022000290000000004320049000000a00530003900000000004504350000000a04000029000000000242043600000008041003600000000401200029000000040000006b000006ba0000613d000000000504034f0000000006020019000000005705043c0000000006760436000000000016004b000006b60000c13d000000060000006b000006c80000613d000000040440036000000006050000290000000305500210000000000601043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f00000000004104350000000a01200029000000000001043500000002013000690000000001210019000001ca0010009c000001ca010080410000006001100210000001ca0030009c000001ca030080410000004002300210000000000121019f0000000002000414000001ca0020009c000001ca02008041000000c002200210000000000112019f000001d3011001c70000800d02000039000000010300003900000202040000410725071b0000040f0000000100200190000002810000613d000000400100043d00000001020000290000000000210435000001ca0010009c000001ca01008041000000400110021000000203011001c7000007260001042e0000020901000041000000000010043f0000004101000039000000040010043f0000020a01000041000007270001043000000201010000410000000000130435000001ca0030009c000001ca030080410000004001300210000001d8011001c700000727000104300001000000000002000001cf02000041000000000502041a0000000002000414000001cd06100197000001ca0020009c000001ca02008041000000c001200210000001d3011001c70000800d020000390000000303000039000001d404000041000100000006001d0725071b0000040f00000001002001900000070b0000613d000000010000006b0000000001000019000001d20100604100000001011001af000001cf02000041000000000012041b000000000001042d00000000010000190000072700010430000000000001042f0000000001000414000001ca0010009c000001ca01008041000000c001100210000001ea011001c70000801002000039072507200000040f0000000100200190000007190000613d000000000101043b000000000001042d000000000100001900000727000104300000071e002104210000000102000039000000000001042d0000000002000019000000000001042d00000723002104230000000102000039000000000001042d0000000002000019000000000001042d0000072500000432000007260001042e000007270001043000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927000000000000000000000000000000000000000000000000000000000dc149f000000000000000000000000000000000000000040000001c0000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0af708b1f13ed484151677600974505d503320f7599db2a484bb528f3d8e02ea90000000200000000000000000000000000000040000001000000000000000000b96bbf3d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000005ab1bd5200000000000000000000000000000000000000000000000000000000f04e283d00000000000000000000000000000000000000000000000000000000f04e283e00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000fee81cf4000000000000000000000000000000000000000000000000000000005ab1bd5300000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000002e21ba0f000000000000000000000000000000000000000000000000000000002e21ba100000000000000000000000000000000000000000000000000000000051cff8d90000000000000000000000000000000000000000000000000000000054d1f13d0000000000000000000000000000000000000000000000000000000015cafde6000000000000000000000000000000000000000000000000000000002569296200000000000000000000000000000000000000000000000000000000389a75e10000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000000000007448fbae02000000000000000000000000000000000000200000000c0000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000006f5e8818fa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c920000000000000000000000000000000000000000000000000000000082b429009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f390200000200000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff27fcd9d10000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000400000000000000000000000007fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65d8da022b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000008000000000000000004df2715c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000008000000000000000006a0ddc7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044000000000000000000000000010000390d7ece662ea76735786332b473ba8edeab6a0c60e02251457df1f5dc9c4d535bdea7cd8a978f128b93471df48c7dbab89d703809115bdc118c235bfd02000000000000000000000000000000000000a4000000000000000000000000077f224a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ffffffe019b991a800000000000000000000000000000000000000000000000000000000a35e7914bdeb3c867652bf563a8fef465d3247bcbe2ee9563fe41acad61f01f90000000000000000000000000000000000000020000000000000000000000000a8c0ba0200000000000000000000000000000000000000000000000000000000cd6225f400000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d00dbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d3cda33511d41a8a5431b1770c5bc0ddd62e1cd30555d16659b89c0d60f4f9f574e487b71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe097e6c8279b6eaebf64a7aa159ac40020071eff1c4aa5cf7ca403c3f332b9b7d8

Block Transaction 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  ]

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.