As of 14 Oct 2026, OpenSea has 2 audit reports by 1 security firm on Trustblock; the latest is by Quantstamp, dated 2 Sep 2022. Those reports list 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 |
|---|---|---|---|---|---|
| NFT Market (PresetHTC, Auction, Store) | Security firm: Quantstamp | Date: | Scope: Files named in the report | No open critical findings | Open · certificate.quantstamp.com |
| NFTMarket | 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 | 1 | 2 | 2 |
| Medium | 0 | 4 | 2 |
| Low | 3 | 8 | 6 |
In contract `NFTStore.sol`, in function `launchProduct()`, LAUNCH_ROLE will add product into the system, and buyer can later pay for the product. The NFT contract will have to assign contract `NFTStore` as a mint role so that `NFTStore` can mint token for the buyer. However, such design can easily be exploited. This also applies to `NFTAuction.launchAuction()`.
Open the reportThe project has no test suite.
Open the reportThere is no control that a unique token(combination of _contractAddr and _tokenId) is not launched in multiple auctions. If same token is listed in different actions, bidders send their funds to the contract on different auctions of the token. But the finalizeAuction will be executed successfully for just one of the auctions, and others will fail due to trying to mint an existing token and the funds get locked in the contract. Similar scenario leads to lock of the funds if a previousely minted token is launcehd in an auction.
Open the reportIn `NFTStore.sol`, Two product `A`, `B` can have the same contract address and `productTokenIds[A]`, `productTokenIds[B]` may have the same TokenID. So, when that token is minted in the product `A`. The token cannot be minted again in `B`, which means that product exists but is invalid to be bought. Although this would not harm the security, since the transaction will revert in the end. But this gives users bad using experience. Similarly in `NFTAuction.sol`, two auctions for the same NFT can exist at the same time. The situation in `NFTAuction` is even worse since this will result a waste of gas from multiple parties. And the seller has to cancel an auction to return ether to the bidder if the token can no longer be minted. If the seller refuse to cancel the auction, the fund used for bid will be **locked** in the contract.
Open the reportIt is not clear which contracts will be registered as “full support contracts”, however the function `acceptOffer()` performs external calls to upon these contracts to invoke and `creatorProfitOf(uint256)`. If the contract is malicious, it may return profit values arbitrarily high.
Open the reportExternal contracts are used throughout the project. If the external contracts do not behave as expected, an auction may be launched/finished/canceled without transferring the actual token (see lines 145 and 223, 441, 498, 525, 609, 687). Furthermore, the tokens may cause re-entrancy.
Open the reportThe clone-and-own approach involves copying and adjusting open source code at one's own discretion. From the development perspective, it is initially beneficial as it reduces the amount of effort. However, from the security perspective, it involves some risks as the code may not follow the best practices, may contain a security vulnerability, or may include intentionally or unintentionally modified upstream libraries. In particular, OpenZeppelins `ReentrancyGuard` [code](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol) as well as `Pausable` [code](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/Pausable.sol) is cloned-and-owned inside `NFTAuction.sol` and `NFTStore.sol`.
Open the reportFunctions `vipBuy()` and `Buy()` have the check `require(!_isContract(msg.sender), "Illegal operation from contract.");`. However, `_isContract()` will incorrectly return `false` for contracts calling from within the constructor, allowing them to bypass this check. The check should therefore not be relied upon as a security measure.
Open the reportFunctions `NFTAuction.setAuctionData()` and `NFTStore.setStoreData()` are having no further constraints on the `_storeProfit` other than 100%. Consequently, users can be subject to very high fees. This can subject users to high fees with no prior announcments.
Open the report`NFTAuction.sol` and `NFTStore` contracts inherit from `AccessControlUpgradeable` contract which is never initialized. Although the `__AccessControl_init` has no implementation but the contract is upgradable and might change in future.
Open the reportSeveral functions such as `launchAuction()` and `bidOrBuy()` have the check `!_isContract(msg.sender)`. However, `_isContract()` will incorrectly return `false` for contracts that are still under construction, allowing new contracts to bypass this check. The check should therefore not be relied upon as a security measure.
Open the reportThe specification states that the “contract also charges a handling fee of 3 percent at default”, and comments within the `AuctionInfo` struct on L62-63 suggest that 1% will go toward the creator and 2% will go to the store. However, the default `_creatorProfit` value is set to 0 on L154, and is only set to new value if `isFullSupportContract(_contractAddr)` is true. It is not clear based on the code provided if this correctly sets the creator fee to 1%.
Open the reportThe following `AuctionInfo` fields are missing from the return values: 1. `contractAddr` 1. `tokenID` 1. `createTime` Is this due to callstack limits? While `contractAddr` and `tokenId` can be obtained from `getAuctionContractInfo()`, `createTime` has no getter function and is not used anywhere.
Open the reportSmart contracts will often have `owner` variables to designate the person with special privileges to make modifications to the smart contract. Specifically, the owner may set future auction data, particularly the `storeDefaultProfit` value which may be arbitrarily high.
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="opensea"></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