More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,910 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Basic Edi... | 130677192 | 27 hrs ago | IN | 0 ETH | 0.000026195835 | ||||
Create Basic Edi... | 130582930 | 3 days ago | IN | 0 ETH | 0.00000382153 | ||||
Create Basic Edi... | 130582835 | 3 days ago | IN | 0 ETH | 0.000002357514 | ||||
Create Basic Edi... | 130582569 | 3 days ago | IN | 0 ETH | 0.000000516839 | ||||
Create Basic Edi... | 130582465 | 3 days ago | IN | 0 ETH | 0.00000058601 | ||||
Create Basic Edi... | 130543458 | 4 days ago | IN | 0 ETH | 0.000000087075 | ||||
Create Basic Edi... | 130539591 | 4 days ago | IN | 0 ETH | 0.000000104797 | ||||
Create Basic Edi... | 130532985 | 4 days ago | IN | 0 ETH | 0.000000461182 | ||||
Create Basic Edi... | 130529038 | 4 days ago | IN | 0 ETH | 0.000000537929 | ||||
Create Basic Edi... | 130504587 | 5 days ago | IN | 0 ETH | 0.000000445287 | ||||
Create Basic Edi... | 130504545 | 5 days ago | IN | 0 ETH | 0.000000488657 | ||||
Create Basic Edi... | 130500267 | 5 days ago | IN | 0 ETH | 0.00000017171 | ||||
Create Basic Edi... | 130499699 | 5 days ago | IN | 0 ETH | 0.000000276283 | ||||
Create Basic Edi... | 130457801 | 6 days ago | IN | 0 ETH | 0.000000678863 | ||||
Create Basic Edi... | 130378338 | 8 days ago | IN | 0 ETH | 0.000008541682 | ||||
Create Basic Edi... | 130364264 | 8 days ago | IN | 0 ETH | 0.000000153766 | ||||
Create Basic Edi... | 130249416 | 11 days ago | IN | 0 ETH | 0.000000264181 | ||||
Create Basic Edi... | 130204049 | 12 days ago | IN | 0 ETH | 0.000000408179 | ||||
Create Basic Edi... | 130180272 | 12 days ago | IN | 0 ETH | 0.00000332436 | ||||
Create Basic Edi... | 130081021 | 14 days ago | IN | 0 ETH | 0.000000915816 | ||||
Create Basic Edi... | 130065413 | 15 days ago | IN | 0 ETH | 0.00000016187 | ||||
Create Basic Edi... | 130026287 | 16 days ago | IN | 0 ETH | 0.000001082807 | ||||
Create Basic Edi... | 129973366 | 17 days ago | IN | 0 ETH | 0.000000491023 | ||||
Create Basic Edi... | 129821875 | 20 days ago | IN | 0 ETH | 0.000002990583 | ||||
Create Basic Edi... | 129790642 | 21 days ago | IN | 0 ETH | 0.000002172536 |
Latest 25 internal transactions (View All)
Advanced mode:
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.
Contract Name:
MintFactory
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 250000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import {IMetadataRenderer} from "create/interfaces/v1/IMetadataRenderer.sol"; import {LibClone} from "solady/utils/LibClone.sol"; import {Ownable} from "solady/auth/Ownable.sol"; import {Pausable} from "openzeppelin/security/Pausable.sol"; import {IMintFactory} from "create/interfaces/v1/IMintFactory.sol"; import {Mint721Configuration} from "create/interfaces/v1/Mint721Configuration.sol"; import {IMint721} from "create/interfaces/v1/IMint721.sol"; contract MintFactory is IMintFactory, Ownable, Pausable { /// @notice The mint module registry. address public mintModuleRegistry; /// @notice The implementation of Mint721 to be cloned here. address public mint721Implementation; error InvalidAddress(); constructor() { _initializeOwner(tx.origin); } /// @inheritdoc IMintFactory function createBasicEdition( Mint721Configuration calldata mint721Configuration, IMetadataRenderer metadataRenderer, bytes calldata metadataRendererData, bytes32 salt, address[] calldata mintModuleAddresses, bytes[] calldata mintModuleData ) external returns (address contractAddress) { return _createBasicEdtion( mint721Configuration, metadataRenderer, metadataRendererData, salt, mintModuleAddresses, mintModuleData ); } /// @inheritdoc IMintFactory function createBasicEdition_efficient_d3ea1b36( Mint721Configuration calldata mint721Configuration, IMetadataRenderer metadataRenderer, bytes calldata metadataRendererData, bytes32 salt, address[] calldata mintModuleAddresses, bytes[] calldata mintModuleData ) external returns (address contractAddress) { return _createBasicEdtion( mint721Configuration, metadataRenderer, metadataRendererData, salt, mintModuleAddresses, mintModuleData ); } function _createBasicEdtion( Mint721Configuration calldata mint721Configuration, IMetadataRenderer metadataRenderer, bytes calldata metadataRendererData, bytes32 salt, address[] calldata mintModuleAddresses, bytes[] calldata mintModuleData ) internal whenNotPaused returns (address contractAddress) { if (address(bytes20(salt)) != msg.sender) revert InvalidSalt(); contractAddress = LibClone.cloneDeterministic(mint721Implementation, salt); IMint721(contractAddress).initialize( mint721Configuration, mintModuleRegistry, metadataRenderer, metadataRendererData, mintModuleAddresses, mintModuleData, msg.sender ); emit ContractCreated(contractAddress, msg.sender); } /// @inheritdoc IMintFactory function updateImplementations(address _mintModuleRegistry, address _mint721Implementation) external onlyOwner { if (_mintModuleRegistry == address(0) || _mint721Implementation == address(0)) { revert InvalidAddress(); } mintModuleRegistry = _mintModuleRegistry; mint721Implementation = _mint721Implementation; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; interface IMetadataRenderer { /// @notice Retrieves the token URI for the specified token ID. /// @param tokenId The ID of the token. /// @return uri The URI of the token. function tokenURI(uint256 tokenId) external view returns (string memory uri); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Minimal proxy library. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibClone.sol) /// @author Minimal proxy by 0age (https://github.com/0age) /// @author Clones with immutable args by wighawag, zefram.eth, Saw-mon & Natalie /// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args) /// /// @dev Minimal proxy: /// Although the sw0nt pattern saves 5 gas over the erc-1167 pattern during runtime, /// it is not supported out-of-the-box on Etherscan. Hence, we choose to use the 0age pattern, /// which saves 4 gas over the erc-1167 pattern during runtime, and has the smallest bytecode. /// /// @dev Minimal proxy (PUSH0 variant): /// This is a new minimal proxy that uses the PUSH0 opcode introduced during Shanghai. /// It is optimized first for minimal runtime gas, then for minimal bytecode. /// The PUSH0 clone functions are intentionally postfixed with a jarring "_PUSH0" as /// many EVM chains may not support the PUSH0 opcode in the early months after Shanghai. /// Please use with caution. /// /// @dev Clones with immutable args (CWIA): /// The implementation of CWIA here implements a `receive()` method that emits the /// `ReceiveETH(uint256)` event. This skips the `DELEGATECALL` when there is no calldata, /// enabling us to accept hard gas-capped `sends` & `transfers` for maximum backwards /// composability. The minimal proxy implementation does not offer this feature. library LibClone { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Unable to deploy the clone. error DeploymentFailed(); /// @dev The salt must start with either the zero address or the caller. error SaltDoesNotStartWithCaller(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MINIMAL PROXY OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Deploys a clone of `implementation`. function clone(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { /** * --------------------------------------------------------------------------+ * CREATION (9 bytes) | * --------------------------------------------------------------------------| * Opcode | Mnemonic | Stack | Memory | * --------------------------------------------------------------------------| * 60 runSize | PUSH1 runSize | r | | * 3d | RETURNDATASIZE | 0 r | | * 81 | DUP2 | r 0 r | | * 60 offset | PUSH1 offset | o r 0 r | | * 3d | RETURNDATASIZE | 0 o r 0 r | | * 39 | CODECOPY | 0 r | [0..runSize): runtime code | * f3 | RETURN | | [0..runSize): runtime code | * --------------------------------------------------------------------------| * RUNTIME (44 bytes) | * --------------------------------------------------------------------------| * Opcode | Mnemonic | Stack | Memory | * --------------------------------------------------------------------------| * | * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | 0 | | * 3d | RETURNDATASIZE | 0 0 | | * 3d | RETURNDATASIZE | 0 0 0 | | * 3d | RETURNDATASIZE | 0 0 0 0 | | * | * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds 0 0 0 0 | | * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | | * 3d | RETURNDATASIZE | 0 0 cds 0 0 0 0 | | * 37 | CALLDATACOPY | 0 0 0 0 | [0..cds): calldata | * | * ::: delegate call to the implementation contract :::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds 0 0 0 0 | [0..cds): calldata | * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | [0..cds): calldata | * 73 addr | PUSH20 addr | addr 0 cds 0 0 0 0 | [0..cds): calldata | * 5a | GAS | gas addr 0 cds 0 0 0 0 | [0..cds): calldata | * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata | * | * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata | * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata | * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata | * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata | * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata | * | * 60 0x2a | PUSH1 0x2a | 0x2a success 0 rds | [0..rds): returndata | * 57 | JUMPI | 0 rds | [0..rds): returndata | * | * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * fd | REVERT | | [0..rds): returndata | * | * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 5b | JUMPDEST | 0 rds | [0..rds): returndata | * f3 | RETURN | | [0..rds): returndata | * --------------------------------------------------------------------------+ */ mstore(0x21, 0x5af43d3d93803e602a57fd5bf3) mstore(0x14, implementation) mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73) instance := create(0, 0x0c, 0x35) // If `instance` is zero, revert. if iszero(instance) { // Store the function selector of `DeploymentFailed()`. mstore(0x00, 0x30116425) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that has been overwritten. mstore(0x21, 0) } } /// @dev Deploys a deterministic clone of `implementation` with `salt`. function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { mstore(0x21, 0x5af43d3d93803e602a57fd5bf3) mstore(0x14, implementation) mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73) instance := create2(0, 0x0c, 0x35, salt) // If `instance` is zero, revert. if iszero(instance) { // Store the function selector of `DeploymentFailed()`. mstore(0x00, 0x30116425) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that has been overwritten. mstore(0x21, 0) } } /// @dev Returns the initialization code hash of the clone of `implementation`. /// Used for mining vanity addresses with create2crunch. function initCodeHash(address implementation) internal pure returns (bytes32 hash) { /// @solidity memory-safe-assembly assembly { mstore(0x21, 0x5af43d3d93803e602a57fd5bf3) mstore(0x14, implementation) mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73) hash := keccak256(0x0c, 0x35) // Restore the part of the free memory pointer that has been overwritten. mstore(0x21, 0) } } /// @dev Returns the address of the deterministic clone of `implementation`, /// with `salt` by `deployer`. /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly. function predictDeterministicAddress(address implementation, bytes32 salt, address deployer) internal pure returns (address predicted) { bytes32 hash = initCodeHash(implementation); predicted = predictDeterministicAddress(hash, salt, deployer); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MINIMAL PROXY OPERATIONS (PUSH0 VARIANT) */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Deploys a PUSH0 clone of `implementation`. function clone_PUSH0(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { /** * --------------------------------------------------------------------------+ * CREATION (9 bytes) | * --------------------------------------------------------------------------| * Opcode | Mnemonic | Stack | Memory | * --------------------------------------------------------------------------| * 60 runSize | PUSH1 runSize | r | | * 5f | PUSH0 | 0 r | | * 81 | DUP2 | r 0 r | | * 60 offset | PUSH1 offset | o r 0 r | | * 5f | PUSH0 | 0 o r 0 r | | * 39 | CODECOPY | 0 r | [0..runSize): runtime code | * f3 | RETURN | | [0..runSize): runtime code | * --------------------------------------------------------------------------| * RUNTIME (45 bytes) | * --------------------------------------------------------------------------| * Opcode | Mnemonic | Stack | Memory | * --------------------------------------------------------------------------| * | * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: | * 5f | PUSH0 | 0 | | * 5f | PUSH0 | 0 0 | | * | * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds 0 0 | | * 5f | PUSH0 | 0 cds 0 0 | | * 5f | PUSH0 | 0 0 cds 0 0 | | * 37 | CALLDATACOPY | 0 0 | [0..cds): calldata | * | * ::: delegate call to the implementation contract :::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds 0 0 | [0..cds): calldata | * 5f | PUSH0 | 0 cds 0 0 | [0..cds): calldata | * 73 addr | PUSH20 addr | addr 0 cds 0 0 | [0..cds): calldata | * 5a | GAS | gas addr 0 cds 0 0 | [0..cds): calldata | * f4 | DELEGATECALL | success | [0..cds): calldata | * | * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | rds success | [0..cds): calldata | * 5f | PUSH0 | 0 rds success | [0..cds): calldata | * 5f | PUSH0 | 0 0 rds success | [0..cds): calldata | * 3e | RETURNDATACOPY | success | [0..rds): returndata | * | * 60 0x29 | PUSH1 0x29 | 0x29 success | [0..rds): returndata | * 57 | JUMPI | | [0..rds): returndata | * | * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | rds | [0..rds): returndata | * 5f | PUSH0 | 0 rds | [0..rds): returndata | * fd | REVERT | | [0..rds): returndata | * | * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 5b | JUMPDEST | | [0..rds): returndata | * 3d | RETURNDATASIZE | rds | [0..rds): returndata | * 5f | PUSH0 | 0 rds | [0..rds): returndata | * f3 | RETURN | | [0..rds): returndata | * --------------------------------------------------------------------------+ */ mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16 mstore(0x14, implementation) // 20 mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9 instance := create(0, 0x0e, 0x36) // If `instance` is zero, revert. if iszero(instance) { // Store the function selector of `DeploymentFailed()`. mstore(0x00, 0x30116425) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that has been overwritten. mstore(0x24, 0) } } /// @dev Deploys a deterministic PUSH0 clone of `implementation` with `salt`. function cloneDeterministic_PUSH0(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16 mstore(0x14, implementation) // 20 mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9 instance := create2(0, 0x0e, 0x36, salt) // If `instance` is zero, revert. if iszero(instance) { // Store the function selector of `DeploymentFailed()`. mstore(0x00, 0x30116425) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that has been overwritten. mstore(0x24, 0) } } /// @dev Returns the initialization code hash of the PUSH0 clone of `implementation`. /// Used for mining vanity addresses with create2crunch. function initCodeHash_PUSH0(address implementation) internal pure returns (bytes32 hash) { /// @solidity memory-safe-assembly assembly { mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16 mstore(0x14, implementation) // 20 mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9 hash := keccak256(0x0e, 0x36) // Restore the part of the free memory pointer that has been overwritten. mstore(0x24, 0) } } /// @dev Returns the address of the deterministic PUSH0 clone of `implementation`, /// with `salt` by `deployer`. /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly. function predictDeterministicAddress_PUSH0( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { bytes32 hash = initCodeHash_PUSH0(implementation); predicted = predictDeterministicAddress(hash, salt, deployer); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CLONES WITH IMMUTABLE ARGS OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Deploys a minimal proxy with `implementation`, /// using immutable arguments encoded in `data`. /// /// Note: This implementation of CWIA differs from the original implementation. /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`. function clone(address implementation, bytes memory data) internal returns (address instance) { assembly { // Compute the boundaries of the data and cache the memory slots around it. let mBefore3 := mload(sub(data, 0x60)) let mBefore2 := mload(sub(data, 0x40)) let mBefore1 := mload(sub(data, 0x20)) let dataLength := mload(data) let dataEnd := add(add(data, 0x20), dataLength) let mAfter1 := mload(dataEnd) // +2 bytes for telling how much data there is appended to the call. let extraLength := add(dataLength, 2) // The `creationSize` is `extraLength + 108` // The `runSize` is `creationSize - 10`. /** * ---------------------------------------------------------------------------------------------------+ * CREATION (10 bytes) | * ---------------------------------------------------------------------------------------------------| * Opcode | Mnemonic | Stack | Memory | * ---------------------------------------------------------------------------------------------------| * 61 runSize | PUSH2 runSize | r | | * 3d | RETURNDATASIZE | 0 r | | * 81 | DUP2 | r 0 r | | * 60 offset | PUSH1 offset | o r 0 r | | * 3d | RETURNDATASIZE | 0 o r 0 r | | * 39 | CODECOPY | 0 r | [0..runSize): runtime code | * f3 | RETURN | | [0..runSize): runtime code | * ---------------------------------------------------------------------------------------------------| * RUNTIME (98 bytes + extraLength) | * ---------------------------------------------------------------------------------------------------| * Opcode | Mnemonic | Stack | Memory | * ---------------------------------------------------------------------------------------------------| * | * ::: if no calldata, emit event & return w/o `DELEGATECALL` ::::::::::::::::::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds | | * 60 0x2c | PUSH1 0x2c | 0x2c cds | | * 57 | JUMPI | | | * 34 | CALLVALUE | cv | | * 3d | RETURNDATASIZE | 0 cv | | * 52 | MSTORE | | [0..0x20): callvalue | * 7f sig | PUSH32 0x9e.. | sig | [0..0x20): callvalue | * 59 | MSIZE | 0x20 sig | [0..0x20): callvalue | * 3d | RETURNDATASIZE | 0 0x20 sig | [0..0x20): callvalue | * a1 | LOG1 | | [0..0x20): callvalue | * 00 | STOP | | [0..0x20): callvalue | * 5b | JUMPDEST | | | * | * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds | | * 3d | RETURNDATASIZE | 0 cds | | * 3d | RETURNDATASIZE | 0 0 cds | | * 37 | CALLDATACOPY | | [0..cds): calldata | * | * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | 0 | [0..cds): calldata | * 3d | RETURNDATASIZE | 0 0 | [0..cds): calldata | * 3d | RETURNDATASIZE | 0 0 0 | [0..cds): calldata | * 3d | RETURNDATASIZE | 0 0 0 0 | [0..cds): calldata | * 61 extra | PUSH2 extra | e 0 0 0 0 | [0..cds): calldata | * | * ::: copy extra data to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 80 | DUP1 | e e 0 0 0 0 | [0..cds): calldata | * 60 0x62 | PUSH1 0x62 | 0x62 e e 0 0 0 0 | [0..cds): calldata | * 36 | CALLDATASIZE | cds 0x62 e e 0 0 0 0 | [0..cds): calldata | * 39 | CODECOPY | e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData | * | * ::: delegate call to the implementation contract ::::::::::::::::::::::::::::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData | * 01 | ADD | cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData | * 3d | RETURNDATASIZE | 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData | * 73 addr | PUSH20 addr | addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData | * 5a | GAS | gas addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData | * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata, [cds..cds+e): extraData | * | * ::: copy return data to memory ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData | * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData | * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData | * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData | * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata | * | * 60 0x60 | PUSH1 0x60 | 0x60 success 0 rds | [0..rds): returndata | * 57 | JUMPI | 0 rds | [0..rds): returndata | * | * ::: revert ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * fd | REVERT | | [0..rds): returndata | * | * ::: return ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 5b | JUMPDEST | 0 rds | [0..rds): returndata | * f3 | RETURN | | [0..rds): returndata | * ---------------------------------------------------------------------------------------------------+ */ // Write the bytecode before the data. mstore(data, 0x5af43d3d93803e606057fd5bf3) // Write the address of the implementation. mstore(sub(data, 0x0d), implementation) // Write the rest of the bytecode. mstore( sub(data, 0x21), or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73) ) // `keccak256("ReceiveETH(uint256)")` mstore( sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff ) mstore( // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e. // The actual EVM limit may be smaller and may change over time. sub(data, add(0x59, lt(extraLength, 0xff9e))), or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f) ) mstore(dataEnd, shl(0xf0, extraLength)) // Create the instance. instance := create(0, sub(data, 0x4c), add(extraLength, 0x6c)) // If `instance` is zero, revert. if iszero(instance) { // Store the function selector of `DeploymentFailed()`. mstore(0x00, 0x30116425) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the overwritten memory surrounding `data`. mstore(dataEnd, mAfter1) mstore(data, dataLength) mstore(sub(data, 0x20), mBefore1) mstore(sub(data, 0x40), mBefore2) mstore(sub(data, 0x60), mBefore3) } } /// @dev Deploys a deterministic clone of `implementation`, /// using immutable arguments encoded in `data`, with `salt`. /// /// Note: This implementation of CWIA differs from the original implementation. /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`. function cloneDeterministic(address implementation, bytes memory data, bytes32 salt) internal returns (address instance) { assembly { // Compute the boundaries of the data and cache the memory slots around it. let mBefore3 := mload(sub(data, 0x60)) let mBefore2 := mload(sub(data, 0x40)) let mBefore1 := mload(sub(data, 0x20)) let dataLength := mload(data) let dataEnd := add(add(data, 0x20), dataLength) let mAfter1 := mload(dataEnd) // +2 bytes for telling how much data there is appended to the call. let extraLength := add(dataLength, 2) // Write the bytecode before the data. mstore(data, 0x5af43d3d93803e606057fd5bf3) // Write the address of the implementation. mstore(sub(data, 0x0d), implementation) // Write the rest of the bytecode. mstore( sub(data, 0x21), or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73) ) // `keccak256("ReceiveETH(uint256)")` mstore( sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff ) mstore( // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e. // The actual EVM limit may be smaller and may change over time. sub(data, add(0x59, lt(extraLength, 0xff9e))), or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f) ) mstore(dataEnd, shl(0xf0, extraLength)) // Create the instance. instance := create2(0, sub(data, 0x4c), add(extraLength, 0x6c), salt) // If `instance` is zero, revert. if iszero(instance) { // Store the function selector of `DeploymentFailed()`. mstore(0x00, 0x30116425) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the overwritten memory surrounding `data`. mstore(dataEnd, mAfter1) mstore(data, dataLength) mstore(sub(data, 0x20), mBefore1) mstore(sub(data, 0x40), mBefore2) mstore(sub(data, 0x60), mBefore3) } } /// @dev Returns the initialization code hash of the clone of `implementation` /// using immutable arguments encoded in `data`. /// Used for mining vanity addresses with create2crunch. function initCodeHash(address implementation, bytes memory data) internal pure returns (bytes32 hash) { assembly { // Compute the boundaries of the data and cache the memory slots around it. let mBefore3 := mload(sub(data, 0x60)) let mBefore2 := mload(sub(data, 0x40)) let mBefore1 := mload(sub(data, 0x20)) let dataLength := mload(data) let dataEnd := add(add(data, 0x20), dataLength) let mAfter1 := mload(dataEnd) // Do a out-of-gas revert if `dataLength` is too big. 0xffff - 0x02 - 0x62 = 0xff9b. // The actual EVM limit may be smaller and may change over time. returndatacopy(returndatasize(), returndatasize(), gt(dataLength, 0xff9b)) // +2 bytes for telling how much data there is appended to the call. let extraLength := add(dataLength, 2) // Write the bytecode before the data. mstore(data, 0x5af43d3d93803e606057fd5bf3) // Write the address of the implementation. mstore(sub(data, 0x0d), implementation) // Write the rest of the bytecode. mstore( sub(data, 0x21), or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73) ) // `keccak256("ReceiveETH(uint256)")` mstore( sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff ) mstore( sub(data, 0x5a), or(shl(0x78, add(extraLength, 0x62)), 0x6100003d81600a3d39f336602c57343d527f) ) mstore(dataEnd, shl(0xf0, extraLength)) // Compute and store the bytecode hash. hash := keccak256(sub(data, 0x4c), add(extraLength, 0x6c)) // Restore the overwritten memory surrounding `data`. mstore(dataEnd, mAfter1) mstore(data, dataLength) mstore(sub(data, 0x20), mBefore1) mstore(sub(data, 0x40), mBefore2) mstore(sub(data, 0x60), mBefore3) } } /// @dev Returns the address of the deterministic clone of /// `implementation` using immutable arguments encoded in `data`, with `salt`, by `deployer`. /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly. function predictDeterministicAddress( address implementation, bytes memory data, bytes32 salt, address deployer ) internal pure returns (address predicted) { bytes32 hash = initCodeHash(implementation, data); predicted = predictDeterministicAddress(hash, salt, deployer); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* OTHER OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the address when a contract with initialization code hash, /// `hash`, is deployed with `salt`, by `deployer`. /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly. function predictDeterministicAddress(bytes32 hash, bytes32 salt, address deployer) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { // Compute and store the bytecode hash. mstore8(0x00, 0xff) // Write the prefix. mstore(0x35, hash) mstore(0x01, shl(96, deployer)) mstore(0x15, salt) predicted := keccak256(0x00, 0x55) // Restore the part of the free memory pointer that has been overwritten. mstore(0x35, 0) } } /// @dev Reverts if `salt` does not start with either the zero address or the caller. function checkStartsWithCaller(bytes32 salt) internal view { /// @solidity memory-safe-assembly assembly { // If the salt does not start with the zero address or the caller. if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) { // Store the function selector of `SaltDoesNotStartWithCaller()`. mstore(0x00, 0x2f634836) // Revert with (offset, size). revert(0x1c, 0x04) } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Simple single owner authorization mixin. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol) /// /// @dev Note: /// This implementation does NOT auto-initialize the owner to `msg.sender`. /// You MUST call the `_initializeOwner` in the constructor / initializer. /// /// While the ownable portion follows /// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility, /// the nomenclature for the 2-step ownership handover may be unique to this codebase. abstract contract Ownable { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The caller is not authorized to call the function. error Unauthorized(); /// @dev The `newOwner` cannot be the zero address. error NewOwnerIsZeroAddress(); /// @dev The `pendingOwner` does not have a valid handover request. error NoHandoverRequest(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ownership is transferred from `oldOwner` to `newOwner`. /// This event is intentionally kept the same as OpenZeppelin's Ownable to be /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173), /// despite it not being as lightweight as a single argument event. event OwnershipTransferred(address indexed oldOwner, address indexed newOwner); /// @dev An ownership handover to `pendingOwner` has been requested. event OwnershipHandoverRequested(address indexed pendingOwner); /// @dev The ownership handover to `pendingOwner` has been canceled. event OwnershipHandoverCanceled(address indexed pendingOwner); /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`. uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE = 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0; /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE = 0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d; /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE = 0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The owner slot is given by: `not(_OWNER_SLOT_NOT)`. /// It is intentionally chosen to be a high value /// to avoid collision with lower slots. /// The choice of manual storage layout is to enable compatibility /// with both regular and upgradeable contracts. uint256 private constant _OWNER_SLOT_NOT = 0x8b78c6d8; /// The ownership handover slot of `newOwner` is given by: /// ``` /// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED)) /// let handoverSlot := keccak256(0x00, 0x20) /// ``` /// It stores the expiry timestamp of the two-step ownership handover. uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Initializes the owner directly without authorization guard. /// This function must be called upon initialization, /// regardless of whether the contract is upgradeable or not. /// This is to enable generalization to both regular and upgradeable contracts, /// and to save gas in case the initial owner is not the caller. /// For performance reasons, this function will not check if there /// is an existing owner. function _initializeOwner(address newOwner) internal virtual { /// @solidity memory-safe-assembly assembly { // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Store the new value. sstore(not(_OWNER_SLOT_NOT), newOwner) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner) } } /// @dev Sets the owner directly without authorization guard. function _setOwner(address newOwner) internal virtual { /// @solidity memory-safe-assembly assembly { let ownerSlot := not(_OWNER_SLOT_NOT) // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner) // Store the new value. sstore(ownerSlot, newOwner) } } /// @dev Throws if the sender is not the owner. function _checkOwner() internal view virtual { /// @solidity memory-safe-assembly assembly { // If the caller is not the stored owner, revert. if iszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) { mstore(0x00, 0x82b42900) // `Unauthorized()`. revert(0x1c, 0x04) } } } /// @dev Returns how long a two-step ownership handover is valid for in seconds. /// Override to return a different value if needed. /// Made internal to conserve bytecode. Wrap it in a public function if needed. function _ownershipHandoverValidFor() internal view virtual returns (uint64) { return 48 * 3600; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC UPDATE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Allows the owner to transfer the ownership to `newOwner`. function transferOwnership(address newOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { if iszero(shl(96, newOwner)) { mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`. revert(0x1c, 0x04) } } _setOwner(newOwner); } /// @dev Allows the owner to renounce their ownership. function renounceOwnership() public payable virtual onlyOwner { _setOwner(address(0)); } /// @dev Request a two-step ownership handover to the caller. /// The request will automatically expire in 48 hours (172800 seconds) by default. function requestOwnershipHandover() public payable virtual { unchecked { uint256 expires = block.timestamp + _ownershipHandoverValidFor(); /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to `expires`. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), expires) // Emit the {OwnershipHandoverRequested} event. log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller()) } } } /// @dev Cancels the two-step ownership handover to the caller, if any. function cancelOwnershipHandover() public payable virtual { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), 0) // Emit the {OwnershipHandoverCanceled} event. log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller()) } } /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`. /// Reverts if there is no existing ownership handover requested by `pendingOwner`. function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) let handoverSlot := keccak256(0x0c, 0x20) // If the handover does not exist, or has expired. if gt(timestamp(), sload(handoverSlot)) { mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`. revert(0x1c, 0x04) } // Set the handover slot to 0. sstore(handoverSlot, 0) } _setOwner(pendingOwner); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC READ FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the owner of the contract. function owner() public view virtual returns (address result) { /// @solidity memory-safe-assembly assembly { result := sload(not(_OWNER_SLOT_NOT)) } } /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`. function ownershipHandoverExpiresAt(address pendingOwner) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { // Compute the handover slot. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) // Load the handover slot. result := sload(keccak256(0x0c, 0x20)) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MODIFIERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Marks a function as only callable by the owner. modifier onlyOwner() virtual { _checkOwner(); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import {BasicMintConfiguration} from "create/interfaces/v1/BasicMintConfiguration.sol"; import {Mint721Configuration} from "create/interfaces/v1/Mint721Configuration.sol"; import {IPFSEditionRendererConfiguration} from "create/interfaces/v1/IPFSEditionRendererConfiguration.sol"; import {IMetadataRenderer} from "create/interfaces/v1/IMetadataRenderer.sol"; interface IMintFactoryEvents { /// @notice Emitted when a new contract is created. /// @param _contract The address of the newly created contract. /// @param _creator The address who created the contract. event ContractCreated(address indexed _contract, address indexed _creator); } interface IMintFactory is IMintFactoryEvents { error InvalidSalt(); /// @notice Creates a new basic edition mint with the specified configurations. /// @dev Uses the CREATE2 opcode with `salt` to create a contract. /// `salt` should start with `msg.sender` and can be followed by any unique byte sequence. /// After the creation, the `ContractCreated` event is emitted. /// @param mint721Configuration The initial configuration for the NFT collection. /// @param metadataRenderer The metadata renderer contract address. /// @param metadataRendererData The configuration data for the metadata renderer, or 0 bytes if none. /// @param salt The CREATE2 salt used for predictable contract addressing. Must start with `msg.sender`. /// @param mintModuleAddresses The initial approved mint modules. /// @param mintModuleData The configuration data for the mint modules. /// @return contractAddress The address of the newly created contract. function createBasicEdition( Mint721Configuration calldata mint721Configuration, IMetadataRenderer metadataRenderer, bytes calldata metadataRendererData, bytes32 salt, address[] calldata mintModuleAddresses, bytes[] calldata mintModuleData ) external returns (address contractAddress); /// @notice Creates a new basic edition mint with the specified configurations. /// @dev This is a functionally identical to `createBasicEdition`, but the four byte selector is 00000000. /// Uses the CREATE2 opcode with `salt` to create a contract. /// `salt` should start with `msg.sender` and can be followed by any unique byte sequence. /// After the creation, the `ContractCreated` event is emitted. /// @param mint721Configuration The initial configuration for the NFT collection. /// @param metadataRenderer The metadata renderer contract address. /// @param metadataRendererData The configuration data for the metadata renderer, or 0 bytes if none. /// @param salt The CREATE2 salt used for predictable contract addressing. Must start with `msg.sender`. /// @param mintModuleAddresses The initial approved mint modules. /// @param mintModuleData The configuration data for the mint modules. /// @return contractAddress The address of the newly created contract. function createBasicEdition_efficient_d3ea1b36( Mint721Configuration calldata mint721Configuration, IMetadataRenderer metadataRenderer, bytes calldata metadataRendererData, bytes32 salt, address[] calldata mintModuleAddresses, bytes[] calldata mintModuleData ) external returns (address contractAddress); /// @notice Updates the contract implementations. /// @dev Can only be called by the protocol admin. /// @param mintModuleRegistry The new MintModuleRegistry contract address. /// @param mint721Implementation The new Mint721 contract address. function updateImplementations(address mintModuleRegistry, address mint721Implementation) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; struct Mint721Configuration { /// @notice NFT collection name string name; /// @notice NFT collection symbol string symbol; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import {Mint721Configuration} from "./Mint721Configuration.sol"; import {IMetadataRenderer} from "./IMetadataRenderer.sol"; interface IMint721 { /// @notice Initializes a new Mint721 contract with the provided configuration. /// @dev `mintModules` and `mintModulesData` must have the same cardinality. /// @param configuration The configuration data. /// @param mintModuleRegistry The mint module registry. /// @param metadataRenderer The metadata renderer. /// @param metadataRendererConfig The configuration data for the metadata renderer, or none if not required. /// @param mintModules The initial approved mint modules. /// @param mintModuleData The configuration data for the mint modules. /// @param creator The creator of the contract. function initialize( Mint721Configuration calldata configuration, address mintModuleRegistry, IMetadataRenderer metadataRenderer, bytes calldata metadataRendererConfig, address[] calldata mintModules, bytes[] calldata mintModuleData, address creator ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; struct BasicMintConfiguration { /// @notice Purchase cost per token. uint256 price; /// @notice UNIX timestamp of mint start. uint64 mintStart; /// @notice UNIX timestamp of mint end, or zero if open-ended. uint64 mintEnd; /// @notice Maximum token purchase limit per wallet, or zero if no limit. uint32 maxPerWallet; /// @notice Maximum tokens mintable per transaction, or zero if no limit. uint32 maxPerTransaction; /// @notice Maximum tokens mintable by this module, or zero if no limit. uint32 maxForModule; /// @notice Maximum tokens that can be minted in total, or zero if no max. uint32 maxSupply; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; struct IPFSEditionRendererConfiguration { /// @notice Name of the token string tokenName; /// @notice Description of the token string tokenDescription; /// @notice IPFS hash for token's image content string imageIPFSHash; /// @notice IPFS hash for token's animated content (if any) /// If empty, no animated content is associated with the token string animationIPFSHash; /// @notice Mime type for token's animated content (if any) string animationMimeType; }
{ "remappings": [ "ERC721A/=lib/ERC721A/contracts/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "openzeppelin/=lib/openzeppelin-contracts/contracts/", "solmate/=lib/solmate/src/", "solady/=lib/solady/src/", "fundrop/=src/Fundrop/", "operator-filter-registry/=lib/operator-filter-registry/src/", "base64/=lib/base64/", "create/=src/Create/", "erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/", "erc721a-upgradeable/=lib/erc721a-upgradeable/contracts/", "openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 250000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidSalt","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_contract","type":"address"},{"indexed":true,"internalType":"address","name":"_creator","type":"address"}],"name":"ContractCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct Mint721Configuration","name":"mint721Configuration","type":"tuple"},{"internalType":"contract IMetadataRenderer","name":"metadataRenderer","type":"address"},{"internalType":"bytes","name":"metadataRendererData","type":"bytes"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address[]","name":"mintModuleAddresses","type":"address[]"},{"internalType":"bytes[]","name":"mintModuleData","type":"bytes[]"}],"name":"createBasicEdition","outputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct Mint721Configuration","name":"mint721Configuration","type":"tuple"},{"internalType":"contract IMetadataRenderer","name":"metadataRenderer","type":"address"},{"internalType":"bytes","name":"metadataRendererData","type":"bytes"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address[]","name":"mintModuleAddresses","type":"address[]"},{"internalType":"bytes[]","name":"mintModuleData","type":"bytes[]"}],"name":"createBasicEdition_efficient_d3ea1b36","outputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mint721Implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintModuleRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mintModuleRegistry","type":"address"},{"internalType":"address","name":"_mint721Implementation","type":"address"}],"name":"updateImplementations","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506000805460ff1916905561002432610029565b610065565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b610d68806100746000396000f3fe6080604052600436106100e35760003560e01c8063715018a61161008a5780639b2088b8116100595780639b2088b8146100e8578063f04e283e1461024c578063f2fde38b1461025f578063fee81cf41461027257600080fd5b8063715018a6146101c95780638456cb59146101d15780638859632c146101e65780638da5cb5b1461021857600080fd5b806354d1f13d116100c657806354d1f13d146101515780635a254858146101595780635ba975eb146101795780635c975abb146101a657600080fd5b80156100e857806325692962146101325780633f4ba83a1461013c575b600080fd5b3480156100f457600080fd5b506101086101033660046109c3565b6102b3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61013a6102d4565b005b34801561014857600080fd5b5061013a610324565b61013a610336565b34801561016557600080fd5b5061013a610174366004610a9e565b610372565b34801561018557600080fd5b506001546101089073ffffffffffffffffffffffffffffffffffffffff1681565b3480156101b257600080fd5b5060005460ff166040519015158152602001610129565b61013a61045c565b3480156101dd57600080fd5b5061013a61046e565b3480156101f257600080fd5b5060005461010890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561022457600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754610108565b61013a61025a366004610ad7565b61047e565b61013a61026d366004610ad7565b6104be565b34801561027e57600080fd5b506102a561028d366004610ad7565b63389a75e1600c908152600091909152602090205490565b604051908152602001610129565b60006102c68a8a8a8a8a8a8a8a8a6104e5565b9a9950505050505050505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b61032c610642565b610334610678565b565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b61037a610642565b73ffffffffffffffffffffffffffffffffffffffff821615806103b1575073ffffffffffffffffffffffffffffffffffffffff8116155b156103e8576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff94851602179055600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b610464610642565b61033460006106f5565b610476610642565b61033461075b565b610486610642565b63389a75e1600c52806000526020600c2080544211156104ae57636f5e88186000526004601cfd5b600090556104bb816106f5565b50565b6104c6610642565b8060601b6104dc57637448fbae6000526004601cfd5b6104bb816106f5565b60006104ef6107b6565b606086901c331461052c576040517f81e69d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015461054f9073ffffffffffffffffffffffffffffffffffffffff1687610828565b6000546040517fc06b659300000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff8084169263c06b6593926105c0928f9261010090920416908e908e908e908d908d908d908d903390600401610c05565b600060405180830381600087803b1580156105da57600080fd5b505af11580156105ee573d6000803e3d6000fd5b505060405133925073ffffffffffffffffffffffffffffffffffffffff841691507f2d49c67975aadd2d389580b368cfff5b49965b0bd5da33c144922ce01e7a4d7b90600090a39998505050505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314610334576382b429006000526004601cfd5b61068061087f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6107636107b6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586106cb3390565b60005460ff1615610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064015b60405180910390fd5b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806108745763301164256000526004601cfd5b600060215292915050565b60005460ff16610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161081f565b6000604082840312156108fd57600080fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff811681146104bb57600080fd5b803561093081610903565b919050565b60008083601f84011261094757600080fd5b50813567ffffffffffffffff81111561095f57600080fd5b60208301915083602082850101111561097757600080fd5b9250929050565b60008083601f84011261099057600080fd5b50813567ffffffffffffffff8111156109a857600080fd5b6020830191508360208260051b850101111561097757600080fd5b600080600080600080600080600060c08a8c0312156109e157600080fd5b893567ffffffffffffffff808211156109f957600080fd5b610a058d838e016108eb565b9a50610a1360208d01610925565b995060408c0135915080821115610a2957600080fd5b610a358d838e01610935565b909950975060608c0135965060808c0135915080821115610a5557600080fd5b610a618d838e0161097e565b909650945060a08c0135915080821115610a7a57600080fd5b50610a878c828d0161097e565b915080935050809150509295985092959850929598565b60008060408385031215610ab157600080fd5b8235610abc81610903565b91506020830135610acc81610903565b809150509250929050565b600060208284031215610ae957600080fd5b8135610af481610903565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610b3057600080fd5b830160208101925035905067ffffffffffffffff811115610b5057600080fd5b80360382131561097757600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b87811015610bf8578284038952610bd98288610afb565b610be4868284610b5f565b9a87019a9550505090840190600101610bc2565b5091979650505050505050565b60e081526000610c158c8d610afb565b604060e0850152610c2b61012085018284610b5f565b9150506020610c3c818f018f610afb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2086850301610100870152610c72848284610b5f565b9350505073ffffffffffffffffffffffffffffffffffffffff808e1682860152808d1660408601528483036060860152610cad838c8e610b5f565b85810360808701528981528a9350820160005b8a811015610ce7578435610cd381610903565b831682529383019390830190600101610cc0565b5085810360a0870152610cfb81898b610ba8565b945050505050610d2360c083018473ffffffffffffffffffffffffffffffffffffffff169052565b9b9a505050505050505050505056fea2646970667358221220fb362129763a27321eb8b8a91c7b0ddc41f8d30e8e52417aed4eaa6d5743d69764736f6c63430008150033
Deployed Bytecode
0x6080604052600436106100e35760003560e01c8063715018a61161008a5780639b2088b8116100595780639b2088b8146100e8578063f04e283e1461024c578063f2fde38b1461025f578063fee81cf41461027257600080fd5b8063715018a6146101c95780638456cb59146101d15780638859632c146101e65780638da5cb5b1461021857600080fd5b806354d1f13d116100c657806354d1f13d146101515780635a254858146101595780635ba975eb146101795780635c975abb146101a657600080fd5b80156100e857806325692962146101325780633f4ba83a1461013c575b600080fd5b3480156100f457600080fd5b506101086101033660046109c3565b6102b3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61013a6102d4565b005b34801561014857600080fd5b5061013a610324565b61013a610336565b34801561016557600080fd5b5061013a610174366004610a9e565b610372565b34801561018557600080fd5b506001546101089073ffffffffffffffffffffffffffffffffffffffff1681565b3480156101b257600080fd5b5060005460ff166040519015158152602001610129565b61013a61045c565b3480156101dd57600080fd5b5061013a61046e565b3480156101f257600080fd5b5060005461010890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561022457600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754610108565b61013a61025a366004610ad7565b61047e565b61013a61026d366004610ad7565b6104be565b34801561027e57600080fd5b506102a561028d366004610ad7565b63389a75e1600c908152600091909152602090205490565b604051908152602001610129565b60006102c68a8a8a8a8a8a8a8a8a6104e5565b9a9950505050505050505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b61032c610642565b610334610678565b565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b61037a610642565b73ffffffffffffffffffffffffffffffffffffffff821615806103b1575073ffffffffffffffffffffffffffffffffffffffff8116155b156103e8576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff94851602179055600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b610464610642565b61033460006106f5565b610476610642565b61033461075b565b610486610642565b63389a75e1600c52806000526020600c2080544211156104ae57636f5e88186000526004601cfd5b600090556104bb816106f5565b50565b6104c6610642565b8060601b6104dc57637448fbae6000526004601cfd5b6104bb816106f5565b60006104ef6107b6565b606086901c331461052c576040517f81e69d9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015461054f9073ffffffffffffffffffffffffffffffffffffffff1687610828565b6000546040517fc06b659300000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff8084169263c06b6593926105c0928f9261010090920416908e908e908e908d908d908d908d903390600401610c05565b600060405180830381600087803b1580156105da57600080fd5b505af11580156105ee573d6000803e3d6000fd5b505060405133925073ffffffffffffffffffffffffffffffffffffffff841691507f2d49c67975aadd2d389580b368cfff5b49965b0bd5da33c144922ce01e7a4d7b90600090a39998505050505050505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314610334576382b429006000526004601cfd5b61068061087f565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6107636107b6565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586106cb3390565b60005460ff1615610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064015b60405180910390fd5b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806108745763301164256000526004601cfd5b600060215292915050565b60005460ff16610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161081f565b6000604082840312156108fd57600080fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff811681146104bb57600080fd5b803561093081610903565b919050565b60008083601f84011261094757600080fd5b50813567ffffffffffffffff81111561095f57600080fd5b60208301915083602082850101111561097757600080fd5b9250929050565b60008083601f84011261099057600080fd5b50813567ffffffffffffffff8111156109a857600080fd5b6020830191508360208260051b850101111561097757600080fd5b600080600080600080600080600060c08a8c0312156109e157600080fd5b893567ffffffffffffffff808211156109f957600080fd5b610a058d838e016108eb565b9a50610a1360208d01610925565b995060408c0135915080821115610a2957600080fd5b610a358d838e01610935565b909950975060608c0135965060808c0135915080821115610a5557600080fd5b610a618d838e0161097e565b909650945060a08c0135915080821115610a7a57600080fd5b50610a878c828d0161097e565b915080935050809150509295985092959850929598565b60008060408385031215610ab157600080fd5b8235610abc81610903565b91506020830135610acc81610903565b809150509250929050565b600060208284031215610ae957600080fd5b8135610af481610903565b9392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610b3057600080fd5b830160208101925035905067ffffffffffffffff811115610b5057600080fd5b80360382131561097757600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b87811015610bf8578284038952610bd98288610afb565b610be4868284610b5f565b9a87019a9550505090840190600101610bc2565b5091979650505050505050565b60e081526000610c158c8d610afb565b604060e0850152610c2b61012085018284610b5f565b9150506020610c3c818f018f610afb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2086850301610100870152610c72848284610b5f565b9350505073ffffffffffffffffffffffffffffffffffffffff808e1682860152808d1660408601528483036060860152610cad838c8e610b5f565b85810360808701528981528a9350820160005b8a811015610ce7578435610cd381610903565b831682529383019390830190600101610cc0565b5085810360a0870152610cfb81898b610ba8565b945050505050610d2360c083018473ffffffffffffffffffffffffffffffffffffffff169052565b9b9a505050505050505050505056fea2646970667358221220fb362129763a27321eb8b8a91c7b0ddc41f8d30e8e52417aed4eaa6d5743d69764736f6c63430008150033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.