Lição 058: Funções Pagáveis
No Solidity, a palavra-chave payable
é utilizada para indicar que uma função ou um endereço pode aceitar Ether. Esse recurso é fundamental para contratos inteligentes que precisam interagir com transferências de criptomoedas, permitindo que recebam fundos como parte de suas operações. Nesta lição, vamos explorar como criar e usar funções pagáveis no Solidity com exemplos práticos.
Compreendendo Funções Pagáveis
Uma função pagável permite que um contrato receba Ether. Quando uma função é marcada como pagável, você pode enviar Ether juntamente com a transação que chama essa função. Isso é particularmente útil para funções que requerem pagamento ou para a coleta de doações.
Definindo uma Função Pagável
Uma função simples pagável pode ser definida usando a palavra-chave payable
da seguinte forma:
pragma solidity ^0.8.0;
contract Coletor {
address public proprietario;
uint public totalFundos;
constructor() {
proprietario = msg.sender; // Define o criador do contrato como o proprietário
}
// Uma função pagável para aceitar doações
function doar() public payable {
totalFundos += msg.value; // Aumenta o total de fundos pelo valor enviado
}
}
Neste exemplo, a função doar
é caracterizada como uma função pagável, o que significa que ela pode aceitar Ether. O valor enviado estará acessível através de msg.value
.
Verificando o Saldo
Para verificar a quantidade de Ether que o contrato possui, você pode criar outra função:
function obterSaldo() public view returns (uint) {
return address(this).balance; // Retorna o saldo do contrato em Wei
}
Exemplo Completo: Contrato Coletor
Aqui está o código completo para um contrato de coleta simples que permite que usuários doem Ether e verifiquem os fundos totais coletados.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Coletor {
address public proprietario;
uint public totalFundos;
constructor() {
proprietario = msg.sender; // Define o criador do contrato como o proprietário
}
// Uma função pagável para aceitar doações
function doar() public payable {
require(msg.value > 0, "Você precisa enviar algum Ether"); // Assegura que o valor enviado seja maior que zero
totalFundos += msg.value; // Aumenta o total de fundos pelo valor enviado
}
// Função para obter os fundos totais recebidos
function obterTotalFundos() public view returns (uint) {
return totalFundos;
}
// Função para retirar fundos para o endereço do proprietário
function retirar() public {
require(msg.sender == proprietario, "Apenas o proprietário pode retirar os fundos"); // Restrito ao proprietário
uint saldo = address(this).balance; // Obtém o saldo do contrato
payable(proprietario).transfer(saldo); // Transfere todos os fundos para o proprietário
totalFundos = 0; // Reseta o total de fundos
}
// Função para verificar o saldo do contrato
function obterSaldo() public view returns (uint) {
return address(this).balance; // Retorna o saldo do contrato em Wei
}
}
Pontos Chave a Observar
-
Modificador Payable: Use o modificador
payable
para funções que devem aceitar Ether. -
msg.value: Esta variável global contém a quantidade de Ether (em Wei) que foi enviada com a transação.
-
Segurança de Tipo: Assegure verificações adequadas como
require(msg.value > 0)
para evitar aceitar transações com valor zero. -
Retiradas: Use a palavra-chave
payable
com o endereço para permitir a transferência de Ether do contrato, como visto na funçãoretirar
. -
Visibilidade: Funções pagáveis devem ter tipicamente visibilidade
public
ouexternal
.
Conclusão
Funções pagáveis são uma parte essencial do Solidity e do desenvolvimento de contratos inteligentes. Elas ajudam a criar aplicações dinâmicas que podem gerenciar transações de Ether de forma segura. Nesta lição, abordamos como criar um contrato coletor com a capacidade de receber e retirar fundos. Compreender como implementar e usar funções pagáveis é fundamental para criar contratos inteligentes mais complexos e valiosos.