Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
205141 | 60 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 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
Contract Source Code (Solidity Standard Json-Input format)
// 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 {} }
// 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; } }
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) } } } }
// 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; }
// 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; }
// 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(); _; } }
// 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) } } _; } }
// 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); }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi", "metadata" ], "": [ "ast" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ 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.