El atributo payable es fundamental al trabajar con contratos inteligentes en Solidity. Este atributo se aplica tanto a direcciones como a métodos de un contrato, permitiéndoles recibir la criptomoneda nativa del ecosistema, como Ether en redes basadas en Ethereum o Zerogold, dependiendo del mismo. Es esencial para la transferencia de valores y transacciones dentro de los contratos inteligentes.
¿Cómo se estructura un contrato payable?
El concepto de "payable" se ve reflejado en el siguiente código de ejemplo, que incluye variables de estado y dos funciones críticas: Deposit y Withdraw. Veamos cómo se integra el atributo payable en este contexto:
contractCharityDonation{addresspayable charity;mapping(address=>uint)public donations;constructor(){ charity =payable(msg.sender);// El desplegador es la dirección de charity}functiondeposit()publicpayable{ donations[msg.sender]+= msg.value;}functionwithdraw()public{ charity.transfer(address(this).balance);}}
¿Cómo funciona cada componente del código?
Variables de Estado:
address payable charity: Esta es la dirección de charity que recibe las donaciones. Se configura como 'payable', lo que le permite recibir Ether.
mapping(address => uint): Este mapeo registra las donaciones realizadas por cada dirección.
Funciones:
constructor: Al desplegar el contrato, el constructor establece la dirección del deployer como la charity.
deposit: Esta función está marcada como 'payable', lo que la califica para recibir criptomonedas. Registra la cantidad de Ether recibida bajo la dirección de quien dona.
withdraw: Transfiere todo el saldo del contrato a la charity.
¿Cómo se despliega y prueba un contrato inteligente con payable?
Para desplegar y probar este contrato, se siguen los siguientes pasos en un entorno como Remix:
Compilación y Despliegue: Se compila el contrato en Remix para asegurar que no haya errores. Luego se despliega seleccionando la cuenta desde la cual se desea efectuar el despliegue.
Métodos Disponibles: Una vez desplegado, se observa que el método deposit tiene un distintivo rojo, indicando que es 'payable'.
Simulación de Donaciones:
Cambiando de cuenta (wallet), se puede simular una transferencia de cripto ingresando el monto en el campo 'Value' y seleccionando la unidad de moneda.
Al ejecutar la función deposit, se envía la cantidad especificada al contrato y se registra en el mapeo de donaciones.
Función de Retiro:
Con withdraw, el contrato transfiere su saldo a la dirección de charity, asegurándose que sea 'payable' para recibir la transferencia.
Consejos para el uso de payable en Solidity
Gestión de Seguridad: Al implementar contratos con pagos, asegúrate de manejar correctamente los fondos y considerar medidas de seguridad adicionales.
Unidades Monetarias: Comprende las conversiones entre unidades, como Ether y Wei, para evitar errores en los cálculos y transferencias.
Pruebas Extensas: Prueba a fondo en un entorno de prueba antes de desplegar en la red principal para evitar pérdida de fondos debido a errores.
Anímate a explorar más sobre Solidity y sus funcionalidades avanzadas. Con el tiempo, podrás crear contratos más complejos y seguros, fortaleciendo tus habilidades en el desarrollo blockchain. ¡Continúa aprendiendo y creciendo en este fascinante campo!
autoriza a recibir la criptomoneda nativa del ecosistema CeloGLD
Código del ejemplo
pragmasolidity^0.8.0;contractPayables{addresspublic charity;// variable de estadomapping(address=>uint)public donations;// variable de estado (relación entre una dirección y un número entero)constructor(){ charity = msg.sender;}functiondeposit()payablepublic{// permite recibir critpomoneda donations[msg.sender]= msg.value;}functionwithdraw()public{payable(charity).transfer(address(this).balance);// recibe una transferencia}}
Aquí les dejo un enlace que les ayudará en las conversiones de las unidades de Ethereum.
No entendí, el deposito le descuenta la cantidad seleccionada a la billetera/dirección elegida, y sólo hasta que llamas el withDraw la billetera del contrato recibirá lo que se mandó en el deposito? pero mientras en donde se guardó? en el bloque en donde está el contrato?, pero si un bloque que ya está en la cadena ya no se puede modificar cómo se sabe que lo que se mandó con el deposito pertenece a ése contrato?
¡Hola! :D
¿Cuál es el problema que tienes?, ¿en qué te puedo ayudar? Compártenos tu código por favor. Puedes adjuntar imágenes arrastrándolas a esta ventana de comentario.
Nunca pares de aprender 💚
Hola una duda, se puede usar la stable coin que mencionaste en un video anterior para pago por los fees?
Lo botones rojos tiene costo de la moneda nativa.
Los botones naranja tiene costo de gas
los botones azules no tiene costo de gas??