Использовать Web3 и Metamask в React

#reactjs #web3 #metamask

#reactjs #web3js (веб-интерфейс) #metamask #web3js

Вопрос:

Я пытаюсь создать свое первое dapp с использованием React. Я не могу понять, как подключиться Web3.js что такое React и как его правильно использовать. Можете ли вы показать, как это сделать правильно?

Возможно, мне следует использовать state.

  import React, { Component } from 'react';
 import Web3 from 'web3';
 import ABI from './web3/ABI'
    
    class App extends Component {

        web3Connection = () => {
                let web3
                if (window.ethereum) {
                    web3 = new Web3(window.ethereum);
                    try {
                        window.ethereum.enable().then(function() {});
                    } catch (e) {}
                } else if (window.web3) {
                    web3 = new Web3(web3.currentProvider);
                } else {
                    alert('You have to install MetaMask !');
                }
    
                web3.eth.defaultAccount = web3.eth.accounts[0];
    
    
                const EthereumNoteContract = web3.eth.contract(ABI);
    
                const EthereumNote = EthereumNoteContract.at('address');
    
            }
    
        addMyNote = (_text) => {
                EthereumNote.addMyNote(_text, { value: 0 }, function(error, result) {
                    if (error) console.log(error);
                    else console.log(result)
                });
            }
    
        render() {
    
            return (
                <div>
                {this.web3Connection}
                <button onClick={this.addMyNote}>Send</button>
                </div>
            )
        }
    }
  

Ответ №1:

Предполагая, что у вас установлено расширение metamask chrome и вы вошли в систему… Также предполагается, что вы установили библиотеку web3…

Вот так:

 import React from 'react';
import Web3 from 'web3'

export default class App extends React.Component {
  state = {account: ''}

  async loadBlockChain() {
    const web3 = new Web3(Web3.givenProvider || 'http://localhost:8080')
    const network = await web3.eth.net.getNetworkType();
    console.log(network) // should give you main if you're connected to the main network via metamask...
    const accounts = await web3.eth.getAccounts()
    this.setState({account: accounts[0]})
  }

  componentDidMount() {
    this.loadBlockChain()
  }
  render() {
    return (
      <div>
        <p>Check out the the console....</p>
        <p>Your account: {this.state.account}</p>
      </div>
    );
  }
}
  

Функционал / Хуки:

 import React, { useState, useEffect } from "react";
import Web3 from "web3";

export default function App() {
  const [account, setAccount] = useState("");

  async function loadBlockChain() {
    const web3 = new Web3(Web3.givenProvider || "http://localhost:8080");
    const network = await web3.eth.net.getNetworkType();
    console.log(network); // should give you main if you're connected to the main network via metamask...
    const accounts = await web3.eth.getAccounts();
    setAccount(accounts[0]);
  }

  useEffect(() => loadBlockChain, []);

  return (
    <div>
      <p>Check out the the console....</p>
      <p>Your account: {account}</p>
    </div>
  );
}
  

Ответ №2:

Вот пример вызова функции, который вы могли бы выполнить в своем проекте React для подключения к Metamask с помощью React:

 export const connectWallet = async () => {
  if (window.ethereum) { //check if Metamask is installed
        try {
            const address = await window.ethereum.enable(); //connect Metamask
            const obj = {
                    connectedStatus: true,
                    status: "",
                    address: address
                }
                return obj;
             
        } catch (error) {
            return {
                connectedStatus: false,
                status: "🦊 Connect to Metamask using the button on the top right."
            }
        }
        
  } else {
        return {
            connectedStatus: false,
            status: "🦊 You must install Metamask into your browser: https://metamask.io/download.html"
        }
      } 
};
  

В этом руководстве по созданию NFT minter с помощью React приведен завершенный пример того, как его использовать и даже подписывать транзакции с помощью Metamask: https://docs.alchemyapi.io/alchemy/tutorials/nft-minter#step-4-connect-metamask-to-your-ui