Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multi Chain
Multichain Addresses
N/ALatest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 7371967 | 489 days 8 hrs ago | IN | Create: NFTCollectionFactory | 0 ETH | 0.01659574 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
7734004 | 428 days 22 hrs ago | 0 ETH | ||||
7705088 | 433 days 20 hrs ago | 0 ETH | ||||
7704849 | 433 days 21 hrs ago | 0 ETH | ||||
7591815 | 452 days 18 hrs ago | 0 ETH | ||||
7591758 | 452 days 18 hrs ago | 0 ETH | ||||
7580999 | 454 days 12 hrs ago | 0 ETH | ||||
7579127 | 454 days 20 hrs ago | 0 ETH | ||||
7578917 | 454 days 20 hrs ago | 0 ETH | ||||
7578842 | 454 days 21 hrs ago | 0 ETH | ||||
7578835 | 454 days 21 hrs ago | 0 ETH | ||||
7578835 | 454 days 21 hrs ago | 0 ETH | ||||
7577929 | 455 days 54 mins ago | 0 ETH | ||||
7560067 | 457 days 21 hrs ago | 0 ETH | ||||
7560046 | 457 days 21 hrs ago | 0 ETH | ||||
7560044 | 457 days 21 hrs ago | 0 ETH | ||||
7560042 | 457 days 21 hrs ago | 0 ETH | ||||
7560031 | 457 days 21 hrs ago | 0 ETH | ||||
7560024 | 457 days 21 hrs ago | 0 ETH | ||||
7559871 | 457 days 22 hrs ago | 0 ETH | ||||
7559597 | 457 days 23 hrs ago | 0 ETH | ||||
7559504 | 457 days 23 hrs ago | 0 ETH | ||||
7555415 | 458 days 15 hrs ago | 0 ETH | ||||
7555402 | 458 days 15 hrs ago | 0 ETH | ||||
7555297 | 458 days 15 hrs ago | 0 ETH | ||||
7549378 | 459 days 15 hrs ago | 0 ETH |
Loading...
Loading
Contract Name:
NFTCollectionFactory
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 1337 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/* ・ * ★ ・ 。 ・ ゚☆ 。 * ★ ゚・。 * 。 * ☆ 。・゚*.。 ゚ *.。☆。★ ・ ` .-:::::-.` `-::---...``` `-:` .:+ssssoooo++//:.` .-/+shhhhhhhhhhhhhyyyssooo: .--::. .+ossso+/////++/:://-` .////+shhhhhhhhhhhhhhhhhhhhhy `-----::. `/+////+++///+++/:--:/+/- -////+shhhhhhhhhhhhhhhhhhhhhy `------:::-` `//-.``.-/+ooosso+:-.-/oso- -////+shhhhhhhhhhhhhhhhhhhhhy .--------:::-` :+:.` .-/osyyyyyyso++syhyo.-////+shhhhhhhhhhhhhhhhhhhhhy `-----------:::-. +o+:-.-:/oyhhhhhhdhhhhhdddy:-////+shhhhhhhhhhhhhhhhhhhhhy .------------::::-- `oys+/::/+shhhhhhhdddddddddy/-////+shhhhhhhhhhhhhhhhhhhhhy .--------------:::::-` +ys+////+yhhhhhhhddddddddhy:-////+yhhhhhhhhhhhhhhhhhhhhhy `----------------::::::-`.ss+/:::+oyhhhhhhhhhhhhhhho`-////+shhhhhhhhhhhhhhhhhhhhhy .------------------:::::::.-so//::/+osyyyhhhhhhhhhys` -////+shhhhhhhhhhhhhhhhhhhhhy `.-------------------::/:::::..+o+////+oosssyyyyyyys+` .////+shhhhhhhhhhhhhhhhhhhhhy .--------------------::/:::.` -+o++++++oooosssss/. `-//+shhhhhhhhhhhhhhhhhhhhyo .------- ``````.......--` `-/+ooooosso+/-` `./++++///:::--...``hhhhyo ````` * ・ 。 ・ ゚☆ 。 * ★ ゚・。 * 。 * ☆ 。・゚*.。 ゚ *.。☆。★ ・ * ゚。·*・。 ゚* ☆゚・。°*. ゚ ・ ゚*。・゚★。 ・ *゚。 * ・゚*。★・ ☆∴。 * ・ 。 */ // SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; import "@openzeppelin/contracts/proxy/Clones.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "./interfaces/ICollectionFactory.sol"; import "./interfaces/INFTDropCollectionInitializer.sol"; import "./interfaces/INFTCollectionInitializer.sol"; import "./interfaces/IRoles.sol"; import "./libraries/AddressLibrary.sol"; import "./mixins/shared/Gap10000.sol"; /** * @title A factory to create NFT collections. * @notice Call this factory to create a batch mint and reveal collection. * @dev This creates and initializes an ERC-1165 minimal proxy pointing to a NFT collection contract template. */ contract NFTCollectionFactory is ICollectionFactory, Initializable, Gap10000 { using AddressUpgradeable for address; using Clones for address; using Strings for uint32; /****** Slot 0 (after inheritance) ******/ /** * @notice The address of the template all new NFTCollections will leverage. */ address public implementationNFTCollection; /** * @notice The implementation version of new NFTCollections. * @dev This is auto-incremented each time the implementation is changed. */ uint32 public versionNFTCollection; /****** Slot 1 ******/ /** * @notice The address of the template all new NFTDropCollections will leverage. */ address public implementationNFTDropCollection; /** * @notice The implementation version of new NFTDropCollections. * @dev This is auto-incremented each time the implementation is changed. */ uint32 public versionNFTDropCollection; /****** End of storage ******/ /** * @notice The contract address which manages common roles. * @dev Used by the NFTCollections for a shared operator definition. */ IRoles public immutable rolesContract; /** * @notice Emitted when the implementation NFTCollection used by new collections is updated. * @param implementation The new implementation contract address. * @param version The version of the new implementation, auto-incremented. */ event ImplementationNFTCollectionUpdated(address indexed implementation, uint256 indexed version); /** * @notice Emitted when the implementation contract used by new collections is updated. * @param implementationNFTDropCollection The new implementation contract address. * @param version The version of the new implementation, auto-incremented. */ event ImplementationNFTDropCollectionUpdated( address indexed implementationNFTDropCollection, uint256 indexed version ); /** * @notice Emitted when a new NFTCollection is created from this factory. * @param collection The address of the new NFT collection contract. * @param creator The address of the creator which owns the new collection. * @param version The implementation version used by the new collection. * @param name The name of the collection contract created. * @param symbol The symbol of the collection contract created. * @param nonce The nonce used by the creator when creating the collection, * used to define the address of the collection. */ event NFTCollectionCreated( address indexed collection, address indexed creator, uint256 indexed version, string name, string symbol, uint256 nonce ); /** * @notice Emitted when a new NFTDropCollection collection is created from this factory. * @param collection The address of the new NFTDropCollection contract. * @param creator The address of the creator which owns the new collection. * @param additionalMinter An additional address to grant MINTER_ROLE. * used to define the address of the collection. * @param name The name of the collection contract created. * @param symbol The symbol of the collection contract created. * @param baseURI The base URI for the collection. * @param postRevealBaseURIHash The hash of the revealed baseURI for the collection. * @param maxTokenId The max token id for this collection. * @param paymentAddress The address to send the proceeds of the drop. * @param version The implementation version used by the new NFTDropCollection collection. * @param nonce The nonce used by the creator when creating the collection, */ event NFTDropCollectionCreated( address indexed collection, address indexed creator, address indexed additionalMinter, string name, string symbol, string baseURI, bytes32 postRevealBaseURIHash, uint256 maxTokenId, address paymentAddress, uint256 version, uint256 nonce ); modifier onlyAdmin() { require(rolesContract.isAdmin(msg.sender), "NFTCollectionFactory: Caller does not have the Admin role"); _; } /** * @notice Defines requirements for the collection drop factory at deployment time. * @param _rolesContract The address of the contract defining roles for collections to use. */ constructor(address _rolesContract) { require(_rolesContract.isContract(), "NFTCollectionFactory: RolesContract is not a contract"); rolesContract = IRoles(_rolesContract); } /** * @notice Initializer called after contract creation. * @param _versionNFTCollection The current implementation version for NFTCollections. */ function initialize(uint32 _versionNFTCollection) external initializer { versionNFTCollection = _versionNFTCollection; } /** * @notice Allows Foundation to change the collection implementation used for future collections. * This call will auto-increment the version. * Existing collections are not impacted. * @param _implementation The new NFTCollection collection implementation address. */ function adminUpdateNFTCollectionImplementation(address _implementation) external onlyAdmin { require(_implementation.isContract(), "NFTCollectionFactory: Implementation is not a contract"); implementationNFTCollection = _implementation; unchecked { // Version cannot overflow 256 bits. versionNFTCollection++; } // The implementation is initialized when assigned so that others may not claim it as their own. INFTCollectionInitializer(_implementation).initialize( payable(address(rolesContract)), string.concat("NFT Collection Template v", versionNFTCollection.toString()), string.concat("NFTv", versionNFTCollection.toString()) ); emit ImplementationNFTCollectionUpdated(_implementation, versionNFTCollection); } /** * @notice Allows Foundation to change the collection implementation used for future collections. * This call will auto-increment the version. * Existing collections are not impacted. * @param _implementation The new NFTDropCollection collection implementation address. */ function adminUpdateNFTDropCollectionImplementation(address _implementation) external onlyAdmin { require(_implementation.isContract(), "NFTCollectionFactory: Implementation is not a contract"); implementationNFTDropCollection = _implementation; unchecked { // Version cannot overflow 256 bits. versionNFTDropCollection++; } emit ImplementationNFTDropCollectionUpdated(_implementation, versionNFTDropCollection); // The implementation is initialized when assigned so that others may not claim it as their own. INFTDropCollectionInitializer(_implementation).initialize( payable(address(this)), string.concat("NFT Drop Collection Template v", versionNFTDropCollection.toString()), string.concat("NFTDropV", versionNFTDropCollection.toString()), "ipfs://QmdB9mCxSsbybucRqtbBGGZf88pSoaJnuQ25FS3GJQvVAx/nft.png", 0x1337000000000000000000000000000000000000000000000000000000001337, 1, address(0), payable(0) ); } /** * @notice Create a new collection contract. * @dev The nonce is required and must be unique for the msg.sender + implementation version, * otherwise this call will revert. * @param name The name for the new collection being created. * @param symbol The symbol for the new collection being created. * @param nonce An arbitrary value used to allow a creator to mint multiple collections. * @return collection The address of the new collection contract. */ function createNFTCollection( string calldata name, string calldata symbol, uint256 nonce ) external returns (address collection) { require(bytes(symbol).length != 0, "NFTCollectionFactory: Symbol is required"); // This reverts if the NFT was previously created using this implementation version + msg.sender + nonce collection = implementationNFTCollection.cloneDeterministic(_getSalt(msg.sender, nonce)); INFTCollectionInitializer(collection).initialize(payable(msg.sender), name, symbol); emit NFTCollectionCreated(collection, msg.sender, versionNFTCollection, name, symbol, nonce); } /** * @notice Create a new collection contract. * @dev The nonce is required and must be unique for the msg.sender + implementation version, * otherwise this call will revert. * @param name The name for the new collection being created. * @param symbol The symbol for the new collection being created. * @param baseURI The base URI for the collection. * @param postRevealBaseURIHash The hash of the revealed baseURI for the collection, * leave empty for collection revealed by default. * @param maxTokenId The max token id for this collection. * @param additionalMinter An optional address to grant the MINTER_ROLE. * @param nonce An arbitrary value used to allow a creator to mint multiple collections. * @return collection The address of the new NFTDropCollection collection contract. */ function createNFTDropCollection( string calldata name, string calldata symbol, string calldata baseURI, bytes32 postRevealBaseURIHash, uint32 maxTokenId, address additionalMinter, uint256 nonce ) external returns (address collection) { return _createNFTDropCollection( name, symbol, baseURI, postRevealBaseURIHash, maxTokenId, additionalMinter, payable(0), nonce ); } /** * @notice Create a new collection contract with a custom payment address. * @param paymentAddress The address that will receive royalties and mint payments. * Notes: * a) For rest of `params` see `createNFTDropCollection` above. */ function createNFTDropCollectionWithPaymentAddress( string calldata name, string calldata symbol, string calldata baseURI, bytes32 postRevealBaseURIHash, uint32 maxTokenId, address additionalMinter, uint256 nonce, address payable paymentAddress ) external returns (address collection) { return _createNFTDropCollection( name, symbol, baseURI, postRevealBaseURIHash, maxTokenId, additionalMinter, paymentAddress != msg.sender ? paymentAddress : payable(0), nonce ); } /** * @notice Create a new collection contract with a custom payment address derived from the factory. * @param paymentAddressFactoryCall The contract call which will return the address to use for payments. * Notes: * a) For rest of `params` see `createNFTDropCollection` above. */ function createNFTDropCollectionWithPaymentFactory( string calldata name, string calldata symbol, string calldata baseURI, bytes32 postRevealBaseURIHash, uint32 maxTokenId, address additionalMinter, uint256 nonce, CallWithoutValue memory paymentAddressFactoryCall ) external returns (address collection) { return _createNFTDropCollection( name, symbol, baseURI, postRevealBaseURIHash, maxTokenId, additionalMinter, AddressLibrary.callAndReturnContractAddress(paymentAddressFactoryCall), nonce ); } function _createNFTDropCollection( string calldata name, string calldata symbol, string calldata baseURI, bytes32 postRevealBaseURIHash, uint32 maxTokenId, address additionalMinter, address payable paymentAddress, uint256 nonce ) private returns (address collection) { // This reverts if the NFT was previously created using this implementation version + msg.sender + nonce collection = implementationNFTDropCollection.cloneDeterministic(_getSalt(msg.sender, nonce)); INFTDropCollectionInitializer(collection).initialize( payable(msg.sender), name, symbol, baseURI, postRevealBaseURIHash, maxTokenId, additionalMinter, paymentAddress ); emit NFTDropCollectionCreated( collection, msg.sender, additionalMinter, name, symbol, baseURI, postRevealBaseURIHash, maxTokenId, paymentAddress, versionNFTDropCollection, nonce ); } /** * @notice Returns the address of a collection given the current implementation version, creator, and nonce. * This will return the same address whether the collection has already been created or not. * @param creator The creator of the collection. * @param nonce An arbitrary value used to allow a creator to mint multiple collections. * @return collection The address of the collection contract that would be created by this nonce. */ function predictNFTCollectionAddress(address creator, uint256 nonce) external view returns (address collection) { collection = implementationNFTCollection.predictDeterministicAddress(_getSalt(creator, nonce)); } /** * @notice Returns the address of a NFTDropCollection collection given the current * implementation version, creator, and nonce. * This will return the same address whether the collection has already been created or not. * @param creator The creator of the collection. * @param nonce An arbitrary value used to allow a creator to mint multiple collections. * @return collection The address of the NFTDropCollection contract * that would be created by this nonce. */ function predictNFTDropCollectionAddress(address creator, uint256 nonce) external view returns (address collection) { collection = implementationNFTDropCollection.predictDeterministicAddress(_getSalt(creator, nonce)); } function _getSalt(address creator, uint256 nonce) private pure returns (bytes32) { return keccak256(abi.encodePacked(creator, nonce)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/Clones.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; import "./IRoles.sol"; import "./IProxyCall.sol"; interface ICollectionFactory { function rolesContract() external returns (IRoles); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; interface INFTDropCollectionInitializer { function initialize( address payable _creator, string calldata _name, string calldata _symbol, string calldata _baseURI, bytes32 _postRevealBaseURIHash, uint32 _maxTokenId, address _additionalMinter, address payable _paymentAddress ) external; }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; interface INFTCollectionInitializer { function initialize( address payable _creator, string memory _name, string memory _symbol ) external; }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; /** * @notice Interface for a contract which implements admin roles. */ interface IRoles { function isAdmin(address account) external view returns (bool); function isOperator(address account) external view returns (bool); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; struct CallWithoutValue { address target; bytes callData; } /** * @title A library for address helpers not already covered by the OZ library library. */ library AddressLibrary { using AddressUpgradeable for address; using AddressUpgradeable for address payable; /** * @notice Calls an external contract with arbitrary data and parse the return value into an address. * @param externalContract The address of the contract to call. * @param callData The data to send to the contract. * @return contractAddress The address of the contract returned by the call. */ function callAndReturnContractAddress(address externalContract, bytes memory callData) internal returns (address payable contractAddress) { bytes memory returnData = externalContract.functionCall(callData); contractAddress = abi.decode(returnData, (address)); require(contractAddress.isContract(), "InternalProxyCall: did not return a contract"); } function callAndReturnContractAddress(CallWithoutValue memory call) internal returns (address payable contractAddress) { return callAndReturnContractAddress(call.target, call.callData); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; /** * @title A placeholder contract leaving room for new mixins to be added to the future. */ abstract contract Gap10000 { /** * @notice This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[10000] private __gap; }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; interface IProxyCall { function proxyCallAndReturnAddress(address externalContract, bytes memory callData) external returns (address payable result); }
{ "optimizer": { "enabled": true, "runs": 1337 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"_rolesContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"},{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ImplementationNFTCollectionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementationNFTDropCollection","type":"address"},{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ImplementationNFTDropCollectionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"NFTCollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"additionalMinter","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"string","name":"baseURI","type":"string"},{"indexed":false,"internalType":"bytes32","name":"postRevealBaseURIHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"maxTokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"paymentAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"NFTDropCollectionCreated","type":"event"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"adminUpdateNFTCollectionImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"adminUpdateNFTDropCollectionImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"createNFTCollection","outputs":[{"internalType":"address","name":"collection","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"bytes32","name":"postRevealBaseURIHash","type":"bytes32"},{"internalType":"uint32","name":"maxTokenId","type":"uint32"},{"internalType":"address","name":"additionalMinter","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"createNFTDropCollection","outputs":[{"internalType":"address","name":"collection","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"bytes32","name":"postRevealBaseURIHash","type":"bytes32"},{"internalType":"uint32","name":"maxTokenId","type":"uint32"},{"internalType":"address","name":"additionalMinter","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address payable","name":"paymentAddress","type":"address"}],"name":"createNFTDropCollectionWithPaymentAddress","outputs":[{"internalType":"address","name":"collection","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"bytes32","name":"postRevealBaseURIHash","type":"bytes32"},{"internalType":"uint32","name":"maxTokenId","type":"uint32"},{"internalType":"address","name":"additionalMinter","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct CallWithoutValue","name":"paymentAddressFactoryCall","type":"tuple"}],"name":"createNFTDropCollectionWithPaymentFactory","outputs":[{"internalType":"address","name":"collection","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementationNFTCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementationNFTDropCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_versionNFTCollection","type":"uint32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"predictNFTCollectionAddress","outputs":[{"internalType":"address","name":"collection","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"predictNFTDropCollectionAddress","outputs":[{"internalType":"address","name":"collection","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rolesContract","outputs":[{"internalType":"contract IRoles","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"versionNFTCollection","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"versionNFTDropCollection","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162001e5638038062001e568339810160408190526200003491620000eb565b62000053816001600160a01b0316620000dc60201b62000c181760201c565b620000ca5760405162461bcd60e51b815260206004820152603560248201527f4e4654436f6c6c656374696f6e466163746f72793a20526f6c6573436f6e747260448201527f616374206973206e6f74206120636f6e74726163740000000000000000000000606482015260840160405180910390fd5b6001600160a01b03166080526200011d565b6001600160a01b03163b151590565b600060208284031215620000fe57600080fd5b81516001600160a01b03811681146200011657600080fd5b9392505050565b608051611d086200014e6000396000818161021801528181610458015281816107ac01526109850152611d086000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063687aa3011161008c5780638bdf0df5116100665780638bdf0df5146101e85780638d8965bd14610200578063ca53b39114610213578063e53e12cd1461023a57600080fd5b8063687aa301146101945780637221e1a4146101a75780637823edb6146101d457600080fd5b80632b61c6c4116100c85780632b61c6c414610145578063343155d31461015a57806345783b3a1461016d57806365c3dd8e1461018157600080fd5b806318a1cb23146100ef57806320ea5e731461011f57806327be0da214610132575b600080fd5b6101026100fd366004611326565b61024d565b6040516001600160a01b0390911681526020015b60405180910390f35b61010261012d3660046113f7565b610272565b6101026101403660046114d7565b6102af565b61015861015336600461154b565b610443565b005b610102610168366004611689565b610757565b61271254610102906001600160a01b031681565b61010261018f36600461176c565b61076e565b6101586101a236600461154b565b610797565b612711546101bf90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610116565b61271154610102906001600160a01b031681565b612712546101bf90600160a01b900463ffffffff1681565b61015861020e366004611798565b610aa6565b6101027f000000000000000000000000000000000000000000000000000000000000000081565b61010261024836600461176c565b610bf6565b60006102638b8b8b8b8b8b8b8b8b60008c610c27565b9b9a5050505050505050505050565b600061029f8c8c8c8c8c8c8c8c8c336001600160a01b038d1603610297576000610299565b8b5b8d610c27565b9c9b505050505050505050505050565b600082810361032b5760405162461bcd60e51b815260206004820152602860248201527f4e4654436f6c6c656374696f6e466163746f72793a2053796d626f6c2069732060448201527f726571756972656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61034b6103383384610d48565b612711546001600160a01b031690610da3565b6040517f906571470000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063906571479061039b9033908a908a908a908a906004016117dc565b600060405180830381600087803b1580156103b557600080fd5b505af11580156103c9573d6000803e3d6000fd5b5050505061271160149054906101000a900463ffffffff1663ffffffff16336001600160a01b0316826001600160a01b03167f22bd5d982c942d99c12bfa4feda7e796b2b9d6a1b8097c890871b12de29963eb898989898960405161043295949392919061181e565b60405180910390a495945050505050565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c90602401602060405180830381865afa1580156104a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cb9190611858565b61053d5760405162461bcd60e51b815260206004820152603960248201527f4e4654436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c65000000000000006064820152608401610322565b6001600160a01b0381163b6105ba5760405162461bcd60e51b815260206004820152603660248201527f4e4654436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e7472616374000000000000000000006064820152608401610322565b612712805463ffffffff600160a01b6001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff19841681178290048316600101831682027fffffffffffffffff00000000000000000000000000000000000000000000000090941681179390931793849055604051930416917ff9555eb90bc7e43c2508783a103691f257c0c9758bd0eae063456789b2de4eee90600090a3612712546001600160a01b0382169063df98c8b790309061068190600160a01b900463ffffffff16610e5a565b604051602001610691919061189e565b60408051808303601f19018152919052612712546106bb90600160a01b900463ffffffff16610e5a565b6040516020016106cb91906118e3565b6040516020818303038152906040527f133700000000000000000000000000000000000000000000000000000000133760016000806040518863ffffffff1660e01b81526004016107229796959493929190611954565b600060405180830381600087803b15801561073c57600080fd5b505af1158015610750573d6000803e3d6000fd5b5050505050565b600061029f8c8c8c8c8c8c8c8c8c6102998c610f97565b600061079061077d8484610d48565b612711546001600160a01b031690610fab565b9392505050565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c90602401602060405180830381865afa1580156107fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081f9190611858565b6108915760405162461bcd60e51b815260206004820152603960248201527f4e4654436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c65000000000000006064820152608401610322565b6001600160a01b0381163b61090e5760405162461bcd60e51b815260206004820152603660248201527f4e4654436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e7472616374000000000000000000006064820152608401610322565b612711805463ffffffff600160a01b6001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff19841681178290048316600101831682027fffffffffffffffff0000000000000000000000000000000000000000000000009094168117939093179384905591926390657147927f0000000000000000000000000000000000000000000000000000000000000000926109b3929190910416610e5a565b6040516020016109c39190611a18565b60408051808303601f19018152919052612711546109ed90600160a01b900463ffffffff16610e5a565b6040516020016109fd9190611a5d565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401610a2a93929190611aa2565b600060405180830381600087803b158015610a4457600080fd5b505af1158015610a58573d6000803e3d6000fd5b505061271154604051600160a01b90910463ffffffff1692506001600160a01b03841691507fc1383747ef02af212da98ad8a2fbc2167484d7736b8774a00472de9d8eef80d590600090a350565b600054610100900460ff1615808015610ac65750600054600160ff909116105b80610ae05750303b158015610ae0575060005460ff166001145b610b525760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610322565b6000805460ff191660011790558015610b75576000805461ff0019166101001790555b61271180547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b63ffffffff8516021790558015610bf2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000610790610c058484610d48565b612712546001600160a01b031690610fab565b6001600160a01b03163b151590565b6000610c49610c363384610d48565b612712546001600160a01b031690610da3565b9050806001600160a01b031663df98c8b7338e8e8e8e8e8e8e8e8e8e6040518c63ffffffff1660e01b8152600401610c8b9b9a99989796959493929190611ae0565b600060405180830381600087803b158015610ca557600080fd5b505af1158015610cb9573d6000803e3d6000fd5b50505050836001600160a01b0316336001600160a01b0316826001600160a01b03167fea349a1d0c88438cb9fe73b6ea9d6389305d876c3faadf16c5039dd7a1be39fb8f8f8f8f8f8f8f8f8e61271260149054906101000a900463ffffffff168f604051610d319b9a99989796959493929190611b62565b60405180910390a49b9a5050505050505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b166020820152603481018290526000906054016040516020818303038152906040528051906020012090505b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b038116610d9d5760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c65640000000000000000006044820152606401610322565b606081600003610e9d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610ec75780610eb181611bf3565b9150610ec09050600a83611c22565b9150610ea1565b60008167ffffffffffffffff811115610ee257610ee2611568565b6040519080825280601f01601f191660200182016040528015610f0c576020820181803683370190505b5090505b8415610f8f57610f21600183611c36565b9150610f2e600a86611c49565b610f39906030611c5d565b60f81b818381518110610f4e57610f4e611c70565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f88600a86611c22565b9450610f10565b949350505050565b6000610d9d82600001518360200151611027565b60006107908383306040517f3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000008152606093841b60148201527f5af43d82803e903d91602b57fd5bf3ff000000000000000000000000000000006028820152921b6038830152604c8201526037808220606c830152605591012090565b60008061103d6001600160a01b038516846110d9565b9050808060200190518101906110539190611c86565b91506001600160a01b0382163b6110d25760405162461bcd60e51b815260206004820152602c60248201527f496e7465726e616c50726f787943616c6c3a20646964206e6f7420726574757260448201527f6e206120636f6e747261637400000000000000000000000000000000000000006064820152608401610322565b5092915050565b606061079083836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506060610f8f84846000856060824710156111985760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610322565b6001600160a01b0385163b6111ef5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610322565b600080866001600160a01b0316858760405161120b9190611ca3565b60006040518083038185875af1925050503d8060008114611248576040519150601f19603f3d011682016040523d82523d6000602084013e61124d565b606091505b509150915061125d828286611268565b979650505050505050565b60608315611277575081610790565b8251156112875782518084602001fd5b8160405162461bcd60e51b81526004016103229190611cbf565b60008083601f8401126112b357600080fd5b50813567ffffffffffffffff8111156112cb57600080fd5b6020830191508360208285010111156112e357600080fd5b9250929050565b803563ffffffff811681146112fe57600080fd5b919050565b6001600160a01b038116811461131857600080fd5b50565b80356112fe81611303565b60008060008060008060008060008060e08b8d03121561134557600080fd5b8a3567ffffffffffffffff8082111561135d57600080fd5b6113698e838f016112a1565b909c509a5060208d013591508082111561138257600080fd5b61138e8e838f016112a1565b909a50985060408d01359150808211156113a757600080fd5b506113b48d828e016112a1565b90975095505060608b013593506113cd60808c016112ea565b925060a08b01356113dd81611303565b8092505060c08b013590509295989b9194979a5092959850565b60008060008060008060008060008060006101008c8e03121561141957600080fd5b67ffffffffffffffff808d35111561143057600080fd5b61143d8e8e358f016112a1565b909c509a5060208d013581101561145357600080fd5b6114638e60208f01358f016112a1565b909a50985060408d013581101561147957600080fd5b5061148a8d60408e01358e016112a1565b909750955060608c013594506114a260808d016112ea565b93506114b060a08d0161131b565b925060c08c013591506114c560e08d0161131b565b90509295989b509295989b9093969950565b6000806000806000606086880312156114ef57600080fd5b853567ffffffffffffffff8082111561150757600080fd5b61151389838a016112a1565b9097509550602088013591508082111561152c57600080fd5b50611539888289016112a1565b96999598509660400135949350505050565b60006020828403121561155d57600080fd5b813561079081611303565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156115a1576115a1611568565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156115d0576115d0611568565b604052919050565b6000604082840312156115ea57600080fd5b6115f261157e565b905081356115ff81611303565b815260208281013567ffffffffffffffff8082111561161d57600080fd5b818501915085601f83011261163157600080fd5b81358181111561164357611643611568565b611655601f8201601f191685016115a7565b9150808252868482850101111561166b57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060008060008060008060008060006101008c8e0312156116ab57600080fd5b67ffffffffffffffff808d3511156116c257600080fd5b6116cf8e8e358f016112a1565b909c509a5060208d01358110156116e557600080fd5b6116f58e60208f01358f016112a1565b909a50985060408d013581101561170b57600080fd5b61171b8e60408f01358f016112a1565b909850965060608d0135955061173360808e016112ea565b945061174160a08e0161131b565b935060c08d013592508060e08e0135111561175b57600080fd5b506114c58d60e08e01358e016115d8565b6000806040838503121561177f57600080fd5b823561178a81611303565b946020939093013593505050565b6000602082840312156117aa57600080fd5b610790826112ea565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03861681526060602082015260006117ff6060830186886117b3565b82810360408401526118128185876117b3565b98975050505050505050565b6060815260006118326060830187896117b3565b82810360208401526118458186886117b3565b9150508260408301529695505050505050565b60006020828403121561186a57600080fd5b8151801515811461079057600080fd5b60005b8381101561189557818101518382015260200161187d565b50506000910152565b7f4e46542044726f7020436f6c6c656374696f6e2054656d706c617465207600008152600082516118d681601e85016020870161187a565b91909101601e0192915050565b7f4e465444726f705600000000000000000000000000000000000000000000000081526000825161191b81600885016020870161187a565b9190910160080192915050565b6000815180845261194081602086016020860161187a565b601f01601f19169290920160200192915050565b60006101006001600160a01b03808b1684528160208501526119788285018b611928565b9150838203604085015261198c828a611928565b848103606080870191909152603d82527f697066733a2f2f516d6442396d437853736279627563527174624247475a663860208301527f3870536f614a6e75513235465333474a51765641782f6e66742e706e670000006040830152608086019990995263ffffffff9790971660a085015294851660c08401525050911660e090910152019392505050565b7f4e465420436f6c6c656374696f6e2054656d706c617465207600000000000000815260008251611a5081601985016020870161187a565b9190910160190192915050565b7f4e46547600000000000000000000000000000000000000000000000000000000815260008251611a9581600485016020870161187a565b9190910160040192915050565b6001600160a01b0384168152606060208201526000611ac46060830185611928565b8281036040840152611ad68185611928565b9695505050505050565b60006001600160a01b03808e1683526101006020840152611b0661010084018d8f6117b3565b8381036040850152611b19818c8e6117b3565b90508381036060850152611b2e818a8c6117b3565b60808501989098525063ffffffff9590951660a08301525091831660c083015290911660e090910152979650505050505050565b61010081526000611b7861010083018d8f6117b3565b8281036020840152611b8b818c8e6117b3565b90508281036040840152611ba0818a8c6117b3565b6060840198909852505063ffffffff94851660808201526001600160a01b039390931660a0840152921660c082015260e001529695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611c0557611c05611bdd565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611c3157611c31611c0c565b500490565b81810381811115610d9d57610d9d611bdd565b600082611c5857611c58611c0c565b500690565b80820180821115610d9d57610d9d611bdd565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611c9857600080fd5b815161079081611303565b60008251611cb581846020870161187a565b9190910192915050565b602081526000610790602083018461192856fea26469706673582212205f8bda6fdacb8abd06fc9ae57fd7ab50644730abe0e27730af730ca2858f4ec164736f6c634300081000330000000000000000000000003c5ce17ae82f39977c3dbf56433dc8c0d9b5f2d7
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063687aa3011161008c5780638bdf0df5116100665780638bdf0df5146101e85780638d8965bd14610200578063ca53b39114610213578063e53e12cd1461023a57600080fd5b8063687aa301146101945780637221e1a4146101a75780637823edb6146101d457600080fd5b80632b61c6c4116100c85780632b61c6c414610145578063343155d31461015a57806345783b3a1461016d57806365c3dd8e1461018157600080fd5b806318a1cb23146100ef57806320ea5e731461011f57806327be0da214610132575b600080fd5b6101026100fd366004611326565b61024d565b6040516001600160a01b0390911681526020015b60405180910390f35b61010261012d3660046113f7565b610272565b6101026101403660046114d7565b6102af565b61015861015336600461154b565b610443565b005b610102610168366004611689565b610757565b61271254610102906001600160a01b031681565b61010261018f36600461176c565b61076e565b6101586101a236600461154b565b610797565b612711546101bf90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610116565b61271154610102906001600160a01b031681565b612712546101bf90600160a01b900463ffffffff1681565b61015861020e366004611798565b610aa6565b6101027f0000000000000000000000003c5ce17ae82f39977c3dbf56433dc8c0d9b5f2d781565b61010261024836600461176c565b610bf6565b60006102638b8b8b8b8b8b8b8b8b60008c610c27565b9b9a5050505050505050505050565b600061029f8c8c8c8c8c8c8c8c8c336001600160a01b038d1603610297576000610299565b8b5b8d610c27565b9c9b505050505050505050505050565b600082810361032b5760405162461bcd60e51b815260206004820152602860248201527f4e4654436f6c6c656374696f6e466163746f72793a2053796d626f6c2069732060448201527f726571756972656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61034b6103383384610d48565b612711546001600160a01b031690610da3565b6040517f906571470000000000000000000000000000000000000000000000000000000081529091506001600160a01b0382169063906571479061039b9033908a908a908a908a906004016117dc565b600060405180830381600087803b1580156103b557600080fd5b505af11580156103c9573d6000803e3d6000fd5b5050505061271160149054906101000a900463ffffffff1663ffffffff16336001600160a01b0316826001600160a01b03167f22bd5d982c942d99c12bfa4feda7e796b2b9d6a1b8097c890871b12de29963eb898989898960405161043295949392919061181e565b60405180910390a495945050505050565b604051630935e01b60e21b81523360048201527f0000000000000000000000003c5ce17ae82f39977c3dbf56433dc8c0d9b5f2d76001600160a01b0316906324d7806c90602401602060405180830381865afa1580156104a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cb9190611858565b61053d5760405162461bcd60e51b815260206004820152603960248201527f4e4654436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c65000000000000006064820152608401610322565b6001600160a01b0381163b6105ba5760405162461bcd60e51b815260206004820152603660248201527f4e4654436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e7472616374000000000000000000006064820152608401610322565b612712805463ffffffff600160a01b6001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff19841681178290048316600101831682027fffffffffffffffff00000000000000000000000000000000000000000000000090941681179390931793849055604051930416917ff9555eb90bc7e43c2508783a103691f257c0c9758bd0eae063456789b2de4eee90600090a3612712546001600160a01b0382169063df98c8b790309061068190600160a01b900463ffffffff16610e5a565b604051602001610691919061189e565b60408051808303601f19018152919052612712546106bb90600160a01b900463ffffffff16610e5a565b6040516020016106cb91906118e3565b6040516020818303038152906040527f133700000000000000000000000000000000000000000000000000000000133760016000806040518863ffffffff1660e01b81526004016107229796959493929190611954565b600060405180830381600087803b15801561073c57600080fd5b505af1158015610750573d6000803e3d6000fd5b5050505050565b600061029f8c8c8c8c8c8c8c8c8c6102998c610f97565b600061079061077d8484610d48565b612711546001600160a01b031690610fab565b9392505050565b604051630935e01b60e21b81523360048201527f0000000000000000000000003c5ce17ae82f39977c3dbf56433dc8c0d9b5f2d76001600160a01b0316906324d7806c90602401602060405180830381865afa1580156107fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081f9190611858565b6108915760405162461bcd60e51b815260206004820152603960248201527f4e4654436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c65000000000000006064820152608401610322565b6001600160a01b0381163b61090e5760405162461bcd60e51b815260206004820152603660248201527f4e4654436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e7472616374000000000000000000006064820152608401610322565b612711805463ffffffff600160a01b6001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff19841681178290048316600101831682027fffffffffffffffff0000000000000000000000000000000000000000000000009094168117939093179384905591926390657147927f0000000000000000000000003c5ce17ae82f39977c3dbf56433dc8c0d9b5f2d7926109b3929190910416610e5a565b6040516020016109c39190611a18565b60408051808303601f19018152919052612711546109ed90600160a01b900463ffffffff16610e5a565b6040516020016109fd9190611a5d565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401610a2a93929190611aa2565b600060405180830381600087803b158015610a4457600080fd5b505af1158015610a58573d6000803e3d6000fd5b505061271154604051600160a01b90910463ffffffff1692506001600160a01b03841691507fc1383747ef02af212da98ad8a2fbc2167484d7736b8774a00472de9d8eef80d590600090a350565b600054610100900460ff1615808015610ac65750600054600160ff909116105b80610ae05750303b158015610ae0575060005460ff166001145b610b525760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610322565b6000805460ff191660011790558015610b75576000805461ff0019166101001790555b61271180547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b63ffffffff8516021790558015610bf2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000610790610c058484610d48565b612712546001600160a01b031690610fab565b6001600160a01b03163b151590565b6000610c49610c363384610d48565b612712546001600160a01b031690610da3565b9050806001600160a01b031663df98c8b7338e8e8e8e8e8e8e8e8e8e6040518c63ffffffff1660e01b8152600401610c8b9b9a99989796959493929190611ae0565b600060405180830381600087803b158015610ca557600080fd5b505af1158015610cb9573d6000803e3d6000fd5b50505050836001600160a01b0316336001600160a01b0316826001600160a01b03167fea349a1d0c88438cb9fe73b6ea9d6389305d876c3faadf16c5039dd7a1be39fb8f8f8f8f8f8f8f8f8e61271260149054906101000a900463ffffffff168f604051610d319b9a99989796959493929190611b62565b60405180910390a49b9a5050505050505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b166020820152603481018290526000906054016040516020818303038152906040528051906020012090505b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b038116610d9d5760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c65640000000000000000006044820152606401610322565b606081600003610e9d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610ec75780610eb181611bf3565b9150610ec09050600a83611c22565b9150610ea1565b60008167ffffffffffffffff811115610ee257610ee2611568565b6040519080825280601f01601f191660200182016040528015610f0c576020820181803683370190505b5090505b8415610f8f57610f21600183611c36565b9150610f2e600a86611c49565b610f39906030611c5d565b60f81b818381518110610f4e57610f4e611c70565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610f88600a86611c22565b9450610f10565b949350505050565b6000610d9d82600001518360200151611027565b60006107908383306040517f3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000008152606093841b60148201527f5af43d82803e903d91602b57fd5bf3ff000000000000000000000000000000006028820152921b6038830152604c8201526037808220606c830152605591012090565b60008061103d6001600160a01b038516846110d9565b9050808060200190518101906110539190611c86565b91506001600160a01b0382163b6110d25760405162461bcd60e51b815260206004820152602c60248201527f496e7465726e616c50726f787943616c6c3a20646964206e6f7420726574757260448201527f6e206120636f6e747261637400000000000000000000000000000000000000006064820152608401610322565b5092915050565b606061079083836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506060610f8f84846000856060824710156111985760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610322565b6001600160a01b0385163b6111ef5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610322565b600080866001600160a01b0316858760405161120b9190611ca3565b60006040518083038185875af1925050503d8060008114611248576040519150601f19603f3d011682016040523d82523d6000602084013e61124d565b606091505b509150915061125d828286611268565b979650505050505050565b60608315611277575081610790565b8251156112875782518084602001fd5b8160405162461bcd60e51b81526004016103229190611cbf565b60008083601f8401126112b357600080fd5b50813567ffffffffffffffff8111156112cb57600080fd5b6020830191508360208285010111156112e357600080fd5b9250929050565b803563ffffffff811681146112fe57600080fd5b919050565b6001600160a01b038116811461131857600080fd5b50565b80356112fe81611303565b60008060008060008060008060008060e08b8d03121561134557600080fd5b8a3567ffffffffffffffff8082111561135d57600080fd5b6113698e838f016112a1565b909c509a5060208d013591508082111561138257600080fd5b61138e8e838f016112a1565b909a50985060408d01359150808211156113a757600080fd5b506113b48d828e016112a1565b90975095505060608b013593506113cd60808c016112ea565b925060a08b01356113dd81611303565b8092505060c08b013590509295989b9194979a5092959850565b60008060008060008060008060008060006101008c8e03121561141957600080fd5b67ffffffffffffffff808d35111561143057600080fd5b61143d8e8e358f016112a1565b909c509a5060208d013581101561145357600080fd5b6114638e60208f01358f016112a1565b909a50985060408d013581101561147957600080fd5b5061148a8d60408e01358e016112a1565b909750955060608c013594506114a260808d016112ea565b93506114b060a08d0161131b565b925060c08c013591506114c560e08d0161131b565b90509295989b509295989b9093969950565b6000806000806000606086880312156114ef57600080fd5b853567ffffffffffffffff8082111561150757600080fd5b61151389838a016112a1565b9097509550602088013591508082111561152c57600080fd5b50611539888289016112a1565b96999598509660400135949350505050565b60006020828403121561155d57600080fd5b813561079081611303565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156115a1576115a1611568565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156115d0576115d0611568565b604052919050565b6000604082840312156115ea57600080fd5b6115f261157e565b905081356115ff81611303565b815260208281013567ffffffffffffffff8082111561161d57600080fd5b818501915085601f83011261163157600080fd5b81358181111561164357611643611568565b611655601f8201601f191685016115a7565b9150808252868482850101111561166b57600080fd5b80848401858401376000908201840152918301919091525092915050565b60008060008060008060008060008060006101008c8e0312156116ab57600080fd5b67ffffffffffffffff808d3511156116c257600080fd5b6116cf8e8e358f016112a1565b909c509a5060208d01358110156116e557600080fd5b6116f58e60208f01358f016112a1565b909a50985060408d013581101561170b57600080fd5b61171b8e60408f01358f016112a1565b909850965060608d0135955061173360808e016112ea565b945061174160a08e0161131b565b935060c08d013592508060e08e0135111561175b57600080fd5b506114c58d60e08e01358e016115d8565b6000806040838503121561177f57600080fd5b823561178a81611303565b946020939093013593505050565b6000602082840312156117aa57600080fd5b610790826112ea565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03861681526060602082015260006117ff6060830186886117b3565b82810360408401526118128185876117b3565b98975050505050505050565b6060815260006118326060830187896117b3565b82810360208401526118458186886117b3565b9150508260408301529695505050505050565b60006020828403121561186a57600080fd5b8151801515811461079057600080fd5b60005b8381101561189557818101518382015260200161187d565b50506000910152565b7f4e46542044726f7020436f6c6c656374696f6e2054656d706c617465207600008152600082516118d681601e85016020870161187a565b91909101601e0192915050565b7f4e465444726f705600000000000000000000000000000000000000000000000081526000825161191b81600885016020870161187a565b9190910160080192915050565b6000815180845261194081602086016020860161187a565b601f01601f19169290920160200192915050565b60006101006001600160a01b03808b1684528160208501526119788285018b611928565b9150838203604085015261198c828a611928565b848103606080870191909152603d82527f697066733a2f2f516d6442396d437853736279627563527174624247475a663860208301527f3870536f614a6e75513235465333474a51765641782f6e66742e706e670000006040830152608086019990995263ffffffff9790971660a085015294851660c08401525050911660e090910152019392505050565b7f4e465420436f6c6c656374696f6e2054656d706c617465207600000000000000815260008251611a5081601985016020870161187a565b9190910160190192915050565b7f4e46547600000000000000000000000000000000000000000000000000000000815260008251611a9581600485016020870161187a565b9190910160040192915050565b6001600160a01b0384168152606060208201526000611ac46060830185611928565b8281036040840152611ad68185611928565b9695505050505050565b60006001600160a01b03808e1683526101006020840152611b0661010084018d8f6117b3565b8381036040850152611b19818c8e6117b3565b90508381036060850152611b2e818a8c6117b3565b60808501989098525063ffffffff9590951660a08301525091831660c083015290911660e090910152979650505050505050565b61010081526000611b7861010083018d8f6117b3565b8281036020840152611b8b818c8e6117b3565b90508281036040840152611ba0818a8c6117b3565b6060840198909852505063ffffffff94851660808201526001600160a01b039390931660a0840152921660c082015260e001529695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611c0557611c05611bdd565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611c3157611c31611c0c565b500490565b81810381811115610d9d57610d9d611bdd565b600082611c5857611c58611c0c565b500690565b80820180821115610d9d57610d9d611bdd565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611c9857600080fd5b815161079081611303565b60008251611cb581846020870161187a565b9190910192915050565b602081526000610790602083018461192856fea26469706673582212205f8bda6fdacb8abd06fc9ae57fd7ab50644730abe0e27730af730ca2858f4ec164736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003c5ce17ae82f39977c3dbf56433dc8c0d9b5f2d7
-----Decoded View---------------
Arg [0] : _rolesContract (address): 0x3c5cE17ae82f39977C3DBF56433Dc8c0D9B5F2d7
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003c5ce17ae82f39977c3dbf56433dc8c0d9b5f2d7
Loading...
Loading
[ 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.