Метамаска Reactjs — Вызов определенной функции из моего смарт-контракта

#reactjs #blockchain #smartcontracts #web3 #metamask

Вопрос:

Я создал веб-сайт reactjs и реализовал подключение к нему Metamask. Я хочу вызвать функцию моего смарт-контракта, чтобы получить количество токенов, которые у меня есть. Я не уверен, как это сделать, учитывая структуру моего приложения react.

 Src ---- Containers ---- Home 
                    ---- Page2 after Metamask connection (where I need to write the result of contract call)
                    ---- Layout (Footer and Navbar for Home and Page2)
 

Поскольку у меня есть кнопка подключения на панели навигации, все подключения web3, metamask находятся в моем Nabvbar.js
Вот код. Как мне вызвать свой конкретный смарт-контракт (с адресом моего контракта), чтобы получить баланс токена, и результат появится на моей странице 2?

 import { useEffect, useState } from 'react';
import { useHistory } from "react-router-dom";
import { Container, Image, Navbar, Nav } from 'react-bootstrap';

import Web3 from 'web3';
import Web3Modal from "web3modal";
import WalletConnectProvider from "@walletconnect/web3-provider";
import Fortmatic from "fortmatic";
import Torus from "@toruslabs/torus-embed";
import Authereum from "authereum";

import { Link, scroller } from "react-scroll";

const Navigation = () => {
    const history = useHistory();
    const [ walletAddress, setWalletAddress ] = useState("");
    const [ showWalletAddress, setShowWalletAddress ] = useState(false);
    const [ navBarShrink, setNavbarShrink ] = useState(false);
    
    const providerOptions = {
        walletconnect: {
          package: WalletConnectProvider,
          options: {
            infuraId: "27e484dcd9e3efcfd25a83a78777cdf1",
            qrcodeModalOptions: {
                mobileLinks: [
                  "rainbow",
                  "metamask",
                  "argent",
                  "trust",
                  "imtoken",
                  "pillar",
                ],
                desktopLinks: [
                  "encrypted ink",
                ]
            }
          }
        },
        torus: {
          package: Torus
        },
        authereum: {
          package: Authereum
        }
    };
      
      const web3Modal = new Web3Modal({
        network: "mainnet", 
        cacheProvider: true, 
        providerOptions
    });
    
      const [walletInfo, setWalletInfo] = useState({
        address: '',
        chainId: 0,
        networkId: 0,
        web3: '',
        provider: '',
        connected: false
    });

    const connect = async () => {
        const provider  = await web3Modal.connect();
        const web3      = getWeb3(provider);
        const accounts  = await web3.eth.getAccounts();
        const address   = accounts[0];
        const networkId = await web3.eth.net.getId();
        const chainId   = await web3.eth.chainId();

        setWalletInfo((prevStatus) => ({
            ...prevStatus,
            address: address,
            chainId: chainId,
            networkId: networkId,
            web3: web3,
            provider: provider,
            connected: true
        }));
        
        if (!provider.on) {
        return;
        }

        provider.on("close", () => resetWallet());

        provider.on("accountsChanged", async (accounts) => {
            setWalletInfo((prevStatus) => ({
                ...prevStatus,
                address: accounts[0]
            }));
        });

        provider.on("chainChanged", async (chainId) => {
            const networkId = await web3.eth.net.getId();
            setWalletInfo((prevStatus) => ({
                ...prevStatus,
                chainId: chainId,
                networkId: networkId
            }));
        });

        provider.on("networkChanged", async (networkId) => {
            setWalletInfo((prevStatus) => ({
                ...prevStatus,
                networkId: networkId
            }));
        });

        if(address) {
            const wallet_txt = getShortText(address);
            setWalletAddress(wallet_txt);
            setShowWalletAddress(true);
            history.push("/default");
        } else {
            setShowWalletAddress(false);
        }
    }

    const getWeb3 = (provider) => {
        const web3 = new Web3(provider);
      
        web3.eth.extend({
          methods: [
            {
              name: "chainId",
              call: "eth_chainId",
              outputFormatter: web3.utils.hexToNumber
            }
          ]
        });
    
        return web3;
    }
    
    const resetWallet = async () => {
        const web3 = walletInfo.web3;
        if (web3 amp;amp; web3.currentProvider amp;amp; web3.currentProvider.close) {
          await web3.currentProvider.close();
        }
        await web3Modal.clearCachedProvider();
        
        setWalletInfo((prevStatus) => ({
          ...prevStatus,
          address: '',
          chainId: 0,
          networkId: 0,
          web3: '',
          provider: '',
          connected: false
        }));

        setShowWalletAddress(false);
        history.push("/");
    };

    return (
        <Navbar>
            <Container>
                NAVBAR CODE
            </Container>
        </Navbar>
  );
}

export default Navigation;

 
 

И там, где я хочу написать, результат находится в tresor.js

 Page2 ---- particles ---- tresor.js
      ---- index.js
 
 import { Container, Image } from "react-bootstrap";

const Tresor = () => {
  return (
   <section className="page-section bg-primary text-blue mb-0" id="tresor">
            <Image id="imgTresor" src={TresorImg} alt=""/>
    </section>
  );
}

export default Tresor;