J'ai déployé mon contrat ERC721 sur Rinkeby TestNet. Le contrat a été déployé avec succès. Je ne parviens pas à appeler des transactions avec MetaMask. J'ai passé toute la journée à chercher à résoudre ce problème. J'ai trouvé des réponses indiquant que le problème avec les fichiers hébergés localement ou que web3.js ne fonctionne pas avec MetaMask.
<script> if (typeof web3 != 'undefined') { web3 = new Web3(web3.currentProvider) // what Metamask injected console.log("existing web3: provider " + typeof web3); } else { // Instantiate and set Ganache as your provider web3 = new Web3(new Web3.providers.HttpProvider("https://rinkeby.infura.io/v3/api-key")); console.log("new provider " + web3); web3.eth.defaultAccount = web3.eth.accounts[0] } // The interface definition for your smart contract (the ABI) var StarNotary = web3.eth.contract( [contract-abi] ) const starNotary = StarNotary.at('0x7cfAD6E80D992599d989166aABf536b21215544C') function claimStar() { web3.eth.getAccounts(function(error, accounts) { if (error) { hotsnackbar(false, error); return }
Erreur non interceptée: adresse non valide à u (web3.min.js: 1) à inputTransactionFormatter (web3.min.js: 1) sur web3.min.js: 1 à Array.map () à i.formatInput (web3.min.js: 1) à i.toPayload (web3.min.js: 1) à _.e [comme sendTransaction] (web3.min.js: 1) à c.sendTransaction (web3.min.js: 1) à index.html: 589 sur web3.min.js: 1
3 Réponses :
Voici une démo complète qui comprend les étapes d'introduction comme l'autorisation du contrat MetaMask et plus encore.
https://fulldecent.github.io/spend-ERC20-create-ERC721/
Voici le code particulier qui vous intéressera: p >
https: //github.com/fulldecent/spend-ERC20-create-ERC721/blob/master/docs/index.html#L102-L114
try { await ethereum.enable(); $('#need-enable').hide(); } catch (error) { console.log("ERROR: Enable account access and reload."); return; }
if (window.ethereum) { window.web3 = new Web3(ethereum); $('#need-metamask').hide(); } else { console.log('Non-Ethereum browser detected. Install MetaMask.'); return; } window.web3.version.getNetwork((err, netId) => { if (netId == "3") { $('#need-ropsten').hide(); } });
Ce qui précède concerne les pages spécifiques à MetaMask. Je n'ai pas encore de réponse plus portable qui soit également sur Opera et d'autres navigateurs avec Web3 intégré. Il y a un problème et une prime en espèces pour cela ici github.com/su-squares/tenthousandsu.com/issues/3
J'ai moi aussi eu le même problème en travaillant sur un DApp avec Rinkeby testnet avec Metamask.
Quand j'ai eu mon fichier web3.js
comme ci-dessous
import Web3 from 'web3'; let web3; if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') { // We are in the browser and metamask is running. //Note: change to window.web3.currentProvider.enable() web3 = new Web3(window.web3.currentProvider.enable()); } else { // We are on the server *OR* the user is not running metamask const provider = new Web3.providers.HttpProvider( 'Infura API' ); web3 = new Web3(provider); //window.web3.currentProvider.enable(); } export default web3;
et quand je cours
npm start
ou npm run dev
(dépend de votre script de démarrage)
Le navigateur émettait une erreur disant "erreur non interceptée: aucune adresse 'de' spécifiée "
Lorsque j'ai ouvert la console du navigateur et effectué web.currentProvider
, la même erreur s'est produite.
Donc, une chose est claire: Metamask n'entre pas en contact avec le navigateur.
Ce que j'ai fait, c'est
J'ai gardé le navigateur activé avec Metamask connecté. Et changé le web3.js en alors que le serveur s'exécutait sur l'invite de commande et sauvegardait le fichier.
import Web3 from 'web3'; let web3; if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') { // We are in the browser and metamask is running. web3 = new Web3(window.web3.currentProvider); } else { // We are on the server *OR* the user is not running metamask const provider = new Web3.providers.HttpProvider( 'Infura API key' ); web3 = new Web3(provider); //window.web3.currentProvider.enable(); } export default web3;
Dès que vous enregistrez le fichier Le Metamask vous envoie une invite indiquant qu'il souhaite se connecter à partir de votre compte.
Cliquez sur Oui.
et supprimez le .enable () du code ci-dessus et enregistrez votre code.
Cela peut être une solution temporaire, mais oui, cela fonctionne!
Fichier web3.js
import Web3 from 'web3'; let provider; // if on server or browser if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') { // we are in browser and metamask present provider = window.web3.currentProvider; } else { // we are on server OR metamask not present provider = new Web3.providers.HttpProvider( 'https://rinkeby.infura.io/v3/API_KEY' ); } const web3 = new Web3(provider); export default web3;
Ne mettez pas de nouveau Web3 () dans le bloc if lui-même. Après avoir hébergé (localement ou sur le serveur), ouvrez Paramètres de méta-masque -> Connexions et ajoutez votre site pour donner accès au méta-masque. A parfaitement fonctionné pour moi après avoir passé des jours derrière des erreurs de méta-masque et Web3!
Êtes-vous sûr qu'il s'agit de
https://rinkeby.infura.io/v3/api-key
?C'est un lien infura
Essayez ce lien:
https://rinkeby.infura.io/
Oui, j'ai fait la même chose. Je viens de supprimer la clé API pour la publication ici.