Blockchain · Tarea de clase 4 — Entregable final del módulo
Plazo: antes del cierre del SIP 2026 (la fecha exacta del TP final la define el cronograma del seminario).
Pre-requisito: las clases 1, 2, 3 y 4 completas. Tienen el stack:
PaymentGateway+ ERC-20 propio + ERC-721 Set Bonus + frontend en Vercel.
Qué hay que entregar
1. Repo en GitHub
Estructura mínima:
.
├── contracts/ # los 4 contratos
│ ├── PaymentGateway.sol
│ ├── ProjectToken.sol # tu ERC-20 ($VBK / $DPF / $RNW / $IDEA)
│ ├── SetBonusNFT.sol # ERC-721 con piezas + rareza
│ └── TierRegistry.sol # SBT con tier del usuario
├── frontend/ # Next.js + wagmi conectado al stack
├── test/ # tests Foundry
│ ├── PaymentGateway.t.sol
│ ├── SetBonusNFT.t.sol
│ └── …
├── SECURITY.md # output de Slither + findings aceptados
└── README.md # addresses en testnet, pasos para correr
Requisitos de los tests:
- Coverage ≥ 70%.
- Al menos 2 fuzz tests.
- Test de Set Bonus (que se mintea, que la rareza se calcula, que
uniqueSlotsOfcuenta bien).
2. Demo en vivo (5 min en clase)
Tienen que mostrar:
- Conectar wallet desde el frontend deployado en Vercel.
- Pagar con USDC de testnet → ver que se mintea el ERC-20 + el ticket/share NFT + la pieza Set Bonus.
- Mostrar el evento
Paid(y los eventos del NFT) en Etherscan. - Mostrar el output de Slither limpio (0 findings HIGH).
3. Defensa (5 min)
- Por qué eligieron esa red para producción (Polygon / Base / Arbitrum / quedarse en Sepolia).
- Qué riesgos quedan abiertos (randomness pseudo, slippage de DEX por burn, dependencia de oráculos…).
- Qué falta para llevarlo a mainnet real.
Cómo probar que está bien
Checklist de aceptación — usenlo como checklist antes de subir el TP:
Contratos
Slither
Deploy
Frontend
Tokenomics + gamification
Defensa
Criterios de evaluación (alineados con el SIP)
| Criterio | Peso |
|---|---|
| Contratos compilan + pasan tests | 25% |
| Tokenomics coherente con el proyecto + documentada | 20% |
| Frontend conecta y ejecuta el flow completo | 20% |
Slither limpio + SECURITY.md honesto |
15% |
| Set Bonus funcional + visualizable | 10% |
| Demo + defensa | 10% |
Si algo falla
| Síntoma | Probable causa | Fix |
|---|---|---|
slither: command not found |
No está en PATH | pip install --user slither-analyzer y agregar
~/.local/bin al PATH |
slither falla con “Source not found” |
Foundry layout no detectado | slither . --foundry-out-directory out o
slither src/ |
solc not installed for 0.8.24 |
Versión no instalada | solc-select install 0.8.24 && solc-select use 0.8.24 |
_safeMint revierte en fuzz tests |
Foundry envía a addresses que no implementan
onERC721Received |
Usar _mint (sin “safe”) o filtrar to con
vm.assume(to.code.length == 0) |
nonReentrant revierte llamadas válidas |
Estás llamando dos funciones nonReentrant en la misma
tx |
Mover lógica interna a función private (sin guard) |
| El Set Bonus siempre da el mismo slot | entropy no incluye block.prevrandao o
nonce |
Agregar block.prevrandao y un nonce que se
incremente |
Slither marca unchecked-transfer en USDT |
USDT real no devuelve bool | Usar SafeERC20.safeTransferFrom (OpenZeppelin) |
forge create en Polygon Amoy revierte |
Faucet de Amoy escaso | Probar https://faucet.polygon.technology o pedir en el foro del campus |
| Frontend no muestra la pieza NFT | El RPC no devolvió tokenURI aún (cache) |
Esperar 30 s, o invalidar query con
queryClient.invalidateQueries |
Dividendos claim() devuelve 0 |
El distribute fue antes de tu compra | Es correcto — el accPerShare solo cuenta hacia
adelante. Ese es el patrón. |
Lo demás, foro del campus.