Errores "La devolución de llamada no contiene ningún resultado" y "Destino de salto incorrecto"

Al llamar al método de contrato testnet ( https://testnet.etherscan.io/address/0xc03db39c18b6056f8c3a3a5495a1e11f3ff8885a ) sendFundsToFriend:

/* Faucet: Send funds, 1 Ether, to a new contact/friend */
function sendFundsToFriend(address to) {
    if (to.balance > 1000000000000000000) {
        faucetResult(msg.sender, to, 'Friends balance higher than 1 Ether'); // Event Log
        throw; // If friend has enough funds (> 1 Ether), do not send anymore
    }
    if (this.balance < 1000000000000000000) {
        faucetResult(msg.sender, to, 'Faucets balance lower than 1 Ether'); // Event Log
        throw; // If SC funds are not enough(< 1 Ether), do not send funds
    }
    bool dummy = to.send(1000000000000000000);
    faucetResult(msg.sender, to, 'Sent 1 Ether to friends account'); // Event Log
}

arroja los siguientes errores:

"Callback contain no result" => when calling contract method through solidity-browser and Metamask.

"Bad jump destination" => when calling contract method through geth node.
    Trace => https://testnet.etherscan.io/vmtrace?txhash=0xa3b522fe104ad9b34cbae4235b59296e624c42665f5e2d6d5b509f4f02c52904

De acuerdo con Problema al establecer el valor de uint en cero y https://www.reddit.com/r/ethdev/comments/5m6j1q/heres_an_interesting_solidity_problem_ese_problem/ parece un error en Solidity (caso Metamask) debido a que Browser Solidity interactúa con geth.

Y el "destino de salto incorrecto" a veces se debe a un índice de matriz no válido o la falta de la palabra clave "memoria" en las declaraciones de variables locales, pero creo que ninguno de esos casos está presente en el método sendFundsToFriend.

Cuando se ejecuta en una máquina virtual Javascript local (sin conexión de nodo), arroja este error:

VM Exception: invalid JUMP at ac4467b97a805884f19a44b98da45c3fe7c604bc2ce1eaabf19fd83a1126f253/692a70d2e424a56d2c6c27aa97d1a86395877b3a:7906

He encontrado tiros de error al ejecutar esta condición:

if (this.balance < 1000000000000000000) {
    throw;
}

Entonces, ¿alguna idea de qué está mal con este código? ¿Alguna forma de depurar el código o encontrar más información sobre los errores? ¡Gracias!

Referencias:

Error encontrado durante la ejecución del contrato [Destino de salto incorrecto]

Cómo depurar el error de destino de salto incorrecto

Error de destino de salto incorrecto

Hola. ¿Qué quieres que haga esta línea de código bool dummy = to.send(1000000000000000000);? ¿ Es necesario comparar un booleano con algo para devolver un trueo un falsederecho?
El propósito de esta línea de código es enviar 1 éter a una cuenta determinada. El dummy booleano está ahí solo para evitar un mensaje de advertencia de solidez.
Oh, está bien, no sabía que podías hacer esto para evitar la advertencia de Solidity. Corríjame si me equivoco, pero su evento faucetResult debería verse así: event faucetResult( address _from, address _to, string _comment );? También el pensamiento que me hace cosquillas en la mente es este Callback contain no result. No veo ningún mecanismo de devolución de llamada en su código.
La definición del evento es la siguiente: event faucetResult(dirección de, dirección a, cadena de resultado); ¿Es eso correcto?
Cuando se ejecuta en una VM Javascript local (sin conexión de nodo), arroja este error: Excepción de VM: SALTO no válido en ac4467b97a805884f19a44b98da45c3fe7c604bc2ce1eaabf19fd83a1126f253/692a70d2e424a56d2c6c27aa97d1a863958906
Descubrí que se producen errores al ejecutar esta condición: if (this.balance < 10000000000000000000) { throw; }
Tal vez el problema esté relacionado con el rango de esos grandes números enteros. Eche un vistazo a esta pregunta: ethereum.stackexchange.com/questions/11346/… Están usando la función web3.toBigNumber(...)para usar gethcon esos números enteros grandes.

Respuestas (1)

Me parece que todos los errores provienen del comando throw. Una vez eliminado funciona bien.

function sendFundsToFriend(address to) {
    if (to.balance >= 1000000000000000000) {
        faucetResult(msg.sender, to, 'Friends balance higher than 1 Ether'); // Event log
    } else if (this.balance < 1000000000000000000) {
        faucetResult(msg.sender, to, 'Faucets balance lower than 1 Ether'); // Event log
    } else {
        bool dummy = to.send(1000000000000000000);
        faucetResult(msg.sender, to, 'Sent 1 Ether to friends account'); // Event log
    }
}
Ho puede ser un error de throw? ¿Has investigado más?