Que fait nft-standards ?
Implémentez les normes NFT (ERC-721, ERC-1155) avec une gestion appropriée des métadonnées, des stratégies de minting et une intégration sur le marché. À utiliser lors de la création de contrats NFT, de la construction de places de marché NFT ou de la mise en œuvre de systèmes d'actifs numériques.
Aperçu
Ce skill fournit les directives et les bonnes pratiques pour implémenter des contrats NFT conformes aux normes ERC-721 (NFT uniques) et ERC-1155 (NFT multiples/tokens fongibles semi-fongibles). Il couvre :
- Gestion des métadonnées avec URI décentralisées (IPFS, Arweave) et stockage JSON structuré.
- Stratégies de minting : minting limité, minting à la demande, whitelist, et minting avec conditions (par exemple, paiement en ETH/ERC-20).
- Intégration avec les places de marché populaires (OpenSea, Rarible, LooksRare) via des contrats compatibles et des API.
- Sécurité des contrats (prévention des reentrancy, gestion des rôles, contrôle d'accès).
Exemple de contrat ERC-721 basique
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MonNFT is ERC721, Ownable {
uint256 public prochainId;
uint256 public prixMint = 0.01 ether;
uint256 public limiteMint = 1000;
string public baseURI;
constructor() ERC721("MonNFT", "MNFT") {
baseURI = "ipfs://QmHash/";
}
function mint(address destinataire) public payable {
require(prochainId < limiteMint, "Mint terminé");
require(msg.value >= prixMint, "ETH insuffisant");
_safeMint(destinataire, prochainId);
prochainId++;
}
function _baseURI() internal view override returns (string memory) {
return baseURI;
}
function definirBaseURI(string calldata nouvelleURI) public onlyOwner {
baseURI = nouvelleURI;
}
function retirerFonds() public onlyOwner {
payable(owner()).transfer(address(this).balance);
}
}
Exemple de contrat ERC-1155 basique
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
class MesItems : ERC1155, Ownable {
uint256 public constant ITEM_OR = 0;
uint256 public constant ITEM_ARGENT = 1;
uint256 public constant ITEM_BRONZE = 2;
constructor() ERC1155("ipfs://QmHash/{id}.json") {
_mint(msg.sender, ITEM_OR, 100, "");
_mint(msg.sender, ITEM_ARGENT, 500, "");
_mint(msg.sender, ITEM_BRONZE, 1000, "");
}
function uri(uint256 id) public view override returns (string memory) {
return string(abi.encodePacked(super.uri(id), Strings.toString(id), ".json"));
}
}
Intégration avec les places de marché
- OpenSea : Assurez-vous que votre contrat implémente
IERC721MetadataouIERC1155MetadataURIet que l’URI des métadonnées pointe vers un fichier JSON valide. - Rarible : Utilisez le contrat
ERC721RaribleouERC1155Rariblepour une compatibilité native. - LooksRare : Les contrats standard ERC-721/1155 sont pris en charge ; aucune modification spéciale n’est nécessaire.
Gestion des métadonnées
Les métadonnées doivent être stockées dans un format JSON structuré et accessible via une URI décentralisée (IPFS, Arweave) pour garantir la persistance. Exemple :
{
"name": "Mon NFT #1",
"description": "Un NFT unique de ma collection.",
"image": "ipfs://QmImageHash",
"attributes": [
{ "trait_type": "Couleur", "value": "Bleu" },
{ "trait_type": "Rareté", "value": "Légendaire" }
]
}
Sécurité et bonnes pratiques
- Utilisez OpenZeppelin pour les contrats audités et les modèles de sécurité.
- Évitez les boucles non bornées dans les fonctions
mintettransfer. - Implémentez des mécanismes de pause et de blacklist pour les situations d’urgence.
- Vérifiez les contrôles d’accès avec
onlyOwnerou des rôles viaAccessControl.
Ressources
- Documentation OpenZeppelin : https://docs.openzeppelin.com/contracts
- Normes ERC-721 et ERC-1155 : EIP-721 et EIP-1155
- Exemples de métadonnées : https://docs.opensea.io/docs/metadata-standards