javascript - 部署智能合约时出错,无法读取未定义的“已部署”属性?
问题描述
我为 Dapp 做一个前端,所以在创建智能合约实例并设置提供者后,我尝试部署合约,获取代币余额并将其显示在网页上,但出现错误:
Cannot read property 'deployed' of undefined
在我的浏览器中。
请注意,我的 FixedSupplyToken.sol 部署在测试 RPC 上,正如我在 FixedSupplyToken.json 文件中看到的那样,它有一个地址。以为这是问题所在,但没有这样的运气......
app.js:
// Import libraries we need.
import { default as Web3} from 'web3';
import { default as contract } from 'truffle-contract'
// Import our contract artifacts and turn them into usable abstractions.
import exchange_artifacts from '../../build/contracts/Exchange.json'
import token_artifacts from '../../build/contracts/FixedSupplyToken.json'
var accounts;
var account;
var ExchangeContract = contract(exchange_artifacts);
var TokenContract = contract(token_artifacts);
window.App = {
start: function() {
//bootstrap everything
ExchangeContract = web3.setProvider(web3.currentProvider);
TokenContract = web3.setProvider(web3.currentProvider);
},
//update balance function
updateTokenBalance: function() {
var tokenInstance;
**TokenContract.deployed().then(function (instance) { // getting the Uncaught TypeError: Cannot read property 'deployed' of undefined**
tokenInstance = instance;
return tokenInstance.balanceOf.call(account);
}).then(function (value) {
var balance_element = document.getElementById("balanceTokenInToken");
balance_element.innerHTML = value.valueOf();
}).catch(function (e) {
console.log(e);
App.setStatus("Error getting balance; see log.");
});
},
即使我取消注释 web3.setProvider(web3.currentProvider) 我得到 setProvider undefined 错误。
感谢您的任何反馈:)
解决方案
在start
函数中,您正在重新分配TokenContract
变量。
尝试改变
ExchangeContract = web3.setProvider(web3.currentProvider);
TokenContract = web3.setProvider(web3.currentProvider);
到:
ExchangeContract.setProvider(web3.currentProvider);
TokenContract.setProvider(web3.currentProvider);
根据评论编辑:
问题的根源是该web3.setProvider
方法返回 void 或,因此在您分配给undefined
的语句中,因此出现错误。设置 web3 提供者和 Truffle 合约提供者是两个不同的操作。不确定是否有更多代码,但如果由于某种原因您需要显式设置提供程序,请尝试将代码更改为:TokenContract = web3.setProvider(web3.currentProvider);
undefined
TokenContract
//bootstrap everything
web3.setProvider(web3.currentProvider);
ExchangeContract.setProvider(web3.currentProvider);
TokenContract.setProvider(web3.currentProvider);
但是,如果 Web3 配置正确,则不需要第一行。我建议为此阅读这篇文章,因为这样做的方式发生了变化:https ://medium.com/@awantoch/how-to-connect-web3-js-to-metamask-in-2020-fee2b2edf58a 。
它的要点是:
window.web3 = new Web3(window.ethereum);
window.ethereum.enable();
推荐阅读
- api - 使用 Google Apps 脚本的可编辑 PDF
- ruby-on-rails - 在刺激控制器内提交表单的 Rails-ujs 上的奇怪 Turbolinks 响应
- jquery - 为数据表excelhtml5按钮添加多种样式
- angular - 第一次更新请求需要重新加载浏览器才能看到变化,但下一次更新请求不需要刷新浏览器才能看到变化
- gitlab - CI/CD - 如何只构建一次
- angular - Angular 10中的任何json编辑器?
- javascript - 数组在 useState 钩子工作后变成字符串
- flutter - Dart Flutter中实现抽象类的父类如何拆分?
- r - 如何根据 r 中的下一行对齐日期?
- vue.js - Vuejs 3:防止编译纯 HTML 标签