Fluxos cross-componente que atravessam mais de um projeto. Cada um traz o gatilho,
se é síncrono/on-chain, um flowchart e os passos numerados.
flowchart LR
U[Usuario] --> DAPP[dApp]
DAPP --> GATE[WriteGate login + carteira]
GATE --> FORGE[Forge requestObtain paga tierPrice]
FORGE --> VRF[Chainlink VRF]
VRF --> FORGE2[Forge fulfillRandomWords]
FORGE2 --> NFT[NFT forgeMint retorna referrer e rateBps]
FORGE2 --> PEND[Forge pendingReferralBnb split do preco]
NFT --> IDX[Indexer indexa eventos]
IDX --> PG[(schema indexer)]
PG --> API[App Backend]
API --> HUB[SignalR forgeFulfilled]
HUB --> DAPP2[dApp reveal NFT]
WriteGate exige login Firebase + carteira vinculada antes de qualquer escrita.forge.requestObtain(tier, referrerCode, name) pagando tierPrice em BNB.ForgeRequested (com requestId).fulfillRandomWords; o Forge chama pickEdition + forgeMint.forgeMint deriva gênero do bit menos significativo da palavra e processa o vínculo
de indicação, retornando (tokenId, referrer, rateBps) — não-zero só no 1º ovo do indicado.paid * rateBps / 10000 em pendingReferralBnb e emite
ReferralBnbAccrued. O Indexer materializa ForgeFulfilled, Minted, ReferralLinked e
ReferralBnbAccrued no schema indexer; a API publica forgeFulfilled via SignalR ao comprador.GET /forge-requests, polling on-chain).npm run deploy:<rede> ou npm run upgrade:<rede>.flowchart LR
OP[Operador] --> HH[Scripts Hardhat]
HH --> RPC[BSC RPC]
RPC --> CHAIN[Contratos via proxy OZ]
HH --> SCAN[BSCScan verify]
HH --> MANIF[.openzeppelin manifests commit]
CHAIN --> ADDR[enderecos deployados]
ADDR -.copia manual.-> DAPP[dApp environment + contract-abi]
ADDR -.copia manual.-> IDX[Indexer abis + DEPLOYED_ADDRESSES_PATH]
setForge, grantRole(MINTER_ROLE),
setEmissionCap, updateTierPrices e registro de edições de exemplo.upgradesApi.upgradeProxy com validação de storage; os manifests
.openzeppelin/{bsc,bsc-testnet}.json devem ser commitados.npm run verify:<rede>.RW.BC.DApp (environment.*.ts +
contract-abi.ts) e em RW.BC.Indexer (abis/*.ts + endereços). Não há
geração automática.flowchart LR
CHAIN[Contratos BSC/Anvil] -->|eventos via RPC| IDX[Indexer Ponder]
IDX -->|readContract getEdition| CHAIN
IDX -->|upsert idempotente| PG[(schema indexer)]
PG -->|EF Core Gridify read-only| API[App Backend]
PG -->|LISTEN/NOTIFY| HUB[SignalR]
API -->|REST paginado| DAPP[dApp MarketDataService]
HUB -->|push| DAPP
readContract({ functionName: "getEdition" }) no bloco do evento.onConflictDoUpdate (upsert idempotente) — reindexação é segura.indexer via EF ToView (somente leitura) com Gridify
(filtro/paginação server-side) e nunca expõe estados não-ativos ao cliente.MarketplaceEventsListener detecta mudanças por LISTEN/NOTIFY (fallback
polling 5 s) e publica marketChanged/forgeFulfilled via SignalR.flowchart LR
VIEW[View com precos] --> CG[CoinGeckoService]
CG -->|cache 60s + dedup inflight| CACHE[(cache local)]
CG -->|GET simple/price| API[CoinGecko API]
API --> CG
CG --> QUOTE[signal quote rate/currency/change24h]
QUOTE --> VIEW
Promise em voo; retry exponencial (3 tentativas).null — nunca bloqueia
a renderização de preços em BNB.