[英]How to random mint a static number of NFT?
我想鑄造這些數量的代幣:
200 超 300 稀有 500 普通
但是鑄造過程需要是隨機的,你可以得到一個(超級、稀有或普通),但在過程結束時,應該鑄造相同數量的 200 超級、300 稀有和 500 普通。
以下代碼是隨機的,但最終的令牌數量將與一開始不同:
function safeMint(address to) public onlyOwner {
require(_tokenIdCounter.current() < totalSupply(), "There's no token to mint.");
require(mintCnt[msg.sender] < maxMintCntPerAddress, "One address can mint 1 tickets.");
if(mintPrice > 0) {
require(mintPrice == msg.value, "Mint price is not correct.");
address payable _to = payable(serviceAddress);
_to.transfer(mintPrice);
}
uint randomNumber = random(expectedTokenSupply - _tokenIdCounter.current());
for (uint256 i = 0; i < _tokenMetadata.length; i++) {
if(_tokenMetadata[i].amount <= randomNumber) {
_safeMint(to, _tokenIdCounter.current());
_setTokenURI(_tokenIdCounter.current(), _tokenMetadata[i].uri);
_tokenIdCounter.increment();
break;
}
}
}
function random(uint maxValue) internal returns (uint) {
return uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, _tokenIdCounter.current()))) % maxValue;
}
首先不要使用 block.timestamp 或任何區塊或區塊鏈數據作為隨機性來源,因為它會導致“隨機性”可預測或可能被礦工操縱,嘗試使用 chainlink 作為隨機性來源,他們有他們的文檔中有很好的例子,如果你想固定供應每種類型的代幣,你可以有 3 個變量來了解每種代幣的鑄造量,以及何時獲得隨機數和你需要的所有東西應用一些數學運算,在這種情況下,您希望代幣是超級代幣的 20%,稀有代幣 30% 和普通代幣 50%,您只需要進行數學運算來決定將鑄造哪個代幣,以防萬一該類型已經達到最大供應量會發生什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.