Repo: github.com/ab4cus/quad4Damage-oracle (antes «qd-oracle»).
Sidecar que cierra el círculo jugar → ganar → mint. Recibe los eventos económicos
que emite el game server Quad4Damage (carril Tier 0, server-authoritative), firma la
sesión con la clave del servidor y la envía a SessionOracle en la L2, que acuña los
ResourceNFT del jugador.
Fase 4 del PLAN-UNIFICADO. Referencia en Node (interactúa con la cadena vía
castde Foundry, sin dependencias npm). En producción se fusiona con el Oracle en Rust y el spool se sustituye por un socket local.
Quad4Damage server qd-oracle L2 (SessionOracle)
│ │ │
partida termina │ │
Trap_EconEvent ──► spool/.evt │ │
{player,resource,amount,rarity}│ │
│ │ lee el evento │
│ │ sessionHash=keccak(gameId, │
│ │ player,drop,nonce) │
│ │ firma con clave del servidor │
│ │ (Tier 0, en GameRegistry) │
│ │ submitSession(...) ──────────►│ verifica firma
│ │ │ mint ResourceNFT
│ │◄──── balanceOf confirma ──────│ → wallet del jugador
sessionHash compromete el contenido del drop, así el relayer no puede alterar lo
que se acuña (aunque tenga el rol RELAYER).
# vigila el spool y procesa eventos en bucle
QD_DEPLOY_JSON=../e4Coin-play4Chain/deploy.json \
QD_ECON_SPOOL=/ruta/al/spool \
L2_RPC_URL=http://127.0.0.1:8545 \
GAME_SIGNER_PK=0x... \
RELAYER_PK=0x... \
node src/oracle.mjs
# o procesa lo pendiente y sale (tests / cron)
node src/oracle.mjs --onceGAME_SIGNER_PK es la clave registrada como signerKey del juego en GameRegistry
(Tier 0). RELAYER_PK paga el gas de submitSession (rol RELAYER de la federación).
.claude/e2e-phase4.sh en la raíz del monorepo levanta anvil, despliega los contratos,
hace que el game server emita eventos (econevent), corre este Oracle y verifica el
balance ResourceNFT del jugador on-chain:
=== 2. game server emite evento economico (Tier 0) ===
eventos en spool: 2
=== 3. qd-oracle procesa el spool -> mint en L2 ===
[qd-oracle] mint OK: 0x7099… +3 iron (common) → balance 3
[qd-oracle] mint OK: 0x7099… +1 artifact (legendary) → balance 1
=== 4. verificacion ON-CHAIN del balance del jugador ===
balance iron del jugador: 3
balance artifact del jugador: 1
- El game server debe correr en modo standalone con su basegame propio (
quad4damage). - Reemplazar el spool por un socket local (menor latencia, sin pulling).
- Firma-umbral BLS del quorum LLMQ en lugar de una única clave de servidor.
- Rate limiting y validación de plausibilidad (anti-abuso) antes de acuñar.
GNU General Public License v2.0 or later (GPL-2.0-or-later) — ver LICENSE.