【问题标题】:Getting an error while deploying smart contracts, Cannot read property 'deployed' of undefined?部署智能合约时出错,无法读取未定义的“已部署”属性?
【发布时间】:2020-10-03 17:46:17
【问题描述】:

我正在为 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 错误。

感谢任何反馈:)

【问题讨论】:

    标签: javascript solidity smartcontracts web3


    【解决方案1】:

    start 函数中,您正在重新分配TokenContract 变量。

    尝试改变

    ExchangeContract = web3.setProvider(web3.currentProvider);
    TokenContract = web3.setProvider(web3.currentProvider);
    

    到:

    ExchangeContract.setProvider(web3.currentProvider);
    TokenContract.setProvider(web3.currentProvider);
    

    根据评论编辑:

    问题的根源在于web3.setProvider 方法返回void 或undefined,因此在TokenContract = web3.setProvider(web3.currentProvider); 语句中,您将undefined 分配给TokenContract,因此出现错误。设置 web3 提供者和 Truffle 合约提供者是两个不同的操作。不确定//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();
    

    【讨论】:

    • Ceno,我正在将我的合同迁移到 ganache,然后在我的 chrome 中注入 metamask。当我使用 set.provider(web3.currentProvider) 时,我得到了 set.provider not defined ,所以我搜索了一下,发现有人遇到了同样的问题,他们通过使用 web3.setProvider 解决了它...
    • 嗨。我根据您的评论添加了更详细的解释。
    • 我已根据您的评论更新了我的帖子。据我在阅读您提供的链接时可以理解的是,我们使用 window.web3 = new Web3(window.ethereum) 设置当前提供程序,然后 contract = setProvider(web3.currentProvider) 应该可以工作吗?但我仍然得到 setProvider undefined 错误...:/
    • 注意它应该是TokenContract.setProvider(web3.currentProvider);,而不是TokenContract = setProvider(web3.currentProvider); 我还想指出Truffle Contract的存储库以获取更多详细信息:github.com/trufflesuite/truffle/tree/master/packages/contract
    • 太棒了!您能否将此标记为已接受的答案?是的,我在 EatTheBlocks discord 中找到了你的问题。
    【解决方案2】:

    这一行:

    import token_artifacts from '../../build/contracts/FixedSupplyToken.json'
    

    我猜您的本地网络服务器植根于您的 HTML 页面所在的位置。因此,任何从 Web 服务器根目录(即从 .. 文件夹)提取内容的尝试都将被拒绝。

    使用正在运行的 F12 工具重新加载您的页面,显示网络流量。我怀疑当页面尝试执行 GET ../../build/contracts/FixedSupplyToken.json 时,您会得到 404 结果。

    因此,token_artifacts 未定义,以及由此创建的所有其他内容也是未定义的。

    快速破解方法是将 FixedSupplyToken.json 移至您的 Web 根目录并适当调整导入语句。

    即使在我将 json 移动到 Web 根目录之后,我的 python Web 服务器也遇到了另一个问题,我正在运行的 python -m http.server 正在返回 Content-Type 标头中的 mime 类型,被 javascript 拒绝进口商。我做的快速破解只是将 json 声明粘贴到一个 .js 文件中,并给它一个变量赋值,如下所示:

    window.FizzBuzzContract =    // added this line
    {
      "contractName": "FizzBuzz",
      "abi": [...
    

    【讨论】:

    • 嗨...所以我今天一直在玩这个,试图将 FixedSupplyToken.json 移动到 webroot 但得到与以前相同的未定义错误,然后尝试再次将其移动到其他一些文件夹并得到“找不到模块:错误:无法解析'../../FixedSupplyToken.json”“所以我猜它在正确的文件夹中并且确实导入了它,否则我会找不到模块之前的错误?嗯在想,你认为松露合同可能是问题所在,因为它已经过时并且现在被@truffle/contract 取代了?:/ thx
    猜你喜欢
    • 2022-11-24
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2018-01-28
    • 2021-10-09
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多