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 desatualizado2. 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$ 253. 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 JavaScriptComponentes do Sistema
| Componente | Responsabilidade |
|---|---|
| TransactionService | Cria transações pareadas, calcula saldo |
| DepositService | Processa depósitos (PIX, Cartão, Crypto) |
| WithdrawalService | Processa saques com 2FA |
| LockService | Distributed locks para operações |
| AuditService | Log 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árioSaí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 completoOperaçõ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
| Garantia | Como é Implementada |
|---|---|
| Integridade | Double-entry: soma sempre zero |
| Atomicidade | Prisma $transaction + Redlock |
| Rastreabilidade | Audit logs com hash chain |
| Não-repúdio | Todas as ações são logadas |
| Prevenção de fraude | Locks distribuídos |
Métodos de Pagamento
Depósitos
| Método | Status | Processamento |
|---|---|---|
| PIX | ✅ Ativo | Instantâneo |
| Cartão de Crédito | ✅ Ativo | Instantâneo |
| Crypto (BTC, ETH) | ✅ Ativo | 1-6 confirmações |
Saques
| Método | Status | Processamento |
|---|---|---|
| PIX | ✅ Ativo | Até 24h (manual) |
| Steam Trade | 🔜 Planejado | - |
Páginas desta Seção
- Gestão de Saldo - Como o saldo é calculado e atualizado
- Sistema de Transações - Double-entry e tipos de transações
- Fluxo de Depósitos - Processamento de depósitos
- Fluxo de Saques - Processamento de saques com 2FA
- Reconciliação - Verificação de integridade
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.
