// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "@openzeppelin/contracts/utils/Multicall.sol"; import "./IGeneralGuildWizardV1.sol"; import "../../utils/ListingWizardsHelperV1.sol"; import "../../utils/GeneralWizardsHelperV1.sol"; import "../../../../contract-registry/ContractEntity.sol"; contract GeneralGuildWizardV1 is DelegatedAccessControlled, Multicall, ContractEntity, IGeneralGuildWizardV1 { using Assets for Assets.Asset; using Assets for Assets.Asset[]; using Assets for Assets.AssetId[]; /** * @dev DAC contract instance. */ IDelegatedAccessControl internal _dacContract; modifier onlyCallerIsLister(Listings.Params calldata params) { if (_msgSender() != params.lister) revert CallerIsNotLister(); _; } constructor(address dac, address metahub) { if (dac == address(0)) revert ZeroAddress(); if (metahub == address(0)) revert ZeroAddress(); _dacContract = IDelegatedAccessControl(dac); _metahub = IMetahub(metahub); } /** * @inheritdoc IGeneralGuildWizardV1 */ function listWithTermsForUniverse( GeneralGuildPreset preset, Assets.Asset[] calldata assets, Listings.Params calldata params, uint32 maxLockPeriod, bool immediatePayout, uint256 universeId, ListingTermsPack[] calldata terms ) external onlyCallerIsLister(params) onlyDelegateAdminOrManager(address(preset)) { // creating listing IListingManager(_metahub.getContract(Contracts.LISTING_MANAGER)).createListing( assets, params, maxLockPeriod, immediatePayout ); // getting asset ids from assets Assets.AssetId[] memory ids = assets.toIds(); // getting address of Original Asset collection address originalCollectionAddress = assets[0].token(); // setting listing terms for configurator preset for (uint256 i = 0; i < terms.length; i++) { ListingTermsPack calldata batch = terms[i]; GeneralWizardsHelperV1.checkListingTermsAreValid(batch.config); ListingWizardsHelperV1.validateMatchWithUniverse( universeId, originalCollectionAddress, batch.config, _metahub ); preset.setListingTerms(universeId, batch.group, ids, batch.config); } } /** * @inheritdoc IContractEntity */ function contractKey() external pure override returns (bytes4) { return Contracts.GENERAL_GUILD_WIZARD_V1; } /** * @inheritdoc IERC165 */ function supportsInterface(bytes4 interfaceId) public view override(ContractEntity, IERC165) returns (bool) { return interfaceId == type(IGeneralGuildWizardV1).interfaceId || super.supportsInterface(interfaceId); } function _dac() internal view virtual override returns (IDelegatedAccessControl) { return _dacContract; } }