inheritance Art Auction House

Smart Contract Audit Report

Audit Summary

inheritance Art Auction House Audit Report inheritance Art is releasing a new Auction House with royalties for creators and support for ERC-721 and ERC-1155 NFT collections.

For this audit, we reviewed the AuctionHouse, InheritanceERC721, and InheritanceERC1155 contracts.

We also reviewed the project team's token contract here and NFT Rental Platform contract here.

Audit Findings

No findings were identified, though some centralized aspects are present.
Date: June 29th, 2022.

Contracts Overview

  • As the contracts are implemented with Solidity v0.8.10, they are safe from any possible overflows/underflows.
AuctionHouse Contract:
  • This contract is used to auction NFTs as well as create new ERC-721 or ERC-1155 NFT collections.
  • Any Admin may list an ERC-721 NFT or multiple ERC-1155 NFTs from a supported NFT collection on the behalf of a seller.
  • The Admin who lists the NFT will be the listing Admin for that auction.
  • A starting price in either iAI tokens or WETH, a sale duration, and whether the auction is exclusive are specified.
  • The listing Admin may provide a whitelist for the auction. If a whitelist is provided, only those addresses may bid on the NFT.
  • Users must stake at least the "minimum stake amount" of iAI tokens in the contract to bid on exclusive auctions.
  • Any user may stake any amount of iAI tokens in the contract at any time.
  • Users may not unstake their iAI tokens until the "locktime" from their most recent stake has passed.

  • Blacklisted users are not permitted to bid on auctions.
  • An auction's first bidder may bid any amount at least equal to the starting sale price.
  • Each subsequent bid must be at least 10% higher than the previous bid.
  • Once the first bid is placed, the end time of the auction is set based on the specified sale duration.
  • Each subsequent bid will set the auction's duration to 15 minutes if the auction's end time is within the next 15 minutes.
  • The winning bidder may claim their NFT once the auction has ended.
  • The NFT's "royalty receiver" will receive a royalty percentage of the winning bid if the purchased NFT supports the ERC-2981 standard.
  • A service fee percentage of the winning bid will be collected and transferred to the contract's owner.
  • The remaining iAI or WETH after fees will be transferred to the seller.

  • Any Admin may create an ERC-721 or ERC-1155 collection at any time; a new contract is cloned from the implementation contracts and added as a supported collection.
  • A listing Admin may add or remove any address from the whitelist for one of their auctions at any time.
  • A listing Admin may update an auction's duration and starting price for any of their auctions that have not been bid on.
  • A listing Admin may cancel any of their auctions that have not been bid on.
  • The owner may add and remove any address as an Admin at any time.
  • The owner may add and remove any address from the blacklist at any time.
  • The owner may toggle whether an NFT collection is supported by the Auction House at any time.
  • The owner may set the service fee to any value, up to 50%, at any time.
  • The owner may set the minimum stake amount for exclusive auctions to any amount at any time.
  • The owner may set the stake lock time to any value, up to 30 days, at any time.
  • The owner may update the ERC-721 and ERC-1155 implementation contracts at any time.
  • The owner may update an auction's listing Admin at any time.
InheritanceERC721 Contract:
  • This contract serves as an implementation for the ERC-721 clones in the AuctionHouse contract.
  • NFT metadata that contains information about the NFTs is stored using an off-chain URI endpoint.
  • The owner may mint any number of NFTs to any address at any time.
  • Each NFT is associated with an Artist who will be the NFT's royalty receiver.
  • The owner may set the contract's royalty percentage to any value, up to 25%, at any time. The default royalty percentage is 10%.
  • The owner may update the base URI at any time.
  • The contract complies with the ERC-721 standard.
InheritanceERC1155 Contract:
  • This contract serves as an implementation for the ERC-1155 clones in the AuctionHouse contract.
  • NFT metadata that contains information about the NFTs is stored using an off-chain URI endpoint.
  • The owner may mint any number of NFTs from a new collection ID to any address at any time.
  • The owner may mint any number of NFTs from an existing collection ID to any address at any time.
  • Each NFT is associated with an Artist who will be the NFT's royalty receiver.
  • The owner may set the contract's royalty percentage to any value, up to 25%, at any time. The default royalty percentage is 10%.
  • The owner may update the base URI at any time.
  • The contract complies with the ERC-1155 standard.

Audit Results

Vulnerability Category Notes Result
Arbitrary Jump/Storage Write N/A PASS
Centralization of Control The AuctionHouse owner may add any address to the blacklist. PASS
Compiler Issues N/A PASS
Delegate Call to Untrusted Contract N/A PASS
Dependence on Predictable Variables N/A PASS
Ether/Token Theft N/A PASS
Flash Loans N/A PASS
Front Running N/A PASS
Improper Events N/A PASS
Improper Authorization Scheme N/A PASS
Integer Over/Underflow N/A PASS
Logical Issues N/A PASS
Oracle Issues N/A PASS
Outdated Compiler Version N/A PASS
Race Conditions N/A PASS
Reentrancy N/A PASS
Signature Issues N/A PASS
Unbounded Loops N/A PASS
Unused Code N/A PASS
Overall Contract Safety   PASS

AuctionHouse Contract

Smart Contract Audit - Inheritance

Smart Contract Audit - Graph


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public
 
 + [Int] IERC165 
    - [Ext] supportsInterface

 + [Int] IERC721 (IERC165)
    - [Ext] balanceOf
    - [Ext] ownerOf
    - [Ext] safeTransferFrom #
    - [Ext] safeTransferFrom #
    - [Ext] transferFrom #
    - [Ext] approve #
    - [Ext] setApprovalForAll #
    - [Ext] getApproved
    - [Ext] isApprovedForAll

 + [Int] IERC1155 (IERC165)
    - [Ext] balanceOf
    - [Ext] balanceOfBatch
    - [Ext] setApprovalForAll #
    - [Ext] isApprovedForAll
    - [Ext] safeTransferFrom #
    - [Ext] safeBatchTransferFrom #

 + [Int] IERC20 
    - [Ext] totalSupply
    - [Ext] balanceOf
    - [Ext] transfer #
    - [Ext] allowance
    - [Ext] approve #
    - [Ext] transferFrom #

 + [Int] IERC2981 (IERC165)
    - [Ext] royaltyInfo

 + [Int] IERC165Upgradeable 
    - [Ext] supportsInterface

 + [Int] IERC721Upgradeable (IERC165Upgradeable)
    - [Ext] balanceOf
    - [Ext] ownerOf
    - [Ext] safeTransferFrom #
    - [Ext] safeTransferFrom #
    - [Ext] transferFrom #
    - [Ext] approve #
    - [Ext] setApprovalForAll #
    - [Ext] getApproved
    - [Ext] isApprovedForAll

 + [Int] IERC1155Upgradeable (IERC165Upgradeable)
    - [Ext] balanceOf
    - [Ext] balanceOfBatch
    - [Ext] setApprovalForAll #
    - [Ext] isApprovedForAll
    - [Ext] safeTransferFrom #
    - [Ext] safeBatchTransferFrom #

 + [Lib] ERC165CheckerUpgradeable 
    - [Int] supportsERC165
    - [Int] supportsInterface
    - [Int] getSupportedInterfaces
    - [Int] supportsAllInterfaces
    - [Prv] _supportsERC165Interface

 + [Int] Collection 
    - [Ext] initialize #
    - [Ext] initialize #

 +  Context 
    - [Int] _msgSender
    - [Int] _msgData

 +  Ownable (Context)
    - [Pub] Constructor #
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Int] _transferOwnership #

 + [Lib] Clones 
    - [Int] clone #
    - [Int] cloneDeterministic #
    - [Int] predictDeterministicAddress
    - [Int] predictDeterministicAddress

 +  AuctionHouse (Ownable)
    - [Pub] Constructor #
    - [Ext] setAdmin #
       - modifiers: onlyOwner
    - [Ext] setArtist #
       - modifiers: onlyOwner
    - [Ext] setBlacklisted #
       - modifiers: onlyOwner
    - [Ext] setCollectionSupported #
       - modifiers: onlyOwner
    - [Ext] setServiceFee #
       - modifiers: onlyOwner
    - [Ext] setMinimumStakeAmount #
       - modifiers: onlyOwner
    - [Ext] setLockTime #
       - modifiers: onlyOwner
    - [Ext] updateERC721Implementation #
       - modifiers: onlyOwner
    - [Ext] updateERC1155Implementation #
       - modifiers: onlyOwner
    - [Ext] withdrawServiceFees #
       - modifiers: onlyOwner
    - [Ext] listNFT #
       - modifiers: onlyAdmin
    - [Ext] addToListingWhitelist #
       - modifiers: onlyAdmin
    - [Int] _addToListingWhitelist #
    - [Ext] removeFromListingWhitelist #
       - modifiers: onlyAdmin
    - [Int] _removeFromListingWhitelist #
    - [Ext] updateListing #
       - modifiers: onlyAdmin
    - [Ext] cancelListing #
       - modifiers: onlyAdmin
    - [Ext] bid #
    - [Ext] claimNFT #
    - [Ext] stake #
    - [Ext] unstake #
    - [Ext] createERC721Collection #
       - modifiers: onlyAdmin
    - [Ext] createERC1155Collection #
       - modifiers: onlyAdmin
    - [Pub] isUserWhitelisted
    - [Pub] getListingInfo
    - [Pub] isNFTCollectionSupported
    - [Pub] onERC721Received #
    - [Pub] onERC1155Received #

InheritanceERC721 Contract

Smart Contract Audit - Inheritance

Smart Contract Audit - Graph


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public
 
 + [Int] IERC165Upgradeable 
    - [Ext] supportsInterface

 + [Int] IERC721Upgradeable (IERC165Upgradeable)
    - [Ext] balanceOf
    - [Ext] ownerOf
    - [Ext] safeTransferFrom #
    - [Ext] safeTransferFrom #
    - [Ext] transferFrom #
    - [Ext] approve #
    - [Ext] setApprovalForAll #
    - [Ext] getApproved
    - [Ext] isApprovedForAll

 + [Int] IERC721ReceiverUpgradeable 
    - [Ext] onERC721Received #

 + [Int] IERC721MetadataUpgradeable (IERC721Upgradeable)
    - [Ext] name
    - [Ext] symbol
    - [Ext] tokenURI

 + [Lib] AddressUpgradeable 
    - [Int] isContract
    - [Int] sendValue #
    - [Int] functionCall #
    - [Int] functionCall #
    - [Int] functionCallWithValue #
    - [Int] functionCallWithValue #
    - [Int] functionStaticCall
    - [Int] functionStaticCall
    - [Int] verifyCallResult

 +  Initializable 
    - [Int] _disableInitializers #
    - [Prv] _setInitializedVersion #

 +  ContextUpgradeable (Initializable)
    - [Int] __Context_init #
       - modifiers: onlyInitializing
    - [Int] __Context_init_unchained #
       - modifiers: onlyInitializing
    - [Int] _msgSender
    - [Int] _msgData

 + [Lib] StringsUpgradeable 
    - [Int] toString
    - [Int] toHexString
    - [Int] toHexString

 +  ERC165Upgradeable (Initializable, IERC165Upgradeable)
    - [Int] __ERC165_init #
       - modifiers: onlyInitializing
    - [Int] __ERC165_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] supportsInterface

 +  ERC721Upgradeable (Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable)
    - [Int] __ERC721_init #
       - modifiers: onlyInitializing
    - [Int] __ERC721_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] supportsInterface
    - [Pub] balanceOf
    - [Pub] ownerOf
    - [Pub] name
    - [Pub] symbol
    - [Pub] tokenURI
    - [Int] _baseURI
    - [Pub] approve #
    - [Pub] getApproved
    - [Pub] setApprovalForAll #
    - [Pub] isApprovedForAll
    - [Pub] transferFrom #
    - [Pub] safeTransferFrom #
    - [Pub] safeTransferFrom #
    - [Int] _safeTransfer #
    - [Int] _exists
    - [Int] _isApprovedOrOwner
    - [Int] _safeMint #
    - [Int] _safeMint #
    - [Int] _mint #
    - [Int] _burn #
    - [Int] _transfer #
    - [Int] _approve #
    - [Int] _setApprovalForAll #
    - [Prv] _checkOnERC721Received #
    - [Int] _beforeTokenTransfer #
    - [Int] _afterTokenTransfer #

 + [Int] IERC2981Upgradeable (IERC165Upgradeable)
    - [Ext] royaltyInfo

 +  OwnableUpgradeable (Initializable, ContextUpgradeable)
    - [Int] __Ownable_init #
       - modifiers: onlyInitializing
    - [Int] __Ownable_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Int] _transferOwnership #

 +  InheritanceERC721 (ERC721Upgradeable, OwnableUpgradeable, IERC2981Upgradeable)
    - [Ext] initialize #
       - modifiers: initializer
    - [Ext] setRoyaltyPercentage #
       - modifiers: onlyOwner
    - [Ext] setBaseURI #
       - modifiers: onlyOwner
    - [Ext] mint #
       - modifiers: onlyOwner
    - [Ext] getArtist
    - [Ext] royaltyInfo
    - [Int] _baseURI
    - [Pub] supportsInterface

InheritanceERC1155 Contract

Smart Contract Audit - Inheritance

Smart Contract Audit - Graph


 ($) = payable function
 # = non-constant function
 
 Int = Internal
 Ext = External
 Pub = Public
 
 + [Int] IERC165Upgradeable 
    - [Ext] supportsInterface

 + [Int] IERC1155Upgradeable (IERC165Upgradeable)
    - [Ext] balanceOf
    - [Ext] balanceOfBatch
    - [Ext] setApprovalForAll #
    - [Ext] isApprovedForAll
    - [Ext] safeTransferFrom #
    - [Ext] safeBatchTransferFrom #

 + [Int] IERC1155ReceiverUpgradeable (IERC165Upgradeable)
    - [Ext] onERC1155Received #
    - [Ext] onERC1155BatchReceived #

 + [Int] IERC1155MetadataURIUpgradeable (IERC1155Upgradeable)
    - [Ext] uri

 + [Lib] AddressUpgradeable 
    - [Int] isContract
    - [Int] sendValue #
    - [Int] functionCall #
    - [Int] functionCall #
    - [Int] functionCallWithValue #
    - [Int] functionCallWithValue #
    - [Int] functionStaticCall
    - [Int] functionStaticCall
    - [Int] verifyCallResult

 +  Initializable 
    - [Int] _disableInitializers #
    - [Prv] _setInitializedVersion #

 +  ContextUpgradeable (Initializable)
    - [Int] __Context_init #
       - modifiers: onlyInitializing
    - [Int] __Context_init_unchained #
       - modifiers: onlyInitializing
    - [Int] _msgSender
    - [Int] _msgData

 +  ERC165Upgradeable (Initializable, IERC165Upgradeable)
    - [Int] __ERC165_init #
       - modifiers: onlyInitializing
    - [Int] __ERC165_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] supportsInterface

 +  ERC1155Upgradeable (Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable)
    - [Int] __ERC1155_init #
       - modifiers: onlyInitializing
    - [Int] __ERC1155_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] supportsInterface
    - [Pub] uri
    - [Pub] balanceOf
    - [Pub] balanceOfBatch
    - [Pub] setApprovalForAll #
    - [Pub] isApprovedForAll
    - [Pub] safeTransferFrom #
    - [Pub] safeBatchTransferFrom #
    - [Int] _safeTransferFrom #
    - [Int] _safeBatchTransferFrom #
    - [Int] _setURI #
    - [Int] _mint #
    - [Int] _mintBatch #
    - [Int] _burn #
    - [Int] _burnBatch #
    - [Int] _setApprovalForAll #
    - [Int] _beforeTokenTransfer #
    - [Int] _afterTokenTransfer #
    - [Prv] _doSafeTransferAcceptanceCheck #
    - [Prv] _doSafeBatchTransferAcceptanceCheck #
    - [Prv] _asSingletonArray

 + [Int] IERC2981Upgradeable (IERC165Upgradeable)
    - [Ext] royaltyInfo

 +  OwnableUpgradeable (Initializable, ContextUpgradeable)
    - [Int] __Ownable_init #
       - modifiers: onlyInitializing
    - [Int] __Ownable_init_unchained #
       - modifiers: onlyInitializing
    - [Pub] owner
    - [Pub] renounceOwnership #
       - modifiers: onlyOwner
    - [Pub] transferOwnership #
       - modifiers: onlyOwner
    - [Int] _transferOwnership #

 + [Lib] Strings 
    - [Int] toString
    - [Int] toHexString
    - [Int] toHexString

 +  InheritanceERC1155 (ERC1155Upgradeable, OwnableUpgradeable, IERC2981Upgradeable)
    - [Ext] initialize #
       - modifiers: initializer
    - [Ext] setRoyaltyPercentage #
       - modifiers: onlyOwner
    - [Ext] setURI #
       - modifiers: onlyOwner
    - [Ext] mint #
       - modifiers: onlyOwner
    - [Ext] mintID #
       - modifiers: onlyOwner
    - [Ext] getArtist
    - [Ext] royaltyInfo
    - [Pub] uri
    - [Pub] supportsInterface

About SourceHat

SourceHat has quickly grown to have one of the most experienced and well-equipped smart contract auditing teams in the industry. Our team has conducted 1300+ solidity smart contract audits covering all major project types and protocols, securing a total of over $50 billion U.S. dollars in on-chain value across 1500 projects!.
Our firm is well-reputed in the community and is trusted as a top smart contract auditing company for the review of solidity code, no matter how complex. Our team of experienced solidity smart contract auditors performs audits for tokens, NFTs, crowdsales, marketplaces, gambling games, financial protocols, and more!

Contact us today to get a free quote for a smart contract audit of your project!

What is a SourceHat Audit?

Typically, a smart contract audit is a comprehensive review process designed to discover logical errors, security vulnerabilities, and optimization opportunities within code. A SourceHat Audit takes this a step further by verifying economic logic to ensure the stability of smart contracts and highlighting privileged functionality to create a report that is easy to understand for developers and community members alike.

How Do I Interpret the Findings?

Each of our Findings will be labeled with a Severity level. We always recommend the team resolve High, Medium, and Low severity findings prior to deploying the code to the mainnet. Here is a breakdown on what each Severity level means for the project:

  • High severity indicates that the issue puts a large number of users' funds at risk and has a high probability of exploitation, or the smart contract contains serious logical issues which can prevent the code from operating as intended.
  • Medium severity issues are those which place at least some users' funds at risk and has a medium to high probability of exploitation.
  • Low severity issues have a relatively minor risk association; these issues have a low probability of occurring or may have a minimal impact.
  • Informational issues pose no immediate risk, but inform the project team of opportunities for gas optimizations and following smart contract security best practices.