Cómo saber si una dirección es capaz de recibir transferencias

Si recibo ether en una función de pago en mi contrato inteligente, ¿hay alguna forma de saber si el msg.sender también es capaz de recibir ether sin enviar algunos wei al remitente para ver si falla o no? (Creo que es un costoso "a prueba de fallas") Supongamos, por ejemplo, que estoy cobrando un depósito que debe devolverse si no se puede realizar el servicio solicitado.

Parece como si cualquier dirección se pudiera convertir en una dirección pagadera, pero eso no le dice si la dirección es o no un contrato que no tiene una función de reserva pagadera. En ese caso, me gustaría revertir la transacción para que el valor no se cobre en primer lugar.

Respuestas (1)

Para que un contrato tenga Ethers, normalmente debe tener payablealgún tipo de función. Digo típicamente , porque hay excepciones .

Entonces, si un contrato le envía Ethers, probablemente payabletambién tenga una función. Pero eso aún no garantiza que pueda usar esa función: tal vez solo se pueda usar en ciertas direcciones, por ejemplo.

Por lo tanto, no puede estar seguro de si un contrato con Ethers tiene una payablefunción, e incluso si pudiera, no puede estar seguro de cuál es esa función y si podría llamarla.

Entonces, por lo que puedo decir, no hay forma de saber si un determinado contrato es capaz de recibir Ethers. Incluso con su método 'a prueba de fallas', no puede estar seguro de si el receptor tiene un código que rechazó condicionalmente su envío o si no puede aceptar Ether en absoluto.

Eso es interesantemente problemático. Para ser más precisos, realmente me gustaría saber si el contrato tiene un método de recepción que aceptaría eth enviado a través de algo como (éxito,) = senderAddress.call({value: somevalue}(""). Por lo general, espero que las personas llamen para ser EOA, pero deduzco que se desaconseja tratar de filtrar las llamadas de función por si el remitente es EOA o no (y no es totalmente confiable).