# High priority:
Ownable is re-used:
- Ownable (node_modules/@openzeppelin/contracts/access/Ownable.sol#20-83)
- Ownable (contracts/UpgradeableBeacon.sol#671-724)
- Ownable (contracts/oz/access/Ownable.sol#20-79)
IBeacon is re-used:
- IBeacon (contracts/UpgradeableBeacon.sol#7-14)
- IBeacon (contracts/oz/proxy/beacon/IBeacon.sol#9-16)
UpgradeableBeacon is re-used:
- UpgradeableBeacon (contracts/UpgradeableBeacon.sol#732-784)
- UpgradeableBeacon (contracts/oz/proxy/beacon/UpgradeableBeacon.sol#16-68)
StringsUpgradeable is re-used:
- StringsUpgradeable (contracts/oz/utils/StringsUpgradeable.sol#8-34)
- StringsUpgradeable (contracts/oz442/utils/StringsUpgradeable.sol#9-71)
Initializable is re-used:
- Initializable (contracts/oz/proxy/Initializable.sol#20-57)
- Initializable (contracts/oz442/proxy/utils/Initializable.sol#35-83)
ERC1967Upgrade is re-used:
- ERC1967Upgrade (contracts/UpgradeableBeacon.sol#107-299)
- ERC1967Upgrade (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#19-200)
ERC165Upgradeable is re-used:
- ERC165Upgradeable (contracts/oz/introspection/ERC165Upgradeable.sol#14-67)
- ERC165Upgradeable (contracts/oz442/utils/introspection/ERC165Upgradeable.sol#23-44)
IERC165Upgradeable is re-used:
- IERC165Upgradeable (contracts/oz/introspection/IERC165Upgradeable.sol#14-24)
- IERC165Upgradeable (contracts/oz442/utils/introspection/IERC165Upgradeable.sol#15-25)
AddressUpgradeable is re-used:
- AddressUpgradeable (contracts/oz/utils/AddressUpgradeable.sol#8-208)
- AddressUpgradeable (contracts/oz442/utils/AddressUpgradeable.sol#9-210)
BeaconProxy is re-used:
- BeaconProxy (contracts/UpgradeableBeacon.sol#1062-1108)
- BeaconProxy (contracts/oz/proxy/beacon/BeaconProxy.sol#18-64)
ContextUpgradeable is re-used:
- ContextUpgradeable (contracts/oz/utils/ContextUpgradeable.sol#16-33)
- ContextUpgradeable (contracts/oz442/utils/ContextUpgradeable.sol#17-33)
EnumerableSet is re-used:
- EnumerableSet (node_modules/@openzeppelin/contracts/utils/structs/EnumerableSet.sol#41-378)
- EnumerableSet (contracts/oz/utils/EnumerableSet.sol#41-424)
IOperatorFilterRegistry is re-used:
- IOperatorFilterRegistry (contracts/opensea/IOperatorFilterRegistry.sol#4-102)
- IOperatorFilterRegistry (node_modules/operator-filter-registry/src/IOperatorFilterRegistry.sol#4-29)
StorageSlot is re-used:
- StorageSlot (contracts/UpgradeableBeacon.sol#568-636)
- StorageSlot (contracts/oz/utils/StorageSlot.sol#32-100)
Address is re-used:
- Address (contracts/UpgradeableBeacon.sol#304-540)
- Address (contracts/oz/utils/Address.sol#9-250)
Context is re-used:
- Context (node_modules/@openzeppelin/contracts/utils/Context.sol#16-24)
- Context (contracts/UpgradeableBeacon.sol#648-657)
- Context (contracts/oz/utils/Context.sol#16-24)
ERC1967Proxy is re-used:
- ERC1967Proxy (contracts/UpgradeableBeacon.sol#792-819)
- ERC1967Proxy (contracts/oz/proxy/ERC1967/ERC1967Proxy.sol#15-42)
Proxy is re-used:
- Proxy (contracts/UpgradeableBeacon.sol#26-97)
- Proxy (contracts/oz/proxy/Proxy.sol#16-86)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#name-reused
INFO:Detectors:
SubdomainController.authorizedAccounts (contracts/controllers/SubdomainController.sol#17) is never initialized. It is used in:
- SubdomainController.isAuthorized() (contracts/controllers/SubdomainController.sol#75-80)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-state-variables
# Medium priority:
INFO:Detectors:
CustomStrings.toString(uint256) (contracts/CustomStrings.sol#5-26) performs a multiplication on the result of a division:
- tempo = (48 + uint8(value - (value / 10) * 10)) (contracts/CustomStrings.sol#20)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#divide-before-multiply
INFO:Detectors:
Reentrancy in DomainPurchaser.purchaseSubdomain(uint256,string,string) (contracts/controllers/DomainPurchaser.sol#112-193):
External calls:
- paymentToken.safeTransferFrom(msg.sender,platformWallet,price) (contracts/controllers/DomainPurchaser.sol#150)
- paymentToken.safeTransferFrom(msg.sender,zNSHub.ownerOf(parentId),price - fee) (contracts/controllers/DomainPurchaser.sol#155-159)
- paymentToken.safeTransferFrom(msg.sender,platformWallet,fee) (contracts/controllers/DomainPurchaser.sol#163)
- createdDomainId = rootRegistrar.registerSubdomainContract(parentId,name,msg.sender,metadataUri,0,false,msg.sender) (contracts/controllers/DomainPurchaser.sol#170-178)
State variables written after the call(s):
- purchaseData[createdDomainId].wasAllowedToSubdomainMintOnCreation = domainData.allowSubdomainsToMint (contracts/controllers/DomainPurchaser.sol#186-187)
DomainPurchaser.purchaseData (contracts/controllers/DomainPurchaser.sol#75) can be used in cross function reentrancies:
- DomainPurchaser.getDomainPrice(uint256,string) (contracts/controllers/DomainPurchaser.sol#305-325)
- DomainPurchaser.initialize(address,address,address,IDomainPurchaser.PricingData,uint256) (contracts/controllers/DomainPurchaser.sol#80-103)
- DomainPurchaser.purchaseData (contracts/controllers/DomainPurchaser.sol#75)
- DomainPurchaser.purchaseSubdomain(uint256,string,string) (contracts/controllers/DomainPurchaser.sol#112-193)
- DomainPurchaser.setDomainMintingStatus(uint256,bool,bool) (contracts/controllers/DomainPurchaser.sol#240-265)
- DomainPurchaser.setDomainPricing(uint256,IDomainPurchaser.PricingData,bool,bool) (contracts/controllers/DomainPurchaser.sol#202-231)
Reentrancy in Registrar.registerDomainInGroupBulk(uint256,uint256,uint256,uint256,uint256,address,uint256,address) (contracts/registrar/Registrar.sol#822-853):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#832)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- tokenId = _registerDomainV2(parentId,CustomStrings.toString(i + namingOffset),minter,,royaltyAmount,true,groupId,i) (contracts/registrar/Registrar.sol#838-847)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
- _transfer(minter,sendTo,tokenId) (contracts/registrar/Registrar.sol#850)
- zNSHub.domainTransferred(from,to,tokenId) (contracts/registrar/Registrar.sol#642)
State variables written after the call(s):
- tokenId = _registerDomainV2(parentId,CustomStrings.toString(i + namingOffset),minter,,royaltyAmount,true,groupId,i) (contracts/registrar/Registrar.sol#838-847)
- records[domainId] = DomainRecord(parentId,minter,false,address(0),controller,0,address(0),domainGroupId,domainGroupFileIndex) (contracts/registrar/Registrar.sol#701-711)
- records[domainId].metadataLockedBy = minter (contracts/registrar/Registrar.sol#389)
- records[domainId].metadataLocked = true (contracts/registrar/Registrar.sol#390)
- records[domainId].royaltyAmount = royaltyAmount (contracts/registrar/Registrar.sol#394)
Registrar.records (contracts/registrar/Registrar.sol#66) can be used in cross function reentrancies:
- Registrar._createDomain(uint256,uint256,address,address,uint256,uint256) (contracts/registrar/Registrar.sol#691-712)
- Registrar._registerDomainV2(uint256,string,address,string,uint256,bool,uint256,uint256) (contracts/registrar/Registrar.sol#347-416)
- Registrar._setDomainLock(uint256,address,bool) (contracts/registrar/Registrar.sol#714-723)
- Registrar._setDomainMetadataUri(uint256,string) (contracts/registrar/Registrar.sol#657-670)
- Registrar.adminBurnToken(uint256) (contracts/registrar/Registrar.sol#725-728)
- Registrar.domainController(uint256) (contracts/registrar/Registrar.sol#578-580)
- Registrar.domainMetadataLockedBy(uint256) (contracts/registrar/Registrar.sol#568-572)
- Registrar.domainRoyaltyAmount(uint256) (contracts/registrar/Registrar.sol#586-590)
- Registrar.isDomainMetadataLocked(uint256) (contracts/registrar/Registrar.sol#558-562)
- Registrar.minterOf(uint256) (contracts/registrar/Registrar.sol#550-552)
- Registrar.parentOf(uint256) (contracts/registrar/Registrar.sol#596-601)
- Registrar.records (contracts/registrar/Registrar.sol#66)
- Registrar.registerSubdomainContract(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#281-324)
- Registrar.setDomainRoyaltyAmount(uint256,uint256) (contracts/registrar/Registrar.sol#423-434)
- Registrar.tokenURI(uint256) (contracts/registrar/Registrar.sol#603-628)
Reentrancy in Registrar.registerSubdomainContract(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#281-324):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#290)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#292-299)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
- subdomainContract = address(new BeaconProxy(zNSHub.registrarBeacon(),)) (contracts/registrar/Registrar.sol#302-304)
- Registrar(subdomainContract).initialize(address(this),id,Zer0 Name Service,ZNS,address(zNSHub)) (contracts/registrar/Registrar.sol#307-313)
State variables written after the call(s):
- records[id].subdomainContract = subdomainContract (contracts/registrar/Registrar.sol#316)
Registrar.records (contracts/registrar/Registrar.sol#66) can be used in cross function reentrancies:
- Registrar._createDomain(uint256,uint256,address,address,uint256,uint256) (contracts/registrar/Registrar.sol#691-712)
- Registrar._registerDomainV2(uint256,string,address,string,uint256,bool,uint256,uint256) (contracts/registrar/Registrar.sol#347-416)
- Registrar._setDomainLock(uint256,address,bool) (contracts/registrar/Registrar.sol#714-723)
- Registrar._setDomainMetadataUri(uint256,string) (contracts/registrar/Registrar.sol#657-670)
- Registrar.adminBurnToken(uint256) (contracts/registrar/Registrar.sol#725-728)
- Registrar.domainController(uint256) (contracts/registrar/Registrar.sol#578-580)
- Registrar.domainMetadataLockedBy(uint256) (contracts/registrar/Registrar.sol#568-572)
- Registrar.domainRoyaltyAmount(uint256) (contracts/registrar/Registrar.sol#586-590)
- Registrar.isDomainMetadataLocked(uint256) (contracts/registrar/Registrar.sol#558-562)
- Registrar.minterOf(uint256) (contracts/registrar/Registrar.sol#550-552)
- Registrar.parentOf(uint256) (contracts/registrar/Registrar.sol#596-601)
- Registrar.records (contracts/registrar/Registrar.sol#66)
- Registrar.registerSubdomainContract(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#281-324)
- Registrar.setDomainRoyaltyAmount(uint256,uint256) (contracts/registrar/Registrar.sol#423-434)
- Registrar.tokenURI(uint256) (contracts/registrar/Registrar.sol#603-628)
Reentrancy in Registrar.setAndLockDomainMetadata(uint256,string) (contracts/registrar/Registrar.sol#441-451):
External calls:
- _setDomainMetadataUri(id,uri) (contracts/registrar/Registrar.sol#449)
- zNSHub.metadataChanged(id,uri) (contracts/registrar/Registrar.sol#669)
- _setDomainLock(id,msg.sender,true) (contracts/registrar/Registrar.sol#450)
- zNSHub.metadataLockChanged(id,locker,lockStatus) (contracts/registrar/Registrar.sol#722)
State variables written after the call(s):
- _setDomainLock(id,msg.sender,true) (contracts/registrar/Registrar.sol#450)
- records[id].metadataLockedBy = locker (contracts/registrar/Registrar.sol#719)
- records[id].metadataLocked = lockStatus (contracts/registrar/Registrar.sol#720)
Registrar.records (contracts/registrar/Registrar.sol#66) can be used in cross function reentrancies:
- Registrar._createDomain(uint256,uint256,address,address,uint256,uint256) (contracts/registrar/Registrar.sol#691-712)
- Registrar._registerDomainV2(uint256,string,address,string,uint256,bool,uint256,uint256) (contracts/registrar/Registrar.sol#347-416)
- Registrar._setDomainLock(uint256,address,bool) (contracts/registrar/Registrar.sol#714-723)
- Registrar._setDomainMetadataUri(uint256,string) (contracts/registrar/Registrar.sol#657-670)
- Registrar.adminBurnToken(uint256) (contracts/registrar/Registrar.sol#725-728)
- Registrar.domainController(uint256) (contracts/registrar/Registrar.sol#578-580)
- Registrar.domainMetadataLockedBy(uint256) (contracts/registrar/Registrar.sol#568-572)
- Registrar.domainRoyaltyAmount(uint256) (contracts/registrar/Registrar.sol#586-590)
- Registrar.isDomainMetadataLocked(uint256) (contracts/registrar/Registrar.sol#558-562)
- Registrar.minterOf(uint256) (contracts/registrar/Registrar.sol#550-552)
- Registrar.parentOf(uint256) (contracts/registrar/Registrar.sol#596-601)
- Registrar.records (contracts/registrar/Registrar.sol#66)
- Registrar.registerSubdomainContract(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#281-324)
- Registrar.setDomainRoyaltyAmount(uint256,uint256) (contracts/registrar/Registrar.sol#423-434)
- Registrar.tokenURI(uint256) (contracts/registrar/Registrar.sol#603-628)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-1
INFO:Detectors:
ERC1967Upgrade._upgradeToAndCallUUPS(address,bytes,bool).slot (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#98) is a local variable never initialized
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#uninitialized-local-variables
INFO:Detectors:
ERC1967Upgrade._upgradeToAndCall(address,bytes,bool) (contracts/UpgradeableBeacon.sol#158-168) ignores return value by Address.functionDelegateCall(newImplementation,data) (contracts/UpgradeableBeacon.sol#166)
ERC1967Upgrade._upgradeToAndCallSecure(address,bytes,bool) (contracts/UpgradeableBeacon.sol#175-208) ignores return value by Address.functionDelegateCall(newImplementation,data) (contracts/UpgradeableBeacon.sol#185)
ERC1967Upgrade._upgradeToAndCallSecure(address,bytes,bool) (contracts/UpgradeableBeacon.sol#175-208) ignores return value by Address.functionDelegateCall(newImplementation,abi.encodeWithSignature(upgradeTo(address),oldImplementation)) (contracts/UpgradeableBeacon.sol#194-197)
ERC1967Upgrade._upgradeBeaconToAndCall(address,bytes,bool) (contracts/UpgradeableBeacon.sol#216-226) ignores return value by Address.functionDelegateCall(IBeacon(newBeacon).implementation(),data) (contracts/UpgradeableBeacon.sol#224)
ERC1967Upgrade._upgradeToAndCall(address,bytes,bool) (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#70-79) ignores return value by Address.functionDelegateCall(newImplementation,data) (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#77)
ERC1967Upgrade._upgradeToAndCallUUPS(address,bytes,bool) (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#86-109) ignores return value by IERC1822Proxiable(newImplementation).proxiableUUID() (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#97-106)
ERC1967Upgrade._upgradeBeaconToAndCall(address,bytes,bool) (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#189-199) ignores return value by Address.functionDelegateCall(IBeacon(newBeacon).implementation(),data) (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#197)
ERC721Upgradeable._mint(address,uint256) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#446-457) ignores return value by _holderTokens[to].add(tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#452)
ERC721Upgradeable._mint(address,uint256) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#446-457) ignores return value by _tokenOwners.set(tokenId,to) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#454)
ERC721Upgradeable._burn(uint256) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#469-487) ignores return value by _holderTokens[owner].remove(tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#482)
ERC721Upgradeable._burn(uint256) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#469-487) ignores return value by _tokenOwners.remove(tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#484)
ERC721Upgradeable._transfer(address,address,uint256) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#500-522) ignores return value by _holderTokens[from].remove(tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#516)
ERC721Upgradeable._transfer(address,address,uint256) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#500-522) ignores return value by _holderTokens[to].add(tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#517)
ERC721Upgradeable._transfer(address,address,uint256) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#500-522) ignores return value by _tokenOwners.set(tokenId,to) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#519)
OperatorFilterRegistry.unregister(address) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#98-109) ignores return value by _subscribers[registration].remove(registrant) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#104)
OperatorFilterRegistry.registerAndSubscribe(address,address) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#114-134) ignores return value by _subscribers[subscription].add(registrant) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#131)
OperatorFilterRegistry.subscribe(address,address) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#309-338) ignores return value by _subscribers[registration].remove(registrant) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#332)
OperatorFilterRegistry.subscribe(address,address) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#309-338) ignores return value by _subscribers[newSubscription].add(registrant) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#336)
OperatorFilterRegistry.unsubscribe(address,bool) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#343-357) ignores return value by _subscribers[registration].remove(registrant) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#351)
OperatorFilterRegistry.onlyAddressOrOwner(address) (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#32-50) ignores return value by Ownable(addr).owner() (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#34-47)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#unused-return
# Low priority:
INFO:Detectors:
AdminUpgradeabilityProxy.constructor(address,address,bytes).admin (contracts/UpgradeableBeacon.sol#1049) shadows:
- TransparentUpgradeableProxy.admin() (contracts/UpgradeableBeacon.sol#878-880) (function)
AuthBasicController.registerSubdomainExtended(uint256,string,address,string,uint256,bool).owner (contracts/controllers/AuthBasicController.sol#58) shadows:
- OwnableUpgradeable.owner() (contracts/oz/access/OwnableUpgradeable.sol#45-47) (function)
SubdomainController.registerSubdomainExtended(address,uint256,string,address,string).owner (contracts/controllers/SubdomainController.sol#35) shadows:
- OwnableUpgradeable.owner() (contracts/oz/access/OwnableUpgradeable.sol#45-47) (function)
SubdomainController.registerSubdomainContractExtended(address,uint256,string,address,string).owner (contracts/controllers/SubdomainController.sol#57) shadows:
- OwnableUpgradeable.owner() (contracts/oz/access/OwnableUpgradeable.sol#45-47) (function)
IZNAResolver.associateWithResourceType(uint256,uint256,uint256).resourceID (contracts/interfaces/IZNAResolver.sol#38) shadows:
- IZNAResolver.resourceID(uint256,uint256) (contracts/interfaces/IZNAResolver.sol#62-65) (function)
IZNAResolver.addResourceRegistry(uint256,IResourceRegistry).resourceRegistry (contracts/interfaces/IZNAResolver.sol#46) shadows:
- IZNAResolver.resourceRegistry(uint256) (contracts/interfaces/IZNAResolver.sol#67-70) (function)
MockOwnedRegistrant.constructor(address)._owner (contracts/mocks/MockOwnedRegistrant.sol#74) shadows:
- Ownable._owner (contracts/oz/access/Ownable.sol#21) (state variable)
MockToken.initialize(string,string).name (contracts/mocks/MockToken.sol#8) shadows:
- ERC20Upgradeable.name() (contracts/oz/token/ERC20/ERC20Upgradeable.sol#80-82) (function)
MockToken.initialize(string,string).symbol (contracts/mocks/MockToken.sol#8) shadows:
- ERC20Upgradeable.symbol() (contracts/oz/token/ERC20/ERC20Upgradeable.sol#88-90) (function)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#local-variable-shadowing
INFO:Detectors:
DomainPurchaser.setPlatformFee(uint256) (contracts/controllers/DomainPurchaser.sol#271-276) should emit an event for:
- platformFee = fee (contracts/controllers/DomainPurchaser.sol#275)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-events-arithmetic
INFO:Detectors:
DomainPurchaser.initialize(address,address,address,IDomainPurchaser.PricingData,uint256)._platformWallet (contracts/controllers/DomainPurchaser.sol#83) lacks a zero-check on :
- platformWallet = _platformWallet (contracts/controllers/DomainPurchaser.sol#90)
Ownable2Step.transferOwnership(address).newOwner (contracts/mocks/MockOwnedRegistrant.sol#38) lacks a zero-check on :
- _pendingOwner = newOwner (contracts/mocks/MockOwnedRegistrant.sol#40)
ZNSHub.initialize(address,address).defaultRegistrar_ (contracts/registrar/ZNSHub.sol#101) lacks a zero-check on :
- defaultRegistrar = defaultRegistrar_ (contracts/registrar/ZNSHub.sol#108)
ZNSHub.initialize(address,address).registrarBeacon_ (contracts/registrar/ZNSHub.sol#101) lacks a zero-check on :
- beacon = registrarBeacon_ (contracts/registrar/ZNSHub.sol#109)
ZNSHub.setDefaultRegistrar(address).defaultRegistrar_ (contracts/registrar/ZNSHub.sol#112) lacks a zero-check on :
- defaultRegistrar = defaultRegistrar_ (contracts/registrar/ZNSHub.sol#113)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#missing-zero-address-validation
INFO:Detectors:
Modifier TransparentUpgradeableProxy.ifAdmin() (contracts/UpgradeableBeacon.sol#861-867) does not always execute _; or revertReference: https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-modifier
INFO:Detectors:
OperatorFilterer._onlyAllowedOperator(address) (contracts/opensea/OperatorFilterer.sol#53-65) has external calls inside a loop: ! OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this),msg.sender) (contracts/opensea/OperatorFilterer.sol#61)
Registrar._transfer(address,address,uint256) (contracts/registrar/Registrar.sol#634-643) has external calls inside a loop: zNSHub.domainTransferred(from,to,tokenId) (contracts/registrar/Registrar.sol#642)
Registrar._setDomainMetadataUri(uint256,string) (contracts/registrar/Registrar.sol#657-670) has external calls inside a loop: zNSHub.metadataChanged(id,uri) (contracts/registrar/Registrar.sol#669)
Registrar._registerDomainV2(uint256,string,address,string,uint256,bool,uint256,uint256) (contracts/registrar/Registrar.sol#347-416) has external calls inside a loop: zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation/#calls-inside-a-loop
INFO:Detectors:
Reentrancy in Registrar.createDomainGroup(string) (contracts/registrar/Registrar.sol#94-106):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#97)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
State variables written after the call(s):
- domainGroups[numDomainGroups + 1] = DomainGroup(baseMetadataUri) (contracts/registrar/Registrar.sol#98-100)
- ++ numDomainGroups (contracts/registrar/Registrar.sol#101)
Reentrancy in Registrar.registerDomain(uint256,string,address,string,uint256,bool) (contracts/registrar/Registrar.sol#235-253):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#243)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#244-252)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
State variables written after the call(s):
- _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#244-252)
- _tokenURIs[tokenId] = _tokenURI (contracts/oz/token/ERC721/ERC721Upgradeable.sol#535)
Reentrancy in Registrar.registerDomainAndSend(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#255-279):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#264)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#266-273)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
State variables written after the call(s):
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#266-273)
- _tokenURIs[tokenId] = _tokenURI (contracts/oz/token/ERC721/ERC721Upgradeable.sol#535)
Reentrancy in Registrar.registerDomainAndSend(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#255-279):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#264)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#266-273)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#276)
- zNSHub.domainTransferred(from,to,tokenId) (contracts/registrar/Registrar.sol#642)
- returndata = to.functionCall(abi.encodeWithSelector(IERC721ReceiverUpgradeable(to).onERC721Received.selector,_msgSender(),from,tokenId,_data),ERC721: transfer to non ERC721Receiver implementer) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#566-575)
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/AddressUpgradeable.sol#149)
External calls sending eth:
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#276)
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/AddressUpgradeable.sol#149)
State variables written after the call(s):
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#276)
- _tokenApprovals[tokenId] = to (contracts/oz/token/ERC721/ERC721Upgradeable.sol#586)
Reentrancy in Registrar.registerDomainAndSendBulk(uint256,uint256,uint256,uint256,address,string,uint256,bool) (contracts/registrar/Registrar.sol#793-820):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#803)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- result = _registerDomain(parentId,CustomStrings.toString(i + namingOffset),minter,string(abi.encodePacked(folderWithIPFSPrefix,CustomStrings.toString(i))),royaltyAmount,locked) (contracts/registrar/Registrar.sol#809-818)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
State variables written after the call(s):
- result = _registerDomain(parentId,CustomStrings.toString(i + namingOffset),minter,string(abi.encodePacked(folderWithIPFSPrefix,CustomStrings.toString(i))),royaltyAmount,locked) (contracts/registrar/Registrar.sol#809-818)
- _tokenURIs[tokenId] = _tokenURI (contracts/oz/token/ERC721/ERC721Upgradeable.sol#535)
Reentrancy in Registrar.registerDomainInGroupBulk(uint256,uint256,uint256,uint256,uint256,address,uint256,address) (contracts/registrar/Registrar.sol#822-853):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#832)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- tokenId = _registerDomainV2(parentId,CustomStrings.toString(i + namingOffset),minter,,royaltyAmount,true,groupId,i) (contracts/registrar/Registrar.sol#838-847)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
- _transfer(minter,sendTo,tokenId) (contracts/registrar/Registrar.sol#850)
- zNSHub.domainTransferred(from,to,tokenId) (contracts/registrar/Registrar.sol#642)
State variables written after the call(s):
- _transfer(minter,sendTo,tokenId) (contracts/registrar/Registrar.sol#850)
- _tokenApprovals[tokenId] = to (contracts/oz/token/ERC721/ERC721Upgradeable.sol#586)
- tokenId = _registerDomainV2(parentId,CustomStrings.toString(i + namingOffset),minter,,royaltyAmount,true,groupId,i) (contracts/registrar/Registrar.sol#838-847)
- _tokenURIs[tokenId] = _tokenURI (contracts/oz/token/ERC721/ERC721Upgradeable.sol#535)
Reentrancy in Registrar.registerSubdomainContract(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#281-324):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#290)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#292-299)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
State variables written after the call(s):
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#292-299)
- _tokenURIs[tokenId] = _tokenURI (contracts/oz/token/ERC721/ERC721Upgradeable.sol#535)
Reentrancy in Registrar.registerSubdomainContract(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#281-324):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#290)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#292-299)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
- subdomainContract = address(new BeaconProxy(zNSHub.registrarBeacon(),)) (contracts/registrar/Registrar.sol#302-304)
- Registrar(subdomainContract).initialize(address(this),id,Zer0 Name Service,ZNS,address(zNSHub)) (contracts/registrar/Registrar.sol#307-313)
- zNSHub.addRegistrar(id,subdomainContract) (contracts/registrar/Registrar.sol#318)
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#321)
- zNSHub.domainTransferred(from,to,tokenId) (contracts/registrar/Registrar.sol#642)
- returndata = to.functionCall(abi.encodeWithSelector(IERC721ReceiverUpgradeable(to).onERC721Received.selector,_msgSender(),from,tokenId,_data),ERC721: transfer to non ERC721Receiver implementer) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#566-575)
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/AddressUpgradeable.sol#149)
External calls sending eth:
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#321)
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/AddressUpgradeable.sol#149)
State variables written after the call(s):
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#321)
- _tokenApprovals[tokenId] = to (contracts/oz/token/ERC721/ERC721Upgradeable.sol#586)
Reentrancy in Registrar.updateDomainGroup(uint256,string) (contracts/registrar/Registrar.sol#113-130):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#117)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
State variables written after the call(s):
- domainGroups[id].baseMetadataUri = baseMetadataUri (contracts/registrar/Registrar.sol#127)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2
INFO:Detectors:
Reentrancy in ERC1967Upgrade._upgradeToAndCallSecure(address,bytes,bool) (contracts/UpgradeableBeacon.sol#175-208):
External calls:
- Address.functionDelegateCall(newImplementation,data) (contracts/UpgradeableBeacon.sol#185)
- Address.functionDelegateCall(newImplementation,abi.encodeWithSignature(upgradeTo(address),oldImplementation)) (contracts/UpgradeableBeacon.sol#194-197)
Event emitted after the call(s):
- Upgraded(newImplementation) (contracts/UpgradeableBeacon.sol#206)
Reentrancy in DomainPurchaser.purchaseSubdomain(uint256,string,string) (contracts/controllers/DomainPurchaser.sol#112-193):
External calls:
- paymentToken.safeTransferFrom(msg.sender,platformWallet,price) (contracts/controllers/DomainPurchaser.sol#150)
- paymentToken.safeTransferFrom(msg.sender,zNSHub.ownerOf(parentId),price - fee) (contracts/controllers/DomainPurchaser.sol#155-159)
- paymentToken.safeTransferFrom(msg.sender,platformWallet,fee) (contracts/controllers/DomainPurchaser.sol#163)
- createdDomainId = rootRegistrar.registerSubdomainContract(parentId,name,msg.sender,metadataUri,0,false,msg.sender) (contracts/controllers/DomainPurchaser.sol#170-178)
Event emitted after the call(s):
- NetworkPurchased(createdDomainId,msg.sender) (contracts/controllers/DomainPurchaser.sol#190)
Reentrancy in Registrar.registerDomain(uint256,string,address,string,uint256,bool) (contracts/registrar/Registrar.sol#235-253):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#243)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#244-252)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
Event emitted after the call(s):
- Transfer(address(0),to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#456)
- _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#244-252)
Reentrancy in Registrar.registerDomainAndSend(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#255-279):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#264)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#266-273)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
Event emitted after the call(s):
- Transfer(address(0),to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#456)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#266-273)
Reentrancy in Registrar.registerDomainAndSend(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#255-279):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#264)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#266-273)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#276)
- zNSHub.domainTransferred(from,to,tokenId) (contracts/registrar/Registrar.sol#642)
- returndata = to.functionCall(abi.encodeWithSelector(IERC721ReceiverUpgradeable(to).onERC721Received.selector,_msgSender(),from,tokenId,_data),ERC721: transfer to non ERC721Receiver implementer) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#566-575)
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/AddressUpgradeable.sol#149)
External calls sending eth:
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#276)
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/AddressUpgradeable.sol#149)
Event emitted after the call(s):
- Approval(ERC721Upgradeable.ownerOf(tokenId),to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#587)
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#276)
- Transfer(from,to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#521)
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#276)
Reentrancy in Registrar.registerDomainAndSendBulk(uint256,uint256,uint256,uint256,address,string,uint256,bool) (contracts/registrar/Registrar.sol#793-820):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#803)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- result = _registerDomain(parentId,CustomStrings.toString(i + namingOffset),minter,string(abi.encodePacked(folderWithIPFSPrefix,CustomStrings.toString(i))),royaltyAmount,locked) (contracts/registrar/Registrar.sol#809-818)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
Event emitted after the call(s):
- Transfer(address(0),to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#456)
- result = _registerDomain(parentId,CustomStrings.toString(i + namingOffset),minter,string(abi.encodePacked(folderWithIPFSPrefix,CustomStrings.toString(i))),royaltyAmount,locked) (contracts/registrar/Registrar.sol#809-818)
Reentrancy in Registrar.registerDomainInGroupBulk(uint256,uint256,uint256,uint256,uint256,address,uint256,address) (contracts/registrar/Registrar.sol#822-853):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#832)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- tokenId = _registerDomainV2(parentId,CustomStrings.toString(i + namingOffset),minter,,royaltyAmount,true,groupId,i) (contracts/registrar/Registrar.sol#838-847)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
- _transfer(minter,sendTo,tokenId) (contracts/registrar/Registrar.sol#850)
- zNSHub.domainTransferred(from,to,tokenId) (contracts/registrar/Registrar.sol#642)
Event emitted after the call(s):
- Approval(ERC721Upgradeable.ownerOf(tokenId),to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#587)
- _transfer(minter,sendTo,tokenId) (contracts/registrar/Registrar.sol#850)
- Transfer(address(0),to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#456)
- tokenId = _registerDomainV2(parentId,CustomStrings.toString(i + namingOffset),minter,,royaltyAmount,true,groupId,i) (contracts/registrar/Registrar.sol#838-847)
- Transfer(from,to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#521)
- _transfer(minter,sendTo,tokenId) (contracts/registrar/Registrar.sol#850)
Reentrancy in Registrar.registerSubdomainContract(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#281-324):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#290)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#292-299)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
Event emitted after the call(s):
- Transfer(address(0),to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#456)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#292-299)
Reentrancy in Registrar.registerSubdomainContract(uint256,string,address,string,uint256,bool,address) (contracts/registrar/Registrar.sol#281-324):
External calls:
- _onlyController() (contracts/registrar/Registrar.sol#290)
- ! controllers[msg.sender] && ! zNSHub.isController(msg.sender) (contracts/registrar/Registrar.sol#652)
- id = _registerDomain(parentId,label,minter,metadataUri,royaltyAmount,locked) (contracts/registrar/Registrar.sol#292-299)
- zNSHub.domainCreated(domainId,label,labelHash,parentId,minter,msg.sender,metadataUri,royaltyAmount,groupId,groupFileIndex) (contracts/registrar/Registrar.sol#402-413)
- subdomainContract = address(new BeaconProxy(zNSHub.registrarBeacon(),)) (contracts/registrar/Registrar.sol#302-304)
- Registrar(subdomainContract).initialize(address(this),id,Zer0 Name Service,ZNS,address(zNSHub)) (contracts/registrar/Registrar.sol#307-313)
- zNSHub.addRegistrar(id,subdomainContract) (contracts/registrar/Registrar.sol#318)
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#321)
- zNSHub.domainTransferred(from,to,tokenId) (contracts/registrar/Registrar.sol#642)
- returndata = to.functionCall(abi.encodeWithSelector(IERC721ReceiverUpgradeable(to).onERC721Received.selector,_msgSender(),from,tokenId,_data),ERC721: transfer to non ERC721Receiver implementer) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#566-575)
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/AddressUpgradeable.sol#149)
External calls sending eth:
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#321)
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/AddressUpgradeable.sol#149)
Event emitted after the call(s):
- Approval(ERC721Upgradeable.ownerOf(tokenId),to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#587)
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#321)
- Transfer(from,to,tokenId) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#521)
- _safeTransfer(minter,sendToUser,id,) (contracts/registrar/Registrar.sol#321)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3
INFO:Detectors:
EnumerableSet.values(EnumerableSet.Bytes32Set) (node_modules/@openzeppelin/contracts/utils/structs/EnumerableSet.sol#219-229) uses assembly
- INLINE ASM (node_modules/@openzeppelin/contracts/utils/structs/EnumerableSet.sol#224-226)
EnumerableSet.values(EnumerableSet.AddressSet) (node_modules/@openzeppelin/contracts/utils/structs/EnumerableSet.sol#293-303) uses assembly
- INLINE ASM (node_modules/@openzeppelin/contracts/utils/structs/EnumerableSet.sol#298-300)
EnumerableSet.values(EnumerableSet.UintSet) (node_modules/@openzeppelin/contracts/utils/structs/EnumerableSet.sol#367-377) uses assembly
- INLINE ASM (node_modules/@openzeppelin/contracts/utils/structs/EnumerableSet.sol#372-374)
Proxy._delegate(address) (contracts/UpgradeableBeacon.sol#32-56) uses assembly
- INLINE ASM (contracts/UpgradeableBeacon.sol#34-55)
Address.isContract(address) (contracts/UpgradeableBeacon.sol#322-333) uses assembly
- INLINE ASM (contracts/UpgradeableBeacon.sol#329-331)
Address._verifyCallResult(bool,bytes,string) (contracts/UpgradeableBeacon.sol#518-539) uses assembly
- INLINE ASM (contracts/UpgradeableBeacon.sol#531-534)
StorageSlot.getAddressSlot(bytes32) (contracts/UpgradeableBeacon.sol#588-596) uses assembly
- INLINE ASM (contracts/UpgradeableBeacon.sol#593-595)
StorageSlot.getBooleanSlot(bytes32) (contracts/UpgradeableBeacon.sol#601-609) uses assembly
- INLINE ASM (contracts/UpgradeableBeacon.sol#606-608)
StorageSlot.getBytes32Slot(bytes32) (contracts/UpgradeableBeacon.sol#614-622) uses assembly
- INLINE ASM (contracts/UpgradeableBeacon.sol#619-621)
StorageSlot.getUint256Slot(bytes32) (contracts/UpgradeableBeacon.sol#627-635) uses assembly
- INLINE ASM (contracts/UpgradeableBeacon.sol#632-634)
Proxy._delegate(address) (contracts/oz/proxy/Proxy.sol#22-45) uses assembly
- INLINE ASM (contracts/oz/proxy/Proxy.sol#23-44)
Address.verifyCallResult(bool,bytes,string) (contracts/oz/utils/Address.sol#229-249) uses assembly
- INLINE ASM (contracts/oz/utils/Address.sol#241-244)
AddressUpgradeable.isContract(address) (contracts/oz/utils/AddressUpgradeable.sol#26-37) uses assembly
- INLINE ASM (contracts/oz/utils/AddressUpgradeable.sol#33-35)
AddressUpgradeable._verifyCallResult(bool,bytes,string) (contracts/oz/utils/AddressUpgradeable.sol#186-207) uses assembly
- INLINE ASM (contracts/oz/utils/AddressUpgradeable.sol#199-202)
EnumerableSet.values(EnumerableSet.Bytes32Set) (contracts/oz/utils/EnumerableSet.sol#234-248) uses assembly
- INLINE ASM (contracts/oz/utils/EnumerableSet.sol#243-245)
EnumerableSet.values(EnumerableSet.AddressSet) (contracts/oz/utils/EnumerableSet.sol#323-337) uses assembly
- INLINE ASM (contracts/oz/utils/EnumerableSet.sol#332-334)
EnumerableSet.values(EnumerableSet.UintSet) (contracts/oz/utils/EnumerableSet.sol#409-423) uses assembly
- INLINE ASM (contracts/oz/utils/EnumerableSet.sol#418-420)
StorageSlot.getAddressSlot(bytes32) (contracts/oz/utils/StorageSlot.sol#52-60) uses assembly
- INLINE ASM (contracts/oz/utils/StorageSlot.sol#57-59)
StorageSlot.getBooleanSlot(bytes32) (contracts/oz/utils/StorageSlot.sol#65-73) uses assembly
- INLINE ASM (contracts/oz/utils/StorageSlot.sol#70-72)
StorageSlot.getBytes32Slot(bytes32) (contracts/oz/utils/StorageSlot.sol#78-86) uses assembly
- INLINE ASM (contracts/oz/utils/StorageSlot.sol#83-85)
StorageSlot.getUint256Slot(bytes32) (contracts/oz/utils/StorageSlot.sol#91-99) uses assembly
- INLINE ASM (contracts/oz/utils/StorageSlot.sol#96-98)
AddressUpgradeable.isContract(address) (contracts/oz442/utils/AddressUpgradeable.sol#27-37) uses assembly
- INLINE ASM (contracts/oz442/utils/AddressUpgradeable.sol#33-35)
AddressUpgradeable.verifyCallResult(bool,bytes,string) (contracts/oz442/utils/AddressUpgradeable.sol#189-209) uses assembly
- INLINE ASM (contracts/oz442/utils/AddressUpgradeable.sol#201-204)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#assembly-usage
INFO:Detectors:
Different versions of Solidity are used:
- Version used: ['^0.8.0', '^0.8.1', '^0.8.11', '^0.8.13', '^0.8.2', '^0.8.9']
- ^0.8.0 (node_modules/@openzeppelin/contracts/access/Ownable.sol#4)
- ^0.8.0 (node_modules/@openzeppelin/contracts/utils/Context.sol#4)
- ^0.8.0 (node_modules/@openzeppelin/contracts/utils/structs/EnumerableSet.sol#5)
- ^0.8.0 (contracts/interfaces/IResourceRegistry.sol#3)
- ^0.8.0 (contracts/interfaces/IZNAResolver.sol#3)
- ^0.8.0 (contracts/oz/access/Ownable.sol#4)
- ^0.8.0 (contracts/oz/interfaces/draft-IERC1822.sol#4)
- ^0.8.0 (contracts/oz/proxy/ERC1967/ERC1967Proxy.sol#4)
- ^0.8.0 (contracts/oz/proxy/Proxy.sol#4)
- ^0.8.0 (contracts/oz/proxy/beacon/BeaconProxy.sol#4)
- ^0.8.0 (contracts/oz/proxy/beacon/IBeacon.sol#4)
- ^0.8.0 (contracts/oz/proxy/beacon/UpgradeableBeacon.sol#4)
- ^0.8.0 (contracts/oz/utils/Context.sol#4)
- ^0.8.0 (contracts/oz/utils/EnumerableSet.sol#5)
- ^0.8.0 (contracts/oz/utils/StorageSlot.sol#4)
- ^0.8.0 (contracts/oz442/access/AccessControlUpgradeable.sol#4)
- ^0.8.0 (contracts/oz442/access/IAccessControlUpgradeable.sol#4)
- ^0.8.0 (contracts/oz442/proxy/utils/Initializable.sol#4)
- ^0.8.0 (contracts/oz442/utils/AddressUpgradeable.sol#4)
- ^0.8.0 (contracts/oz442/utils/ContextUpgradeable.sol#4)
- ^0.8.0 (contracts/oz442/utils/StringsUpgradeable.sol#4)
- ^0.8.0 (contracts/oz442/utils/introspection/ERC165Upgradeable.sol#4)
- ^0.8.0 (contracts/oz442/utils/introspection/IERC165Upgradeable.sol#4)
- ^0.8.1 (contracts/oz/utils/Address.sol#4)
- ^0.8.11 (contracts/CustomStrings.sol#2)
- ^0.8.11 (contracts/controllers/DomainPurchaser.sol#2)
- ^0.8.11 (contracts/interfaces/IDomainPurchaser.sol#2)
- ^0.8.11 (contracts/libraries/ResourceType.sol#2)
- ^0.8.11 (contracts/mocks/MockResourceRegistry.sol#2)
- ^0.8.11 (contracts/registrar/Registrar.sol#2)
- ^0.8.11 (contracts/resolver/ZNAResolver.sol#2)
- ^0.8.13 (contracts/opensea/IOperatorFilterRegistry.sol#2)
- ^0.8.13 (contracts/opensea/OperatorFilterer.sol#2)
- ^0.8.13 (contracts/opensea/RevokableOperatorFilterer.sol#2)
- ^0.8.13 (node_modules/operator-filter-registry/src/IOperatorFilterRegistry.sol#2)
- ^0.8.13 (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#2)
- ^0.8.13 (node_modules/operator-filter-registry/src/OperatorFilterRegistryErrorsAndEvents.sol#2)
- ^0.8.2 (contracts/UpgradeableBeacon.sol#2)
- ^0.8.2 (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#4)
- ^0.8.9 (contracts/SimpleTokenSafelist.sol#2)
- ^0.8.9 (contracts/controllers/AuthBasicController.sol#2)
- ^0.8.9 (contracts/controllers/SubdomainController.sol#2)
- ^0.8.9 (contracts/interfaces/IBasicController.sol#2)
- ^0.8.9 (contracts/interfaces/IRegistrar.sol#2)
- ^0.8.9 (contracts/interfaces/IStakingController.sol#2)
- ^0.8.9 (contracts/interfaces/IStakingControllerV2.sol#2)
- ^0.8.9 (contracts/interfaces/ITokenSafelist.sol#2)
- ^0.8.9 (contracts/interfaces/IZNSHub.sol#2)
- ^0.8.9 (contracts/mocks/MockOwnedRegistrant.sol#2)
- ^0.8.9 (contracts/mocks/MockToken.sol#2)
- ^0.8.9 (contracts/oz/access/OwnableUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/introspection/ERC165Upgradeable.sol#3)
- ^0.8.9 (contracts/oz/introspection/IERC165Upgradeable.sol#3)
- ^0.8.9 (contracts/oz/math/SafeMathUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/proxy/Initializable.sol#4)
- ^0.8.9 (contracts/oz/token/ERC20/ERC20Upgradeable.sol#3)
- ^0.8.9 (contracts/oz/token/ERC20/IERC20Upgradeable.sol#3)
- ^0.8.9 (contracts/oz/token/ERC20/SafeERC20Upgradeable.sol#3)
- ^0.8.9 (contracts/oz/token/ERC721/ERC721HolderUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/token/ERC721/ERC721PausableUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/token/ERC721/ERC721Upgradeable.sol#3)
- ^0.8.9 (contracts/oz/token/ERC721/IERC721EnumerableUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/token/ERC721/IERC721MetadataUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/token/ERC721/IERC721ReceiverUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/token/ERC721/IERC721Upgradeable.sol#3)
- ^0.8.9 (contracts/oz/utils/AddressUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/utils/ContextUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/utils/EnumerableMapUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/utils/EnumerableSetUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/utils/PausableUpgradeable.sol#3)
- ^0.8.9 (contracts/oz/utils/StringsUpgradeable.sol#3)
- ^0.8.9 (contracts/registrar/ZNSHub.sol#2)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#different-pragma-directives-are-used
INFO:Detectors:
AccessControlUpgradeable._setRoleAdmin(bytes32,bytes32) (contracts/oz442/access/AccessControlUpgradeable.sol#234-238) is never used and should be removed
Address.functionCall(address,bytes) (contracts/UpgradeableBeacon.sol#380-385) is never used and should be removed
Address.functionCall(address,bytes,string) (contracts/UpgradeableBeacon.sol#393-399) is never used and should be removed
Address.functionCallWithValue(address,bytes,uint256) (contracts/UpgradeableBeacon.sol#412-424) is never used and should be removed
Address.functionCallWithValue(address,bytes,uint256,string) (contracts/UpgradeableBeacon.sol#432-447) is never used and should be removed
Address.functionStaticCall(address,bytes) (contracts/UpgradeableBeacon.sol#455-462) is never used and should be removed
Address.functionStaticCall(address,bytes,string) (contracts/UpgradeableBeacon.sol#470-480) is never used and should be removed
Address.sendValue(address,uint256) (contracts/UpgradeableBeacon.sol#351-360) is never used and should be removed
AddressUpgradeable.functionCall(address,bytes) (contracts/oz442/utils/AddressUpgradeable.sol#83-88) is never used and should be removed
AddressUpgradeable.functionCallWithValue(address,bytes,uint256) (contracts/oz442/utils/AddressUpgradeable.sol#115-127) is never used and should be removed
AddressUpgradeable.functionStaticCall(address,bytes) (contracts/oz442/utils/AddressUpgradeable.sol#157-164) is never used and should be removed
AddressUpgradeable.functionStaticCall(address,bytes,string) (contracts/oz442/utils/AddressUpgradeable.sol#172-181) is never used and should be removed
AddressUpgradeable.sendValue(address,uint256) (contracts/oz442/utils/AddressUpgradeable.sol#55-63) is never used and should be removed
AddressUpgradeable.verifyCallResult(bool,bytes,string) (contracts/oz442/utils/AddressUpgradeable.sol#189-209) is never used and should be removed
BeaconProxy._beacon() (contracts/UpgradeableBeacon.sol#1084-1086) is never used and should be removed
BeaconProxy._setBeacon(address,bytes) (contracts/UpgradeableBeacon.sol#1105-1107) is never used and should be removed
Context._msgData() (contracts/UpgradeableBeacon.sol#653-656) is never used and should be removed
ContextUpgradeable._msgData() (contracts/oz/utils/ContextUpgradeable.sol#27-30) is never used and should be removed
ERC1967Upgrade._upgradeToAndCallSecure(address,bytes,bool) (contracts/UpgradeableBeacon.sol#175-208) is never used and should be removed
ERC1967Upgrade._upgradeToAndCallUUPS(address,bytes,bool) (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#86-109) is never used and should be removed
ERC20Upgradeable._burn(address,uint256) (contracts/oz/token/ERC20/ERC20Upgradeable.sol#324-335) is never used and should be removed
ERC20Upgradeable._setupDecimals(uint8) (contracts/oz/token/ERC20/ERC20Upgradeable.sol#369-371) is never used and should be removed
ERC721Upgradeable._safeMint(address,uint256) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#414-416) is never used and should be removed
ERC721Upgradeable._safeMint(address,uint256,bytes) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#422-432) is never used and should be removed
ERC721Upgradeable._setBaseURI(string) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#543-545) is never used and should be removed
EnumerableMapUpgradeable._get(EnumerableMapUpgradeable.Map,bytes32) (contracts/oz/utils/EnumerableMapUpgradeable.sol#176-180) is never used and should be removed
EnumerableMapUpgradeable._tryGet(EnumerableMapUpgradeable.Map,bytes32) (contracts/oz/utils/EnumerableMapUpgradeable.sol#159-167) is never used and should be removed
EnumerableMapUpgradeable.get(EnumerableMapUpgradeable.UintToAddressMap,uint256) (contracts/oz/utils/EnumerableMapUpgradeable.sol#293-299) is never used and should be removed
EnumerableMapUpgradeable.tryGet(EnumerableMapUpgradeable.UintToAddressMap,uint256) (contracts/oz/utils/EnumerableMapUpgradeable.sol#277-284) is never used and should be removed
EnumerableSet.add(EnumerableSet.UintSet,uint256) (contracts/oz/utils/EnumerableSet.sol#351-353) is never used and should be removed
EnumerableSet.at(EnumerableSet.UintSet,uint256) (contracts/oz/utils/EnumerableSet.sol#393-399) is never used and should be removed
EnumerableSet.contains(EnumerableSet.UintSet,uint256) (contracts/oz/utils/EnumerableSet.sol#368-374) is never used and should be removed
EnumerableSet.length(EnumerableSet.UintSet) (contracts/oz/utils/EnumerableSet.sol#379-381) is never used and should be removed
EnumerableSet.remove(EnumerableSet.UintSet,uint256) (contracts/oz/utils/EnumerableSet.sol#361-363) is never used and should be removed
EnumerableSet.values(EnumerableSet.UintSet) (contracts/oz/utils/EnumerableSet.sol#409-423) is never used and should be removed
EnumerableSetUpgradeable.add(EnumerableSetUpgradeable.AddressSet,address) (contracts/oz/utils/EnumerableSetUpgradeable.sol#216-218) is never used and should be removed
EnumerableSetUpgradeable.add(EnumerableSetUpgradeable.Bytes32Set,bytes32) (contracts/oz/utils/EnumerableSetUpgradeable.sol#151-153) is never used and should be removed
EnumerableSetUpgradeable.at(EnumerableSetUpgradeable.AddressSet,uint256) (contracts/oz/utils/EnumerableSetUpgradeable.sol#261-267) is never used and should be removed
EnumerableSetUpgradeable.at(EnumerableSetUpgradeable.Bytes32Set,uint256) (contracts/oz/utils/EnumerableSetUpgradeable.sol#196-202) is never used and should be removed
EnumerableSetUpgradeable.contains(EnumerableSetUpgradeable.AddressSet,address) (contracts/oz/utils/EnumerableSetUpgradeable.sol#236-242) is never used and should be removed
EnumerableSetUpgradeable.contains(EnumerableSetUpgradeable.Bytes32Set,bytes32) (contracts/oz/utils/EnumerableSetUpgradeable.sol#171-177) is never used and should be removed
EnumerableSetUpgradeable.contains(EnumerableSetUpgradeable.UintSet,uint256) (contracts/oz/utils/EnumerableSetUpgradeable.sol#298-304) is never used and should be removed
EnumerableSetUpgradeable.length(EnumerableSetUpgradeable.AddressSet) (contracts/oz/utils/EnumerableSetUpgradeable.sol#247-249) is never used and should be removed
EnumerableSetUpgradeable.length(EnumerableSetUpgradeable.Bytes32Set) (contracts/oz/utils/EnumerableSetUpgradeable.sol#182-184) is never used and should be removed
EnumerableSetUpgradeable.remove(EnumerableSetUpgradeable.AddressSet,address) (contracts/oz/utils/EnumerableSetUpgradeable.sol#226-231) is never used and should be removed
EnumerableSetUpgradeable.remove(EnumerableSetUpgradeable.Bytes32Set,bytes32) (contracts/oz/utils/EnumerableSetUpgradeable.sol#161-166) is never used and should be removed
PausableUpgradeable.__Pausable_init() (contracts/oz/utils/PausableUpgradeable.sol#33-36) is never used and should be removed
Registrar._getAdmin() (contracts/registrar/Registrar.sol#132-134) is never used and should be removed
RevokableOperatorFilterer._onlyAllowedOperator(address) (contracts/opensea/RevokableOperatorFilterer.sol#19-37) is never used and should be removed
RevokableOperatorFilterer._onlyAllowedOperatorApproval(address) (contracts/opensea/RevokableOperatorFilterer.sol#39-53) is never used and should be removed
SafeERC20Upgradeable.safeApprove(IERC20Upgradeable,address,uint256) (contracts/oz/token/ERC20/SafeERC20Upgradeable.sol#52-69) is never used and should be removed
SafeERC20Upgradeable.safeDecreaseAllowance(IERC20Upgradeable,address,uint256) (contracts/oz/token/ERC20/SafeERC20Upgradeable.sol#83-96) is never used and should be removed
SafeERC20Upgradeable.safeIncreaseAllowance(IERC20Upgradeable,address,uint256) (contracts/oz/token/ERC20/SafeERC20Upgradeable.sol#71-81) is never used and should be removed
SafeERC20Upgradeable.safeTransfer(IERC20Upgradeable,address,uint256) (contracts/oz/token/ERC20/SafeERC20Upgradeable.sol#22-31) is never used and should be removed
SafeMathUpgradeable.div(uint256,uint256) (contracts/oz/math/SafeMathUpgradeable.sol#135-138) is never used and should be removed
SafeMathUpgradeable.div(uint256,uint256,string) (contracts/oz/math/SafeMathUpgradeable.sol#194-201) is never used and should be removed
SafeMathUpgradeable.mod(uint256,uint256) (contracts/oz/math/SafeMathUpgradeable.sol#152-155) is never used and should be removed
SafeMathUpgradeable.mod(uint256,uint256,string) (contracts/oz/math/SafeMathUpgradeable.sol#218-225) is never used and should be removed
SafeMathUpgradeable.mul(uint256,uint256) (contracts/oz/math/SafeMathUpgradeable.sol#116-121) is never used and should be removed
SafeMathUpgradeable.sub(uint256,uint256) (contracts/oz/math/SafeMathUpgradeable.sol#101-104) is never used and should be removed
SafeMathUpgradeable.tryAdd(uint256,uint256) (contracts/oz/math/SafeMathUpgradeable.sol#24-28) is never used and should be removed
SafeMathUpgradeable.tryDiv(uint256,uint256) (contracts/oz/math/SafeMathUpgradeable.sol#60-63) is never used and should be removed
SafeMathUpgradeable.tryMod(uint256,uint256) (contracts/oz/math/SafeMathUpgradeable.sol#70-73) is never used and should be removed
SafeMathUpgradeable.tryMul(uint256,uint256) (contracts/oz/math/SafeMathUpgradeable.sol#45-53) is never used and should be removed
SafeMathUpgradeable.trySub(uint256,uint256) (contracts/oz/math/SafeMathUpgradeable.sol#35-38) is never used and should be removed
StorageSlot.getBooleanSlot(bytes32) (contracts/oz/utils/StorageSlot.sol#65-73) is never used and should be removed
StorageSlot.getBytes32Slot(bytes32) (contracts/oz/utils/StorageSlot.sol#78-86) is never used and should be removed
StorageSlot.getUint256Slot(bytes32) (contracts/oz/utils/StorageSlot.sol#91-99) is never used and should be removed
StringsUpgradeable.toHexString(uint256) (contracts/oz442/utils/StringsUpgradeable.sol#40-51) is never used and should be removed
TransparentUpgradeableProxy._admin() (contracts/UpgradeableBeacon.sol#933-935) is never used and should be removed
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#dead-code
INFO:Detectors:
Pragma version^0.8.0 (node_modules/@openzeppelin/contracts/access/Ownable.sol#4) allows old versions
Pragma version^0.8.0 (node_modules/@openzeppelin/contracts/utils/Context.sol#4) allows old versions
Pragma version^0.8.0 (node_modules/@openzeppelin/contracts/utils/structs/EnumerableSet.sol#5) allows old versions
Pragma version^0.8.11 (contracts/CustomStrings.sol#2) allows old versions
Pragma version^0.8.9 (contracts/SimpleTokenSafelist.sol#2) allows old versions
Pragma version^0.8.2 (contracts/UpgradeableBeacon.sol#2) allows old versions
Pragma version^0.8.9 (contracts/controllers/AuthBasicController.sol#2) allows old versions
Pragma version^0.8.11 (contracts/controllers/DomainPurchaser.sol#2) allows old versions
Pragma version^0.8.9 (contracts/controllers/SubdomainController.sol#2) allows old versions
Pragma version^0.8.9 (contracts/interfaces/IBasicController.sol#2) allows old versions
Pragma version^0.8.11 (contracts/interfaces/IDomainPurchaser.sol#2) allows old versions
Pragma version^0.8.9 (contracts/interfaces/IRegistrar.sol#2) allows old versions
Pragma version^0.8.0 (contracts/interfaces/IResourceRegistry.sol#3) allows old versions
Pragma version^0.8.9 (contracts/interfaces/IStakingController.sol#2) allows old versions
Pragma version^0.8.9 (contracts/interfaces/IStakingControllerV2.sol#2) allows old versions
Pragma version^0.8.9 (contracts/interfaces/ITokenSafelist.sol#2) allows old versions
Pragma version^0.8.0 (contracts/interfaces/IZNAResolver.sol#3) allows old versions
Pragma version^0.8.9 (contracts/interfaces/IZNSHub.sol#2) allows old versions
Pragma version^0.8.11 (contracts/libraries/ResourceType.sol#2) allows old versions
Pragma version^0.8.9 (contracts/mocks/MockOwnedRegistrant.sol#2) allows old versions
Pragma version^0.8.11 (contracts/mocks/MockResourceRegistry.sol#2) allows old versions
Pragma version^0.8.9 (contracts/mocks/MockToken.sol#2) allows old versions
Pragma version^0.8.13 (contracts/opensea/IOperatorFilterRegistry.sol#2) allows old versions
Pragma version^0.8.13 (contracts/opensea/OperatorFilterer.sol#2) allows old versions
Pragma version^0.8.13 (contracts/opensea/RevokableOperatorFilterer.sol#2) allows old versions
Pragma version^0.8.0 (contracts/oz/access/Ownable.sol#4) allows old versions
Pragma version^0.8.9 (contracts/oz/access/OwnableUpgradeable.sol#3) allows old versions
Pragma version^0.8.0 (contracts/oz/interfaces/draft-IERC1822.sol#4) allows old versions
Pragma version^0.8.9 (contracts/oz/introspection/ERC165Upgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/introspection/IERC165Upgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/math/SafeMathUpgradeable.sol#3) allows old versions
Pragma version^0.8.0 (contracts/oz/proxy/ERC1967/ERC1967Proxy.sol#4) allows old versions
Pragma version^0.8.2 (contracts/oz/proxy/ERC1967/ERC1967Upgrade.sol#4) allows old versions
Pragma version^0.8.9 (contracts/oz/proxy/Initializable.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz/proxy/Proxy.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz/proxy/beacon/BeaconProxy.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz/proxy/beacon/IBeacon.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz/proxy/beacon/UpgradeableBeacon.sol#4) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC20/ERC20Upgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC20/IERC20Upgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC20/SafeERC20Upgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC721/ERC721HolderUpgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC721/ERC721PausableUpgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC721/ERC721Upgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC721/IERC721EnumerableUpgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC721/IERC721MetadataUpgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC721/IERC721ReceiverUpgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/token/ERC721/IERC721Upgradeable.sol#3) allows old versions
Pragma version^0.8.1 (contracts/oz/utils/Address.sol#4) allows old versions
Pragma version^0.8.9 (contracts/oz/utils/AddressUpgradeable.sol#3) allows old versions
Pragma version^0.8.0 (contracts/oz/utils/Context.sol#4) allows old versions
Pragma version^0.8.9 (contracts/oz/utils/ContextUpgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/utils/EnumerableMapUpgradeable.sol#3) allows old versions
Pragma version^0.8.0 (contracts/oz/utils/EnumerableSet.sol#5) allows old versions
Pragma version^0.8.9 (contracts/oz/utils/EnumerableSetUpgradeable.sol#3) allows old versions
Pragma version^0.8.9 (contracts/oz/utils/PausableUpgradeable.sol#3) allows old versions
Pragma version^0.8.0 (contracts/oz/utils/StorageSlot.sol#4) allows old versions
Pragma version^0.8.9 (contracts/oz/utils/StringsUpgradeable.sol#3) allows old versions
Pragma version^0.8.0 (contracts/oz442/access/AccessControlUpgradeable.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz442/access/IAccessControlUpgradeable.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz442/proxy/utils/Initializable.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz442/utils/AddressUpgradeable.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz442/utils/ContextUpgradeable.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz442/utils/StringsUpgradeable.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz442/utils/introspection/ERC165Upgradeable.sol#4) allows old versions
Pragma version^0.8.0 (contracts/oz442/utils/introspection/IERC165Upgradeable.sol#4) allows old versions
Pragma version^0.8.11 (contracts/registrar/Registrar.sol#2) allows old versions
Pragma version^0.8.9 (contracts/registrar/ZNSHub.sol#2) allows old versions
Pragma version^0.8.11 (contracts/resolver/ZNAResolver.sol#2) allows old versions
Pragma version^0.8.13 (node_modules/operator-filter-registry/src/IOperatorFilterRegistry.sol#2) allows old versions
Pragma version^0.8.13 (node_modules/operator-filter-registry/src/OperatorFilterRegistry.sol#2) allows old versions
Pragma version^0.8.13 (node_modules/operator-filter-registry/src/OperatorFilterRegistryErrorsAndEvents.sol#2) allows old versions
solc-0.8.13 is not recommended for deployment
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-versions-of-solidity
INFO:Detectors:
Low level call in Address.sendValue(address,uint256) (contracts/UpgradeableBeacon.sol#351-360):
- (success) = recipient.call{value: amount}() (contracts/UpgradeableBeacon.sol#355)
Low level call in Address.functionCallWithValue(address,bytes,uint256,string) (contracts/UpgradeableBeacon.sol#432-447):
- (success,returndata) = target.call{value: value}(data) (contracts/UpgradeableBeacon.sol#445)
Low level call in Address.functionStaticCall(address,bytes,string) (contracts/UpgradeableBeacon.sol#470-480):
- (success,returndata) = target.staticcall(data) (contracts/UpgradeableBeacon.sol#478)
Low level call in Address.functionDelegateCall(address,bytes,string) (contracts/UpgradeableBeacon.sol#506-516):
- (success,returndata) = target.delegatecall(data) (contracts/UpgradeableBeacon.sol#514)
Low level call in ProxyAdmin.getProxyImplementation(TransparentUpgradeableProxy) (contracts/UpgradeableBeacon.sol#961-974):
- (success,returndata) = address(proxy).staticcall(0x5c60da1b) (contracts/UpgradeableBeacon.sol#969-971)
Low level call in ProxyAdmin.getProxyAdmin(TransparentUpgradeableProxy) (contracts/UpgradeableBeacon.sol#983-996):
- (success,returndata) = address(proxy).staticcall(0xf851a440) (contracts/UpgradeableBeacon.sol#991-993)
Low level call in Address.sendValue(address,uint256) (contracts/oz/utils/Address.sol#60-68):
- (success) = recipient.call{value: amount}() (contracts/oz/utils/Address.sol#63)
Low level call in Address.functionCallWithValue(address,bytes,uint256,string) (contracts/oz/utils/Address.sol#140-154):
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/Address.sol#152)
Low level call in Address.functionStaticCall(address,bytes,string) (contracts/oz/utils/Address.sol#177-186):
- (success,returndata) = target.staticcall(data) (contracts/oz/utils/Address.sol#184)
Low level call in Address.functionDelegateCall(address,bytes,string) (contracts/oz/utils/Address.sol#212-221):
- (success,returndata) = target.delegatecall(data) (contracts/oz/utils/Address.sol#219)
Low level call in AddressUpgradeable.sendValue(address,uint256) (contracts/oz/utils/AddressUpgradeable.sol#55-64):
- (success) = recipient.call{value: amount}() (contracts/oz/utils/AddressUpgradeable.sol#59)
Low level call in AddressUpgradeable.functionCallWithValue(address,bytes,uint256,string) (contracts/oz/utils/AddressUpgradeable.sol#136-151):
- (success,returndata) = target.call{value: value}(data) (contracts/oz/utils/AddressUpgradeable.sol#149)
Low level call in AddressUpgradeable.functionStaticCall(address,bytes,string) (contracts/oz/utils/AddressUpgradeable.sol#174-184):
- (success,returndata) = target.staticcall(data) (contracts/oz/utils/AddressUpgradeable.sol#182)
Low level call in AddressUpgradeable.sendValue(address,uint256) (contracts/oz442/utils/AddressUpgradeable.sol#55-63):
- (success) = recipient.call{value: amount}() (contracts/oz442/utils/AddressUpgradeable.sol#58)
Low level call in AddressUpgradeable.functionCallWithValue(address,bytes,uint256,string) (contracts/oz442/utils/AddressUpgradeable.sol#135-149):
- (success,returndata) = target.call{value: value}(data) (contracts/oz442/utils/AddressUpgradeable.sol#147)
Low level call in AddressUpgradeable.functionStaticCall(address,bytes,string) (contracts/oz442/utils/AddressUpgradeable.sol#172-181):
- (success,returndata) = target.staticcall(data) (contracts/oz442/utils/AddressUpgradeable.sol#179)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#low-level-calls
INFO:Detectors:
Parameter AuthBasicController.initialize(IRegistrar)._registrar (contracts/controllers/AuthBasicController.sol#33) is not in mixedCase
Parameter DomainPurchaser.initialize(address,address,address,IDomainPurchaser.PricingData,uint256)._paymentToken (contracts/controllers/DomainPurchaser.sol#81) is not in mixedCase
Parameter DomainPurchaser.initialize(address,address,address,IDomainPurchaser.PricingData,uint256)._zNSHub (contracts/controllers/DomainPurchaser.sol#82) is not in mixedCase
Parameter DomainPurchaser.initialize(address,address,address,IDomainPurchaser.PricingData,uint256)._platformWallet (contracts/controllers/DomainPurchaser.sol#83) is not in mixedCase
Parameter DomainPurchaser.initialize(address,address,address,IDomainPurchaser.PricingData,uint256)._rootPrices (contracts/controllers/DomainPurchaser.sol#84) is not in mixedCase
Parameter DomainPurchaser.initialize(address,address,address,IDomainPurchaser.PricingData,uint256)._platformFee (contracts/controllers/DomainPurchaser.sol#85) is not in mixedCase
Constant DomainPurchaser.shortNameLength (contracts/controllers/DomainPurchaser.sol#19) is not in UPPER_CASE_WITH_UNDERSCORES
Constant DomainPurchaser.mediumNameLength (contracts/controllers/DomainPurchaser.sol#21) is not in UPPER_CASE_WITH_UNDERSCORES
Constant DomainPurchaser.maxNameLength (contracts/controllers/DomainPurchaser.sol#23) is not in UPPER_CASE_WITH_UNDERSCORES
Constant DomainPurchaser.divisionBasisPlatformFee (contracts/controllers/DomainPurchaser.sol#26) is not in UPPER_CASE_WITH_UNDERSCORES
Constant MockOwnedRegistrant.registry (contracts/mocks/MockOwnedRegistrant.sol#72) is not in UPPER_CASE_WITH_UNDERSCORES
Parameter MockResourceRegistry.addResource(uint256)._zNA (contracts/mocks/MockResourceRegistry.sol#32) is not in mixedCase
Parameter MockResourceRegistry.addResourceExploit(uint256,uint256)._zNA (contracts/mocks/MockResourceRegistry.sol#40) is not in mixedCase
Parameter MockResourceRegistry.addResourceExploit(uint256,uint256)._resourceType (contracts/mocks/MockResourceRegistry.sol#40) is not in mixedCase
Parameter MockResourceRegistry.resourceExists(uint256)._resourceID (contracts/mocks/MockResourceRegistry.sol#59) is not in mixedCase
Function OwnableUpgradeable.__Ownable_init() (contracts/oz/access/OwnableUpgradeable.sol#31-34) is not in mixedCase
Function OwnableUpgradeable.__Ownable_init_unchained() (contracts/oz/access/OwnableUpgradeable.sol#36-40) is not in mixedCase
Variable OwnableUpgradeable.__gap (contracts/oz/access/OwnableUpgradeable.sol#79) is not in mixedCase
Function ERC165Upgradeable.__ERC165_init() (contracts/oz/introspection/ERC165Upgradeable.sol#25-27) is not in mixedCase
Function ERC165Upgradeable.__ERC165_init_unchained() (contracts/oz/introspection/ERC165Upgradeable.sol#29-33) is not in mixedCase
Variable ERC165Upgradeable.__gap (contracts/oz/introspection/ERC165Upgradeable.sol#66) is not in mixedCase
Function ERC20Upgradeable.__ERC20_init(string,string) (contracts/oz/token/ERC20/ERC20Upgradeable.sol#60-66) is not in mixedCase
Function ERC20Upgradeable.__ERC20_init_unchained(string,string) (contracts/oz/token/ERC20/ERC20Upgradeable.sol#68-75) is not in mixedCase
Variable ERC20Upgradeable.__gap (contracts/oz/token/ERC20/ERC20Upgradeable.sol#393) is not in mixedCase
Function ERC721HolderUpgradeable.__ERC721Holder_init() (contracts/oz/token/ERC721/ERC721HolderUpgradeable.sol#15-17) is not in mixedCase
Function ERC721HolderUpgradeable.__ERC721Holder_init_unchained() (contracts/oz/token/ERC721/ERC721HolderUpgradeable.sol#19) is not in mixedCase
Variable ERC721HolderUpgradeable.__gap (contracts/oz/token/ERC721/ERC721HolderUpgradeable.sol#35) is not in mixedCase
Function ERC721PausableUpgradeable.__ERC721Pausable_init() (contracts/oz/token/ERC721/ERC721PausableUpgradeable.sol#21-26) is not in mixedCase
Function ERC721PausableUpgradeable.__ERC721Pausable_init_unchained() (contracts/oz/token/ERC721/ERC721PausableUpgradeable.sol#28) is not in mixedCase
Variable ERC721PausableUpgradeable.__gap (contracts/oz/token/ERC721/ERC721PausableUpgradeable.sol#47) is not in mixedCase
Function ERC721Upgradeable.__ERC721_init(string,string) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#101-108) is not in mixedCase
Function ERC721Upgradeable.__ERC721_init_unchained(string,string) (contracts/oz/token/ERC721/ERC721Upgradeable.sol#110-121) is not in mixedCase
Parameter ERC721Upgradeable.safeTransferFrom(address,address,uint256,bytes)._data (contracts/oz/token/ERC721/ERC721Upgradeable.sol#332) is not in mixedCase
Variable ERC721Upgradeable._tokenOwners (contracts/oz/token/ERC721/ERC721Upgradeable.sol#44) is not in mixedCase
Variable ERC721Upgradeable.__gap (contracts/oz/token/ERC721/ERC721Upgradeable.sol#611) is not in mixedCase
Function ContextUpgradeable.__Context_init() (contracts/oz/utils/ContextUpgradeable.sol#17-19) is not in mixedCase
Function ContextUpgradeable.__Context_init_unchained() (contracts/oz/utils/ContextUpgradeable.sol#21) is not in mixedCase
Variable ContextUpgradeable.__gap (contracts/oz/utils/ContextUpgradeable.sol#32) is not in mixedCase
Function PausableUpgradeable.__Pausable_init() (contracts/oz/utils/PausableUpgradeable.sol#33-36) is not in mixedCase
Function PausableUpgradeable.__Pausable_init_unchained() (contracts/oz/utils/PausableUpgradeable.sol#38-40) is not in mixedCase
Variable PausableUpgradeable.__gap (contracts/oz/utils/PausableUpgradeable.sol#97) is not in mixedCase
Function AccessControlUpgradeable.__AccessControl_init() (contracts/oz442/access/AccessControlUpgradeable.sol#56-60) is not in mixedCase
Function AccessControlUpgradeable.__AccessControl_init_unchained() (contracts/oz442/access/AccessControlUpgradeable.sol#62) is not in mixedCase
Variable AccessControlUpgradeable.__gap (contracts/oz442/access/AccessControlUpgradeable.sol#264) is not in mixedCase
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions
INFO:Detectors:
Redundant expression "this (contracts/UpgradeableBeacon.sol#654)" inContext (contracts/UpgradeableBeacon.sol#648-657)
Redundant expression "this (contracts/oz/utils/ContextUpgradeable.sol#28)" inContextUpgradeable (contracts/oz/utils/ContextUpgradeable.sol#16-33)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#redundant-statements
INFO:Detectors:
Variable UpgradeableBeacon._implementation (contracts/UpgradeableBeacon.sol#733) is too similar to UpgradeableBeacon.constructor(address).implementation_ (contracts/UpgradeableBeacon.sol#744)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#variable-names-too-similar
INFO:Detectors:
RevokableOperatorFilterer (contracts/opensea/RevokableOperatorFilterer.sol#13-76) does not implement functions:
- RevokableOperatorFilterer.owner() (contracts/opensea/RevokableOperatorFilterer.sol#75)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#unimplemented-functions
INFO:Detectors:
Registrar.test (contracts/registrar/Registrar.sol#83) is never used in Registrar (contracts/registrar/Registrar.sol#14-854)
Registrar.gap (contracts/registrar/Registrar.sol#84) is never used in Registrar (contracts/registrar/Registrar.sol#14-854)
ZNSHub.test (contracts/registrar/ZNSHub.sol#94) is never used in ZNSHub (contracts/registrar/ZNSHub.sol#10-256)
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#unused-state-variable
INFO:Detectors:
Registrar.beacon (contracts/registrar/Registrar.sol#75) should be constant
Registrar.gap (contracts/registrar/Registrar.sol#84) should be constant
Registrar.test (contracts/registrar/Registrar.sol#83) should be constant
ZNSHub.test (contracts/registrar/ZNSHub.sol#94) should be constant
Reference: https://github.com/crytic/slither/wiki/Detector-Documentation#state-variables-that-could-be-declared-constant
INFO:Slither:. analyzed (85 contracts with 85 detectors), 321 result(s) found