Skip to content

Instantly share code, notes, and snippets.

@fxsjy
Created December 24, 2021 03:11
Show Gist options
  • Save fxsjy/6c3ff8ab1b0278ac4edf1aaf2dd8e26f to your computer and use it in GitHub Desktop.
Save fxsjy/6c3ff8ab1b0278ac4edf1aaf2dd8e26f to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.7+commit.e28d00a7.js&optimize=false&runs=200&gist=
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
import "./Erc721.sol";
import "./Utils.sol";
contract WaterMargin is ERC721Enumerable, ReentrancyGuard, Ownable {
mapping(uint256 => string) heroNames;
uint256 lastTokenId;
uint256 seed;
string[] private bigHeros = [
unicode"宋江",
unicode"卢俊义",
unicode"吴用",
unicode"公孙胜",
unicode"关胜",
unicode"林冲",
unicode"秦明",
unicode"呼延灼",
unicode"花荣",
unicode"柴进",
unicode"李应",
unicode"朱仝",
unicode"鲁智深",
unicode"武松",
unicode"董平",
unicode"张清",
unicode"扬志",
unicode"徐宁",
unicode"索超",
unicode"戴宗",
unicode"刘唐",
unicode"李逵",
unicode"史进",
unicode"穆弘",
unicode"雷横",
unicode"李俊",
unicode"阮小二",
unicode"张横",
unicode"阮小五",
unicode"张顺",
unicode"阮小七",
unicode"扬雄",
unicode"石秀",
unicode"解珍",
unicode"解宝",
unicode"燕青",
unicode"朱武",
unicode"黄信",
unicode"孙立",
unicode"宣赞",
unicode"郝思文",
unicode"韩滔",
unicode"彭玘",
unicode"单廷",
unicode"魏定国",
unicode"萧让",
unicode"裴宣",
unicode"欧鹏",
unicode"邓飞",
unicode"燕顺",
unicode"杨林",
unicode"凌振",
unicode"蒋敬",
unicode"吕方",
unicode"郭盛",
unicode"安道全",
unicode"皇甫端",
unicode"王英",
unicode"扈三娘",
unicode"鲍旭",
unicode"樊瑞",
unicode"孔明",
unicode"孔亮",
unicode"项充",
unicode"李衮",
unicode"金大坚",
unicode"马麟",
unicode"童威",
unicode"童猛",
unicode"孟康",
unicode"侯健",
unicode"陈达",
unicode"杨春",
unicode"郑天寿",
unicode"陶宗旺",
unicode"宋清",
unicode"乐和",
unicode"龚旺",
unicode"丁得孙",
unicode"穆春",
unicode"曹正",
unicode"宋万",
unicode"杜迁",
unicode"薛永",
unicode"施恩",
unicode"李忠",
unicode"周通",
unicode"汤隆",
unicode"杜兴",
unicode"邹渊",
unicode"邹润",
unicode"朱贵",
unicode"朱富",
unicode"蔡福",
unicode"蔡庆",
unicode"李立",
unicode"李云",
unicode"焦挺",
unicode"石勇",
unicode"孙新",
unicode"顾大嫂",
unicode"张青",
unicode"孙二娘",
unicode"王定六",
unicode"郁保四",
unicode"白胜",
unicode"时迁",
unicode"段景住"
];
string[] private titles = [
unicode"及时雨",
unicode"玉麒麟",
unicode"智多星",
unicode"入云龙",
unicode"大刀",
unicode"豹子头",
unicode"霹雳火",
unicode"双鞭",
unicode"小李广",
unicode"小旋风",
unicode"扑天雕",
unicode"美髯公",
unicode"花和尚",
unicode"行者",
unicode"双枪将",
unicode"没羽箭",
unicode"青面兽",
unicode"金枪手",
unicode"急先锋",
unicode"神行太保",
unicode"赤发鬼",
unicode"黑旋风",
unicode"九纹龙",
unicode"没遮拦",
unicode"插翅虎",
unicode"混江龙",
unicode"立地太岁",
unicode"船火儿",
unicode"短命二郎",
unicode"浪里白条",
unicode"活阎罗",
unicode"病关索",
unicode"拼命三郎",
unicode"两头蛇",
unicode"双尾蝎",
unicode"浪子",
unicode"神机军师",
unicode"镇三山",
unicode"病尉迟",
unicode"丑郡马",
unicode"井木犴",
unicode"百胜将",
unicode"天目将",
unicode"圣水将",
unicode"神火将",
unicode"圣手书生",
unicode"铁面孔目",
unicode"摩云金翅",
unicode"火眼狻猊",
unicode"锦毛虎",
unicode"锦豹子",
unicode"轰天雷",
unicode"神算子",
unicode"小温侯",
unicode"赛仁贵",
unicode"神医",
unicode"紫髯伯",
unicode"矮脚虎",
unicode"一丈青",
unicode"丧门神",
unicode"混世魔王",
unicode"毛头星",
unicode"独火星",
unicode"八臂哪吒",
unicode"飞天大圣",
unicode"玉臂匠",
unicode"铁笛仙",
unicode"出洞蛟",
unicode"翻江蜃",
unicode"玉幡竿",
unicode"通臂猿",
unicode"跳涧虎",
unicode"白花蛇",
unicode"白面郎君",
unicode"九尾龟",
unicode"铁扇子",
unicode"铁叫子",
unicode"花项虎",
unicode"中箭虎",
unicode"小遮拦",
unicode"操刀鬼",
unicode"云里金刚",
unicode"摸着天",
unicode"病大虫",
unicode"金眼彪",
unicode"打虎将",
unicode"小霸王",
unicode"金钱豹子",
unicode"鬼脸儿",
unicode"出林龙",
unicode"独角龙",
unicode"旱地忽律",
unicode"笑面虎",
unicode"铁臂膊",
unicode"一枝花",
unicode"催命判官",
unicode"青眼虎",
unicode"没面目",
unicode"石将军",
unicode"小尉迟",
unicode"母大虫",
unicode"菜园子",
unicode"母夜叉",
unicode"活闪婆",
unicode"险道神",
unicode"白日鼠",
unicode"鼓上蚤",
unicode"金毛犬"
];
function random(uint upper) private returns (uint256) {
seed = uint256(keccak256(abi.encodePacked(seed,
blockhash(block.number - 1),
block.coinbase,
block.timestamp,
block.difficulty)));
return seed % upper;
}
function mint() public nonReentrant returns (uint256) {
lastTokenId = lastTokenId+1;
uint tokenId = lastTokenId + 108;
uint r1 = random(10);
if (r1 >=7) { // prob: 30%
uint r4 = random(108);
tokenId = r4;
if (bytes(heroNames[tokenId]).length == 0) {
heroNames[tokenId] = string(abi.encodePacked(titles[r4],' ', bigHeros[r4]));
_safeMint(_msgSender(), tokenId);
return tokenId;
}
}
uint r2 = random(108);
uint r3 = random(108);
string memory prefix = Utils.substring(bigHeros[r2],0,3);
string memory suffix = Utils.substring(bigHeros[r3],3,6);
heroNames[tokenId] = string(abi.encodePacked(unicode'好汉 ', prefix,suffix));
_safeMint(_msgSender(), tokenId);
return tokenId;
}
function tokenURI(uint256 tokenId) override public view returns (string memory) {
//require(tokenId <= lastTokenId, "not minted");
require(tokenId >0, "invalid tokenid");
string[4] memory parts;
parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 40px; }</style><rect width="100%" height="100%" fill="blue" /><text x="10" y="50" class="base">';
parts[1] = heroNames[tokenId];
parts[2] = '</text><text x="10" y="80" class="base">';
parts[3] = '</text></svg>';
string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3]));
string memory json = Utils.b64encode(bytes(string(abi.encodePacked('{"name": "Hero #', Utils.uint2str(tokenId), '", "description": "Heros from WaterMargin.", "image": "data:image/svg+xml;base64,', Utils.b64encode(bytes(output)), '"}'))));
output = string(abi.encodePacked('data:application/json;base64,', json));
return output;
}
constructor() ERC721("WaterMargin", "WATER") Ownable() {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment