Created
December 24, 2021 03:11
-
-
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=
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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