Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 15540353 | 658 days ago | IN | Create: NFTCollectionFactory | 0 ETH | 0.02857051 |
View more zero value Internal Transactions in Advanced View mode
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:
NFTCollectionFactory
Compiler Version
v0.8.17+commit.8df45f5f
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/internal/INFTDropCollectionInitializer.sol"; import "./interfaces/internal/INFTCollectionInitializer.sol"; import "./interfaces/internal/roles/IHasRolesContract.sol"; import "./interfaces/internal/roles/IRoles.sol"; import "./libraries/AddressLibrary.sol"; import "./mixins/shared/Gap10000.sol"; /** * @title A factory to create NFT collections. * @notice Call this factory to create NFT collections. * @dev This creates and initializes an ERC-1167 minimal proxy pointing to an NFT collection contract implementation. * @author batu-inal & HardlyDifficult */ contract NFTCollectionFactory is IHasRolesContract, Initializable, Gap10000 { using AddressUpgradeable for address; using Clones for address; using Strings for uint32; /****** Slot 0 (after inheritance) ******/ /** * @notice The address of the implementation all new NFTCollections will leverage. * @dev When this is changed, `versionNFTCollection` is incremented. * @return The implementation address for NFTCollection. */ address public implementationNFTCollection; /** * @notice The implementation version of new NFTCollections. * @dev This is auto-incremented each time `implementationNFTCollection` is changed. * @return The current NFTCollection implementation version. */ uint32 public versionNFTCollection; /****** Slot 1 ******/ /** * @notice The address of the implementation all new NFTDropCollections will leverage. * @dev When this is changed, `versionNFTDropCollection` is incremented. * @return The implementation address for NFTDropCollection. */ address public implementationNFTDropCollection; /** * @notice The implementation version of new NFTDropCollections. * @dev This is auto-incremented each time `implementationNFTDropCollection` is changed. * @return The current NFTDropCollection implementation version. */ uint32 public versionNFTDropCollection; /****** End of storage ******/ /** * @notice The contract address which manages common roles. * @dev Defines a centralized admin role definition for permissioned functions below. * @return The contract address with role definitions. */ IRoles public immutable rolesManager; /** * @notice Emitted when the implementation of 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 of NFTDropCollection 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 is created from this factory. * @param collection The address of the new NFT drop collection contract. * @param creator The address of the creator which owns the new collection. * @param approvedMinter An optional address to grant the MINTER_ROLE. * @param name The collection's `name`. * @param symbol The collection's `symbol`. * @param baseURI The base URI for the collection. * @param isRevealed Whether the collection is revealed or not. * @param maxTokenId The max `tokenID` for this collection. * @param paymentAddress The address that will receive royalties and mint payments. * @param version The implementation version used by the new NFTDropCollection collection. * @param nonce The nonce used by the creator to create this collection. */ event NFTDropCollectionCreated( address indexed collection, address indexed creator, address indexed approvedMinter, string name, string symbol, string baseURI, bool isRevealed, uint256 maxTokenId, address paymentAddress, uint256 version, uint256 nonce ); modifier onlyAdmin() { require(rolesManager.isAdmin(msg.sender), "NFTCollectionFactory: Caller does not have the Admin role"); _; } modifier onlyContract(address _implementation) { require(_implementation.isContract(), "NFTCollectionFactory: Implementation is not a contract"); _; } /** * @notice Defines requirements for the collection drop factory at deployment time. * @param _rolesManager The address of the contract defining roles for collections to use. */ constructor(address _rolesManager) initializer { require(_rolesManager.isContract(), "NFTCollectionFactory: RolesContract is not a contract"); rolesManager = IRoles(_rolesManager); } /** * @notice Initializer called after contract creation. * @dev This is used so that this factory will resume versions from where our original factory had left off. * @param _versionNFTCollection The current implementation version for NFTCollections. */ function initialize(uint32 _versionNFTCollection) external initializer { versionNFTCollection = _versionNFTCollection; } /** * @notice Allows Foundation to change the NFTCollection 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 onlyContract(_implementation) { implementationNFTCollection = _implementation; // Version will not realistically overflow 32 bits. ++versionNFTCollection; // The implementation is initialized when assigned so that others may not claim it as their own. INFTCollectionInitializer(_implementation).initialize( payable(address(rolesManager)), string.concat("NFT Collection Implementation v", versionNFTCollection.toString()), string.concat("NFTv", versionNFTCollection.toString()) ); emit ImplementationNFTCollectionUpdated(_implementation, versionNFTCollection); } /** * @notice Allows Foundation to change the NFTDropCollection 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 onlyContract(_implementation) { implementationNFTDropCollection = _implementation; // Version will not realistically overflow 32 bits. ++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 Implementation v", versionNFTDropCollection.toString()), string.concat("NFTDropV", versionNFTDropCollection.toString()), "ipfs://QmUtCsULTpfUYWBfcUS1y25rqBZ6E5CfKzZg6j9P3gFScK/", true, 1, address(0), payable(0) ); emit ImplementationNFTDropCollectionUpdated(_implementation, versionNFTDropCollection); } /** * @notice Create a new collection contract. * @dev The nonce must be unique for the msg.sender + implementation version, otherwise this call will revert. * @param name The collection's `name`. * @param symbol The collection's `symbol`. * @param nonce An arbitrary value used to allow a creator to mint multiple collections with a counterfactual address. * @return collection The address of the newly created collection contract. */ function createNFTCollection( string calldata name, string calldata symbol, uint96 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 drop collection contract. * @dev The nonce must be unique for the msg.sender + implementation version, otherwise this call will revert. * @param name The collection's `name`. * @param symbol The collection's `symbol`. * @param baseURI The base URI for the collection. * @param isRevealed Whether the collection is revealed or not. * @param maxTokenId The max token id for this collection. * @param approvedMinter An optional address to grant the MINTER_ROLE. * @param nonce An arbitrary value used to allow a creator to mint multiple collections with a counterfactual address. * @return collection The address of the newly created collection contract. */ function createNFTDropCollection( string calldata name, string calldata symbol, string calldata baseURI, bool isRevealed, uint32 maxTokenId, address approvedMinter, uint96 nonce ) external returns (address collection) { collection = _createNFTDropCollection( name, symbol, baseURI, isRevealed, maxTokenId, approvedMinter, payable(0), nonce ); } /** * @notice Create a new drop collection contract with a custom payment address. * @dev All params other than `paymentAddress` are the same as in `createNFTDropCollection`. * The nonce must be unique for the msg.sender + implementation version, otherwise this call will revert. * @param name The collection's `name`. * @param symbol The collection's `symbol`. * @param baseURI The base URI for the collection. * @param isRevealed Whether the collection is revealed or not. * @param maxTokenId The max token id for this collection. * @param approvedMinter An optional address to grant the MINTER_ROLE. * @param nonce An arbitrary value used to allow a creator to mint multiple collections with a counterfactual address. * @param paymentAddress The address that will receive royalties and mint payments. * @return collection The address of the newly created collection contract. */ function createNFTDropCollectionWithPaymentAddress( string calldata name, string calldata symbol, string calldata baseURI, bool isRevealed, uint32 maxTokenId, address approvedMinter, uint96 nonce, address payable paymentAddress ) external returns (address collection) { collection = _createNFTDropCollection( name, symbol, baseURI, isRevealed, maxTokenId, approvedMinter, paymentAddress != msg.sender ? paymentAddress : payable(0), nonce ); } /** * @notice Create a new drop collection contract with a custom payment address derived from the factory. * @dev All params other than `paymentAddressFactoryCall` are the same as in `createNFTDropCollection`. * The nonce must be unique for the msg.sender + implementation version, otherwise this call will revert. * @param name The collection's `name`. * @param symbol The collection's `symbol`. * @param baseURI The base URI for the collection. * @param isRevealed Whether the collection is revealed or not. * @param maxTokenId The max token id for this collection. * @param approvedMinter An optional address to grant the MINTER_ROLE. * @param nonce An arbitrary value used to allow a creator to mint multiple collections with a counterfactual address. * @param paymentAddressFactoryCall The contract call which will return the address to use for payments. * @return collection The address of the newly created collection contract. */ function createNFTDropCollectionWithPaymentFactory( string calldata name, string calldata symbol, string calldata baseURI, bool isRevealed, uint32 maxTokenId, address approvedMinter, uint96 nonce, CallWithoutValue calldata paymentAddressFactoryCall ) external returns (address collection) { collection = _createNFTDropCollection( name, symbol, baseURI, isRevealed, maxTokenId, approvedMinter, AddressLibrary.callAndReturnContractAddress(paymentAddressFactoryCall), nonce ); } function _createNFTDropCollection( string calldata name, string calldata symbol, string calldata baseURI, bool isRevealed, uint32 maxTokenId, address approvedMinter, address payable paymentAddress, uint96 nonce ) private returns (address collection) { require(bytes(symbol).length > 0, "NFTCollectionFactory: Symbol is required"); require(maxTokenId > 0, "NFTCollectionFactory: maxTokenId is required"); // 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, isRevealed, maxTokenId, approvedMinter, paymentAddress ); emit NFTDropCollectionCreated( collection, msg.sender, approvedMinter, name, symbol, baseURI, isRevealed, 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 with a counterfactual address. * @return collection The address of the collection contract that would be created by this nonce. */ function predictNFTCollectionAddress(address creator, uint96 nonce) external view returns (address collection) { collection = implementationNFTCollection.predictDeterministicAddress(_getSalt(creator, nonce)); } /** * @notice Returns the address of an 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 with a counterfactual address. * @return collection The address of the collection contract that would be created by this nonce. */ function predictNFTDropCollectionAddress(address creator, uint96 nonce) external view returns (address collection) { collection = implementationNFTDropCollection.predictDeterministicAddress(_getSalt(creator, nonce)); } /** * @dev Salt is address + nonce packed. */ function _getSalt(address creator, uint96 nonce) private pure returns (bytes32) { return bytes32((uint256(uint160(creator)) << 96) | uint256(nonce)); } }
// 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. * @author batu-inal & HardlyDifficult */ 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 calldata 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 calldata call) internal returns (address payable contractAddress) { contractAddress = callAndReturnContractAddress(call.target, call.callData); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; /** * @author batu-inal & HardlyDifficult */ interface INFTDropCollectionInitializer { function initialize( address payable _creator, string calldata _name, string calldata _symbol, string calldata _baseURI, bool isRevealed, uint32 _maxTokenId, address _approvedMinter, address payable _paymentAddress ) external; }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; /** * @author batu-inal & HardlyDifficult */ 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; /** * @title A placeholder contract leaving room for new mixins to be added to the future. * @author batu-inal & HardlyDifficult */ 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[10_000] private __gap; }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; import "./IRoles.sol"; /** * @author batu-inal & HardlyDifficult */ interface IHasRolesContract { function rolesManager() external returns (IRoles); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.12; /** * @notice Interface for a contract which implements admin roles. * @author batu-inal & HardlyDifficult */ interface IRoles { function isAdmin(address account) external view returns (bool); function isOperator(address account) external view returns (bool); }
// 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: UNLICENSED pragma solidity >=0.6.0; import "../contracts/NFTCollectionFactory.sol"; contract $NFTCollectionFactory is NFTCollectionFactory { bytes32 public __hh_exposed_bytecode_marker = "hardhat-exposed"; constructor(address _rolesManager) NFTCollectionFactory(_rolesManager) {} function $_disableInitializers() external { return super._disableInitializers(); } receive() external payable {} }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.0; import "../../../contracts/interfaces/internal/INFTCollectionInitializer.sol"; abstract contract $INFTCollectionInitializer is INFTCollectionInitializer { bytes32 public __hh_exposed_bytecode_marker = "hardhat-exposed"; constructor() {} receive() external payable {} }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.0; import "../../../contracts/interfaces/internal/INFTDropCollectionInitializer.sol"; abstract contract $INFTDropCollectionInitializer is INFTDropCollectionInitializer { bytes32 public __hh_exposed_bytecode_marker = "hardhat-exposed"; constructor() {} receive() external payable {} }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.0; import "../../../../contracts/interfaces/internal/roles/IHasRolesContract.sol"; abstract contract $IHasRolesContract is IHasRolesContract { bytes32 public __hh_exposed_bytecode_marker = "hardhat-exposed"; constructor() {} receive() external payable {} }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.0; import "../../../../contracts/interfaces/internal/roles/IRoles.sol"; abstract contract $IRoles is IRoles { bytes32 public __hh_exposed_bytecode_marker = "hardhat-exposed"; constructor() {} receive() external payable {} }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.0; import "../../contracts/libraries/AddressLibrary.sol"; contract $AddressLibrary { bytes32 public __hh_exposed_bytecode_marker = "hardhat-exposed"; event $callAndReturnContractAddress_address_bytes_Returned(address payable arg0); event $callAndReturnContractAddress_CallWithoutValue_Returned(address payable arg0); constructor() {} function $callAndReturnContractAddress(address externalContract,bytes calldata callData) external payable returns (address payable) { (address payable ret0) = AddressLibrary.callAndReturnContractAddress(externalContract,callData); emit $callAndReturnContractAddress_address_bytes_Returned(ret0); return (ret0); } function $callAndReturnContractAddress(CallWithoutValue calldata call) external payable returns (address payable) { (address payable ret0) = AddressLibrary.callAndReturnContractAddress(call); emit $callAndReturnContractAddress_CallWithoutValue_Returned(ret0); return (ret0); } receive() external payable {} }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.6.0; import "../../../contracts/mixins/shared/Gap10000.sol"; contract $Gap10000 is Gap10000 { bytes32 public __hh_exposed_bytecode_marker = "hardhat-exposed"; constructor() {} receive() external payable {} }
{ "optimizer": { "enabled": true, "runs": 1337 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_rolesManager","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":"approvedMinter","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":"bool","name":"isRevealed","type":"bool"},{"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":"uint96","name":"nonce","type":"uint96"}],"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":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint32","name":"maxTokenId","type":"uint32"},{"internalType":"address","name":"approvedMinter","type":"address"},{"internalType":"uint96","name":"nonce","type":"uint96"}],"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":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint32","name":"maxTokenId","type":"uint32"},{"internalType":"address","name":"approvedMinter","type":"address"},{"internalType":"uint96","name":"nonce","type":"uint96"},{"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":"bool","name":"isRevealed","type":"bool"},{"internalType":"uint32","name":"maxTokenId","type":"uint32"},{"internalType":"address","name":"approvedMinter","type":"address"},{"internalType":"uint96","name":"nonce","type":"uint96"},{"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":"uint96","name":"nonce","type":"uint96"}],"name":"predictNFTCollectionAddress","outputs":[{"internalType":"address","name":"collection","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint96","name":"nonce","type":"uint96"}],"name":"predictNFTDropCollectionAddress","outputs":[{"internalType":"address","name":"collection","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rolesManager","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
60a06040523480156200001157600080fd5b506040516200209d3803806200209d833981016040819052620000349162000210565b600054610100900460ff1615808015620000555750600054600160ff909116105b8062000085575062000072306200020160201b62000c0d1760201c565b15801562000085575060005460ff166001145b620000ee5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000112576000805461ff0019166101001790555b62000131826001600160a01b03166200020160201b62000c0d1760201c565b620001a55760405162461bcd60e51b815260206004820152603560248201527f4e4654436f6c6c656374696f6e466163746f72793a20526f6c6573436f6e747260448201527f616374206973206e6f74206120636f6e747261637400000000000000000000006064820152608401620000e5565b6001600160a01b0382166080528015620001f9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505062000242565b6001600160a01b03163b151590565b6000602082840312156200022357600080fd5b81516001600160a01b03811681146200023b57600080fd5b9392505050565b608051611e2a62000273600039600081816101f2015281816104060152818161070f01526108e40152611e2a6000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638bdf0df51161008c578063a3574c5b11610066578063a3574c5b146101ed578063b5a296f714610214578063c96acbca14610227578063ceefb1aa1461023a57600080fd5b80638bdf0df5146101af5780638d8965bd146101c75780639e9e40ac146101da57600080fd5b806345783b3a116100c857806345783b3a14610147578063687aa3011461015b5780637221e1a41461016e5780637823edb61461019b57600080fd5b80630f828159146100ef5780631f09d21b1461011f5780632b61c6c414610132575b600080fd5b6101026100fd366004611400565b61024d565b6040516001600160a01b0390911681526020015b60405180910390f35b61010261012d3660046114d1565b6103cc565b6101456101403660046115b0565b6103f1565b005b61271254610102906001600160a01b031681565b6101456101693660046115b0565b6106fa565b6127115461018690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610116565b61271154610102906001600160a01b031681565b6127125461018690600160a01b900463ffffffff1681565b6101456101d53660046115cd565b610a19565b6101026101e83660046115e8565b610b69565b6101027f000000000000000000000000000000000000000000000000000000000000000081565b610102610222366004611635565b610b92565b6101026102353660046115e8565b610bbf565b610102610248366004611738565b610be1565b60008281036102b45760405162461bcd60e51b815260206004820152602860248201527f4e4654436f6c6c656374696f6e466163746f72793a2053796d626f6c206973206044820152671c995c5d5a5c995960c21b60648201526084015b60405180910390fd5b6102d46102c13384610c1c565b612711546001600160a01b031690610c5a565b6040517f906571470000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906390657147906103249033908a908a908a908a9060040161183d565b600060405180830381600087803b15801561033e57600080fd5b505af1158015610352573d6000803e3d6000fd5b5050505061271160149054906101000a900463ffffffff1663ffffffff16336001600160a01b0316826001600160a01b03167f22bd5d982c942d99c12bfa4feda7e796b2b9d6a1b8097c890871b12de29963eb89898989896040516103bb95949392919061187f565b60405180910390a495945050505050565b60006103e28b8b8b8b8b8b8b8b8b60008c610d11565b9b9a5050505050505050505050565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047991906118c7565b6104eb5760405162461bcd60e51b815260206004820152603960248201527f4e4654436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c650000000000000060648201526084016102ab565b806001600160a01b0381163b6105695760405162461bcd60e51b815260206004820152603660248201527f4e4654436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e74726163740000000000000000000060648201526084016102ab565b612712805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416178082556014906105ac90600160a01b900463ffffffff166118fa565b91906101000a81548163ffffffff021916908363ffffffff160217905550816001600160a01b031663b1fb9914306105fc61271260149054906101000a900463ffffffff1663ffffffff16610f0c565b60405160200161060c9190611941565b60408051808303601f190181529190526127125461063690600160a01b900463ffffffff16610f0c565b60405160200161064691906119ac565b6040516020818303038152906040526001806000806040518863ffffffff1660e01b815260040161067d9796959493929190611a1d565b600060405180830381600087803b15801561069757600080fd5b505af11580156106ab573d6000803e3d6000fd5b505061271254604051600160a01b90910463ffffffff1692506001600160a01b03851691507ff9555eb90bc7e43c2508783a103691f257c0c9758bd0eae063456789b2de4eee90600090a35050565b604051630935e01b60e21b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906324d7806c90602401602060405180830381865afa15801561075e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078291906118c7565b6107f45760405162461bcd60e51b815260206004820152603960248201527f4e4654436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c650000000000000060648201526084016102ab565b806001600160a01b0381163b6108725760405162461bcd60e51b815260206004820152603660248201527f4e4654436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e74726163740000000000000000000060648201526084016102ab565b612711805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416178082556014906108b590600160a01b900463ffffffff166118fa565b91906101000a81548163ffffffff021916908363ffffffff160217905550816001600160a01b031663906571477f000000000000000000000000000000000000000000000000000000000000000061092561271160149054906101000a900463ffffffff1663ffffffff16610f0c565b6040516020016109359190611ae1565b60408051808303601f190181529190526127115461095f90600160a01b900463ffffffff16610f0c565b60405160200161096f9190611b26565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161099c93929190611b6b565b600060405180830381600087803b1580156109b657600080fd5b505af11580156109ca573d6000803e3d6000fd5b505061271154604051600160a01b90910463ffffffff1692506001600160a01b03851691507fc1383747ef02af212da98ad8a2fbc2167484d7736b8774a00472de9d8eef80d590600090a35050565b600054610100900460ff1615808015610a395750600054600160ff909116105b80610a535750303b158015610a53575060005460ff166001145b610ac55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016102ab565b6000805460ff191660011790558015610ae8576000805461ff0019166101001790555b61271180547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b63ffffffff8516021790558015610b65576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000610b8b610b788484610c1c565b612712546001600160a01b031690611049565b9392505050565b6000610baf8c8c8c8c8c8c8c8c8c610ba98c6110c5565b8d610d11565b9c9b505050505050505050505050565b6000610b8b610bce8484610c1c565b612711546001600160a01b031690611049565b6000610baf8c8c8c8c8c8c8c8c8c336001600160a01b038d1603610c06576000610ba9565b8b8d610d11565b6001600160a01b03163b151590565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166bffffffffffffffffffffffff8216175b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b038116610c545760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016102ab565b600088610d715760405162461bcd60e51b815260206004820152602860248201527f4e4654436f6c6c656374696f6e466163746f72793a2053796d626f6c206973206044820152671c995c5d5a5c995960c21b60648201526084016102ab565b60008563ffffffff1611610ded5760405162461bcd60e51b815260206004820152602c60248201527f4e4654436f6c6c656374696f6e466163746f72793a206d6178546f6b656e496460448201527f206973207265717569726564000000000000000000000000000000000000000060648201526084016102ab565b610e0d610dfa3384610c1c565b612712546001600160a01b031690610c5a565b9050806001600160a01b031663b1fb9914338e8e8e8e8e8e8e8e8e8e6040518c63ffffffff1660e01b8152600401610e4f9b9a99989796959493929190611ba9565b600060405180830381600087803b158015610e6957600080fd5b505af1158015610e7d573d6000803e3d6000fd5b50505050836001600160a01b0316336001600160a01b0316826001600160a01b03167f539650f67bdd91b68860520943769ed5924e62e8722a454d882e292191ad37c48f8f8f8f8f8f8f8f8e61271260149054906101000a900463ffffffff168f604051610ef59b9a99989796959493929190611c2b565b60405180910390a49b9a5050505050505050505050565b606081600003610f4f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610f795780610f6381611cb8565b9150610f729050600a83611ce7565b9150610f53565b60008167ffffffffffffffff811115610f9457610f94611cfb565b6040519080825280601f01601f191660200182016040528015610fbe576020820181803683370190505b5090505b841561104157610fd3600183611d11565b9150610fe0600a86611d24565b610feb906030611d38565b60f81b81838151811061100057611000611d4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061103a600a86611ce7565b9450610fc2565b949350505050565b6000610b8b8383306040517f3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000008152606093841b60148201527f5af43d82803e903d91602b57fd5bf3ff000000000000000000000000000000006028820152921b6038830152604c8201526037808220606c830152605591012090565b6000610c546110d760208401846115b0565b6110e46020850185611d61565b60008061113184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b038916929150506111ce565b9050808060200190518101906111479190611da8565b91506001600160a01b0382163b6111c65760405162461bcd60e51b815260206004820152602c60248201527f496e7465726e616c50726f787943616c6c3a20646964206e6f7420726574757260448201527f6e206120636f6e7472616374000000000000000000000000000000000000000060648201526084016102ab565b509392505050565b6060610b8b83836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506060611041848460008560608247101561128d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016102ab565b6001600160a01b0385163b6112e45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102ab565b600080866001600160a01b031685876040516113009190611dc5565b60006040518083038185875af1925050503d806000811461133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b509150915061135282828661135d565b979650505050505050565b6060831561136c575081610b8b565b82511561137c5782518084602001fd5b8160405162461bcd60e51b81526004016102ab9190611de1565b60008083601f8401126113a857600080fd5b50813567ffffffffffffffff8111156113c057600080fd5b6020830191508360208285010111156113d857600080fd5b9250929050565b80356bffffffffffffffffffffffff811681146113fb57600080fd5b919050565b60008060008060006060868803121561141857600080fd5b853567ffffffffffffffff8082111561143057600080fd5b61143c89838a01611396565b9097509550602088013591508082111561145557600080fd5b5061146288828901611396565b90945092506114759050604087016113df565b90509295509295909350565b801515811461148f57600080fd5b50565b80356113fb81611481565b803563ffffffff811681146113fb57600080fd5b6001600160a01b038116811461148f57600080fd5b80356113fb816114b1565b60008060008060008060008060008060e08b8d0312156114f057600080fd5b8a3567ffffffffffffffff8082111561150857600080fd5b6115148e838f01611396565b909c509a5060208d013591508082111561152d57600080fd5b6115398e838f01611396565b909a50985060408d013591508082111561155257600080fd5b5061155f8d828e01611396565b90975095505060608b013561157381611481565b935061158160808c0161149d565b925060a08b0135611591816114b1565b915061159f60c08c016113df565b90509295989b9194979a5092959850565b6000602082840312156115c257600080fd5b8135610b8b816114b1565b6000602082840312156115df57600080fd5b610b8b8261149d565b600080604083850312156115fb57600080fd5b8235611606816114b1565b9150611614602084016113df565b90509250929050565b60006040828403121561162f57600080fd5b50919050565b60008060008060008060008060008060006101008c8e03121561165757600080fd5b67ffffffffffffffff808d35111561166e57600080fd5b61167b8e8e358f01611396565b909c509a5060208d013581101561169157600080fd5b6116a18e60208f01358f01611396565b909a50985060408d01358110156116b757600080fd5b6116c78e60408f01358f01611396565b90985096506116d860608e01611492565b95506116e660808e0161149d565b94506116f460a08e016114c6565b935061170260c08e016113df565b92508060e08e0135111561171557600080fd5b506117268d60e08e01358e0161161d565b90509295989b509295989b9093969950565b60008060008060008060008060008060006101008c8e03121561175a57600080fd5b67ffffffffffffffff808d35111561177157600080fd5b61177e8e8e358f01611396565b909c509a5060208d013581101561179457600080fd5b6117a48e60208f01358f01611396565b909a50985060408d01358110156117ba57600080fd5b506117cb8d60408e01358e01611396565b90975095506117dc60608d01611492565b94506117ea60808d0161149d565b93506117f860a08d016114c6565b925061180660c08d016113df565b915061172660e08d016114c6565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0386168152606060208201526000611860606083018688611814565b8281036040840152611873818587611814565b98975050505050505050565b606081526000611893606083018789611814565b82810360208401526118a6818688611814565b9150506bffffffffffffffffffffffff831660408301529695505050505050565b6000602082840312156118d957600080fd5b8151610b8b81611481565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818103611913576119136118e4565b6001019392505050565b60005b83811015611938578181015183820152602001611920565b50506000910152565b7f4e46542044726f7020436f6c6c656374696f6e20496d706c656d656e7461746981527f6f6e20760000000000000000000000000000000000000000000000000000000060208201526000825161199f81602485016020870161191d565b9190910160240192915050565b7f4e465444726f70560000000000000000000000000000000000000000000000008152600082516119e481600885016020870161191d565b9190910160080192915050565b60008151808452611a0981602086016020860161191d565b601f01601f19169290920160200192915050565b60006101006001600160a01b03808b168452816020850152611a418285018b6119f1565b91508382036040850152611a55828a6119f1565b848103606080870191909152603682527f697066733a2f2f516d55744373554c547066555957426663555331793235727160208301527f425a36453543664b7a5a67366a395033674653634b2f000000000000000000006040830152981515608086015263ffffffff9790971660a085015294851660c08401525050911660e090910152019392505050565b7f4e465420436f6c6c656374696f6e20496d706c656d656e746174696f6e207600815260008251611b1981601f85016020870161191d565b91909101601f0192915050565b7f4e46547600000000000000000000000000000000000000000000000000000000815260008251611b5e81600485016020870161191d565b9190910160040192915050565b6001600160a01b0384168152606060208201526000611b8d60608301856119f1565b8281036040840152611b9f81856119f1565b9695505050505050565b60006001600160a01b03808e1683526101006020840152611bcf61010084018d8f611814565b8381036040850152611be2818c8e611814565b90508381036060850152611bf7818a8c611814565b97151560808501525063ffffffff9590951660a08301525091831660c083015290911660e090910152979650505050505050565b61010081526000611c4161010083018d8f611814565b8281036020840152611c54818c8e611814565b90508281036040840152611c69818a8c611814565b9715156060840152505063ffffffff94851660808201526001600160a01b039390931660a0840152921660c08201526bffffffffffffffffffffffff90911660e0909101529695505050505050565b600060018201611cca57611cca6118e4565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611cf657611cf6611cd1565b500490565b634e487b7160e01b600052604160045260246000fd5b81810381811115610c5457610c546118e4565b600082611d3357611d33611cd1565b500690565b80820180821115610c5457610c546118e4565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611d7857600080fd5b83018035915067ffffffffffffffff821115611d9357600080fd5b6020019150368190038213156113d857600080fd5b600060208284031215611dba57600080fd5b8151610b8b816114b1565b60008251611dd781846020870161191d565b9190910192915050565b602081526000610b8b60208301846119f156fea264697066735822122095fe8ed3046b90d260339c5da183f8e07368746501b10d644e2279b179c8937164736f6c6343000811003300000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb6
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638bdf0df51161008c578063a3574c5b11610066578063a3574c5b146101ed578063b5a296f714610214578063c96acbca14610227578063ceefb1aa1461023a57600080fd5b80638bdf0df5146101af5780638d8965bd146101c75780639e9e40ac146101da57600080fd5b806345783b3a116100c857806345783b3a14610147578063687aa3011461015b5780637221e1a41461016e5780637823edb61461019b57600080fd5b80630f828159146100ef5780631f09d21b1461011f5780632b61c6c414610132575b600080fd5b6101026100fd366004611400565b61024d565b6040516001600160a01b0390911681526020015b60405180910390f35b61010261012d3660046114d1565b6103cc565b6101456101403660046115b0565b6103f1565b005b61271254610102906001600160a01b031681565b6101456101693660046115b0565b6106fa565b6127115461018690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610116565b61271154610102906001600160a01b031681565b6127125461018690600160a01b900463ffffffff1681565b6101456101d53660046115cd565b610a19565b6101026101e83660046115e8565b610b69565b6101027f00000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb681565b610102610222366004611635565b610b92565b6101026102353660046115e8565b610bbf565b610102610248366004611738565b610be1565b60008281036102b45760405162461bcd60e51b815260206004820152602860248201527f4e4654436f6c6c656374696f6e466163746f72793a2053796d626f6c206973206044820152671c995c5d5a5c995960c21b60648201526084015b60405180910390fd5b6102d46102c13384610c1c565b612711546001600160a01b031690610c5a565b6040517f906571470000000000000000000000000000000000000000000000000000000081529091506001600160a01b038216906390657147906103249033908a908a908a908a9060040161183d565b600060405180830381600087803b15801561033e57600080fd5b505af1158015610352573d6000803e3d6000fd5b5050505061271160149054906101000a900463ffffffff1663ffffffff16336001600160a01b0316826001600160a01b03167f22bd5d982c942d99c12bfa4feda7e796b2b9d6a1b8097c890871b12de29963eb89898989896040516103bb95949392919061187f565b60405180910390a495945050505050565b60006103e28b8b8b8b8b8b8b8b8b60008c610d11565b9b9a5050505050505050505050565b604051630935e01b60e21b81523360048201527f00000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb66001600160a01b0316906324d7806c90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047991906118c7565b6104eb5760405162461bcd60e51b815260206004820152603960248201527f4e4654436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c650000000000000060648201526084016102ab565b806001600160a01b0381163b6105695760405162461bcd60e51b815260206004820152603660248201527f4e4654436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e74726163740000000000000000000060648201526084016102ab565b612712805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416178082556014906105ac90600160a01b900463ffffffff166118fa565b91906101000a81548163ffffffff021916908363ffffffff160217905550816001600160a01b031663b1fb9914306105fc61271260149054906101000a900463ffffffff1663ffffffff16610f0c565b60405160200161060c9190611941565b60408051808303601f190181529190526127125461063690600160a01b900463ffffffff16610f0c565b60405160200161064691906119ac565b6040516020818303038152906040526001806000806040518863ffffffff1660e01b815260040161067d9796959493929190611a1d565b600060405180830381600087803b15801561069757600080fd5b505af11580156106ab573d6000803e3d6000fd5b505061271254604051600160a01b90910463ffffffff1692506001600160a01b03851691507ff9555eb90bc7e43c2508783a103691f257c0c9758bd0eae063456789b2de4eee90600090a35050565b604051630935e01b60e21b81523360048201527f00000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb66001600160a01b0316906324d7806c90602401602060405180830381865afa15801561075e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078291906118c7565b6107f45760405162461bcd60e51b815260206004820152603960248201527f4e4654436f6c6c656374696f6e466163746f72793a2043616c6c657220646f6560448201527f73206e6f742068617665207468652041646d696e20726f6c650000000000000060648201526084016102ab565b806001600160a01b0381163b6108725760405162461bcd60e51b815260206004820152603660248201527f4e4654436f6c6c656374696f6e466163746f72793a20496d706c656d656e746160448201527f74696f6e206973206e6f74206120636f6e74726163740000000000000000000060648201526084016102ab565b612711805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416178082556014906108b590600160a01b900463ffffffff166118fa565b91906101000a81548163ffffffff021916908363ffffffff160217905550816001600160a01b031663906571477f00000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb661092561271160149054906101000a900463ffffffff1663ffffffff16610f0c565b6040516020016109359190611ae1565b60408051808303601f190181529190526127115461095f90600160a01b900463ffffffff16610f0c565b60405160200161096f9190611b26565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161099c93929190611b6b565b600060405180830381600087803b1580156109b657600080fd5b505af11580156109ca573d6000803e3d6000fd5b505061271154604051600160a01b90910463ffffffff1692506001600160a01b03851691507fc1383747ef02af212da98ad8a2fbc2167484d7736b8774a00472de9d8eef80d590600090a35050565b600054610100900460ff1615808015610a395750600054600160ff909116105b80610a535750303b158015610a53575060005460ff166001145b610ac55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016102ab565b6000805460ff191660011790558015610ae8576000805461ff0019166101001790555b61271180547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b63ffffffff8516021790558015610b65576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6000610b8b610b788484610c1c565b612712546001600160a01b031690611049565b9392505050565b6000610baf8c8c8c8c8c8c8c8c8c610ba98c6110c5565b8d610d11565b9c9b505050505050505050505050565b6000610b8b610bce8484610c1c565b612711546001600160a01b031690611049565b6000610baf8c8c8c8c8c8c8c8c8c336001600160a01b038d1603610c06576000610ba9565b8b8d610d11565b6001600160a01b03163b151590565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606083901b166bffffffffffffffffffffffff8216175b92915050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b038116610c545760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016102ab565b600088610d715760405162461bcd60e51b815260206004820152602860248201527f4e4654436f6c6c656374696f6e466163746f72793a2053796d626f6c206973206044820152671c995c5d5a5c995960c21b60648201526084016102ab565b60008563ffffffff1611610ded5760405162461bcd60e51b815260206004820152602c60248201527f4e4654436f6c6c656374696f6e466163746f72793a206d6178546f6b656e496460448201527f206973207265717569726564000000000000000000000000000000000000000060648201526084016102ab565b610e0d610dfa3384610c1c565b612712546001600160a01b031690610c5a565b9050806001600160a01b031663b1fb9914338e8e8e8e8e8e8e8e8e8e6040518c63ffffffff1660e01b8152600401610e4f9b9a99989796959493929190611ba9565b600060405180830381600087803b158015610e6957600080fd5b505af1158015610e7d573d6000803e3d6000fd5b50505050836001600160a01b0316336001600160a01b0316826001600160a01b03167f539650f67bdd91b68860520943769ed5924e62e8722a454d882e292191ad37c48f8f8f8f8f8f8f8f8e61271260149054906101000a900463ffffffff168f604051610ef59b9a99989796959493929190611c2b565b60405180910390a49b9a5050505050505050505050565b606081600003610f4f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610f795780610f6381611cb8565b9150610f729050600a83611ce7565b9150610f53565b60008167ffffffffffffffff811115610f9457610f94611cfb565b6040519080825280601f01601f191660200182016040528015610fbe576020820181803683370190505b5090505b841561104157610fd3600183611d11565b9150610fe0600a86611d24565b610feb906030611d38565b60f81b81838151811061100057611000611d4b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061103a600a86611ce7565b9450610fc2565b949350505050565b6000610b8b8383306040517f3d602d80600a3d3981f3363d3d373d3d3d363d730000000000000000000000008152606093841b60148201527f5af43d82803e903d91602b57fd5bf3ff000000000000000000000000000000006028820152921b6038830152604c8201526037808220606c830152605591012090565b6000610c546110d760208401846115b0565b6110e46020850185611d61565b60008061113184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b038916929150506111ce565b9050808060200190518101906111479190611da8565b91506001600160a01b0382163b6111c65760405162461bcd60e51b815260206004820152602c60248201527f496e7465726e616c50726f787943616c6c3a20646964206e6f7420726574757260448201527f6e206120636f6e7472616374000000000000000000000000000000000000000060648201526084016102ab565b509392505050565b6060610b8b83836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506060611041848460008560608247101561128d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016102ab565b6001600160a01b0385163b6112e45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102ab565b600080866001600160a01b031685876040516113009190611dc5565b60006040518083038185875af1925050503d806000811461133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b509150915061135282828661135d565b979650505050505050565b6060831561136c575081610b8b565b82511561137c5782518084602001fd5b8160405162461bcd60e51b81526004016102ab9190611de1565b60008083601f8401126113a857600080fd5b50813567ffffffffffffffff8111156113c057600080fd5b6020830191508360208285010111156113d857600080fd5b9250929050565b80356bffffffffffffffffffffffff811681146113fb57600080fd5b919050565b60008060008060006060868803121561141857600080fd5b853567ffffffffffffffff8082111561143057600080fd5b61143c89838a01611396565b9097509550602088013591508082111561145557600080fd5b5061146288828901611396565b90945092506114759050604087016113df565b90509295509295909350565b801515811461148f57600080fd5b50565b80356113fb81611481565b803563ffffffff811681146113fb57600080fd5b6001600160a01b038116811461148f57600080fd5b80356113fb816114b1565b60008060008060008060008060008060e08b8d0312156114f057600080fd5b8a3567ffffffffffffffff8082111561150857600080fd5b6115148e838f01611396565b909c509a5060208d013591508082111561152d57600080fd5b6115398e838f01611396565b909a50985060408d013591508082111561155257600080fd5b5061155f8d828e01611396565b90975095505060608b013561157381611481565b935061158160808c0161149d565b925060a08b0135611591816114b1565b915061159f60c08c016113df565b90509295989b9194979a5092959850565b6000602082840312156115c257600080fd5b8135610b8b816114b1565b6000602082840312156115df57600080fd5b610b8b8261149d565b600080604083850312156115fb57600080fd5b8235611606816114b1565b9150611614602084016113df565b90509250929050565b60006040828403121561162f57600080fd5b50919050565b60008060008060008060008060008060006101008c8e03121561165757600080fd5b67ffffffffffffffff808d35111561166e57600080fd5b61167b8e8e358f01611396565b909c509a5060208d013581101561169157600080fd5b6116a18e60208f01358f01611396565b909a50985060408d01358110156116b757600080fd5b6116c78e60408f01358f01611396565b90985096506116d860608e01611492565b95506116e660808e0161149d565b94506116f460a08e016114c6565b935061170260c08e016113df565b92508060e08e0135111561171557600080fd5b506117268d60e08e01358e0161161d565b90509295989b509295989b9093969950565b60008060008060008060008060008060006101008c8e03121561175a57600080fd5b67ffffffffffffffff808d35111561177157600080fd5b61177e8e8e358f01611396565b909c509a5060208d013581101561179457600080fd5b6117a48e60208f01358f01611396565b909a50985060408d01358110156117ba57600080fd5b506117cb8d60408e01358e01611396565b90975095506117dc60608d01611492565b94506117ea60808d0161149d565b93506117f860a08d016114c6565b925061180660c08d016113df565b915061172660e08d016114c6565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0386168152606060208201526000611860606083018688611814565b8281036040840152611873818587611814565b98975050505050505050565b606081526000611893606083018789611814565b82810360208401526118a6818688611814565b9150506bffffffffffffffffffffffff831660408301529695505050505050565b6000602082840312156118d957600080fd5b8151610b8b81611481565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818103611913576119136118e4565b6001019392505050565b60005b83811015611938578181015183820152602001611920565b50506000910152565b7f4e46542044726f7020436f6c6c656374696f6e20496d706c656d656e7461746981527f6f6e20760000000000000000000000000000000000000000000000000000000060208201526000825161199f81602485016020870161191d565b9190910160240192915050565b7f4e465444726f70560000000000000000000000000000000000000000000000008152600082516119e481600885016020870161191d565b9190910160080192915050565b60008151808452611a0981602086016020860161191d565b601f01601f19169290920160200192915050565b60006101006001600160a01b03808b168452816020850152611a418285018b6119f1565b91508382036040850152611a55828a6119f1565b848103606080870191909152603682527f697066733a2f2f516d55744373554c547066555957426663555331793235727160208301527f425a36453543664b7a5a67366a395033674653634b2f000000000000000000006040830152981515608086015263ffffffff9790971660a085015294851660c08401525050911660e090910152019392505050565b7f4e465420436f6c6c656374696f6e20496d706c656d656e746174696f6e207600815260008251611b1981601f85016020870161191d565b91909101601f0192915050565b7f4e46547600000000000000000000000000000000000000000000000000000000815260008251611b5e81600485016020870161191d565b9190910160040192915050565b6001600160a01b0384168152606060208201526000611b8d60608301856119f1565b8281036040840152611b9f81856119f1565b9695505050505050565b60006001600160a01b03808e1683526101006020840152611bcf61010084018d8f611814565b8381036040850152611be2818c8e611814565b90508381036060850152611bf7818a8c611814565b97151560808501525063ffffffff9590951660a08301525091831660c083015290911660e090910152979650505050505050565b61010081526000611c4161010083018d8f611814565b8281036020840152611c54818c8e611814565b90508281036040840152611c69818a8c611814565b9715156060840152505063ffffffff94851660808201526001600160a01b039390931660a0840152921660c08201526bffffffffffffffffffffffff90911660e0909101529695505050505050565b600060018201611cca57611cca6118e4565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611cf657611cf6611cd1565b500490565b634e487b7160e01b600052604160045260246000fd5b81810381811115610c5457610c546118e4565b600082611d3357611d33611cd1565b500690565b80820180821115610c5457610c546118e4565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611d7857600080fd5b83018035915067ffffffffffffffff821115611d9357600080fd5b6020019150368190038213156113d857600080fd5b600060208284031215611dba57600080fd5b8151610b8b816114b1565b60008251611dd781846020870161191d565b9190910192915050565b602081526000610b8b60208301846119f156fea264697066735822122095fe8ed3046b90d260339c5da183f8e07368746501b10d644e2279b179c8937164736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb6
-----Decoded View---------------
Arg [0] : _rolesManager (address): 0x67Df244584b67E8C51B10aD610aAfFa9a402FdB6
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000067df244584b67e8c51b10ad610aaffa9a402fdb6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.