// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./GeneralWizardsHelperV1.sol"; import "../../../tax/tax-strategies/TaxStrategies.sol"; import "../../../tax/tax-terms-registry/ITaxTermsRegistry.sol"; import "../../../warper/preset-factory/IWarperPresetFactory.sol"; import "../../../warper/warper-manager/IWarperManager.sol"; import "../../../metahub/core/IMetahub.sol"; import "../../../contract-registry/Contracts.sol"; library WarperWizardsHelperV1 { /** * @dev Thrown when something went wrong with setting Warper Tax Terms. */ error FailedToSetWarperTaxTerms(); /** * @dev Does not perform Warper and Universe ownership checks! */ function registerWarperAndCheckTaxTermsExist( address warperAddress, ITaxTermsRegistry.TaxTerms calldata universeWarperTaxTerms, IWarperManager.WarperRegistrationParams memory warperRegistrationParams, IMetahub metahub ) internal { IWarperManager(metahub.getContract(Contracts.WARPER_MANAGER)).registerWarper( warperAddress, warperRegistrationParams ); GeneralWizardsHelperV1.checkTaxTermsAreValid(universeWarperTaxTerms); ITaxTermsRegistry(metahub.getContract(Contracts.TAX_TERMS_REGISTRY)).registerUniverseWarperTaxTerms( warperRegistrationParams.universeId, warperAddress, universeWarperTaxTerms ); } function removeAllWarperTaxTerms( uint256 universeId, address warperAddress, IMetahub metahub ) internal { bytes4[] memory supportedTaxStrategies = TaxStrategies.getSupportedTaxStrategyIDs(); ITaxTermsRegistry taxTermsRegistry = ITaxTermsRegistry(metahub.getContract(Contracts.TAX_TERMS_REGISTRY)); for (uint256 i = 0; i < supportedTaxStrategies.length; i++) { if ( taxTermsRegistry.areRegisteredUniverseWarperTaxTerms( universeId, warperAddress, supportedTaxStrategies[i] ) ) { taxTermsRegistry.removeUniverseWarperTaxTerms(universeId, warperAddress, supportedTaxStrategies[i]); } } } /** * @dev Does not perform Warper and Universe ownership checks! */ function deregisterWarperAndRemoveWarperTaxTerms(address warperAddress, IMetahub metahub) internal { IWarperManager warperManager = IWarperManager(metahub.getContract(Contracts.WARPER_MANAGER)); uint256 universeId = warperManager.warperInfo(warperAddress).universeId; warperManager.deregisterWarper(warperAddress); removeAllWarperTaxTerms(universeId, warperAddress, metahub); } /** * @dev Does not perform Warper and Universe ownership checks! */ function deployWarperFromPresetOrReturnExistingOne( address existingWarperAddress, bytes32 warperPresetId, bytes calldata warperInitData, IMetahub metahub ) internal returns (address deployedWarperAddress) { if (existingWarperAddress == address(0)) { deployedWarperAddress = IWarperPresetFactory(metahub.getContract(Contracts.WARPER_PRESET_FACTORY)) .deployPreset(warperPresetId, warperInitData); } else { deployedWarperAddress = existingWarperAddress; } } /** * @dev Does not perform Warper and Universe ownership checks! */ function alterWarperTaxTerms( address warperAddress, ITaxTermsRegistry.TaxTerms calldata newUniverseWarperTaxTerms, IMetahub metahub ) internal { IWarperManager warperManager = IWarperManager(metahub.getContract(Contracts.WARPER_MANAGER)); uint256 universeId = warperManager.warperInfo(warperAddress).universeId; ITaxTermsRegistry taxTermsRegistry = ITaxTermsRegistry(metahub.getContract(Contracts.TAX_TERMS_REGISTRY)); GeneralWizardsHelperV1.checkTaxTermsAreValid(newUniverseWarperTaxTerms); bytes4[] memory supportedTaxStrategies = TaxStrategies.getSupportedTaxStrategyIDs(); for (uint256 i = 0; i < supportedTaxStrategies.length; i++) { bytes4 supportedTaxStrategy = supportedTaxStrategies[i]; if ( taxTermsRegistry.areRegisteredUniverseWarperTaxTerms(universeId, warperAddress, supportedTaxStrategy) && supportedTaxStrategy == newUniverseWarperTaxTerms.strategyId ) { taxTermsRegistry.removeUniverseWarperTaxTerms(universeId, warperAddress, supportedTaxStrategy); taxTermsRegistry.registerUniverseWarperTaxTerms(universeId, warperAddress, newUniverseWarperTaxTerms); // Successfully altered the Tax Terms. return; } } revert FailedToSetWarperTaxTerms(); } }