Skip to content

Commit 3f7764a

Browse files
committed
Added image uri to kdo nft
1 parent 94a0251 commit 3f7764a

File tree

3 files changed

+721
-5
lines changed

3 files changed

+721
-5
lines changed

packages/foundry/contracts/KDONft.sol

+71-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
pragma solidity >=0.8.0 <0.9.0;
33

44
import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
5+
import { Base64 } from "@openzeppelin/contracts/utils/Base64.sol";
56

67
contract KDONft is ERC721 {
78
//////////////
@@ -40,9 +41,29 @@ contract KDONft is ERC721 {
4041
uint256 public s_nextTokenId;
4142
mapping(address child => TaskMilestone taskMilestone) public
4243
s_childLastNftMinted;
44+
mapping(uint256 tokenId => TaskMilestone taskMilestone) public
45+
s_tokenIdToMilestone;
4346

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") {
4560
s_nextTokenId = 0;
61+
62+
s_fiveSvgImageUri = fiveSvgImageUri;
63+
s_tenSvgImageUri = tenSvgImageUri;
64+
s_twentySvgImageUri = twentySvgImageUri;
65+
s_fiftySvgImageUri = fiftySvgImageUri;
66+
s_hundredSvgImageUri = hundredSvgImageUri;
4667
}
4768

4869
/**
@@ -76,7 +97,55 @@ contract KDONft is ERC721 {
7697
if (tokenId >= s_nextTokenId) {
7798
revert KDONft__NftDoesNotExist(tokenId);
7899
}
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+
}
80149
}
81150

82151
/**

packages/foundry/script/DeployKiddoPerks.s.sol

+29-1
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,32 @@ import { KiddoPerks } from "../contracts/KiddoPerks.sol";
55
import { KDOToken } from "../contracts/KDOToken.sol";
66
import { KDONft } from "../contracts/KDONft.sol";
77
import { ScaffoldETHDeploy, console } from "./DeployHelpers.s.sol";
8+
import { Base64 } from "@openzeppelin/contracts/utils/Base64.sol";
89

910
contract DeployKiddoPerks is ScaffoldETHDeploy {
1011
// use `deployer` from `ScaffoldETHDeploy`
1112
function run() external ScaffoldEthDeployerRunner {
13+
string memory fiveTasksAchievedSvg =
14+
vm.readFile("./nfts/5tasksAchieved.svg");
15+
string memory tenTasksAchievedSvg =
16+
vm.readFile("./nfts/10tasksAchieved.svg");
17+
string memory twentyTasksAchievedSvg =
18+
vm.readFile("./nfts/20tasksAchieved.svg");
19+
string memory fiftyTasksAchievedSvg =
20+
vm.readFile("./nfts/50tasksAchieved.svg");
21+
string memory hundredTasksAchievedSvg =
22+
vm.readFile("./nfts/100tasksAchieved.svg");
23+
1224
address PARENT = 0x27dBc64e6C38633eD526d970258372476BCE58C0;
1325

1426
KDOToken token = new KDOToken();
15-
KDONft nft = new KDONft();
27+
KDONft nft = new KDONft(
28+
fiveTasksAchievedSvg,
29+
tenTasksAchievedSvg,
30+
twentyTasksAchievedSvg,
31+
fiftyTasksAchievedSvg,
32+
hundredTasksAchievedSvg
33+
);
1634

1735
KiddoPerks kiddoPerks = new KiddoPerks(token, nft);
1836
console.logString(
@@ -23,4 +41,14 @@ contract DeployKiddoPerks is ScaffoldETHDeploy {
2341
kiddoPerks.setParent(PARENT);
2442
token.transferOwnership(address(kiddoPerks));
2543
}
44+
45+
function svgToImageURI(
46+
string memory svg
47+
) public pure returns (string memory) {
48+
string memory baseUrl = "data:image/svg+xml;base64,";
49+
string memory svgBase64Encoded =
50+
Base64.encode(bytes(string(abi.encodePacked(svg))));
51+
52+
return string(abi.encodePacked(baseUrl, svgBase64Encoded));
53+
}
2654
}

0 commit comments

Comments
 (0)