|
2 | 2 | pragma solidity >=0.8.0 <0.9.0;
|
3 | 3 |
|
4 | 4 | import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
|
| 5 | +import { Base64 } from "@openzeppelin/contracts/utils/Base64.sol"; |
5 | 6 |
|
6 | 7 | contract KDONft is ERC721 {
|
7 | 8 | //////////////
|
@@ -40,9 +41,29 @@ contract KDONft is ERC721 {
|
40 | 41 | uint256 public s_nextTokenId;
|
41 | 42 | mapping(address child => TaskMilestone taskMilestone) public
|
42 | 43 | s_childLastNftMinted;
|
| 44 | + mapping(uint256 tokenId => TaskMilestone taskMilestone) public |
| 45 | + s_tokenIdToMilestone; |
43 | 46 |
|
44 |
| - constructor() ERC721("KiddoPerks NFT", "KDONft") { |
| 47 | + string private s_fiveSvgImageUri; |
| 48 | + string private s_tenSvgImageUri; |
| 49 | + string private s_twentySvgImageUri; |
| 50 | + string private s_fiftySvgImageUri; |
| 51 | + string private s_hundredSvgImageUri; |
| 52 | + |
| 53 | + constructor( |
| 54 | + string memory fiveSvgImageUri, |
| 55 | + string memory tenSvgImageUri, |
| 56 | + string memory twentySvgImageUri, |
| 57 | + string memory fiftySvgImageUri, |
| 58 | + string memory hundredSvgImageUri |
| 59 | + ) ERC721("KiddoPerks NFT", "KDONft") { |
45 | 60 | s_nextTokenId = 0;
|
| 61 | + |
| 62 | + s_fiveSvgImageUri = fiveSvgImageUri; |
| 63 | + s_tenSvgImageUri = tenSvgImageUri; |
| 64 | + s_twentySvgImageUri = twentySvgImageUri; |
| 65 | + s_fiftySvgImageUri = fiftySvgImageUri; |
| 66 | + s_hundredSvgImageUri = hundredSvgImageUri; |
46 | 67 | }
|
47 | 68 |
|
48 | 69 | /**
|
@@ -76,7 +97,55 @@ contract KDONft is ERC721 {
|
76 | 97 | if (tokenId >= s_nextTokenId) {
|
77 | 98 | revert KDONft__NftDoesNotExist(tokenId);
|
78 | 99 | }
|
79 |
| - return ""; |
| 100 | + |
| 101 | + string memory imageUri = |
| 102 | + _getImageUriForMilestone(s_tokenIdToMilestone[tokenId]); |
| 103 | + |
| 104 | + return string( |
| 105 | + abi.encodePacked( |
| 106 | + _baseURI(), |
| 107 | + Base64.encode( |
| 108 | + bytes( |
| 109 | + abi.encodePacked( |
| 110 | + '{"name": "}', |
| 111 | + name(), |
| 112 | + '", "description": "An NFT that reflects the number of tasks completed on KiddoPerks.", "image:":', |
| 113 | + imageUri, |
| 114 | + '"}' |
| 115 | + ) |
| 116 | + ) |
| 117 | + ) |
| 118 | + ) |
| 119 | + ); |
| 120 | + } |
| 121 | + |
| 122 | + /** |
| 123 | + * @dev We need to let metadata know that the content is JSON. |
| 124 | + */ |
| 125 | + function _baseURI() internal pure override returns (string memory) { |
| 126 | + return "data:application/json;base64,"; |
| 127 | + } |
| 128 | + |
| 129 | + /** |
| 130 | + * @dev Gets image uri given a task milestone |
| 131 | + * @param milestone Milestone task for tokenId |
| 132 | + */ |
| 133 | + function _getImageUriForMilestone( |
| 134 | + TaskMilestone milestone |
| 135 | + ) internal view returns (string memory) { |
| 136 | + if (milestone == TaskMilestone.FIVE) { |
| 137 | + return s_fiveSvgImageUri; |
| 138 | + } else if (milestone == TaskMilestone.TEN) { |
| 139 | + return s_tenSvgImageUri; |
| 140 | + } else if (milestone == TaskMilestone.TWENTY) { |
| 141 | + return s_twentySvgImageUri; |
| 142 | + } else if (milestone == TaskMilestone.FIFTY) { |
| 143 | + return s_fiftySvgImageUri; |
| 144 | + } else if (milestone == TaskMilestone.HUNDRED) { |
| 145 | + return s_hundredSvgImageUri; |
| 146 | + } else { |
| 147 | + revert("Invalid milestone"); |
| 148 | + } |
80 | 149 | }
|
81 | 150 |
|
82 | 151 | /**
|
|
0 commit comments