Unable to find manual contract audit (e.g. Certik, PeckShield, Solidity...)
Contract ownership is not renounced (belongs to a wallet)
StarNFTV3.uint2str(uint256) (StarNFTV3.sol#253-273) performs a multiplication on the result of a division:
-temp = (48 + uint8(_i - (_i / 10) * 10)) (StarNFTV3.sol#267)
Consider ordering multiplication before division.
Additional information: link
ERC721._mint(address,uint256) (ERC721.sol#333-344) ignores return value by _holderTokens[to].add(tokenId) (ERC721.sol#339)
ERC721._mint(address,uint256) (ERC721.sol#333-344) ignores return value by _tokenOwners.set(tokenId,to) (ERC721.sol#341)
ERC721._burn(uint256) (ERC721.sol#356-374) ignores return value by _holderTokens[owner].remove(tokenId) (ERC721.sol#369)
ERC721._burn(uint256) (ERC721.sol#356-374) ignores return value by _tokenOwners.remove(tokenId) (ERC721.sol#371)
ERC721._transfer(address,address,uint256) (ERC721.sol#387-402) ignores return value by _holderTokens[from].remove(tokenId) (ERC721.sol#396)
ERC721._transfer(address,address,uint256) (ERC721.sol#387-402) ignores return value by _holderTokens[to].add(tokenId) (ERC721.sol#397)
ERC721._transfer(address,address,uint256) (ERC721.sol#387-402) ignores return value by _tokenOwners.set(tokenId,to) (ERC721.sol#399)
Ensure that all the return values of the function calls are used.
Additional information: link
StarNFTV3.mint(address,uint256).cid (StarNFTV3.sol#126) shadows:
- StarNFTV3.cid(uint256) (StarNFTV3.sol#121-123) (function)
StarNFTV3.isOwnerOf(address,uint256).owner (StarNFTV3.sol#186) shadows:
- Ownable.owner() (Ownable.sol#35-37) (function)
StarNFTV3.setName(string)._name (StarNFTV3.sol#223) shadows:
- ERC721._name (ERC721.sol#45) (state variable)
StarNFTV3.setSymbol(string)._symbol (StarNFTV3.sol#230) shadows:
- ERC721._symbol (ERC721.sol#48) (state variable)
Rename the local variables that shadow another component.
Additional information: link
Address.isContract(address) (Address.sol#26-35) uses assembly
- INLINE ASM (Address.sol#33)
Address._verifyCallResult(bool,bytes,string) (Address.sol#171-188) uses assembly
- INLINE ASM (Address.sol#180-183)
Do not use evm assembly.
Additional information: link
Different versions of Solidity is used:
- Version used: ['0.7.6', '>=0.6.0<0.8.0', '>=0.6.2<0.8.0']
- >=0.6.2<0.8.0 (Address.sol#3)
- >=0.6.0<0.8.0 (Context.sol#3)
- >=0.6.0<0.8.0 (ERC165.sol#3)
- >=0.6.0<0.8.0 (ERC721.sol#3)
- >=0.6.0<0.8.0 (EnumerableMap.sol#3)
- >=0.6.0<0.8.0 (EnumerableSet.sol#3)
- >=0.6.0<0.8.0 (IERC165.sol#3)
- >=0.6.2<0.8.0 (IERC721.sol#3)
- >=0.6.2<0.8.0 (IERC721Enumerable.sol#3)
- >=0.6.2<0.8.0 (IERC721Metadata.sol#3)
- >=0.6.0<0.8.0 (IERC721Receiver.sol#3)
- 0.7.6 (IStarNFT.sol#18)
- >=0.6.0<0.8.0 (Ownable.sol#3)
- >=0.6.0<0.8.0 (SafeMath.sol#3)
- 0.7.6 (StarNFTV3.sol#15)
- >=0.6.0<0.8.0 (Strings.sol#3)
Use one Solidity version.
Additional information: link
StarNFTV3.mintBatch(address,uint256,uint256[]) (StarNFTV3.sol#140-153) has costly operations inside a loop:
- _starCount ++ (StarNFTV3.sol#147)
ERC721._burn(uint256) (ERC721.sol#356-374) has costly operations inside a loop:
- delete _tokenURIs[tokenId] (ERC721.sol#366)
StarNFTV3.burnBatch(address,uint256[]) (StarNFTV3.sol#164-177) has costly operations inside a loop:
- delete _cids[ids[i]] (StarNFTV3.sol#175)
Use a local variable to hold the loop computation result.
Additional information: link
Address.functionCall(address,bytes) (Address.sol#79-81) is never used and should be removed
Address.functionCallWithValue(address,bytes,uint256) (Address.sol#104-106) is never used and should be removed
Address.functionDelegateCall(address,bytes) (Address.sol#153-155) is never used and should be removed
Address.functionDelegateCall(address,bytes,string) (Address.sol#163-169) is never used and should be removed
Address.functionStaticCall(address,bytes) (Address.sol#129-131) is never used and should be removed
Address.functionStaticCall(address,bytes,string) (Address.sol#139-145) is never used and should be removed
Address.sendValue(address,uint256) (Address.sol#53-59) is never used and should be removed
Context._msgData() (Context.sol#20-23) is never used and should be removed
ERC721._safeMint(address,uint256) (ERC721.sol#308-310) is never used and should be removed
ERC721._safeMint(address,uint256,bytes) (ERC721.sol#316-319) is never used and should be removed
ERC721._setTokenURI(uint256,string) (ERC721.sol#411-414) is never used and should be removed
EnumerableMap._get(EnumerableMap.Map,bytes32) (EnumerableMap.sol#163-167) is never used and should be removed
EnumerableMap._tryGet(EnumerableMap.Map,bytes32) (EnumerableMap.sol#150-154) is never used and should be removed
EnumerableMap.get(EnumerableMap.UintToAddressMap,uint256) (EnumerableMap.sol#253-255) is never used and should be removed
EnumerableMap.tryGet(EnumerableMap.UintToAddressMap,uint256) (EnumerableMap.sol#241-244) is never used and should be removed
EnumerableSet.add(EnumerableSet.AddressSet,address) (EnumerableSet.sol#201-203) is never used and should be removed
EnumerableSet.add(EnumerableSet.Bytes32Set,bytes32) (EnumerableSet.sol#147-149) is never used and should be removed
EnumerableSet.at(EnumerableSet.AddressSet,uint256) (EnumerableSet.sol#239-241) is never used and should be removed
EnumerableSet.at(EnumerableSet.Bytes32Set,uint256) (EnumerableSet.sol#185-187) is never used and should be removed
EnumerableSet.contains(EnumerableSet.AddressSet,address) (EnumerableSet.sol#218-220) is never used and should be removed
EnumerableSet.contains(EnumerableSet.Bytes32Set,bytes32) (EnumerableSet.sol#164-166) is never used and should be removed
EnumerableSet.contains(EnumerableSet.UintSet,uint256) (EnumerableSet.sol#273-275) is never used and should be removed
EnumerableSet.length(EnumerableSet.AddressSet) (EnumerableSet.sol#225-227) is never used and should be removed
EnumerableSet.length(EnumerableSet.Bytes32Set) (EnumerableSet.sol#171-173) is never used and should be removed
EnumerableSet.remove(EnumerableSet.AddressSet,address) (EnumerableSet.sol#211-213) is never used and should be removed
EnumerableSet.remove(EnumerableSet.Bytes32Set,bytes32) (EnumerableSet.sol#157-159) is never used and should be removed
SafeMath.add(uint256,uint256) (SafeMath.sol#85-89) is never used and should be removed
SafeMath.div(uint256,uint256) (SafeMath.sol#135-138) is never used and should be removed
SafeMath.div(uint256,uint256,string) (SafeMath.sol#190-193) is never used and should be removed
SafeMath.mod(uint256,uint256) (SafeMath.sol#152-155) is never used and should be removed
SafeMath.mod(uint256,uint256,string) (SafeMath.sol#210-213) is never used and should be removed
SafeMath.mul(uint256,uint256) (SafeMath.sol#116-121) is never used and should be removed
SafeMath.sub(uint256,uint256) (SafeMath.sol#101-104) is never used and should be removed
SafeMath.sub(uint256,uint256,string) (SafeMath.sol#170-173) is never used and should be removed
SafeMath.tryAdd(uint256,uint256) (SafeMath.sol#24-28) is never used and should be removed
SafeMath.tryDiv(uint256,uint256) (SafeMath.sol#60-63) is never used and should be removed
SafeMath.tryMod(uint256,uint256) (SafeMath.sol#70-73) is never used and should be removed
SafeMath.tryMul(uint256,uint256) (SafeMath.sol#45-53) is never used and should be removed
SafeMath.trySub(uint256,uint256) (SafeMath.sol#35-38) is never used and should be removed
Strings.toString(uint256) (Strings.sol#12-33) is never used and should be removed
Remove unused functions.
Additional information: link
Pragma version>=0.6.2<0.8.0 (Address.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (Context.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (ERC165.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (ERC721.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (EnumerableMap.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (EnumerableSet.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (IERC165.sol#3) is too complex
Pragma version>=0.6.2<0.8.0 (IERC721.sol#3) is too complex
Pragma version>=0.6.2<0.8.0 (IERC721Enumerable.sol#3) is too complex
Pragma version>=0.6.2<0.8.0 (IERC721Metadata.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (IERC721Receiver.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (Ownable.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (SafeMath.sol#3) is too complex
Pragma version>=0.6.0<0.8.0 (Strings.sol#3) is too complex
Deploy with any of the following Solidity versions: 0.5.16 - 0.5.17, 0.6.11 - 0.6.12, 0.7.5 - 0.7.6 Use a simple pragma version that allows any of these versions. Consider using the latest version of Solidity for testing.
Additional information: link
Low level call in Address.sendValue(address,uint256) (Address.sol#53-59):
- (success) = recipient.call{value: amount}() (Address.sol#57)
Low level call in Address.functionCallWithValue(address,bytes,uint256,string) (Address.sol#114-121):
- (success,returndata) = target.call{value: value}(data) (Address.sol#119)
Low level call in Address.functionStaticCall(address,bytes,string) (Address.sol#139-145):
- (success,returndata) = target.staticcall(data) (Address.sol#143)
Low level call in Address.functionDelegateCall(address,bytes,string) (Address.sol#163-169):
- (success,returndata) = target.delegatecall(data) (Address.sol#167)
Avoid low-level calls. Check the call success. If the call is meant for a contract, check for code existence
Additional information: link
Parameter ERC721.safeTransferFrom(address,address,uint256,bytes)._data (ERC721.sol#245) is not in mixedCase
Parameter StarNFTV3.safeTransferFrom(address,address,uint256,bytes)._data (StarNFTV3.sol#94) is not in mixedCase
Parameter StarNFTV3.setTransferable(bool)._transferable (StarNFTV3.sol#216) is not in mixedCase
Parameter StarNFTV3.setName(string)._name (StarNFTV3.sol#223) is not in mixedCase
Parameter StarNFTV3.setSymbol(string)._symbol (StarNFTV3.sol#230) is not in mixedCase
Parameter StarNFTV3.uint2str(uint256)._i (StarNFTV3.sol#253) is not in mixedCase
Follow the Solidity naming convention.
Additional information: link
Redundant expression "this (Context.sol#21)" inContext (Context.sol#15-24)
Remove redundant statements if they congest code but offer no value.
Additional information: link
supportsInterface(bytes4) should be declared external:
- ERC165.supportsInterface(bytes4) (ERC165.sol#35-37)
balanceOf(address) should be declared external:
- ERC721.balanceOf(address) (ERC721.sol#106-109)
name() should be declared external:
- ERC721.name() (ERC721.sol#121-123)
- StarNFTV3.name() (StarNFTV3.sol#107-109)
symbol() should be declared external:
- ERC721.symbol() (ERC721.sol#128-130)
- StarNFTV3.symbol() (StarNFTV3.sol#114-116)
tokenURI(uint256) should be declared external:
- ERC721.tokenURI(uint256) (ERC721.sol#135-151)
- StarNFTV3.tokenURI(uint256) (StarNFTV3.sol#194-201)
tokenOfOwnerByIndex(address,uint256) should be declared external:
- ERC721.tokenOfOwnerByIndex(address,uint256) (ERC721.sol#165-167)
totalSupply() should be declared external:
- ERC721.totalSupply() (ERC721.sol#172-175)
tokenByIndex(uint256) should be declared external:
- ERC721.tokenByIndex(uint256) (ERC721.sol#180-183)
approve(address,uint256) should be declared external:
- ERC721.approve(address,uint256) (ERC721.sol#188-197)
setApprovalForAll(address,bool) should be declared external:
- ERC721.setApprovalForAll(address,bool) (ERC721.sol#211-216)
transferFrom(address,address,uint256) should be declared external:
- ERC721.transferFrom(address,address,uint256) (ERC721.sol#228-233)
- StarNFTV3.transferFrom(address,address,uint256) (StarNFTV3.sol#58-69)
safeTransferFrom(address,address,uint256) should be declared external:
- ERC721.safeTransferFrom(address,address,uint256) (ERC721.sol#238-240)
- StarNFTV3.safeTransferFrom(address,address,uint256) (StarNFTV3.sol#74-85)
renounceOwnership() should be declared external:
- Ownable.renounceOwnership() (Ownable.sol#54-57)
transferOwnership(address) should be declared external:
- Ownable.transferOwnership(address) (Ownable.sol#63-67)
cid(uint256) should be declared external:
- StarNFTV3.cid(uint256) (StarNFTV3.sol#121-123)
isOwnerOf(address,uint256) should be declared external:
- StarNFTV3.isOwnerOf(address,uint256) (StarNFTV3.sol#180-188)
Use the external attribute for functions never called from the contract.
Additional information: link
Unable to find website, listings and other project-related information
Young tokens have high risks of scam / price dump / death
Token has no active CoinGecko listing / rank
Token has no active CoinMarketCap listing / rank
Unable to find Telegram and Twitter accounts