As of 15 Oct 2026, Petaverse has 1 audit report on Trustblock, by Quantstamp, dated 3 Mar 2023. That report lists no open critical findings.
Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Petaverse | Security firm: Quantstamp | Date: | Scope: Files named in the report | No open critical findings | Open · certificate.quantstamp.com |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 0 | 1 |
| Medium | 0 | 0 | 1 |
| Low | 1 | 6 | 10 |
Documentation suggests that clones can only be transferred by the Cloner role, however, clones can also be transferred by Custodians if they are owned by custodial accounts, or if clones are owned by the contract they can be transferred by Minters. Additionally, accounts holding cloned pets are free to transfer them as they wish. By design, cloned pets are intended to only be held by the same account that holds the original pet, just on a terminal chain. However, with the ability to transfer these clones, a situation could arise where separate accounts are holding both the original and cloned pet. Also, recipients of cloned pets could be surprised to have their NFT moved by the team at any point.
Open the reportThe function `setRoyaltyInfo()` does not verify the `royaltyReceiver` to not be the `0x0 address`, and the `royaltyNumerator` to be within a defined bound. If the royaltyNumerator is the same as the `ROYALTY_DENOMINATOR`, then the royalty will be the entire sale price. If it is greater than the `ROYALTY_DENOMINATOR` then the royalty will be more than the sale price itself.
Open the reportDocumentation suggests that NFTs should only be transferred, approved, or burned on the origin chain where they were minted. However, there is no smart-contract level enforcement of this. This means NFTs can be transferred, regardless of what chain they are on.
Open the reportIn `Pet.mintTo()`#L222, the custodial status of the to address is updated after the minting of the token, violating the Checks-Effects-Interactions coding pattern. The coding pattern is meant to mitigate any chance of other contracts manipulating the state of the blockchain in unexpected and possibly malicious ways before control is returned to the original contract. While no critical vulnerabilities were identified as a result of this violation, it is still best to adhere to the pattern to mitigate any potential issues.
Open the report`Pet.bulkTransferFromCustodials()` is restricted to only being called by an `Custodian` However, the call to `setCustodial()` inside of this function is limited to only addresses with DEFAULT_ADMIN_ROLE. An address with CUSTODIAN_ROLE cannot bulk transfer Pets if they do not additionally hold the DEFAULT_ADMIN_ROLE.
Open the report`Voucher.mintTo()`, a voucher can be minted in 2 ways: <ol> <li> The _to address must match the to address on the signed VoucherToken data.</li> <li> As long as the _to data doesnt equal the 0x0 address and _voucher.to is 0x0, then the voucher token can be minted to any arbitrary _to address</li> </ol> The second scenario allows for a front-runner to simulate a `mintTo()` transaction for a voucher token with an unassigned address and see that they can receive this token if they provide their own address in the _to the parameter.
Open the reportCurrently, Voucher only allows the assignment of the value for the address of the Pet proxy contract once, during construction. The inability of the team to modify the address used for the Pet contract presents a single point of failure. If there were an instance where this proxy address was compromised, or assigned an incorrect address, Voucher would have to be redeployed as this contract would be unable to function as intended.
Open the reportThe function `mintTo()` can write the same value as the custodial mapping because it maps an address to a boolean. Consider the case where the address is already marked as custodial, there is no need to do the same write operation again. Given that the `_tos` array contains duplicate addresses, the same goes for the function `multiMintTo()`; except that it writes the same value for the duration of the loop. Although it is only one bit, these write operations can cost more gas than needed.
Open the reportThe contracts can approve an address to transfer tokens on their behalf without setting a limit on how many tokens may be transferred via `ERC721.setApprovalForAll()`. If the approved address becomes hacked or is intentionally malicious, it may transfer out all of the approved tokens.
Open the reportIn the Pet.sol file a `_burn()` function is defined which overrides the burn function of all other contracts it inherits from. However, it is an internal function that is never used in any part of the code.
Open the reportIn `Pet.initialize()`, both the Ownable and ReentrancyGuard upgradeable contracts are left uninitialized. Additionally, adding the `_disableInitializers()` function to the constructor of the implementation contract will prevent any malicious actors from calling `initialize()` on the implementation contract and taking it over, as described in Open Zeppelin's documentation.
Open the report`Voucher.redeemVoucherTo()` does not enforce that the address receiving the Pet from the Pet contract is the same receiving address specified by the associated Voucher. Although this function call is limited to the `REDEEMER_ROLE` it is still possible for human error on behalf of the team. If an incorrect address is provided for the `_to` parameter, an address different than that specified by the Voucher would receive the Pet.
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="petaverse-1"></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