Un contrato inteligente de lotería desarrollado con Foundry, donde los usuarios pueden comprar tickets y un ganador es elegido aleatoriamente.
- Características
- Instalación y Configuración
- Estructura del Proyecto
- Comandos Principales
- Cómo Funciona
- Testing
- Deployment
- Análisis de Gas
- Consideraciones de Seguridad
- 🎫 Compra de Tickets: Los usuarios pueden comprar tickets con un precio fijo
- 🎰 Selección Aleatoria: El ganador se elige usando un algoritmo pseudoaleatorio
- 💰 Premio Automático: El ganador recibe todo el balance del contrato
- 🔄 Múltiples Rondas: Se pueden iniciar nuevas loterías después de cada ronda
- 🔒 Control de Acceso: Solo el owner puede elegir ganador y iniciar nuevas rondas
- 📊 Eventos: Emite eventos para todas las acciones importantes
- Docker Desktop (debe estar ejecutándose)
- Git para Windows
- VS Code (recomendado)
-
Clonar el repositorio:
git clone <tu-repo-url> cd lottery-with-foundry
-
Instalar Foundry (usar Git BASH en Windows):
curl -L https://foundry.paradigm.xyz | bash source ~/.bashrc foundryup
-
Verificar instalación:
forge --version cast --version anvil --version
-
Compilar el proyecto:
forge build
-
Ejecutar tests:
forge test
lottery-with-foundry/
├── .devcontainer/ # Configuración para Dev Containers
├── src/
│ ├── Counter.sol # Contrato de ejemplo (original de Foundry)
│ └── Lottery.sol # 🎯 Contrato principal de la lotería
├── test/
│ ├── Counter.t.sol # Tests del contrato de ejemplo
│ └── Lottery.t.sol # 🧪 Tests del contrato de lotería
├── script/
│ ├── Counter.s.sol # Script de deployment de ejemplo
│ └── DeployLottery.s.sol # 🚀 Script de deployment de la lotería
├── lib/
│ └── forge-std/ # Librería estándar de Foundry
├── foundry.toml # ⚙️ Configuración de Foundry
└── README.md # 📖 Esta documentación
Importante: En Windows, usar siempre Git BASH para los comandos de Foundry, no PowerShell.
# Compilar todos los contratos
forge build
# Compilar con información adicional
forge build --sizes
# Ejecutar todos los tests
forge test
# Tests con output detallado
forge test -vvv
# Reporte de gas de los tests
forge test --gas-report
# Ejecutar tests específicos
forge test --match-test test_PlayerCanEnterLottery
# Tests con coverage
forge coverage
# Formatear código Solidity
forge fmt
# Limpiar archivos compilados
forge clean
# Simulación local del deployment
forge script script/DeployLottery.s.sol
# Deploy en blockchain local (Anvil)
anvil # En una terminal separada
forge script script/DeployLottery.s.sol --fork-url http://localhost:8545 --broadcast
# Deploy en testnet (ejemplo Sepolia)
forge script script/DeployLottery.s.sol \
--rpc-url https://sepolia.infura.io/v3/TU_API_KEY \
--private-key TU_PRIVATE_KEY \
--broadcast \
--verify
- El contrato se despliega con un precio de ticket específico (ej: 0.01 ETH)
- La lotería se activa automáticamente al desplegar
// Los usuarios llaman a esta función con el valor exacto del ticket
lottery.enterLottery{value: 0.01 ether}();
// Solo el owner puede ejecutar esto
lottery.pickWinner();
// El owner puede iniciar una nueva lotería
lottery.startNewLottery(0.02 ether); // Nuevo precio de ticket
lottery.getPlayersCount(); // Número de jugadores
lottery.getTotalPrize(); // Premio total acumulado
lottery.getPlayers(); // Lista de jugadores
lottery.lotteryActive(); // Estado de la lotería
El proyecto incluye tests completos que cubren:
- ✅ Configuración inicial correcta
- ✅ Compra de tickets
- ✅ Validación de precios
- ✅ Múltiples jugadores
- ✅ Control de acceso
- ✅ Selección de ganador
- ✅ Transferencia de premios
- ✅ Gestión de estado
- ✅ Emisión de eventos
- ✅ Fuzz testing
# Test de compra de tickets
forge test --match-test test_PlayerCanEnterLottery -vvv
# Test de selección de ganador
forge test --match-test test_PickWinnerTransfersPrize -vvv
# Fuzz testing
forge test --match-test testFuzz_EnterLotteryWithDifferentTicketPrices -vvv
-
Iniciar Anvil:
anvil
Esto te dará 10 cuentas con 10,000 ETH cada una.
-
Deployar:
forge script script/DeployLottery.s.sol \ --fork-url http://localhost:8545 \ --broadcast \ --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
-
Configurar variables de entorno:
# Crear archivo .env touch .env
Agregar al
.env
:PRIVATE_KEY=tu_private_key_aqui SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/tu_api_key ETHERSCAN_API_KEY=tu_etherscan_api_key
-
Deployar:
source .env forge script script/DeployLottery.s.sol \ --rpc-url $SEPOLIA_RPC_URL \ --private-key $PRIVATE_KEY \ --broadcast \ --verify \ --etherscan-api-key $ETHERSCAN_API_KEY
- Lottery Contract:
924,970 gas ($25-50 dependiendo del gas price)
Función | Gas Promedio | Descripción |
---|---|---|
enterLottery() |
~71,014 | Comprar un ticket |
pickWinner() |
~37,203 | Elegir ganador |
startNewLottery() |
~52,367 | Iniciar nueva ronda |
getPlayersCount() |
~2,440 | Ver número de jugadores |
getTotalPrize() |
~356 | Ver premio total |
- Uso de
payable[]
para eficiencia en transferencias - Eventos indexados para búsqueda eficiente
- Funciones de vista para consultas sin gas
- Limpieza de estado después de cada ronda
-
Aleatoriedad: El contrato usa
keccak256
con variables de bloque para generar aleatoriedad. NO es criptográficamente seguro para producción. -
Para Producción: Usar Chainlink VRF para aleatoriedad verdadera.
-
Reentrancy: El contrato está protegido contra reentrancy al cambiar el estado antes de transferir.
// Ejemplo con Chainlink VRF
import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";
contract SecureLottery is VRFConsumerBase {
// Implementar Chainlink VRF para aleatoriedad real
}
Antes de usar en mainnet:
- Auditoría de seguridad profesional
- Implementar Chainlink VRF
- Tests de stress con múltiples usuarios
- Revisión de límites de gas
- Análisis de MEV (Maximal Extractable Value)
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature
) - Commit tus cambios (
git commit -m 'Add some AmazingFeature'
) - Push a la rama (
git push origin feature/AmazingFeature
) - Abre un Pull Request
Este proyecto está bajo la licencia MIT. Ver el archivo LICENSE
para más detalles.
- Implementar Chainlink VRF para aleatoriedad segura
- Agregar interfaz web con React
- Implementar límites de tiempo para rondas
- Añadir comisión para el owner
- Crear sistema de múltiples premios
- Agregar whitelist para jugadores VIP
¡Desarrollado con ❤️ y Foundry!