Skip to content

Instantly share code, notes, and snippets.

Created December 23, 2021 03:37
What would you like to do?
//SPDX-License-Identifier: MIT
pragma solidity 0.8.3;
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import { Base64 } from "./libraries/Base64.sol";
contract EternalNFT is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenId;
string public collectionName;
string public collectionSymbol;
string baseSvg = "<svg xmlns='' preserveAspectRatio='xMinYMin meet' viewBox='0 0 350 350'><style>.base { fill: white; font-family: serif; font-size: 24px; }</style><rect width='100%' height='100%' fill='black' /><text x='50%' y='50%' class='base' dominant-baseline='middle' text-anchor='middle'>";
string[] element = [
string[] weapon = [
string[] rank = [
constructor() ERC721("EternalNFT", "ENFT") {
collectionName = name();
collectionSymbol = symbol();
function random(string memory _input) internal pure returns(uint256) {
return uint256(keccak256(abi.encodePacked(_input)));
function pickFirstWord(uint256 tokenId) public view returns(string memory) {
uint256 rand = random(string(abi.encodePacked("element", Strings.toString(tokenId))));
rand = rand % element.length;
return element[rand];
function pickSecondWord(uint256 tokenId) public view returns(string memory) {
uint256 rand = random(string(abi.encodePacked("weapon", Strings.toString(tokenId))));
rand = rand % weapon.length;
return weapon[rand];
function pickThirdWord(uint256 tokenId) public view returns(string memory) {
uint256 rand = random(string(abi.encodePacked("rank", Strings.toString(tokenId))));
rand = rand % rank.length;
return rank[rand];
function createEternalNFT() public returns(uint256) {
uint256 newItemId = _tokenId.current();
string memory first = pickFirstWord(newItemId);
string memory second = pickSecondWord(newItemId);
string memory third = pickThirdWord(newItemId);
string memory combinedWord = string(abi.encodePacked(first,second,third));
string memory finalSvg = string(abi.encodePacked(baseSvg, first, second, third, "</text></svg>"));
string memory json = Base64.encode(
'{"name": "',
'", "description": "A highly acclaimed collection Eternal Warriors", "image": "data:image/svg+xml;base64,',
string memory finalTokenURI = string(abi.encodePacked(
"data:application/json;base64,", json
_safeMint(msg.sender, newItemId);
_setTokenURI(newItemId, finalTokenURI);
return newItemId;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment