uck typeerror:_web3client__webpack_imported_module_1 __。minttoken。而不是函数

发布于 2025-02-11 20:42:46 字数 2877 浏览 1 评论 0原文

我正在尝试将我的智能合约与Frontend React JS集成,但是在使用合同方法时,我会遇到此错误。

我之前遇到了React Scripts版本的错误,因此我安装了一个小于5的版本,现在我遇到了此错误。有关系吗?请帮忙。

Uncaught TypeError: _Web3Client__WEBPACK_IMPORTED_MODULE_1__.mintToken.then is not a function

app.js文件

import React, { useEffect, useState } from 'react';
import { init, mintToken } from './Web3Client';
function App() {
  const [minted, setMinted] = useState(false);
  const mint = () => {
    mintToken
      .then((tx) => {
        console.log(tx);
        setMinted(true);
      })
      .catch((err) => {
        console.log(err);
      });
  };
  return (
    <div className="App">
      {!minted ? (
        <button onClick={() => mint()}>Mint Token</button>
      ) : (
        <p>Token Minted successfully</p>
      )}
    </div>
  );
}

export default App;

web3client.js文件

import Web3 from 'web3';
import NFTContract from './NFT.json';
let selectedAccount;
let nftContract;
let isInitialized = false;
export const init = async () => {
  let provider = window.ethereum; //
  if (typeof provider !== 'undefined') {
    //metamask is installed
    provider
      .request({ method: 'eth_requestAccounts' })
      .then((accounts) => {
        selectedAccount = accounts[0];
        console.log(`selected account is ${selectedAccount}`);
      })
      .catch((err) => {
        console.log(err);
        return;
      });
    window.ethereum.on('accountsChanged', function (accounts) {
      selectedAccount = accounts[0];
      console.log(`Selected account changed to ${selectedAccount}`);
    });
  }
  const web3 = Web3(provider);
  const networkId = await web3.eth.net.getId();
  nftContract = new web3.eth.Contract(
    NFTContract.abi,
    NFTContract.networks[networkId].address
  );
  isInitialized = true;
};
export const mintToken = async () => {
  if (!isInitialized) {
    await init();
  }
  return nftContract.methods
    .mint(selectedAccount)
    .send({ from: selectedAccount });
};

NFT合同

pragma solidity >=0.8.9;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';

contract NFT is ERC721 {
  constructor() ERC721('Coolest NFT', 'NFT') {}

  uint256 private _tokenId = 0;

  function mint() external returns (uint256) {
    _tokenId++;
    _mint(msg.sender, _tokenId);
    return _tokenId;
  }
}

I am trying to integrate my smart contract with frontend react js but I am getting this error while using methods of the contract.
enter image description here

I got an error of react scripts version before so I installed a version less than 5 and now I am getting this error. Is it related? Please help .

Uncaught TypeError: _Web3Client__WEBPACK_IMPORTED_MODULE_1__.mintToken.then is not a function

App.js file

import React, { useEffect, useState } from 'react';
import { init, mintToken } from './Web3Client';
function App() {
  const [minted, setMinted] = useState(false);
  const mint = () => {
    mintToken
      .then((tx) => {
        console.log(tx);
        setMinted(true);
      })
      .catch((err) => {
        console.log(err);
      });
  };
  return (
    <div className="App">
      {!minted ? (
        <button onClick={() => mint()}>Mint Token</button>
      ) : (
        <p>Token Minted successfully</p>
      )}
    </div>
  );
}

export default App;

Web3Client.js File

import Web3 from 'web3';
import NFTContract from './NFT.json';
let selectedAccount;
let nftContract;
let isInitialized = false;
export const init = async () => {
  let provider = window.ethereum; //
  if (typeof provider !== 'undefined') {
    //metamask is installed
    provider
      .request({ method: 'eth_requestAccounts' })
      .then((accounts) => {
        selectedAccount = accounts[0];
        console.log(`selected account is ${selectedAccount}`);
      })
      .catch((err) => {
        console.log(err);
        return;
      });
    window.ethereum.on('accountsChanged', function (accounts) {
      selectedAccount = accounts[0];
      console.log(`Selected account changed to ${selectedAccount}`);
    });
  }
  const web3 = Web3(provider);
  const networkId = await web3.eth.net.getId();
  nftContract = new web3.eth.Contract(
    NFTContract.abi,
    NFTContract.networks[networkId].address
  );
  isInitialized = true;
};
export const mintToken = async () => {
  if (!isInitialized) {
    await init();
  }
  return nftContract.methods
    .mint(selectedAccount)
    .send({ from: selectedAccount });
};

NFT Contract

pragma solidity >=0.8.9;

import '@openzeppelin/contracts/token/ERC721/ERC721.sol';

contract NFT is ERC721 {
  constructor() ERC721('Coolest NFT', 'NFT') {}

  uint256 private _tokenId = 0;

  function mint() external returns (uint256) {
    _tokenId++;
    _mint(msg.sender, _tokenId);
    return _tokenId;
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夕色琉璃 2025-02-18 20:42:46

。然后()是承诺的回调,但是您的minttoken()方法不会返回承诺。您需要做到这一点:

export const mintToken = async () => {
  return new Promise(async(resolve,reject) => {
   if (!isInitialized) {
     await init();
   }

   const _txn = nftContract.methods
     .mint(selectedAccount)
     .send({ from: selectedAccount });

    resolve(_txn);
  });
};

.then() is a callback for promises, but your mintToken() method does not return a promise. You will need to do this instead:

export const mintToken = async () => {
  return new Promise(async(resolve,reject) => {
   if (!isInitialized) {
     await init();
   }

   const _txn = nftContract.methods
     .mint(selectedAccount)
     .send({ from: selectedAccount });

    resolve(_txn);
  });
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文