Función de solidez recibiendo valor, pasándolo a otra función de contrato

Estoy tratando de crear un contrato que recibe valor para una función llamada contribuir.

Luego llamaré a otra función de contrato con valor. Me pregunto cómo se hace esto, no está muy claro.

Este es el código que obtuve hasta ahora (todas las demás funciones y variables se omiten por simplicidad):

contract Hub {
    function contribute(address _address) payable {
       Project project = Project(_address);
       project.fund.value(msg.value)();
    }
}

contract Project {
    function fund(address sender) payable {
       amount += msg.value;
       contributors[sender] = msg.value;
    }
}

Esto me da un código de operación no válido por alguna razón. ¿Qué podría estar mal? ¿Estoy tratando de hacerlo mal?

La pila de código de operación está aquí: https://gist.github.com/vongohren/160b61e5fd2b6c0c85fb8829aed9b3b2

Respuestas (2)

fundrequiere un parámetro, así que intente pasarle un argumento :

proyecto.fondo.valor(mensaje.valor)( mensaje.remitente )


Al no pasar un argumento, Solidity probablemente intente buscar una función fundque no tome parámetros, y no la encontrará y, por lo tanto, invocará la función de respaldo , que a su vez causará una excepción interna a través de un código de operación no válido si no lo es payable.

Eso no fue todo, lo intenté con y sin parámetros, pero aún proporciona un código de operación no válido :(
Es posible que deba comentar más código o mostrar más. Gist fue probado en Remix y funcionó.

El problema para mí fue que no envié suficiente gasolina. Descubrí esto de diferentes maneras, pero el problema principal fue que, dado que llamé a otro método de contratos, costaba más gasolina que enviar. Lanzó un código de operación no válido y no se quedó sin combustible.

Por lo tanto, podría ser inteligente especificar también el uso de gas en su contrato que llamará a otros contratos, para que el usuario obtenga una retroalimentación adecuada. De esta forma, si no se envía suficiente gas al contrato principal, ¡será el propio error! No es un falso error de código de operación no válido.