address.send (msg.value) devolviendo falso pero se transfirieron éteres

Esta es la función que estoy usando para transferir éteres de la cuenta de usuario a la cuenta del contrato.

function addEathersToContractAccount(address contractAddress)public payable returns(bool){
                changePaymentStatus(2);
                bool success= contractAddress.send(msg.value)
            if(success){
                changePaymentStatus(3);
                return true; 
            }else{
                return false;
            }
    }

mientras lo probaba en REMIX, descubrí que esta función siempre devuelve falso, pero los éteres se transfirieron de la cuenta de usuario a la cuenta del contrato.

Nuevamente lo probé usando ethereum testrpc pero el resultado fue el mismo.

yo tambien he probado

contractAddress.transfer(msg.value)

Esta es la salida proporcionada por remixingrese la descripción de la imagen aquí

dosis alguien tiene alguna idea de por qué sucede esto.

Usar contractAddress.transfer(msg.value)orequire(contractAddress.send(msg.value))

Respuestas (1)

sendregresa falseen caso de falla, y depende de usted manejar la falla. Es por eso que, excepto en algunos casos en los que desea/necesita manejar las fallas usted mismo, es mejor usar transfer, que se encargará de eso por usted.

En tu caso, esto es lo que debes hacer.


function addEathersToContractAccount(address contractAddress)public payable returns(bool){
                changePaymentStatus(2);
                bool success= contractAddress.send(msg.value)
            if(success){
                changePaymentStatus(3);
            }else{
                revert();
            }
            return success;
    }

revertle permite revertir los cambios realizados y devolver un valor.

Todavía deberías usar esto:

function addEathersToContractAccount(address contractAddress)public payable returns(bool){
                changePaymentStatus(2);
                contractAddress.transfer(msg.value);
                changePaymentStatus(3);
                return success;
    }
Después de reemplazar mi función con su código, el resultado es el mismo, la función devuelve falso pero los éteres se transfirieron.
@SwapnilKumbhar, ¿desplegó a través de remix?
@SwapnilKumbhar Debe revertir en caso de que sendfalle manualmente. si no lo hace send, devolverá falso, pero se consumirá el envío eth con msg.value. Revisa mi comentario de arriba.
@SwapnilKumbhar Remix a veces tiene problemas en los que, incluso si actualiza el código, seguirá implementando el anterior. Lo mejor es seguir remezclando en modo incógnito o vaciar tu caché.
@PrashantPrabhakarSingh Sí, gracias por TIP, pero la pregunta es por qué la dosis devuelve falso incluso después de transferir con éxito los éteres.
La transferencia no debería ocurrir. ¿Revisó el saldo ETH de contractAddress?