Tout d'abord, afin de faciliter la compréhension du problème, je ne conserverai que les fonctions les plus utiles à la compréhension du problème. Ce code permet de créer des NFT dans un tableau, où le premier NFT a un idToken de 0. Lorsque je clique sur le bouton "Obtenir les données du contrat", je souhaite transmettre le paramètre 0 à la fonction JavaScript readContract (tokenid) pour afficher la valeur Power, un fichier HTML uint8 (généré aléatoirement, valeur de 0 à 100). Malheureusement, j'ai rencontré un bug et j'ai essayé différentes manières de le résoudre sans succès. Le contrat et JavaScript sont correctement connectés (comme en témoigne la fonction connectContract(), qui en est une vérification), donc l'ABI et l'adresse ne font pas partie du problème. La fonction readContract() est censée utiliser la méthode getNFTPower écrite dans le contrat Solidity, mais quelque chose ne va pas : la valeur de retour n'est pas valide. Mais pour moi, ils le sont haha… J'ai également essayé d'insérer des instructions console.log dans la fonction readContract() avant et après la première ligne de code : const power = attendre window.contract.methods.getNFTPower(tokenId).call(); Je ne vois aucune sortie console.log après cette instruction, donc le problème semble se produire là-bas.
J'espère que quelqu'un pourra me donner un indice..Merci.La capture d'écran d'erreur ci-dessous
Partie du code ci-dessous.
CODE SOLIDITÉ
contract NFTGame is ERC721, Ownable { using SafeMath for uint256; address public erc20TokenAddress; struct NFTAttributes { uint8 power; bool inArena; } NFTAttributes[] public nfts; constructor(address _erc20TokenAddress) ERC721(FightArena, FIGA) payable { erc20TokenAddress = _erc20TokenAddress; } function createNFT() external { uint8 power = uint8(uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender))) % 101); Random number da 0 a 100 nfts.push(NFTAttributes(power, false)); uint256 tokenId = nfts.length - 1; _mint(msg.sender, tokenId); } function getNFTPower(uint256 tokenId) public view returns (uint8) { require(_exists(tokenId), ID del token non valido); return uint8(nfts[tokenId].power); } }
HTML/JS
... <head> ... <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/web3/1.2.7-rc.0/web3.min.js"></script> ... </head> ... <body> <button onclick="connectMetamask()">CONNECT METAMASK</button> <br> <p id="accountArea"></p> <button onclick="connectContract()">CONNECT TO CONTRACT</button> <br> <p id="contractArea"></p> <button onclick="readContract(0)">GET DATA FROM CONTRACT</button> <br> <p id="dataArea"></p> // 0 is the first NFT minted by the function createNFT() ... </body> ... <script> ... const readContract = async (tokenId) => { const power = await window.contract.methods.getNFTPower(tokenId).call(); const powerString = power.toString(); document.getElementById("dataArea").innerHTML = "Power of NFT " + tokenId + ": " + powerString; } ... </script> ...J'ai essayé de réécrire la fonction readContract() de différentes manières, mais cela n'a pas aidé. Mon objectif est de cliquer sur le bouton "Obtenir les données du contrat" et d'afficher la valeur POWER du tokenId du NFT que je passe en paramètre (dans le code ci-dessus, le premier NFT, tokenId = 0).
Il y a deux raisons les plus courantes :