Skip to content

Sistema Financeiro

O sistema financeiro do CSGOFlip é construído sobre princípios de contabilidade de partida dupla (double-entry bookkeeping), garantindo integridade absoluta em todas as operações monetárias.

Visão Geral

┌─────────────────────────────────────────────────────────────────┐
│                    SISTEMA FINANCEIRO                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│    ┌──────────────┐    ┌──────────────┐    ┌──────────────┐     │
│    │   DEPÓSITOS  │    │  TRANSAÇÕES  │    │    SAQUES    │     │
│    │  (Entrada)   │───►│  (Registro)  │◄───│   (Saída)    │     │
│    └──────────────┘    └──────┬───────┘    └──────────────┘     │
│                               │                                  │
│                               ▼                                  │
│                     ┌──────────────────┐                        │
│                     │      SALDO       │                        │
│                     │  (Source of      │                        │
│                     │   Truth)         │                        │
│                     └──────────────────┘                        │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

Princípios Fundamentais

1. Source of Truth

O saldo do usuário é SEMPRE calculado da soma das transações:

typescript
// ✅ CORRETO
const balance = await transactionRepository.getUserBalance(userId);

// ❌ ERRADO
const balance = user.balanceCents; // Cache, pode estar desatualizado

2. Double-Entry Bookkeeping

Toda movimentação tem débito E crédito pareados:

Depósito de R$ 100:
├── DEBIT:  Gateway -R$ 100
└── CREDIT: Usuário +R$ 100

Abertura de caixa R$ 25:
├── DEBIT:  Usuário -R$ 25
└── CREDIT: House +R$ 25

3. Distributed Locks

Operações de saldo usam locks para evitar race conditions:

typescript
const lock = await redlock.acquire([`user:balance:${userId}`], 5000);
try {
  // Operação atômica
} finally {
  await lock.release();
}

4. Valores em Centavos (BigInt)

Todos os valores monetários são armazenados em centavos como BigInt:

typescript
// R$ 100,00 = 10000 centavos
const amount = 10000n;

// Nunca use float para dinheiro!
// 0.1 + 0.2 !== 0.3 em JavaScript

Componentes do Sistema

ComponenteResponsabilidade
TransactionServiceCria transações pareadas, calcula saldo
DepositServiceProcessa depósitos (PIX, Cartão, Crypto)
WithdrawalServiceProcessa saques com 2FA
LockServiceDistributed locks para operações
AuditServiceLog imutável de todas as operações

Fluxos Principais

Entrada de Dinheiro (Depósito)

1. Usuário solicita depósito
2. Gateway processa pagamento
3. Webhook confirma pagamento
4. Sistema cria transação CREDIT
5. Saldo é atualizado
6. WebSocket notifica usuário

Saída de Dinheiro (Saque)

1. Usuário solicita saque
2. Sistema valida saldo
3. Sistema solicita 2FA (se habilitado)
4. Admin aprova saque
5. Sistema cria transação DEBIT
6. Gateway processa pagamento
7. Admin marca como completo

Operações Internas

Abertura de caixa:
├── DEBIT do usuário (custo)
└── CREDIT ao ganhar item

Batalha:
├── DEBIT dos participantes (entrada)
└── CREDIT dos vencedores (prêmio)

Upgrade:
├── DEBIT do usuário (itens usados)
└── CREDIT se ganhar (item alvo)

Garantias de Segurança

GarantiaComo é Implementada
IntegridadeDouble-entry: soma sempre zero
AtomicidadePrisma $transaction + Redlock
RastreabilidadeAudit logs com hash chain
Não-repúdioTodas as ações são logadas
Prevenção de fraudeLocks distribuídos

Métodos de Pagamento

Depósitos

MétodoStatusProcessamento
PIX✅ AtivoInstantâneo
Cartão de Crédito✅ AtivoInstantâneo
Crypto (BTC, ETH)✅ Ativo1-6 confirmações

Saques

MétodoStatusProcessamento
PIX✅ AtivoAté 24h (manual)
Steam Trade🔜 Planejado-

Páginas desta Seção

Alertas Importantes

Regra Crítica

NUNCA manipule user.balanceCents diretamente. Sempre use TransactionService para operações de saldo.

Operações Sensíveis

Saques acima de R$ 100 requerem 2FA quando habilitado pelo usuário.

Auditoria

Todas as transações financeiras são registradas em log imutável com hash encadeado, permitindo auditoria completa.

Documentação Técnica CSGOFlip