forked from camohe90/platziretoDNFT
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DNFTMOD.sol
132 lines (117 loc) · 4.11 KB
/
DNFTMOD.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//Begin
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import "@chainlink/contracts/src/v0.8/KeeperCompatible.sol";
import "@openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/[email protected]/utils/Counters.sol";
contract keeperFlower is ERC721, ERC721URIStorage, KeeperCompatibleInterface {
using Counters for Counters.Counter;
Counters.Counter public tokenIdCounter;
// Metadata information for each stage of the NFT on IPFS.
string[] IpfsUri = [
"https://gateway.pinata.cloud/ipfs/QmUjsN7bi1fcM8PuG6Le54TSpT1wybWiumi3qpWRSmUiAt",
"https://gateway.pinata.cloud/ipfs/QmWeTqcD8AJ33SzxdfAhJ8F9hKBfkQUjFGjobe4pRpa1Ph",
"https://gateway.pinata.cloud/ipfs/QmbLQwmLYBzpj1vnZ2B2VR3GrWJHmWvr8PVBFUfuvz8nfv",
"https://gateway.pinata.cloud/ipfs/Qmdeswyj5LMiQ1D5nTH5rmiaSJevsRpATr1pPp6KhEKy2z",
"https://gateway.pinata.cloud/ipfs/QmZptQrt2mo2tucRdN7AycuTfKiWgPQHTSjSqVvYxEmp9f"
];
uint256 lastTimeStamp;
uint256 interval;
constructor(uint _interval) ERC721("DinamicNFT", "GRN") {
interval = _interval;
lastTimeStamp = block.timestamp;
}
function checkUpkeep(
bytes calldata /* checkData */
)
external
view
override
returns (
bool upkeepNeeded,
bytes memory /* performData */
)
{
uint256 tokenId = tokenIdCounter.current() - 1;
bool done;
if (flowerStage(tokenId) >= 4) {
done = true;
}
upkeepNeeded = !done && ((block.timestamp - lastTimeStamp) > interval);
// We don't use the checkData in this example. The checkData is defined when the Upkeep was registered.
}
function performUpkeep(
bytes calldata /* performData */
) external override {
//We highly recommend revalidating the upkeep in the performUpkeep function
if ((block.timestamp - lastTimeStamp) > interval) {
lastTimeStamp = block.timestamp;
uint256 tokenId = tokenIdCounter.current() - 1;
growFlower(tokenId);
}
// We don't use the performData in this example. The performData is generated by the Keeper's call to your checkUpkeep function
}
function safeMint(address to) public {
uint256 tokenId = tokenIdCounter.current();
tokenIdCounter.increment();
_safeMint(to, tokenId);
_setTokenURI(tokenId, IpfsUri[0]);
}
function growFlower(uint256 _tokenId) public {
if (flowerStage(_tokenId) >= 4) {
return;
}
// Get the current stage of the flower and add 1
uint256 newVal = flowerStage(_tokenId) + 1;
// store the new URI
string memory newUri = IpfsUri[newVal];
// Update the URI
_setTokenURI(_tokenId, newUri);
}
// determine the stage of the flower growth
function flowerStage(uint256 _tokenId) public view returns (uint256) {
string memory _uri = tokenURI(_tokenId);
// Seed
if (compareStrings(_uri, IpfsUri[0])) {
return 0;
}
// Sprout
if (compareStrings(_uri, IpfsUri[1])) {
return 1;
}
if (compareStrings(_uri, IpfsUri[2])) {
return 2;
}
if (compareStrings(_uri, IpfsUri[3])) {
return 3;
}
// Must be a Bloom
return 4;
}
// helper function to compare strings
function compareStrings(string memory a, string memory b)
public
pure
returns (bool)
{
return (keccak256(abi.encodePacked((a))) ==
keccak256(abi.encodePacked((b))));
}
// The following functions is an override required by Solidity.
function _burn(uint256 tokenId)
internal
override(ERC721, ERC721URIStorage)
{
super._burn(tokenId);
}
// The following functions is an override required by Solidity.
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
}
//End