No se pueden transferir fondos en el contrato

Dentro de Remix, estoy usando una dirección (addr1) para implementar el contrato y otra (addr2) para llamar a una función dentro del contrato. La función es una función de transferencia simple. Estoy transfiriendo 1000000000000000000 Wei (1 éter) de addr2 a addr1. Sin embargo, no se puede transferir y mi salida sigue siendo falsa. ¿Que esta mal aquí?

También estoy usando la biblioteca SafeMath para el sub, es lo mismo que restar.

function transferToOwner() payable returns (bool) {
    owner.transfer(msg.value.sub(1000000000000000000));
    return true;
}

Respuestas (1)

La forma correcta de hacerlo sería así:

function transferToOwner() payable returns (bool) {
    owner.transfer(msg.value);
    return true;
}

Esto reenviará cualquier cantidad de eth que haya enviado la persona que llama a esta función.

Si solo desea enviar 1 eth independientemente de lo que enviaron cuando llamaron a la función, se vería así:

function transferToOwner() payable returns (bool) {
    //Sender should forward at least 1 ether.
    require(msg.value > 1 ether);
    uint amountToSend = 1 ether;
    uint change = msg.value - amountToSend; // Do something with the change. Return it to sender, maybe?
    //If you don't do anything with the change, it will be stuck on this contract
    owner.transfer(1 ether);
    return true;
}
Sin embargo, ¿cómo pasas msg.value? Actualmente devuelve 0.
@JorahFriendzone si está utilizando Remix, hay un campo en la parte superior que dice "valor", puede ingresar cuánto éter enviar a una función paga como la que escribió anteriormente.
¡Ah gracias! La razón por la que estaba tratando de probar era, en última instancia, para que web3 llamara a la función transferToOwner. Sin embargo, en este momento, usando Remix, estoy ingresando manualmente el valor. ¿Cómo haría esto a través de web3, ya que no estoy pasando una variable a la función?
Puede pasar un objeto junto con cualquier llamada de función que contenga, entre otras cosas, el valor de eth que desea enviar o el suministro de gas.
Normalmente, cuando hago una llamada de función en web3, hago contractInstance.functionName (los datos se pasan aquí), pero estoy tratando de renunciar a pasar datos, a través de la función y solo hacer que la función maneje todo internamente, por lo que mi transferToOwner no tiene cualquier parámetro. Estoy tratando de averiguar cómo puedo ejecutar transferToOwner sin pasar parámetros a través de web3 si eso tiene sentido
Harías contractInstance.functionName({value:1000000000000000000});