57701 sc insight accesstoken collectionexpire is never checked allowing tokens to be minted even after the collection expires

Submitted on Oct 28th 2025 at 09:53:21 UTC by @s8olidity for Audit Comp | Belongarrow-up-right

  • Report ID: #57701

  • Report Type: Smart Contract

  • Report severity: Insight

  • Target: https://github.com/immunefi-team/audit-comp-belong/blob/main/contracts/v2/tokens/AccessToken.sol

Impacts:

  • Direct theft of any user funds, whether at-rest or in-motion, other than unclaimed yield

Description

Brief / Intro

The collectionExpire field in AccessTokenInfo is never checked in any mint entry (mintStaticPrice / mintDynamicPrice), and signature verification does not include an expiration time constraint. Consequently, after the collection expires, requests with a valid signature (or a persistent checkout) can continue to be minted indefinitely.

Vulnerability Details

  • The structure definition includes collectionExpire (contracts/v2/Structures.sol:32), but the mintStaticPrice and mintDynamicPrice methods in the AccessToken contract do not check the current time against collectionExpire.

  • The SignatureVerifier signature for the mint parameter only covers receiver/tokenId/tokenUri/price/whitelisted parameters, and does not include a time or window, making it impossible to constrain expiration at the signature level.

  • Therefore, as long as a signature is present, the contract will not refuse to mint tokens due to "collection expiration," which deviates from the standard business objective of "collection lifecycle."

Impact Details

  • The promised "sale/minting window" is invalid: minting can continue even after the expiration date, violating scarcity and redemption rules;

  • If peripheral systems/frontend dependencies have expired, attackers can manually interact with the contract to mint NFTs directly;

  • Recommended Severity: Medium ("Unauthorized minting of NFTs" strictly requires unsigned minting to be considered critical, but this is considered a business violation due to "failure to stop minting on schedule" and still poses a risk).

References

  • contracts/v2/tokens/AccessToken.sol:162, 199, 212 (mint entry does not check for expire)

  • contracts/v2/utils/SignatureVerifier.sol (mint verification hash does not include expire)

  • test/v2/tokens/accessToken.test.ts (only asserts storage, not validation)

Proof of Concept

chevron-rightPoC: test demonstrating mint succeeds after collectionExpire has passedhashtag

Was this helpful?