Metamask fordert den Benutzer NICHT auf, an den Vertrag zu senden

Ich kann Merchant.buy anrufen und erhalte einen Erfolgsrückruf und sehe die Transaktion in meinem Ganache-Cli-Protokoll. Der Benutzer wurde nie aufgefordert.

Ich verwende Brave + Metamask und verweise auf das lokale Netzwerk.

Erwartetes Verhalten: Beim Aufruf von .send fordert Metamask den Benutzer auf.

class Merchant {
  static load() {
    if (typeof window.web3 !== 'undefined') {
      window.web3 = new Web3(Web3.currentProvider);
      console.log("Current provider" + Web3.currentProvider);
      if (!Web3.currentProvider) {
        window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
      }
      console.log("web3 is" + window.web3);
    } else {
      window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
      console.log("New web3 is" + window.web3);
    }

    let c = new window.web3.eth.Contract(Merchant.abi(), Merchant.address());
    Merchant.contract = c;
    console.log("Loaded contract" + Merchant.contract);

    window.web3.eth.getAccounts().then(function(a,b) {
      Merchant.accounts = a;
      console.log("Merchant accounts: " + Merchant.accounts);
    });
  }

  static buy(amount) {
    console.log("buying amount is" + amount);
    let accounts = Merchant.accounts;
    let c = Merchant.contract;

    let account = accounts[0];
    let buyParams = {from: account,value: amount};

    let v = c.methods.buyKey().send(buyParams);
    v.then(function(a,b) {
      console.log("Bought successfully result" + (a));
    });  
  }

Antworten (1)

Web3.currentProvidersein sollte web3.currentProvider(Kleinbuchstabe W).

Ich denke, was passiert, ist, dass es Web3.currentProvidernicht existiert, also greifen Sie auf eine direkte Verbindung zu localhost ( ganache-cli) zurück und verwenden MetaMask überhaupt nicht.

Hey, wirklich guter Fang. So habe ich es importiert: import Web3 from 'web3';
Oh, du hast Recht! Es erstellt ein neues ... ok, wie soll ich es dann initieren? Es sollte keine Rolle spielen, ob ich es als web3 oder Web3 importiere
MetaMask fügt die Variable bei ein window.web3, also müssen Sie verwenden window.web3.currentProvider.
(Die Großschreibung spielt also eine Rolle, da es nicht an Ihnen liegt. MetaMask verwendet ein kleines W.)
Ja, das sehe ich jetzt. Danke. Ich habe den Fehler gemacht, mit node zu importieren und DANN nach web3 zu suchen
Wenn ich verstehe, was Sie richtig machen, sollte das Importieren zuerst in Ordnung sein, solange Sie nicht überschreiben window.web3, was nicht so aussieht, als würden Sie es tun. (Sie verwenden Web3, was die Norm ist.)
Ah, Danke. Ich denke, mein Anwendungsfall ist, dass ich Metamask benötige, um auf die Brieftasche zuzugreifen. Gibt es einen Grund, warum ein Entwickler sein eigenes Web3 verwenden möchte, ohne sich mit Metamask zu verbinden?
Nun, wenn Sie nicht im Browser liefen, könnten Sie MetaMask nicht verwenden. Wenn Sie im Nebel laufen würden, würden Sie das stattdessen verwenden. Wenn Sie nur Daten aus der Blockchain lesen müssen, können Sie sich einfach direkt mit einem öffentlichen Knoten verbinden (einen, den Sie betreiben oder einen, der von einem Drittanbieter bereitgestellt wird). Und es gibt wahrscheinlich andere Lösungen (z. B. auf Mobilgeräten), die nicht auf MetaMask angewiesen sind.