socialfi/contract/NFT-mint.sol
2025-12-18 00:05:55 +09:00

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;
}
}