Phoenix Games
Guidelines

Troubleshooting & Pitfalls

Common mistakes and debugging strategies

Currency Handling Mistakes

❌ Forgetting Cents Conversion

// WRONG
const withdrawAmount = request.amount; // 5000 treated as $5000

// CORRECT
const withdrawAmount = request.amount / 100; // 5000 cents = $50

❌ Using Floating-Point Arithmetic

// WRONG
const newBalance = balance - (amount * 0.01);

// CORRECT
const newBalance = (balanceInCents - amountInCents) / 100;

Security Mistakes

❌ Skipping Signature Verification

  • Always verify signatures, even in dev/staging
  • Use proper RSA verification with SHA-256
  • Never trust requests without valid signatures

❌ Logging Sensitive Data

// WRONG
console.log('Request:', { ...request, signature });

// CORRECT
console.log('Request:', { ...request, signature: '[REDACTED]' });

Performance Issues

❌ Making Blocking External Calls

// WRONG
const externalData = await slowExternalAPI.getData();

// CORRECT
const result = processWithdraw(cachedData);
// Update cache asynchronously

❌ Synchronous Operations

  • Use async logging libraries
  • Implement non-blocking database queries
  • Avoid synchronous file operations

Data Integrity Issues

❌ Not Handling Race Conditions

  • Use database transactions with proper isolation
  • Implement row-level locking (SELECT FOR UPDATE)
  • Queue requests per player if needed

❌ Ignoring Idempotency

  • Always check tx_id before processing
  • Store and return previous responses for duplicates
  • Handle retries gracefully

❌ Missing Rollback Logic

  • Wrap operations in transactions
  • Implement compensating transactions for failures
  • Test rollback scenarios thoroughly

Debugging Strategies

Common Issues

  • Timeout errors: Check database query performance and indexes
  • Balance discrepancies: Verify transaction atomicity and rollback logic
  • Signature failures: Validate key format and signing process
  • Race conditions: Review concurrent request handling

Circuit Breaker Implementation

  • Monitor failure rates for external dependencies
  • Open circuit after threshold failures
  • Provide fallback responses during outages
  • Automatically retry after cooldown period