如何用tron-web调用合约方法

时间:2019-01-30 08:51:47

标签: web3 tron tronweb

我正在尝试调用一个仅返回数据字符串的简单协定方法。我的代码基于可在docs => https://developers.tron.network/reference#methodcall

中找到的示例
tronWeb.trx.getContract("TFWbGYFVjUMKrHALdU4MnFWNYY9Uc5W9SZ").then(async contract => {
    console.log(contract);
    let abi = contract.abi;
    console.log(abi);
    let c = await tronWeb.contract({
        abi
    });
    let result = await c.getBadgeOwner('something is up').call();
    console.log(result);
});

与在文档中可以找到的不同之处在于,我从加载的合约中加载了abi,而不是像示例中那样对其进行硬编码。

我得到的错误是index.js:105 Uncaught (in promise) TypeError: e.forEach is not a function,它似乎以某种方式引用了abi:

enter image description here

3 个答案:

答案 0 :(得分:1)

对于任何因相同的初学者错误而绊倒的人,以下是解决方法:

使用contract()。at()代替getContract()

let contract = await tronWeb
        .contract()
        .at("TFWbGYFVjUMKrHALdU4MnFWNYY9Uc5W9SZ")

在那之后,您可以很好地调用合同方法

let currentValue = await contract.getBadgeOwner('something is up').call();

答案 1 :(得分:0)

我之前在犯同样的错误。这对我有用

async function a (){
        let contract = await tronWeb.contract().at("TFWbGYFVjUMKrHALdU4MnFWNYY9Uc5W9SZ")
        //console.log(contract);
        let currentValue = await contract.getBadgeOwner('something is up').call();
        console.log(currentValue);
}

a()

答案 2 :(得分:0)

setTimeout(async () => {
   this.myContractOb = await 
   this.tronWeb.contract(myContract).at(this.contractAddress);
},10000);

将上述代码与myContract一起用作具有相同问题的ABI json对象。