payable
es un modificador de visibilidad que indica que una función o dirección es capaz de manejar transferencias de Ether. Si una función no es declarada como payable
, intentos de enviar Ether a través de ella generarán un error.
1. Recepción de Ether:
payable
pueden recibir Ether.
2. Gestión de fondos:
3. Seguridad:
payable
payable
para recibir Ether
pragma solidity ^0.8.0;
contract EjemploPayable {
// Función para recibir Ether
function recibirPago() public payable {
// Los fondos enviados se almacenan en el contrato
}
// Consultar el balance del contrato
function obtenerBalance() public view returns (uint) {
return address(this).balance;
}
}
En este ejemplo:
recibirPago
permite que el contrato acepte Ether.
address(this).balance
.
payable
Las funciones payable
permiten recibir Ether directamente del remitente.
contract Transferencias {
// Recibir Ether
function depositar() public payable {}
// Transferir Ether al remitente
function retirarTodo() public {
uint balance = address(this).balance;
require(balance > 0, "No hay fondos para retirar");
payable(msg.sender).transfer(balance);
}
}
contract Marketplace {
address public propietario;
constructor() {
propietario = msg.sender;
}
// Comprar un producto
function comprar() public payable {
require(msg.value >= 1 ether, "El precio mínimo es 1 Ether");
// El propietario recibe el Ether
payable(propietario).transfer(msg.value);
}
}
En este caso:
comprar
recibe Ether y asegura que el monto sea suficiente.
receive
)
Cuando no se incluyen datos en la transacción, la función especial receive()
se activa.
contract EjemploReceive {
event PagoRecibido(address remitente, uint cantidad);
// Función para manejar pagos sin datos
receive() external payable {
emit PagoRecibido(msg.sender, msg.value);
}
// Consultar balance del contrato
function obtenerBalance() public view returns (uint) {
return address(this).balance;
}
}
receive()
permite recibir Ether sin datos.
Cuando una transacción incluye datos y no coincide con una función existente, se utiliza la función fallback()
.
contract EjemploFallback {
event FallbackActivada(address remitente, uint cantidad);
// Manejar pagos con datos no coincidentes
fallback() external payable {
emit FallbackActivada(msg.sender, msg.value);
}
}
1. transfer:
payable(destinatario).transfer(1 ether);
2. send:
transfer
, pero devuelve true
o false
en lugar de revertir.
bool exito = payable(destinatario).send(1 ether);
require(exito, "El envío falló");
3. call:
(bool exito, ) = destinatario.call{value: 1 ether}("");
require(exito, "La llamada falló");
payable
1. Validar el monto recibido:
require
para asegurarte de que el monto cumple con las condiciones.
require(msg.value >= 1 ether, "Monto insuficiente");
2. Evitar transferencias innecesarias:
3. Usar withdraw en lugar de push:
function retirarFondos() public {
uint monto = balances[msg.sender];
require(monto > 0, "No hay fondos para retirar");
balances[msg.sender] = 0;
payable(msg.sender).transfer(monto);
}
4. Documentar funciones payable:
payable
sea claro para los usuarios.
payable
1. No declarar payable:
payable
en la función provoca un error.
2. No manejar adecuadamente el balance:
3. Sobrecarga de gas:
transfer
o send
con límites estrictos de gas puede fallar si el destinatario tiene un contrato.
payable
1. Interacción directa con Ether:
2. Versatilidad:
3. Seguridad:
Para más información sobre payable
, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer