This EIP proposes a standard for creating economically sustainable NFT governance for collections built on collaborative models based on ERC-721. It introduces dynamic minting fees, role-based access control, and a donation-based engagement model to enhance creator-community interactions. These mechanisms aim to balance scarcity, incentivize meaningful participation, and ensure sustainable growth for both creators and contributors.
The model defines "economically sustainable" as tokens whose minting value, creator subscription fees, and token quantity within each progressive discount cycle can only be adjusted once every 30 days from the last update by an ADMIN user. These mechanisms prevent excessive administrative modifications that could disrupt market stability, ensuring consistent price discovery and maintaining participant confidence. By aligning incentives and fostering predictability, the model creates a robust framework for engagement and value creation.
As the NFT market matures, one of the recurring challenges faced by both creators and users is the inflationary nature of supply and the lack of effective mechanisms to engage the community meaningfully. NFT collections built on collaborative models require governance systems that empower all stakeholders—creators, contributors, and collectors—while also maintaining long-term economic sustainability. The introduction of this proposal aims to solve these issues by fostering a more dynamic, flexible, and transparent system for NFT collections. This EIP addresses these gaps by introducing:
The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
The following interface MUST be implemented.
currentTokenId()Description:
Tracks the current token ID in the system. Can also be used to determine how many tokens have been minted in the system.
mintBaseFee()Description:
The base fee for minting a token, paid by the user to create a new token.
creatorSignatureFee()Description:
The fee required for a user to acquire a creator's signature, allowing them to become a creator in the system.
maxMintsPerUserInCycle()Description:
The maximum number of mints a user can perform during their current cycle of progressive discounts. Once the limit is exceeded, the user's minting count is reset to zero.
lastUpdateTimestamp()Description:
Timestamp of the last time the contract terms were updated (e.g., minting fees and creator signature fees). It is used to determine when the contract's terms can be updated again.
UPDATE_INTERVAL()Description:
The time interval between contract terms updates. MUST be fixed to 30 days.
ADMIN_ROLE()Description:
The role identifier for admins in the system.
Requirements:
msg.sender.CREATOR_ROLE()Description:
The role identifier for creators in the system.
Requirements:
msg.sender.CONTRIBUTOR_ROLE()Description:
The role identifier for contributors in the system.
mintsPerUserInCycle(address user)Description:
Tracks the number of mints a user has performed in their current cycle of progressive discounts. It is used to enforce the maximum minting limit per user.
CreatorTermsUpdated(uint256 mintBaseFee, uint256 creatorSignatureFee, uint256 maxMintsPerUserInCycle)Description:
Emitted when the contract terms related to minting are updated by the ADMIN_ROLE.
DonationReceived(address from, address to, uint256 amount)Description:
Emitted when a user donates ETH to a creator. This event tracks the details of the donation, including the donor's address, the recipient's address, and the donation amount.
Parameters:
from: The address of the user making the donation.to: The address of the creator receiving the donation.amount: The amount of ETH donated.safeMint(string memory uri)Description:
Allows the caller to mint a new token to their address with a provided URI.
Requirements:
mintFee()Description:
Calculates and returns the current minting fee that the caller MUST pay, based on the number of mints performed during his current discount per mint cycle. Is RECOMMENDED that the fee use a logarithmic reduction to adjust the fee smoothly.
Formula:
Note: Please note that the returned logarithm is always rounded to integers due to the characteristics of Solidity with floating-point numbers.
Requirements:
donate(address creator)Description:
Allows users to donate ETH to a creator, helping fund their activities. After making a donation, the donor SHALL receive the CONTRIBUTOR_ROLE.
Requirements:
msg.sender MUST NOT be the same as the creator.DonationReceived event after the donation is processed.getCreatorSignature()Description:
Allows a user to acquire a creator's signature by paying the required fee.
Requirements:
updateTerms(uint256 mintBaseFee, uint256 creatorSignatureFee, uint256 maxMintsPerUserInCycle)Description:
Allows the admin to update the minting fee, creator signature fee, and the maximum mints per user in a cycle of progressive discounts.
Requirements:
ADMIN_ROLE MUST call this function.CreatorTermsUpdated event after the contract terms are updated.withdraw(uint256 amount)Description:
Allows the ADMIN_ROLE to withdraw ETH from the contract.
Requirements:
ADMIN_ROLE MUST call this function.burn(uint256 tokenId)Description:
Allows the owner of a token to burn (destroy) the token specified by tokenId.
Requirements:
pause()Description:
Allows the ADMIN_ROLE to pause the contract, disabling certain functions.
Requirements:
ADMIN_ROLE SHOULD call this function to pause the contract.unpause()Description:
Allows the ADMIN_ROLE to unpause the contract, re-enabling functionality.
Requirements:
ADMIN_ROLE SHOULD call this function to unpause the contract.Below are the key considerations and justifications for the design choices:
Access Control
Dynamic Minting Fees
Donation-Based Engagement
This EIP is fully compatible with ERC-721. Extensions like dynamic minting fees, donation systems are modular and do not impact existing NFT token functionalities.
mintFee()safeMint(string memory uri)safeMint, withdraw and donate are protected against reentrancy attacks.Copyright and related rights waived via CC0.