SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
17.11.2024

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

  1. Modificador Payable: Use o modificador payable para funções que devem aceitar Ether.

  2. msg.value: Esta variável global contém a quantidade de Ether (em Wei) que foi enviada com a transação.

  3. Segurança de Tipo: Assegure verificações adequadas como require(msg.value > 0) para evitar aceitar transações com valor zero.

  4. Retiradas: Use a palavra-chave payable com o endereço para permitir a transferência de Ether do contrato, como visto na função retirar.

  5. Visibilidade: Funções pagáveis devem ter tipicamente visibilidade public ou external.

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.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!