[Ethereum] function call from other contract

contract-developmentremixsolidity

I'm trying to invoke a function by interacting 2 contracts. I defined 2 contracts ArrayTes and CallFunction within same file. CallFunction is calling a function secfun from contract ArrayTes

Intercontract.sol

pragma solidity ^0.4.23;


contract ArrayTes {

    uint256 public l;

    function secfun(uint256 a) public view returns(uint256) {

        l = l+a;
        return l;
    }
}


contract CallFunction {

    ArrayTes at;

    function CallFunction(address _t) {
        at = ArrayTes(_t);
    }

    function thirdfun(uint256 a) public view returns(uint256 c) {

        c = at.secfun(a);
        return c;
    }

}

But c is always returned as zero. I tried defining contracts on seperate file and importing it.

ArrayTes.sol

pragma solidity ^0.4.23;

contract ArrayTes {

    uint256 public l;

    function secfun(uint256 a) public view returns(uint256) {

        l = l + a;
        return l;
    }
}

CallFunction.sol

pragma solidity ^0.4.23;

import "./ArrayTes.sol";

contract CallFunction {

    address useraddress;
    constructor(address _t) public {

        useraddress = _t;
    }


    function thirdfun(uint256 a) public view returns(uint256 c) {

        ArrayTes instanceuser = ArrayTes(useraddress);
        c = instanceuser.secfun(a);
        return c;
    }

}

2_deploy_contracts.js

var ArrayTes = artifacts.require("./ArrayTes.sol");
var CallFunction = artifacts.require("./CallFunction.sol");

module.exports = function(deployer) {

    deployer.deploy(ArrayTes).then(function() {

        return deployer.deploy(CallFunction, ArrayTes.address);
    });
};

Still c value is returned zero. useraddress from CallFunction is returned as '0x'. When I commented code lines c = instanceuser.secfun(a);from CallFunction correct contract address ie; useraddress was returned. This code worked for me around 6 months back. Now its not working. I can't figure out the issue.Help will be appreciated 🙂

Best Answer

1.

function secfun(uint256 a) public view returns(uint256)

is declared as view, but tries modifying l

  1. address useraddress;

is not declared public, so of course it cannot be returned.

Here is my working solution, I think you can make it from here on:

CallFunction.sol

    pragma solidity ^0.4.23;

import "./ArrayTes.sol";

contract CallFunction {

    address public useraddress;
    constructor(address _t) public {

        useraddress = _t;
    }

    function thirdfun(uint256 a) public view returns(uint256 c) {

        ArrayTes instanceuser = ArrayTes(useraddress);
        c = instanceuser.secfun(a);
        return c;
    }

}

ArrayTes.sol

pragma solidity ^0.4.23;

contract ArrayTes {

    function secfun(uint256 a) public pure returns(uint256) {
        uint l;
        l = l + a;
        return l;
    }
}

2_deploy_contracts.js

var ArrayTes = artifacts.require("./ArrayTes.sol");
var CallFunction = artifacts.require("./CallFunction.sol");
var cf;
module.exports = function(deployer) {

    deployer.deploy(ArrayTes).then(function() {
        return deployer.deploy(CallFunction, ArrayTes.address);
    }).then(function(instance){
      cf = instance;
      return cf.thirdfun.call(3).then(function(result){
        console.log("The number is: " + result.toNumber());
      });
    }).then(function(){
      return cf.useraddress.call().then(function(theAddress){
        console.log("The address is: " + theAddress);
      });
    })
};

Have fun !

Related Topic