Virtualness

QuillAuditsFiles named in the report

QuillAudits reviewed Virtualness on 24 Jul 2023: 41 findings, 0 critical; 19 marked fixed, 22 open.

No open critical findings
Open the reportOpen Virtualness’s security record

Report hosted on quillaudits.com.

Statuses are the security firm’s own, from this report. Trustblock does not review code.

Findings41

Statuses are the security firm’s own, from its report.

SeverityOpenAcknowledgedFixed
Critical000
High100
Medium203
Low19016
HighUser can use mintData created and signed for different order:Not fixed

A mint data signed for one order can be used for another order.If sell.order.trader and sell.order.collection.tokenId are matching with mintData.creators[0].account and mintData.tokenId respectively then other mintData can be used for another order for which that wasn't created. here because other data from the mintData like uri,supply etc is not getting checked ( because the mintData is the way owner/minter provides it) user would be able to change the uri,supply to the other mintData's uri and supply if they use different mintData

MediumCentralization in isApprovedForAllNot fixed

isApprovedForAll returns true for all the addresses which have a minter role. This can be problematic where a malicious person with minter role tries to transfer tokens from someone's ( user’s) account to another account using tansferFrom() as the malicious address would be able to transfer even without having approvals.On the other side from the user's perspective users would like to have more control over their token approvals.

MediumCentralization in isApprovedForAllNot fixed

isApprovedForAll returns true for all the addresses which have a minter role. This can be problematic where a malicious person with minter role tries to transfer tokens from someone's ( user’s) account to another account using tansferFrom() as the malicious address would be able to transfer even without having approvals.On the other side from the user's perspective users would like to have more control over their token approvals.

LowAbsence of setBaseURINot fixed

base Uri is not getting set in the initialize function , and the contract is doesn't has internal setBaseURI() from ERC1155URIStorageUpgradeable exposed with public function. So that authorized address can call it .While setting uri for tokenIds the _setURI is getting used, where full uri needs to be set.

LowAdd extra check for zero address signerNot fixed

It can happen that invalid signature may end up recovering invalid signer as the zero address. The used openzeppelin’s ECDSAUpgradeable should revert in the case where it recovers zero address. But it's a good idea to have an extra check in place for handling this situation in lazyMint().

LowAdd extra check for zero address signerNot fixed

It can happen that invalid signature may end up recovering invalid signer as the zero address. The used openzeppelin’s ECDSAUpgradeable should revert in the case where it recovers zero address. But it's a good idea to have an extra check in place for handling this situation in lazyMint().

Lowcare needs to be taken for the addresses while removing minter roleNot fixed

In the scenario where address having minter role signs the mintData and later minter role of that address gets removed then while executing the order with that mintData the transaction can revert when lazyMint() checks the signer recovered is owner or the address having minter role, As at that moment the address won’t have the minter role.This scenario should be noted while performing actions such as removing minter role.

Lowcare needs to be taken for the addresses while removing minter roleNot fixed

In the scenario where address having minter role signs the mintData and later minter role of that address gets removed then while executing the order with that mintData the transaction can revert when lazyMint() checks the signer recovered is owner or the address having minter role, As at that moment the address won’t have the minter role.This scenario should be noted while performing actions such as removing minter role.

LowCheck the fixed supply of token logicNot fixed

(This issue is for information regarding implemented logic and can be acknowledged if this is the intentional logic)Code implements logic for keeping supply limited according to what it gets assigned first. mint_() checks for the case where the amount exceeds the defined supply while minting the tokenId amount.  And because of this in mint(), delegateMint() and in lazyMint() it restricts the supply from exceeding the supply amount that was set earlier.

LowConsideration for the scenarioNot fixed

The team should note that the scenario like this can happen because of the logic of the code, where the user creates a second order while the first order is still there, e.g first user creates an order for 100 tokens and then again for 100 tokens while the old order is still there.

Show 10 more
LowLack of test cases for the contractNot fixed

The contract VirtualnessV1Core lacks proper test cases. Having less test cases makes contract miss issues if there are any also it makes it hard for other devs to understand proper working and functionality of the contract.

LowLimit for fees can be addedNot fixed

Currently the fees have no limit so the fee rate can be anything. Fee limit can be added in the contract so that it can't exceed a certain limit. in this way the user would be assured about the fees that they are not getting exceeded from a certain limit.

Lownonce is getting used as OrderId while emitting OrdersMatchedNot fixed

nonce is getting used as OrderId while emitting OrdersMatched in matchAndTransfer() and matchAndLazyMint()

LowPass receiveAmount instead of priceNot fixed

Pass the receiveAmount instead of price in royaltyInfo(). As the order fee was transferred and receiveAmount was calculated ( that is price - totalFee from _transferFees()) so user would be receiving receiveAmount amount, now while calculating royalty amount the royaltyInfo() will calculate royalty amount with price which would be more than the amount if that would be calculated with receiveAmount.

LowSeller can manipulate the seller order before signing it. Description:Not fixed

While discussing with developers we came to know that the platform fees (fees array) in the seller order are getting added by the dapp backend (similar to other things that the backend would be adding in the mintOrder).Here, malicious signer can manipulate the content that he is signing in some cases.

Lowtotal variable is not getting usedNot fixed

In function _saveCreators() where creators of the collection are getting assigned and stored. The variable total is used to calculate value/share but the total variable then is not used in any of the other calculations making it redundant.

LowtransferOwnership should be two step processNot fixed

In contract ERC721Virtualness there is function transferOwnership() for transferring the ownership to another user but it is just a single function which is prone to some issues if the address to which the ownership is to be transferred is not correct or is malicious.

LowUnused importsNot fixed

In the contract ERC1155Upgradeable.sol is not getting inherited.

LowUnused parameter in LazyMintNot fixed

LazyMint() function takes a parameter but it's not getting used. Unused parameter should be removed.

LowUnused parameter in LazyMintNot fixed

LazyMint() function takes a parameter but it's not getting used. Unused parameter should be removed.

Show 2 more
LowUse of fee on transfer token in contractNot fixed

It is quite possible that users can use a fee on transfer tokens for buying/selling. The issue with the token is that with each functionality(transfer) that happens it takes some fees out of it. Example if userA has 100 tokens he transfers to userB then userB will only get 95 tokens if the fee is 5%. In that way the seller and creator with royalties will get less than what is expected.

LowVariable is set but not usedNot fixed

In the struct OrderParameters isLazy boolean value is used and it is getting used in _hashOrder() function in ProtocolEIP712 contract but is not used for checking if the nft is minted using lazyMint function. If it's true then the order will be fulfilled with fulfillLazyMintOrder() function otherwise by fulfillOrder() function but as the variable is not used it might create confusion.

Contracts in scope

No deployed address is recorded for this audit.

The report names a repository or files. Open the report to see its scope.

Repository and files the report names (18)

  • contracts/ERC1155-Common/ERC1155Roles.sol
  • contracts/protocol-v1/lib/ProtocolEIP712.sol
  • contracts/protocol-v1/lib/OrderStructs.sol
  • contracts/ERC721-Common/ERC721Roles.sol
  • contracts/protocol-v1/OrderValidator.sol
  • /docs.sol
  • contracts/Lazy-Mint/erc-1155/IERC1155LazyMint.sol
  • contracts/protocol-v1/OrderMatch.sol
  • contracts/protocol-v1/ProtocolV1Core.sol
  • ERC1155Upgradeable.sol
  • contracts/protocol-v1/lib/ExecutionDelegate.sol
  • contracts/Lazy-Mint/erc-721/IERC721LazyMint.sol
  • contracts/Lazy-Mint/erc-1155/LibERC1155LazyMint.sol
  • contracts/Lazy-Mint/erc-721/LibERC721LazyMint.sol
  • contracts/protocol-v1/VirtualnessProtocolV1.sol
  • contracts/protocol-v1/TransferExecutor.sol
  • contracts/ERC1155-Common/ERC1155Virtualness.sol
  • contracts/ERC721-Common/ERC721Virtualness.sol

Part of Virtualness’s security record

Virtualness
Audits1 audit by 1 firmLast audit Jul 2023, by QuillAudits.
Critical findingsNo open critical findingsIn 1 report.
Open Virtualness’s security record

Security firm

QuillAudits

350 projects reviewed · 463 reports · latest Apr 2025

See QuillAudits’s audits

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us