@@ -0,0 +1,84 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.19;
|
||||
|
||||
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
|
||||
import {Base64} from "@openzeppelin/contracts/utils/Base64.sol";
|
||||
import {ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
|
||||
|
||||
contract MoodNft is ERC721 {
|
||||
error MoodNft__NotOwnerOfToken();
|
||||
|
||||
uint256 private s_tokenCounter;
|
||||
string private s_sadSvgImageUri;
|
||||
string private s_happySvgImageUri;
|
||||
|
||||
enum Mood {
|
||||
HAPPY,
|
||||
SAD
|
||||
}
|
||||
|
||||
mapping(uint256 => Mood) private s_tokenIdToMood;
|
||||
|
||||
constructor(
|
||||
string memory happySvgImageUri,
|
||||
string memory sadSvgImageUri
|
||||
) ERC721("MoodNft", "MN") {
|
||||
s_tokenCounter = 0;
|
||||
s_sadSvgImageUri = sadSvgImageUri;
|
||||
s_happySvgImageUri = happySvgImageUri;
|
||||
}
|
||||
|
||||
function mintNft() public {
|
||||
_safeMint(msg.sender, s_tokenCounter);
|
||||
s_tokenIdToMood[s_tokenCounter] = Mood.HAPPY;
|
||||
s_tokenCounter = s_tokenCounter + 1;
|
||||
}
|
||||
|
||||
function tokenURI(
|
||||
uint256 tokenId
|
||||
) public view override returns (string memory) {
|
||||
string memory imageURI;
|
||||
if (s_tokenIdToMood[tokenId] == Mood.HAPPY) {
|
||||
imageURI = s_happySvgImageUri;
|
||||
} else {
|
||||
imageURI = s_sadSvgImageUri;
|
||||
}
|
||||
|
||||
string memory tokenMetadata = string.concat(
|
||||
'{"name":"',
|
||||
name(), // You can add whatever name here
|
||||
'", "description":"An NFT that reflects the mood of the owner, 100% on Chain!", ',
|
||||
'"attributes": [{"trait_type": "moodiness", "value": 100}], "image":"',
|
||||
imageURI,
|
||||
'"}'
|
||||
);
|
||||
|
||||
string memory tokenURIJson = string(
|
||||
abi.encodePacked(
|
||||
_baseURI(),
|
||||
Base64.encode(
|
||||
bytes(abi.encodePacked(tokenMetadata)) // bytes casting actually unnecessary as 'abi.encodePacked()' returns a bytes
|
||||
)
|
||||
)
|
||||
);
|
||||
return tokenURIJson;
|
||||
}
|
||||
|
||||
function _baseURI() internal pure override returns (string memory) {
|
||||
return "data:application/json;base64,";
|
||||
}
|
||||
|
||||
function flipMood(uint256 tokenId) public {
|
||||
if (
|
||||
getApproved(tokenId) != msg.sender && ownerOf(tokenId) != msg.sender
|
||||
) {
|
||||
revert MoodNft__NotOwnerOfToken();
|
||||
}
|
||||
if (s_tokenIdToMood[tokenId] == Mood.HAPPY) {
|
||||
s_tokenIdToMood[tokenId] = Mood.SAD;
|
||||
} else {
|
||||
s_tokenIdToMood[tokenId] = Mood.HAPPY;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user