-
Notifications
You must be signed in to change notification settings - Fork 1
/
marketMint.sol
271 lines (245 loc) · 13 KB
/
marketMint.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
//*~~~> SPDX-License-Identifier: MIT make it better, stronger, faster
/*~~~>
Thank you Phunks for your inspiration and phriendship.
Never stop phighting, never surrender, always stand up for what is right and make the best of all situations towards all people.
Phunks are phreedom phighters!
"When the power of love overcomes the love of power the world will know peace." - Jimi Hendrix <3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((((((((((((((((((((((@@@@@##############################%%%%%@@@@@((((((((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((((((((((((((((((((((@@@@@##############################%%%%%@@@@@((((((((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((@@@@@########################################%%%%%@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((@@@@@########################################%%%%%@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###############@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###############@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@@@@##########@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((@@PhunkyJON was here programming trustless unstoppable contracts@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@/////////////////////////////////////////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@/////////////////////////////////////////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@#PHUNKYJON///////////////#PHUNKYJON//////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@#PHUNKYJON///////////////#PHUNKYJON//////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@/////@EYES////////////////////@EYES///////////////@@@@@((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@/////@EYES////////////////////@EYES///////////////EAR@@((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@//////////////////////////////////////////////////EAR@@((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@//////////////////////////////////////////////////EAR@@((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@/////////////////////////////////////////////@@@@@@@@@@((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@/////////////////////////////////////////////@@@@@@@@@@((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@//////////NOSE@NOSE@////////////////////#####@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((SMOKE((((((((((@@@@@//////////NOSE@NOSE@////////////////////#####@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((@@@@@#####//////////////////////////////##########@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((@@@@@#####//////////////////////////////##########@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((@SPLIFF@SPLIFF@SPLIFF@SPLIFF@@###################################@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((@SPLIFF@SPLIFF@SPLIFF@SPLIFF@@###################################@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((EMBER(((((,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@MOUTH&&&&&####################@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((EMBER(((((,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@MOUTH&&&&&####################@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((@SPLIFF@SPLIFF@SPLIFF@SPLIFF@@##############################/////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((@SPLIFF@SPLIFF@SPLIFF@SPLIFF@@##############################/////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((((((((((((((((((((((@@@@@##############################//////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%(((((((((((((((((((((((((((((((((((@@@@@##############################//////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@///////////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@@@@@@///////////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((@@@@@///////////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((@@@@@///////////////@@@@@(((((((((((((((((((((((((%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@@@@///////////////@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@@@@///////////////@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<~~~*/
pragma solidity 0.8.7;
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "./interfaces/IRoleProvider.sol";
import "./interfaces/IRewardsController.sol";
interface MarketNFT {
function safeMint(address to, uint _tokenId) external;
}
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract Mint is ReentrancyGuard {
/*~~~>
State variables
<~~~*/
uint public eRC20Count;
uint public nftsRedeemed;
uint public nftsRemaining;
uint[] public availableNfts;
uint[] public tokensClaimed;
address public roleAdd;
bytes32 public constant NFTADD = keccak256("NFT");
bytes32 public constant REWARDS = keccak256("REWARDS");
//*~~~> Marketplace NFT that can be used to claim rewards and act as a DAO
struct NFT {
uint tokenId;
address contractAddress;
address redeemerAddress;
}
//*~~~> Tokens redeemed to create Marketplace NFTs
struct RedemptionToken {
uint redeemAmount;
address contractAddress;
}
//*~~~> Roles for designated accessibility
bytes32 public constant PROXY_ROLE = keccak256("PROXY_ROLE");
bytes32 public constant DEV = keccak256("DEV");
modifier hasAdmin(){
require(IRoleProvider(roleAdd).hasTheRole(PROXY_ROLE, msg.sender), "DOES NOT HAVE ADMIN ROLE");
_;
}
modifier hasDevAdmin(){
require(IRoleProvider(roleAdd).hasTheRole(DEV, msg.sender), "DOES NOT HAVE DEV ROLE");
_;
}
constructor(address role) {
roleAdd = role;
nftsRedeemed = 0;
eRC20Count=0;
}
//*~~~> Memory mappings
mapping (uint256 => NFT) private _idToNft;
mapping (uint256 => RedemptionToken) private _idToRedemption;
mapping (address => uint) private _indexToRedemptionToken;
// Event declaration
event nftClaimed(uint nftId, uint redeemId, address creator);
event RedeemTokenSet(address contractAddress, uint amount);
/// @notice
/*~~~>
Function for re - setting the redemption token details
<~~~*/
/// @dev
/*~~~>
uint _redeemAmount: Amount needed to redeem a NFT;
address _contract: address of the redemption token;
<~~~*/
function resetRedemptionToken(uint redeemAmount, address contractAdd) external hasAdmin returns(bool){
uint index = _indexToRedemptionToken[contractAdd];
_idToRedemption[index] = RedemptionToken(redeemAmount, contractAdd);
emit RedeemTokenSet(contractAdd, redeemAmount);
return true;
}
/// @notice
/*~~~> Function for setting new redemption tokens <~~~*/
/// @dev
/*~~~>
uint _redeemAmount: amount needed to redeem for creating new NFTs;
address _contract: address for the token;
<~~~*/
/// @return Bool
function setNewRedemption(uint redeemAmount, address contractAdd) external hasAdmin returns(bool){
eRC20Count+=1;
uint id = eRC20Count;
_idToRedemption[id] = RedemptionToken(redeemAmount, contractAdd);
emit RedeemTokenSet(contractAdd, redeemAmount);
return true;
}
/// @notice
//*~~~> For updating the total NFT count
///@dev
//*~~~> uint totalCount: total count of NFTs
event NFTCountAdded(uint);
function setNftCount(uint totalCount) public hasDevAdmin returns(bool){
nftsRemaining = totalCount;
emit NFTCountAdded(totalCount);
return true;
}
/// @notice
/*~~~>
Public interaction function for redeeming new NFTs by exchanging Tokens
<~~~*/
/// @dev
/*~~~>
uint redeemId: index to the redemption token structure
<~~~*/
/// @return Bool
function redeemForNft(uint redeemId) external returns(bool){
// Being in contract addresses
address rewardsAddress = IRoleProvider(roleAdd).fetchAddress(REWARDS);
address nftAddress = IRoleProvider(roleAdd).fetchAddress(NFTADD);
/// Bring in token Interface
RedemptionToken memory token = _idToRedemption[redeemId];
IERC20 tokenContract = IERC20(token.contractAddress);
/// Check allowance
uint256 allowance = tokenContract.allowance(msg.sender, address(this));
require(allowance >= token.redeemAmount, "Check the token allowance");
/// Execute transfer to rewards contract
require(tokenContract.transferFrom(msg.sender, rewardsAddress, token.redeemAmount));
require(IRewardsController(rewardsAddress).depositERC20Rewards(token.redeemAmount, token.contractAddress));
/// Increment internal count
nftsRedeemed+=1;
uint256 nftId = nftsRedeemed;
MarketNFT(nftAddress).safeMint(msg.sender, nftId);
_idToNft[nftId] = NFT(nftId, nftAddress, msg.sender);
require(IRewardsController(rewardsAddress).createNftHodler(nftId));
emit nftClaimed(nftId, redeemId, msg.sender);
return true;
}
/// @notice
/*~~~>
Internal function for sending ether
<~~~*/
/// @return Bool
function sendEther(address recipient, uint ethvalue) internal nonReentrant returns (bool){
(bool success, bytes memory data) = address(recipient).call{value: ethvalue}("");
return(success);
}
/// @notice
/*~~~>
Functions for retrieving memory items
<~~~*/
function fetchRedemptionTokens() external view returns (RedemptionToken[] memory) {
uint itemCount = eRC20Count;
RedemptionToken[] memory tokens = new RedemptionToken[](itemCount);
uint currentIndex;
for (uint i=0; i < itemCount; i++) {
RedemptionToken storage currentItem = _idToRedemption[i + 1];
tokens[currentIndex] = currentItem;
currentIndex++;
}
return tokens;
}
function fetchNFTsCreated() external view returns (NFT[] memory) {
uint itemCount = nftsRedeemed;
NFT[] memory nfts = new NFT[](itemCount);
uint currentIndex;
for (uint i=0; i < itemCount; i++) {
NFT storage currentItem = _idToNft[i+1];
nfts[i] = currentItem;
currentIndex++;
}
return nfts;
}
function fetchNFTsCreatedCount() external view returns (uint) {
return nftsRedeemed;
}
//*~~~> Fallback functions
///@notice
/*~~~> External ETH transfer forwarded to role provider contract <~~~*/
receive() external payable {
require(sendEther(roleAdd, msg.value));
}
function onERC1155Received(address, address, uint256, uint256, bytes memory) external virtual returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external pure returns(bytes4) {
return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));
}
}