es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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;
    }
Tags:  , , ,

Answer

  1. Avatar for 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:

    uint256 public totalSupply = 1000; // número total de tokens NFT a acuñar
    uint256 public superSupply = 200;
    uint256 public rareSupply = 300;
    uint256 public commonSupply = 500;
    
    uint256 public superMinted = 0;
    uint256 public rareMinted = 0;
    uint256 public commonMinted = 0;
    
    mapping(uint256 => string) private _tokenURIs;
    
    function safeMint(address to) public onlyOwner {
      require(_tokenIdCounter.current() < totalSupply, "Se han acuñado todos los tokens.");
    
      uint256 randomNumber = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _tokenIdCounter.current())));
    
      if(superMinted < superSupply) {
        _safeMint(to, _tokenIdCounter.current());
        _setTokenURI(_tokenIdCounter.current(), "super_uri");
        _tokenIdCounter.increment();
        superMinted++;
      } else if(rareMinted < rareSupply) {
        _safeMint(to, _tokenIdCounter.current());
        _setTokenURI(_tokenIdCounter.current(), "rare_uri");
        _tokenIdCounter.increment();
        rareMinted++;
      } else if(commonMinted < commonSupply) {
        _safeMint(to, _tokenIdCounter.current());
        _setTokenURI(_tokenIdCounter.current(), "common_uri");
        _tokenIdCounter.increment();
        commonMinted++;
      }
    }
    

    Este código utiliza tres variables superMinted, rareMinted y commonMinted para llevar un registro de cuántos tokens de cada tipo se han acuñado. Cuando se llama a la función safeMint, el código verifica si existen tokens por acuñar. Si se han acuñado menos de 200 tokens super, el código acuña un token super e incrementa superMinted. Si ya se han acuñado 200 tokens super, pero se han acuñado menos de 300 tokens raros, el código acuña un token raro e incrementa rareMinted. Finalmente, si se han acuñado 200 tokens super y 300 tokens raros, pero se han acuñado menos de 500 tokens comunes, el código acuña un token común e incrementa commonMinted. 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, 300 raros y 500 comunes), al mismo tiempo que permite la aleatoriedad en el proceso de acuñación.

Comments are closed.