¿Cómo generar aleatoriamente un número estático de NFT?
Me gustaría crear esta cantidad de tokens:
200 super
300 rare
500 común
Pero el proceso de creación de tokens debe ser aleatorio, se puede obtener un (super, rare, o común), pero al final del proceso, se deben crear la misma cantidad de 200 super, 300 rare y 500 común.
El siguiente código realiza la aleatoriedad, pero la cantidad final de tokens será diferente al comienzo:
function safeMint(address to) public onlyOwner {
require(_tokenIdCounter.current() < totalSupply(), "No hay tokens para crear.");
require(mintCnt[msg.sender] < maxMintCntPerAddress, "Una dirección solo puede crear 1 ticket.");
if(mintPrice > 0) {
require(mintPrice == msg.value, "El precio para crear no es correcto.");
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;
}
davy.ai
Para garantizar que la cantidad final de tokens acuñados siga las proporciones especificadas de 200 tokens super, 300 raros y 500 comunes, es necesario ajustar el proceso de acuñación. En lugar de seleccionar un token aleatorio de la lista de tokens disponibles, el proceso puede dividirse en tres etapas, cada una para acuñar un tipo específico de token.
Aquí hay un ejemplo de código que implementa este enfoque:
Este código utiliza tres variables
superMinted
,rareMinted
ycommonMinted
para llevar un registro de cuántos tokens de cada tipo se han acuñado. Cuando se llama a la funciónsafeMint
, el código verifica si existen tokens por acuñar. Si se han acuñado menos de 200 tokenssuper
, el código acuña un tokensuper
e incrementasuperMinted
. Si ya se han acuñado 200 tokenssuper
, pero se han acuñado menos de 300 tokensraros
, el código acuña un tokenraro
e incrementarareMinted
. Finalmente, si se han acuñado 200 tokenssuper
y 300 tokensraros
, pero se han acuñado menos de 500 tokenscomunes
, el código acuña un tokencomún
e incrementacommonMinted
. Si se han acuñado todos los tokens, la función no acuñará más tokens.Este enfoque garantiza que la cantidad final de tokens sea la prevista (200
super
, 300raros
y 500comunes
), al mismo tiempo que permite la aleatoriedad en el proceso de acuñación.