-
Notifications
You must be signed in to change notification settings - Fork 575
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add ERC: Sustainable collaborative NFT collections #752
Open
gfLobo
wants to merge
36
commits into
ethereum:master
Choose a base branch
from
gfLobo:master
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+337
−0
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
abcoathup
reviewed
Dec 5, 2024
abcoathup
reviewed
Dec 5, 2024
abcoathup
reviewed
Dec 5, 2024
abcoathup
reviewed
Dec 5, 2024
abcoathup
reviewed
Dec 5, 2024
Co-authored-by: Andrew B Coathup <28278242+abcoathup@users.noreply.github.com>
RainbowScientist5
approved these changes
Dec 20, 2024
RainbowScientist5
approved these changes
Jan 13, 2025
SamWilsn
reviewed
Jan 17, 2025
Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com>
Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com>
Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com>
GloWE3
approved these changes
Feb 8, 2025
RainbowScientist5
approved these changes
Feb 8, 2025
RainbowScientist5
approved these changes
Feb 13, 2025
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
eip: 7832
title: Sustainable collaborative NFT collections
description: Economically sustainable collaborative NFT collections with dynamic fees and donation-based engagement.
author: Gustavo Lobo (@gfLobo)
discussions-to: https://ethereum-magicians.org/t/erc-7832-sustainable-nft-collections/22201
status: Review
type: Standards Track
category: ERC
created: 2024-12-04
requires: 721
Abstract
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.Motivation
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:
Specification
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.
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 thecreator
.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.Rationale
Below are the key considerations and justifications for the design choices:
Access Control
Dynamic Minting Fees
Donation-Based Engagement
Backwards Compatibility
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.
Reference Implementation
mintFee()
safeMint(string memory uri)
Security Considerations
Is RECOMMENDED to make sure the functions
safeMint
,withdraw
anddonate
are protected against reentrancy attacks.The Administrators MUST be able to pause the contract during emergencies to prevent unwanted operations and mitigate risks during uncertain times.
Ensure that only the owner of a token can burn it, reducing the risk of malicious contracts or unauthorized users destroying tokens belonging to others. The burn behavior is restricted to the ownership function, enhancing security by preventing accidental or abusive token destruction.
Copyright
Copyright and related rights waived via CC0.