Omniscia Seen Haus Audit

SeenHausNFT Code Style Findings

SeenHausNFT Code Style Findings

SHN-01C: Improper Initialization

TypeSeverityLocation
Standard ConformityInformationalSeenHausNFT.sol:L42

Description:

The ERC1155Upgradeable contract is initialized with its unchained counterpart.

Example:

contracts/market/client/nft/SeenHausNFT.sol
25contract SeenHausNFT is ISeenHausNFT, MarketClientBase, ERC1155Upgradeable {
26
27 address private _owner;
28
29 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
30
31 /// @dev token id => Token struct
32 mapping (uint256 => Token) internal tokens;
33
34 // Next token number
35 uint256 internal nextToken;
36
37 /**
38 * @notice Initializer
39 */
40 function initialize(address _initOwner)
41 public {
42 __ERC1155_init_unchained("");
43 _transferOwnership(_initOwner);
44 }

Recommendation:

We advise the normal counterpart to be initialized instead. While it bears no effect as the dependencies of ERC1155Upgradeable have no logic in their initializers, its still more standardized to do it this way.

Alleviation:

The normal initialize counterpart is now properly invoked in the codebase.

SHN-02C: Non-Standard Storage Declaration

TypeSeverityLocation
Language SpecificInformationalSeenHausNFT.sol:L27, L32, L35

Description:

The SeenHausNFT contract is meant to be an upgrade-able one yet has its storage layout bundled with its logic blocks.

Example:

contracts/market/client/nft/SeenHausNFT.sol
25contract SeenHausNFT is ISeenHausNFT, MarketClientBase, ERC1155Upgradeable {
26
27 address private _owner;
28
29 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
30
31 /// @dev token id => Token struct
32 mapping (uint256 => Token) internal tokens;
33
34 // Next token number
35 uint256 internal nextToken;

Recommendation:

We advise the two items to be split into separate contracts to increase the maintainability of the codebase as the order of storage is crucial in upgradeable contracts.

Alleviation:

A dedicated SeenHausNFTStorage contract is now utilized to declare storage variables.

SHN-03C: Redundant import Statement

TypeSeverityLocation
Gas OptimizationInformationalSeenHausNFT.sol:L5

Description:

The linked dependency is not utilized by the codebase.

Example:

contracts/market/client/nft/SeenHausNFT.sol
1// SPDX-License-Identifier: GPL-3.0-or-later
2pragma solidity ^0.8.0;
3
4import "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol";
5import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
6import "../../../interfaces/ISeenHausNFT.sol";
7import "../../../interfaces/IERC2981.sol";
8import "../MarketClientBase.sol";
9
10/**
11 * @title SeenHausNFT
12 * @notice This is the Seen.Haus ERC-1155 NFT contract.
13 *
14 * Key features:
15 * - Supports the ERC-2981 NFT Royalty Standard
16 * - Tracks the original creator of each token.
17 * - Tracks which tokens have a physical part
18 * - Logically capped token supplies; a token's supply cannot be increased after minting.
19 * - Only ESCROW_AGENT-roled addresses can mint physical NFTs.
20 * - Only MINTER-roled addresses can mint digital NFTs, e.g., Seen.Haus staff, approved artists.
21 * - Newly minted NFTs are automatically transferred to the MarketController and consigned
22 *
23 * @author Cliff Hall <cliff@futurescale.com> (https://twitter.com/seaofarrows)
24 */
25contract SeenHausNFT is ISeenHausNFT, MarketClientBase, ERC1155Upgradeable {

Recommendation:

We advise it to be safely omitted.

Alleviation:

The redundant import statement has been omitted from the codebase.