¿Cómo hacer llamadas de función de contrato externo de un contrato a otro?

Tengo dificultades para entender la documentación para realizar una llamada de función externa de un contrato a otro. En este tutorial hay un ejemplo:

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)(); }
}

Que funciona cuando lo ejecuto desde la niebla.

Estoy tratando de escribir este contrato:

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;
    }

}

Después de transferir la propiedad (fuente completa incluida en la parte inferior) del contrato grower_ID al Auditor, puede aprobar una dirección, pero obtengo un error de gas intrínseco demasiado bajo si intento emitir un token de ID. El problema es esta línea grower_IDs.makeID.value(10).gas(1000)(target);, que es la misma forma que el ejemplo feed.info.value(10).gas(800)();que no recibe el error. Realmente no entiendo para qué sirve .value() al hacer esta llamada. ¿Hay alguna forma de dejarlo funcionar con una cantidad de gas no especificada?

Fuente completa:

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;
    }

}

Editar:

El procedimiento que he estado intentando es hacer primero el contrato growId, luego el auditor usando la dirección del growId. Después de transferir la propiedad del contrato growId a la dirección del Auditor, agrego una de mis cuentas como productor aprobado. El error es cuando trato de usar la función de auditor issueGrowerID. Esta función llama a la función growerID grower_IDs.makeID(target). Lo probé con ambos grower_IDs.makeID(target)y grower_IDs.value(x).gas(x)(target)todavía dice que el gas intrínseco es demasiado bajo.

Dirección aprobada

Gas intrínseco demasiado bajo

.value()es cuando quieres transferir wei: no creo que el Auditor quiera pagar 10 wei cada vez que llama makeID. Intente eliminarlo .gas(), ya que limita la cantidad de gas disponible makeIDy esta información relacionada puede ayudar: ethereum.stackexchange.com/questions/551/…
Estoy incluyendo capturas de pantalla de lo que estoy recibiendo. Estos fueron tomados después de hacer los cambios que sugirió. El error es el mismo de cualquier manera, el gas intrínseco es demasiado bajo.

Respuestas (1)

La billetera de niebla intenta estimar la cantidad adecuada de gas para enviar con la transacción, pero no siempre puede estimar esto de manera precisa o correcta.

Desde la pantalla de envío de transacciones en la billetera de niebla, el gasvalor se puede editar. Aumentarlo a algo grande (como 2 millones) debería solucionar su problema.

Terminé integrándolo todo en un solo contrato, ya que los diferentes tokens no son intercambiables entre usuarios, no necesitamos rastrearlos y la interfaz es suficiente.