13

I'm having a hard time understanding the documentation for making an external function call from one contract to another. In this tutorial there is an example:

contract InfoFeed {
  function info() returns (uint ret) { return 42; }
}
contract Consumer {
  InfoFeed feed;
  function setFeed(address addr) { feed = InfoFeed(addr); }
  function callFeed() { feed.info.value(10).gas(800)(); }
}

Which works when I run it from mist.

I am trying to write this contract:

contract Auditor is owned {
    growId public grower_IDs;
    mapping (address => bool) public approvedGrows;

    function Auditor(address GID){
        grower_IDs = growId(GID);
        grower_IDs.transferOwenership(this);
    }

    function approveGrower(address target){
        if (approvedGrows[target] == true) throw;
        else approvedGrows[target] = true;
    }

    function issueGrowerID(address target) {
        if (approvedGrows[target] == true && grower_IDs.balanceOf.value(10).gas(1000)(target) == 0) {
            grower_IDs.makeID.value(10).gas(1000)(target);
        }
        else throw;
    }

}

After you transfer ownership (full source included in the bottom) of the grower_ID contract to the Auditor you are able to approve an address, but I get an intrinsic gas is too low error if I try to issue an ID token. The problem is this line grower_IDs.makeID.value(10).gas(1000)(target);, which is the same form as the example feed.info.value(10).gas(800)(); which does not get the error. Im not really understanding what the .value() is for when making this call. Is there a way to let is run it with an unspecified amount of gas?

Full source:

contract owned {
    address public owner;
    bool disabled;
    function owned() {
        owner = msg.sender;
        disabled = false;
    }

    modifier onlyOwner {
        if (msg.sender != owner) throw;
    }

    modifier disableable {
        if (disabled == true) throw;
    }
    function trasferOwnership(address newOwner) onlyOwner {
        owner = newOwner;
    }

    event DisabledToggle(bool dis);

    function disable() onlyOwner {
        disabled = true;
        DisabledToggle(true);
    }

    function enable() onlyOwner {
        disabled = false;
        DisabledToggle(false);
    }


}

contract growId is owned {
    string public name;
    string public symbol;
    uint8 public decimals;
    mapping (address => uint256) public balanceOf;

    function growId() {
        name = "growId";
        symbol = "GID";
        decimals = 1;
    }

    function isOwner() returns (bool ret) {
        if (msg.sender == owner) return true;
    }

    function makeID(address target) onlyOwner {
        balanceOf[target] += 1;
        Transfer(0, target, 1);
    }

    function transfer(address _to) disableable {
        if (balanceOf[msg.sender] < 1 || balanceOf[_to] + 1 < balanceOf[_to])
        throw;

        if(msg.sender == owner){
            balanceOf[msg.sender] -= 1;
            balanceOf[_to] += 1;
            Transfer(msg.sender, _to, 1);
        }

        if(_to == owner){
            balanceOf[msg.sender] -= 1;
            balanceOf[_to] += 1;
            Transfer(msg.sender, _to, 1);
        }
        else throw;
    }

    event Transfer(address indexed from, address indexed to, uint256 value);
}

contract Auditor is owned {
    growId public grower_IDs;
    mapping (address => bool) public approvedGrows;

    function Auditor(address GID){
        grower_IDs = growId(GID);
        grower_IDs.transferOwenership(this);
    }

    function approveGrower(address target){
        if (approvedGrows[target] == true) throw;
        else approvedGrows[target] = true;
    }

    function issueGrowerID(address target) {
        if (approvedGrows[target] == true && grower_IDs.balanceOf.value(10).gas(1000)(target) == 0) {
            grower_IDs.makeID.value(10).gas(1000)(target);
        }
        else throw;
    }

}

Edit:

The procedure I've been trying is to first make the growId contract, then the auditor using the address of the growId. After I turn over ownership of the growId contract to the Auditors address, I add in one of my accounts as an approved grower. The error is when I try and use the auditor function issueGrowerID. This function calls the growerID function grower_IDs.makeID(target). I have tried it with both grower_IDs.makeID(target) and grower_IDs.value(x).gas(x)(target) and it still says intrinsic gas too low.

Address Approved

Intrinsic gas too low

2
  • .value() is when you want to transfer wei: I don't think the Auditor wants to pay 10 wei each time it calls makeID. Try removing .gas() since it limits the amount of gas available to makeID and this related information may help: ethereum.stackexchange.com/questions/551/…
    – eth
    Mar 15, 2016 at 12:20
  • Im including screenshots of what im getting. These were taken after making the changes you suggested. The error is the same either way, intrinsic gas too low.
    – Anandamide
    Mar 15, 2016 at 19:05

1 Answer 1

3

The mist wallet tries to estimate the appropriate amount of gas to send with the transaction, but it is not always able to estimate this accurately or correctly.

From the send transaction screen in the mist wallet the gas value can actually be edited. Increasing it to something large (like 2 million) should fix your problem.

1
  • I ended up rolling it all into one contract, since the different tokens are not tradeable between users, we dont need to track them, and the interface is enough
    – Anandamide
    Apr 14, 2016 at 20:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.