125 lines
4.7 KiB
Solidity
125 lines
4.7 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.7;
|
|
|
|
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
|
|
import "@openzeppelin/contracts/access/Ownable.sol";
|
|
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
|
|
contract UsernameNFT is ERC721, Ownable {
|
|
struct NFTMetadata {
|
|
uint256 tokenId;
|
|
string username;
|
|
uint256 salePrice;
|
|
string metadataURI;
|
|
}
|
|
|
|
mapping(string => address) private usernameToOwner;
|
|
mapping(uint256 => string) private tokenIdToUsername;
|
|
mapping(string => NFTMetadata) private nftMetadata;
|
|
address public constant cwnTokenAddress = ;
|
|
IERC20 public cwnToken;
|
|
uint256 public baseMintCost;
|
|
uint256 private nextTokenId;
|
|
|
|
constructor() ERC721("CAW", "tCAW") {
|
|
cwnToken = IERC20(cwnTokenAddress);
|
|
baseMintCost = 0.005 ether;
|
|
nextTokenId = 1;
|
|
}
|
|
event NFTCreated(uint256 indexed tokenId, address indexed owner, string username, uint256 salePrice);
|
|
|
|
function setMintCost(string memory username, uint256 mintCost) external onlyOwner {
|
|
require(usernameToOwner[username] != address(0), "Username does not exist");
|
|
require(mintCost > 0, "Mint cost must be greater than zero");
|
|
nftMetadata[username].salePrice = mintCost;
|
|
}
|
|
|
|
|
|
function createNFT(string memory username, string memory metadataURI, uint256 mintCost) external {
|
|
require(usernameToOwner[username] == address(0), "Username already used");
|
|
require(mintCost > 0, "Mint cost must be greater than zero");
|
|
require(usernameToOwner[username] == address(0), "Username already used");
|
|
|
|
usernameToOwner[username] = msg.sender;
|
|
tokenIdToUsername[nextTokenId] = username;
|
|
|
|
NFTMetadata storage metadata = nftMetadata[username];
|
|
metadata.salePrice = mintCost;
|
|
metadata.metadataURI = metadataURI;
|
|
|
|
_safeMint(msg.sender, nextTokenId);
|
|
emit NFTCreated(nextTokenId, msg.sender, username, mintCost);
|
|
nextTokenId++;
|
|
cwnToken.approve(msg.sender, mintCost);
|
|
cwnToken.transferFrom(msg.sender, address(this), mintCost);
|
|
}
|
|
|
|
function checkUsernameAvailability(string memory username) external view returns (bool) {
|
|
return usernameToOwner[username] == address(0);
|
|
}
|
|
|
|
function sellNFT(uint256 tokenId, uint256 salePrice) external {
|
|
require(_exists(tokenId), "Token ID does not exist");
|
|
require(ownerOf(tokenId) == msg.sender, "Only the owner can sell the NFT");
|
|
require(salePrice > 0, "Sale price must be greater than zero");
|
|
|
|
nftMetadata[tokenIdToUsername[tokenId]].salePrice = salePrice;
|
|
}
|
|
|
|
function buyNFT(uint256 tokenId) external {
|
|
require(_exists(tokenId), "Token ID does not exist");
|
|
require(nftMetadata[tokenIdToUsername[tokenId]].salePrice > 0, "NFT not for sale");
|
|
|
|
address seller = ownerOf(tokenId);
|
|
uint256 salePrice = nftMetadata[tokenIdToUsername[tokenId]].salePrice;
|
|
|
|
cwnToken.transferFrom(msg.sender, seller, salePrice);
|
|
_transfer(seller, msg.sender, tokenId);
|
|
nftMetadata[tokenIdToUsername[tokenId]].salePrice = 0;
|
|
}
|
|
|
|
function getAllNFTs() external view returns (NFTMetadata[] memory) {
|
|
NFTMetadata[] memory allMetadata = new NFTMetadata[](nextTokenId - 1);
|
|
|
|
for (uint256 i = 1; i < nextTokenId; i++) {
|
|
string memory username = tokenIdToUsername[i];
|
|
NFTMetadata memory metadata = nftMetadata[username];
|
|
|
|
metadata.tokenId = i;
|
|
metadata.username = username;
|
|
|
|
allMetadata[i - 1] = metadata;
|
|
}
|
|
|
|
return allMetadata;
|
|
}
|
|
|
|
function tokenURI(uint256 tokenId) public view override returns (string memory) {
|
|
require(_exists(tokenId), "Token ID does not exist");
|
|
string memory username = tokenIdToUsername[tokenId];
|
|
return nftMetadata[username].metadataURI;
|
|
}
|
|
|
|
function getUsername(uint256 tokenId) public view returns (string memory) {
|
|
require(_exists(tokenId), "Token ID does not exist");
|
|
return tokenIdToUsername[tokenId];
|
|
}
|
|
|
|
function getMintCost(string memory username) external view returns (uint256) {
|
|
require(usernameToOwner[username] != address(0), "Username does not exist");
|
|
return nftMetadata[username].salePrice;
|
|
}
|
|
|
|
function getSalePrice(string memory username) external view returns (uint256) {
|
|
require(usernameToOwner[username] != address(0), "Username does not exist");
|
|
return nftMetadata[username].salePrice;
|
|
}
|
|
|
|
function getProfileImageURI(uint256 tokenId) external view returns (string memory) {
|
|
require(_exists(tokenId), "Token ID does not exist");
|
|
string memory username = tokenIdToUsername[tokenId];
|
|
return nftMetadata[username].metadataURI;
|
|
}
|
|
|
|
}
|