17. Funções e Endereços pagáveis (payable)
Para que um contrato possa receber Ether ou o Token nativo da Blockchain EVM que estiver sendo executado ele precisa ter funções payable e para enviar é necessário utilizar endereços do tipo payable.
# Funções pagáveis
Somente funções que NÃO sejam do tipo view podem receber Ether.
# Enviando Ether para o contrato
O parâmetro payable serve para que o contrato possa receber e manipular saldos. Lembrando que estamos falando Ether ou token nativo como BNB, MATIC entre outros e não de Tokens no formato ERC-20.
# Consultando saldo do contrato
Para saber qual o saldo do contrato em que está sendo executado a função utiliza-se a instrução built-in address(this).balance;
# Payable como Parâmetro
Anteriormente você viu que para contrato possa RECEBER Ether é preciso o parâmetro payable esteja presente no cabeçalho da função.
Para que o contrato possa ENVIAR ele precisa lidar com endereços do tipo payable. No exemplo abaixo inserimos esse parâmetro como instrução adicional ao endereço que será passado para função.
# Endereços pagáveis
No exemplo abaixo será transferido 1 ether que sairá do saldo do contrato para o endereço passado como parâmetro _quemrecebe _ para a função.
Já nesse caso, será uma transferência que irá para quem está chamando (msg.sender) a função do saque do contrato.
Há duas formas de fazer transferências: usando a função send() ou a função transfer() e a diferença entre elas é que a função send() irá retornar true ou false e a função transfer() não retorna nada caso a transferência tenha acontecido e irá reverter toda a transação caso tenha falhado.