2

having a problem with calling a method of my deployed contract in the main Ethereum network.

I have a 'view' function which returns user's refund balance, everything worked fine in my local blockchain (Ganache), but doesn't work in the main network :(

So here I call that method from web3:

this.myContract.methods.checkFunds().call().then((refunds) => { return refunds; }); 

this is my contract function and here I call another contract function:

mapping(address => uint256) private funds; function checkFunds() external view returns(uint256) { return contract2.checkFunds(msg.sender); } 

here is that contract2:

function checkFunds(address _owner) public view returns(uint256) { return funds[_owner]; } 

if user doesn't have funds then it should return 0 and it's uint256, then it should be ok, but I get such an error:

Uncaught (in promise) Error: Returned values aren't valid, did it run Out of Gas? at ABICoder.decodeParameters (app.js:37038) at Contract._decodeMethodReturn (app.js:36366) at Method.outputFormatter (app.js:36719) at Method.formatOutput (app.js:9201) at sendTxCallback (app.js:9511) at app.js:96628 at inpage.js:1 at inpage.js:1 at o (inpage.js:1) at inpage.js:1 

and I have the latest version of web3 btw:"react-web3": "1.2.0",

Do view functions cost gas ? That's strange, because I call another method of that contract to read items and it doesn't cost anything.

thank you!

7
  • 1
    The error printout is misleading (you), because a view function does not require any gas in order to execute it. It is merely a "peek" into the blockchain data (i.e., no mining is performed). Commented Dec 25, 2018 at 12:23
  • 1
    I suggest that in your contract, check if contract2 is initialized correctly. Commented Dec 25, 2018 at 12:24
  • 1
    @goodvibration thank you for your reply. It's also in the main network and I have already tried to call it's functions, so the problem in this one only. Checked it in etherscan, it's also there, so that function exists and it's view one there Commented Dec 25, 2018 at 12:28
  • 1
    Make sure that you are calling the function checkFunds() other contract, not of contract2. Commented Dec 25, 2018 at 12:28
  • 1
    Well, is contract2 deployed on the main network? Commented Dec 25, 2018 at 12:28

2 Answers 2

2

You're doing a call(), without setting the msg.sender. Try to add the addr as a param to the checkFunds() function, modify the web3 call accordingly and see if that fixes it.

1
this.myContract.methods.checkFunds().call({ from: 0x123... }).then((refunds) => { return refunds; }); 

input address in call()

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.