diff --git a/contracts/DufyNFT.sol b/contracts/DufyNFT.sol new file mode 100644 index 0000000000000000000000000000000000000000..b1887eddda9636a877b4d0e0425ff8a770e2dd79 --- /dev/null +++ b/contracts/DufyNFT.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/token/common/ERC2981.sol"; + +/** + * @title DufyNFT + * @dev Contrat pour la création et la gestion de NFTs inspirés du style de Raoul Dufy. + * Inclut un système de royalties pour l’artiste ou ses ayants droit. + */ +contract DufyNFT is ERC721URIStorage, Ownable, ERC2981 { + // Compteur d’IDs des NFTs + uint256 private _tokenIdCounter; + + // Pourcentage des royalties (en basis points, 500 = 5%) + uint96 public constant royaltyPercentage = 500; + + event NFTMinted(address indexed owner, uint256 indexed tokenId, string tokenURI); + event RoyaltyUpdated(address indexed receiver, uint96 percentage); + + /** + * @dev Constructeur qui initialise le contrat avec le propriétaire des royalties. + * @param defaultRoyaltyReceiver Adresse qui recevra les royalties sur chaque revente. + * @param contractOwner Adresse initiale qui sera le propriétaire du contrat. + */ + constructor(address defaultRoyaltyReceiver, address contractOwner) + ERC721("DufyNFT", "DUFY") // Initialisation explicite du parent ERC721 + Ownable(contractOwner) // Initialisation explicite du parent Ownable + { + require(defaultRoyaltyReceiver != address(0), "Invalid royalty receiver address"); + require(contractOwner != address(0), "Invalid contract owner address"); + + // Initialisation des royalties + _setDefaultRoyalty(defaultRoyaltyReceiver, royaltyPercentage); + + // Initialisation du compteur de TokenID + _tokenIdCounter = 0; + } + + /** + * @dev Fonction permettant de minter un NFT unique. + * Seul le propriétaire du contrat peut exécuter cette action. + * @param recipient Adresse du propriétaire initial du NFT. + * @param tokenURI URI des métadonnées associées à l’image du NFT. + */ + function mintNFT(address recipient, string memory tokenURI) public onlyOwner returns (uint256) { + _tokenIdCounter++; + uint256 newTokenId = _tokenIdCounter; + + _safeMint(recipient, newTokenId); + _setTokenURI(newTokenId, tokenURI); + + emit NFTMinted(recipient, newTokenId, tokenURI); + return newTokenId; + } + + /** + * @dev Permet de modifier l’adresse recevant les royalties. + * Seul le propriétaire peut mettre à jour cette information. + * @param newReceiver Nouvelle adresse pour percevoir les royalties. + * @param newPercentage Nouveau pourcentage des royalties (en basis points). + */ + function updateRoyaltyReceiver(address newReceiver, uint96 newPercentage) public onlyOwner { + require(newReceiver != address(0), "Invalid receiver address"); + require(newPercentage <= 1000, "Royalty percentage too high"); // Max 10% + + _setDefaultRoyalty(newReceiver, newPercentage); + emit RoyaltyUpdated(newReceiver, newPercentage); + } + + /** + * @dev Vérifie les interfaces prises en charge (ERC721URIStorage, ERC2981 pour les royalties). + * @param interfaceId ID de l’interface à vérifier. + */ + function supportsInterface(bytes4 interfaceId) + public + view + override(ERC721URIStorage, ERC2981) + returns (bool) + { + return super.supportsInterface(interfaceId); + } +}