Both implementations (Cairo and Solidity v1/v2) store a collection-level expiration timestamp but never enforce it during minting.
Cairo:
The collection expiration is stored but not used. It's defined here: https://github.com/immunefi-team/audit-comp-belong//blob/a17f775dcc4c125704ce85d4e18b744daece65af/src/nft/interface.cairo#L14-L15
pub collection_expires: u256, // Collection expiration period (timestamp)
It's set on deploy here: https://github.com/immunefi-team/audit-comp-belong//blob/a17f775dcc4c125704ce85d4e18b744daece65af/src/nftfactory/nftfactory.cairo#L304
collection_expires: info.collection_expires,
It is not validated in minting in the following parts of the protocol:
src/nft/nft.cairo: _base_mint (here it only checks max_total_supply) https://github.com/immunefi-team/audit-comp-belong//blob/a17f775dcc4c125704ce85d4e18b744daece65af/contracts/v1/NFT.sol#L287-L297
Solidity v1:
Defined in contracts/v1/Structures.sol: https://github.com/immunefi-team/audit-comp-belong//blob/a17f775dcc4c125704ce85d4e18b744daece65af/contracts/v1/Structures.sol#L33
Defined in contracts/v2/Structures.sol: https://github.com/immunefi-team/audit-comp-belong//blob/a17f775dcc4c125704ce85d4e18b744daece65af/contracts/v2/Structures.sol#L32-L33
Because of the missing on-chain check, collections intended to be time-bound can be minted indefinitely after the intended expiration.
Impact
Critical - Unauthorized minting of NFTs
The protocol intends to prevent mints after a deadline but does not enforce it on chain, allowing mints that should be disallowed.
Recommended mitigation steps
Enforce collection expiration at mint-time. Treat 0 as “no expiry”.
Cairo:
In _base_mint or the relevant mint entrypoints, revert if collection_expires != 0 and now > collection_expires.
Solidity v1/v2:
Prefer centralizing the check in _baseMint:
Proof of Concept
PoC: Hardhat test demonstrating mint after expiry (v1)
I added a focused Hardhat test that deploys a v1 NFT with collectionExpire in the past and mints successfully.
Create a file named test/v1/nft_expiry_poc.test.ts and paste the PoC below in it. The test deploys v1 NFT with collectionExpire = 1 (past), then mints via mintStaticPrice. The mint succeeds and ownerOf(0) equals the minter.