| Serviço | Direção | Protocolo | Criticidade | Tratamento de falha |
|---|---|---|---|---|
| Reown AppKit / WalletConnect | Saída (modal) | EIP-1193 / WalletConnect v2 | Alta — sem ela não há conexão de carteira | connect() retorna false; componentes verificam isConnected() antes de agir |
| BSC RPC (leitura) | Saída | JSON-RPC over HTTPS | Alta — leituras de contrato | FallbackProvider com múltiplos endpoints; withRetry (3x, exp. jitter); safeRead retorna fallback |
| BSC RPC (escrita) | Saída | JSON-RPC over HTTPS (via signer) | Alta — transações | toTransactionError mapeia códigos ethers; toast de erro exibido ao usuário |
| Firebase Auth | Saída | HTTPS (SDK Firebase Web v12) | Alta — autenticação da identidade | Falha no login/signup lança exceção capturada no componente de auth |
| RW.BC.Api (REST) | Saída | HTTPS + Firebase JWT Bearer | Alta — contas, dados on-chain indexados | HttpErrorResponse capturado; erros de wallet-link mapeados para WalletLinkError com chave i18n |
| RW.BC.Api (SignalR) | Bidirecional | WebSocket (via @microsoft/signalr) | Média — realtime marketplace e forge | withAutomaticReconnect(); fallback para polling API/on-chain após 45 s |
| CoinGecko API | Saída | HTTPS REST | Baixa — cotação BNB/fiat | Falha silenciosa; retorna último valor cacheado ou null; retry 3x |
| Pinata (IPFS upload) | Saída | HTTPS multipart/form-data | Baixa — upload de arte (só admin) | Lança Error com mensagem descritiva; exibido no painel admin |
| Google Analytics (GA4) | Saída | HTTPS (gtag.js) | Baixa — telemetria | Desabilitado sem consent; sem consent, nenhum evento é enviado |
| BSCScan / Otterscan | Saída (link) | HTTPS (abre em nova aba) | Baixa — explorador de tx | Link gerado por explorer.ts sem chamada HTTP; falha = link inválido |
Configuração: core/web3/web3.service.ts (construtor; createAppKit)
appKit.local = true → chain local 1337; production = true → bsc; senão → bscTestnetprojectId: environment.reown.projectId (placeholder nos environment.*.ts versionados; preencha com seu próprio project ID do cloud.reown.com)effect(() => appKit.setThemeMode(...))getSigner() valida chainId antes de retornar; lança Web3Error WRONG_NETWORK se rede incorretaConfiguração: environment.*.ts (rpcUrl, rpcUrls, contracts.*)
bsc-dataseed.binance.org, bsc-dataseed1.defibit.io, bsc-dataseed1.ninicoin.iohttp://localhost:8545getMintTiers(), getCatalog() e inventário por endereçosafeRead<T>(fn, fallback) absorve qualquer erro e retorna fallback — usado para getters opcionaisContratos acessados (endereços em environment.contracts):
| Variável | Contrato |
|---|---|
contracts.token |
BitChicken Token (BCKN ERC-20) |
contracts.nft |
BitChicken NFT (ERC-721) |
contracts.staking |
BitChicken Staking |
contracts.marketplace |
BitChicken Marketplace |
contracts.forge |
BitChicken Forge (VRF gacha) |
Configuração: environment.contracts.* + signer via Web3Service.getSigner()
executeWrite<T> centraliza o ciclo: awaitingSignature → submitting → confirming (1 confirmação)toTransactionError mapeia: ACTION_REJECTED → USER_REJECTED, INSUFFICIENT_FUNDS, CALL_EXCEPTION, NETWORK_ERROR; demais → TRANSACTION_FAILEDweb3-errors.ts: describeError() traduz Web3Error e erros de revert (revert.name ou errorName) para chaves i18nConfiguração: environment.*.ts (campo firebase: apiKey, authDomain, projectId, appId)
firebase/app, firebase/auth)getApps() (guard contra re-inicialização)createUserWithEmailAndPassword / signInWithEmailAndPassword → onIdTokenChanged → AccountStore chama GET /accounts/megetIdToken(user) chamado pelo authTokenInterceptor a cada requisição para apiBaseUrlConfiguração: environment.apiBaseUrl
| Endpoint | Serviço consumidor | Payload / Resposta |
|---|---|---|
GET /accounts/me |
AuthApiService |
AccountDto { id, email, nickname, walletAddress, walletLinked } |
POST /accounts/me/wallet/nonce |
AuthApiService |
WalletNonceDto { message, nonce, expiresAt } |
POST /accounts/me/wallet |
AuthApiService |
LinkWalletDto { address, signature } → AccountDto |
DELETE /accounts/me/wallet |
AuthApiService |
→ AccountDto |
GET /marketplace/listings |
MarketDataService |
PagedResponse<ListingDto> (filtro Gridify, orderBy) |
GET /editions |
MarketDataService |
PagedResponse<EditionDto> |
GET /accounts/:addr/nfts |
MarketDataService |
PagedResponse<NftItemDto> |
GET /accounts/:addr/staking |
MarketDataService |
PagedResponse<StakingPairDto> |
GET /accounts/:addr/referral |
MarketDataService |
ReferralInfoDto |
GET /accounts/:addr/forge-requests |
ForgeApiService |
PagedResponse<ForgeRequestDto> |
GET /transparency/summary |
MarketDataService |
TransparencySummaryDto |
GET /transparency/sales |
MarketDataService |
PagedResponse<SaleDto> |
authTokenInterceptor apenas em URLs com prefixo apiBaseUrltokenId, price, editionId, etc.)Configuração: environment.apiBaseUrl + hub path /hubs/events
SignalrService gerencia conexão única com withAutomaticReconnect()marketChanged → { count, maxBlock } — marketplace recarrega listings (debounce 300 ms)forgeFulfilled → { requestId, tokenId, editionId } — resolve promessa em ForgeWaitServiceSubscribe(address) — inscreve endereço para receber forgeFulfilledUnsubscribe(address) — desinscreve após receber fulfillmentForgeWaitService timeout: 45 s → fallback API → fallback polling on-chainConfiguração: environment.coingecko (baseUrl, demoApiKey)
GET /simple/price?ids=binancecoin&vs_currencies=<fiat>&include_24hr_change=truex_cg_demo_api_key); sem ela, sujeito a rate limit do plano gratuitowithRetry (3 tentativas, base 1000 ms)Map<string, number>) com TTL de 60 sPromise em voo (inflight Map)Configuração: JWT armazenado em localStorage pelo painel admin (PinataUploadService.setJwt())
POST https://api.pinata.cloud/pinning/pinFileToIPFSenvironment.ts — configurado pelo operador em runtime na UIIpfsHash string → armazenado como artURI da ediçãoConfiguração: environment.analytics (measurementId, enabled)
enabled: true)analytics_storage: 'denied' por padrão; atualizado para 'granted' se usuário aceitarlocalStorage (bitchicken.consent)page_view (cada NavigationEnd) e login (method: web3_wallet)setUser: hash SHA-256 do endereço da carteira (nunca o endereço raw)