Skip to content

Sistema Provably Fair - CSGOFlip

Range Oficial

O range do sistema Provably Fair é de 1 a 10.000.000 (dez milhões).

typescript
const HASH_MIN = 1;
const HASH_MAX = 10000000;

Como Funciona

1. Geração do Roll

O roll é calculado usando HMAC-SHA256:

typescript
function calculateRoll(serverSeed: string, clientSeed: string, nonce: number): number {
  const combined = `${serverSeed}:${clientSeed}:${nonce}`;
  const hash = crypto.createHmac('sha256', serverSeed).update(combined).digest('hex');
  return (parseInt(hash.substring(0, 8), 16) % 10000000) + 1;
}

Componentes:

  • serverSeed: Gerado pelo servidor (hash SHA256 revelado antes, seed revelado depois)
  • clientSeed: Fornecido pelo jogador (ou gerado automaticamente)
  • nonce: Contador incremental por sessão

Aplicações

Abertura de Caixas

Cada item da caixa tem um range de hash:

Item                    | Range Start | Range End  | Chance
------------------------|-------------|------------|--------
AK-47 | Redline         | 1           | 3.500.000  | 35%
M4A4 | Asiimov          | 3.500.001   | 6.000.000  | 25%
AWP | Dragon Lore       | 9.999.900   | 10.000.000 | 0.001%

O item é selecionado quando: roll >= hashRangeStart && roll <= hashRangeEnd

Upgrades

O sucesso do upgrade é calculado com base na chance:

typescript
// Exemplo: 20% de chance
const successThreshold = 10000000 - (20 / 100) * 10000000; // = 8.000.000
const success = roll >= successThreshold; // Roll >= 8.000.000 = sucesso
ChanceThresholdRange de Sucesso
5%9.500.0009.500.000 - 10.000.000
10%9.000.0009.000.000 - 10.000.000
20%8.000.0008.000.000 - 10.000.000
50%5.000.0005.000.000 - 10.000.000
80%2.000.0002.000.000 - 10.000.000

Sistema FLIP

O FLIP ativa quando o roll cai na faixa de itens raros:

typescript
const flipThreshold = Math.min(...rareItems.map(item => item.hashRangeStart));
const isFlip = roll >= flipThreshold;

Verificação

Os jogadores podem verificar qualquer resultado:

  1. Antes do jogo: Server Seed Hash é revelado
  2. Durante o jogo: Client Seed é definido pelo jogador
  3. Após o jogo: Server Seed original é revelado

Como Verificar

javascript
const crypto = require('crypto');

// Dados fornecidos após o jogo
const serverSeed = 'abc123...';
const clientSeed = 'xyz789...';
const nonce = 42;

// Verificar hash do server seed
const serverSeedHash = crypto.createHash('sha256').update(serverSeed).digest('hex');
console.log('Server Seed Hash:', serverSeedHash); // Deve bater com o hash revelado antes

// Calcular roll
const combined = `${serverSeed}:${clientSeed}:${nonce}`;
const hash = crypto.createHmac('sha256', serverSeed).update(combined).digest('hex');
const roll = (parseInt(hash.substring(0, 8), 16) % 10000000) + 1;
console.log('Roll:', roll); // Deve bater com o roll do jogo

Arquivos do Sistema

ArquivoResponsabilidade
provably-fair.service.tsCálculo de roll e geração de seeds
perform-upgrade.use-case.tsLógica de sucesso do upgrade
verify-upgrade.use-case.tsVerificação de upgrades
open-case.use-case.tsAbertura de caixas
execute-battle.use-case.tsBatalhas
flip.service.tsSistema FLIP
add-case-item.use-case.tsRecálculo de ranges
remove-case-item.use-case.tsRecálculo de ranges
probability.service.tsAtribuição de ranges

Regras de Implementação

SEMPRE

  • Use HASH_MAX = 10000000 em todos os cálculos
  • Use roll >= start && roll <= end para seleção de items
  • Use roll >= successThreshold para upgrades
  • Arredonde para baixo (Math.floor) ao calcular ranges

NUNCA

  • Use ranges diferentes de 1-10.000.000
  • Use < ao invés de <= na comparação de ranges
  • Use valores hardcoded diferentes de 10.000.000

Histórico de Correções

2024-12-09: Padronização do Range

Problema: Alguns arquivos usavam 100000 ao invés de 10000000.

Arquivos corrigidos:

  • calculate-result.use-case.ts: 100000 → 10000000
  • verify-upgrade.use-case.ts: 100000 → 10000000
  • probability.service.ts: HASH_MAX 100000 → 10000000
  • add-case-item.use-case.ts: Adicionada normalização para 10000000
  • remove-case-item.use-case.ts: Adicionada normalização para 10000000

Documentação Técnica CSGOFlip