Cofrinho
Contrato para depositar e retirar ETH de forma segura.
Conceitos ensinados:
- Função payable
- msg.value (ETH recebido)
- msg.sender (quem chamou)
- Transferência de ETH (.transfer())
- Segurança básica (padrão checks-effects-interactions)
Código
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title Cofrinho
* @dev Contrato para depositar e retirar ETH de forma segura
* Ensina: payable + msg.value + require + segurança
*
* Como testar no Remix:
* 1. Deploy no Remix VM.
* 2. Em Value, selecione 1 ether e chame depositar().
* 3. Chame meuSaldo() e confirme 1000000000000000000.
* 4. Chame sacar(200000000000000000) para retirar 0.2 ether.
* 5. Chame sacarTudo() e confirme meuSaldo() igual a 0.
*/
contract Cofrinho {
// Mapeia endereço => saldo em wei
mapping(address => uint256) public saldos;
/**
* @dev Função para depositar ETH (qualquer valor)
*
* Uso: Envie ETH junto e será adicionado ao seu saldo
* msg.value = quantidade de ETH em wei
*/
function depositar() public payable {
require(msg.value > 0, "Deposito deve ser maior que zero");
saldos[msg.sender] += msg.value;
}
/**
* @dev Retira uma quantia específica de ETH
* @param valor Quantidade em wei a retirar
*
* Requer: Você ter saldo suficiente
*/
function sacar(uint256 valor) public {
require(saldos[msg.sender] >= valor, "Saldo insuficiente");
require(valor > 0, "Saque deve ser maior que zero");
// Primeiro atualiza o saldo (segurança contra re-entrancy)
saldos[msg.sender] -= valor;
// Depois transfere
payable(msg.sender).transfer(valor);
}
/**
* @dev Vê seu saldo atual em wei
* @return Seu saldo em wei (divide por 10^18 pra converter pra ETH)
*/
function meuSaldo() public view returns (uint256) {
return saldos[msg.sender];
}
/**
* @dev Saca tudo de uma vez
*/
function sacarTudo() public {
uint256 saldo = saldos[msg.sender];
require(saldo > 0, "Sem saldo para sacar");
saldos[msg.sender] = 0;
payable(msg.sender).transfer(saldo);
}
}
Como Testar no Remix
- Deploy no Remix VM
- No campo Value, selecione 1 ether
- Chame
depositar()→ seu ETH vai pro contrato - Chame
meuSaldo()→ deve mostrar 1000000000000000000 (1 ETH em wei) - Chame
sacar(200000000000000000)para sacar 0.2 ETH - Chame
meuSaldo()→ deve mostrar 800000000000000000 - Chame
sacarTudo()→ saldo volta a 0
Use Case
Primeira vez com dinheiro real • Entender payable e transferências