Code Snippets
Minting Functions
// Function to mint a standard Lordz NFT
function mintToken(address user, string memory catNum, string memory lrdId) payable external returns (uint256) {
require (msg.value >= bnbMintCost, "Not enough BNB");
require((user == _msgSender() || _msgSender() == owner()), "Reserved function");
require(IERC20(tokenAddr).balanceOf(user) >= lordzMintCost * 10 ** 9, "Not enough $LORDZ");
IERC20(tokenAddr).transferFrom(user, royalAddr, lordzMintCost * 10 ** 9);
uint256 id = totalSupply() + 1;
catalog[id] = catNum;
lordzID[id] = lrdId;
_safeMint(user, id);
_setTokenURI(id, string(abi.encodePacked(catNum, ".json")));
return id;
}
// Function to mint a rare OP Lordz NFT using VRF for randomness
function mintVRFToken(address user, string memory catNum, string memory lrdId) payable external returns (uint256) {
require (msg.value >= bnbVRFCost, "Not enough BNB");
require((user == _msgSender() || _msgSender() == owner()), "Reserved function");
require (!mintLocked[user], "Minting is locked");
require(IERC20(tokenAddr).balanceOf(user) >= lordzVRFCost * 10 ** 9, "Not enough $LORDZ");
IERC20(tokenAddr).transferFrom(user, royalAddr, lordzVRFCost * 10 ** 9);
mintLocked[user] = true;
uint256 id = totalSupply() + 1;
catalog[id] = catNum;
lordzID[id] = lrdId;
bytes32 requestId = getRandomNumber();
rarity[id] = resultVRF;
reqId = requestId;
_safeMint(user, id);
_setTokenURI(id, string(abi.encodePacked(catNum, "a.json")));
return id;
}
Burning Function
// Function to burn a Lordz NFT
function burnToken(uint256 tokenId) external onlyTokenOwner(tokenId) {
_burn(tokenId);
}
Transfer Functions
// Function to safely transfer a Lordz NFT
function safeTransferFrom(address from, address to, uint256 tokenId) public override {
safeTransferFrom(from, to, tokenId, "");
}
// Function to safely transfer a Lordz NFT with data
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
// Function to transfer a Lordz NFT
function transferFrom(address from, address to, uint256 tokenId) public override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
Approval Functions
// Function to approve another address to transfer a specific Lordz NFT
function approve(address to, uint256 tokenId) public override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all");
_approve(to, tokenId);
}
// Function to set or unset the approval of a given operator
function setApprovalForAll(address operator, bool approved) public override {
_setApprovalForAll(_msgSender(), operator, approved);
}
Randomness Functions
// Function to request randomness from the VRF coordinator
function getRandomNumber() internal returns (bytes32 requestId) {
require(LINK.balanceOf(address(this)) >= linkFee, "Not enough LINK");
return requestRandomness(keyHash, linkFee);
}
// Callback function used by VRF Coordinator to fulfill randomness
function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
randomResult = (randomness % 1000);
if (randomResult < aFreq) {
resultVRF = "a";
} else if (randomResult >= aFreq && randomResult < (aFreq + bFreq)) {
resultVRF = "b";
} else if (randomResult >= (aFreq + bFreq) && randomResult < (aFreq + bFreq + cFreq)) {
resultVRF = "c";
} else if (randomResult >= (aFreq + bFreq + cFreq) && randomResult < (aFreq + bFreq + cFreq + dFreq)) {
resultVRF = "d";
} else {
resultVRF = "e";
}
reqId = requestId;
}
Withdrawal Functions
// Function to withdraw all LINK tokens from the contract
function withdrawLink() external onlyOwner {
IERC20 linkContract = IERC20(linkAddr);
linkContract.transfer(_msgSender(), linkContract.balanceOf(address(this)));
}
// Function to withdraw all BNB from the contract
function withdrawBNB() external onlyOwner {
payable(msg.sender).transfer(address(this).balance);
}
// Function to withdraw all BNB from the contract to a specific address
function withdrawBNBto(address addr) external onlyOwner {
payable(addr).transfer(address(this).balance);
}
Ownership Functions
// Function to renounce ownership of the contract
function renounceOwnership() public override onlyOwner {
_transferOwnership(address(0));
}
// Function to transfer ownership of the contract to a new address
function transferOwnership(address newOwner) public override onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
Helper Functions
// Function to set the base URI for token metadata
function setBaseURI(string memory newBaseURI) external onlyOwner {
baseURI = newBaseURI;
}
// Function to set token metadata URI
function setTokenMetadataURI(uint256 tokenId) external onlyTokenOwner(tokenId) {
_setTokenURI(tokenId, string(abi.encodePacked(catalog[tokenId], rarity[tokenId], ".json")));
mintLocked[ownerOf(tokenId)] = false;
}
// Function to set frequencies for random minting
function setFreqs(uint256 a, uint256 b, uint256 c, uint256 d, uint256 e) external onlyOwner {
require((a + b + c + d + e) == 1000, "All values must add up to 1000");
aFreq = a;
bFreq = b;
cFreq = c;
dFreq = d;
eFreq = e;
}
// Function to set the LINK fee for VRF
function setLinkFee(uint256 fee) external onlyOwner {
linkFee = fee;
}
// Function to set the mint cost in LORDZ tokens
function setLordzMintCost(uint256 cost) external onlyOwner {
lordzMintCost = cost;
}
// Function to set the VRF mint cost in LORDZ tokens
function setLordzVRFCost(uint256 cost) external onlyOwner {
lordzVRFCost = cost;
}
// Function to set the mint cost in BNB
function setBnbMintCost(uint256 cost) external onlyOwner {
bnbMintCost = cost;
}
// Function to set the VRF mint cost in BNB
function setBnbVrfCost(uint256 cost) external onlyOwner {
bnbVRFCost = cost;
}
// Function to set the token address for LORDZ
function setTokenAddr(address token) external onlyOwner {
tokenAddr = token;
}
// Function to set the royalty address
function setRoyalAddr(address addr) external onlyOwner {
royalAddr = addr;
}
These snippets highlight the core functionality of the MemeLordz NFT smart contract, ensuring secure and efficient interactions with the NFTs within the ecosystem.
Last updated