As of 14 Oct 2026, Virtualness has 1 audit report on Trustblock, by QuillAudits, dated 24 Jul 2023. That report lists no open critical findings.
Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Statuses are the security firms’ own. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Virtualness | Security firm: QuillAudits | Date: | Scope: Files named in the report | No open critical findings | Open · quillaudits.com |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 1 | 0 | 0 |
| Medium | 2 | 0 | 3 |
| Low | 19 | 0 | 16 |
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
Open the reportisApprovedForAll 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.
Open the reportisApprovedForAll 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.
Open the reportbase 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.
Open the reportIt 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().
Open the reportIt 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().
Open the reportIn 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.
Open the reportIn 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.
Open the report(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.
Open the reportThe 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.
Open the reportThe 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.
Open the reportCurrently 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.
Open the reportnonce is getting used as OrderId while emitting OrdersMatched in matchAndTransfer() and matchAndLazyMint()
Open the reportPass 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.
Open the reportWhile 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.
Open the reportIn 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.
Open the reportIn 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.
Open the reportIn the contract ERC1155Upgradeable.sol is not getting inherited.
Open the reportLazyMint() function takes a parameter but it's not getting used. Unused parameter should be removed.
Open the reportLazyMint() function takes a parameter but it's not getting used. Unused parameter should be removed.
Open the reportIt 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.
Open the reportIn 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.
Open the reportThe reports name a repository or files. Open a report to see its scope.
Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.
Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.
<head><script src="https://widget.trustblock.run/project-widget.min.js" defer></script></head><body><divdata-tb-project-widgetdata-tb-project-slug="virtualness"></div></body>
Paste the code where the label should appear. It uses no API credit and updates by itself.
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