Skip to main content

Top Casino Wins

The topCasinoWins query returns the user's top 20 winning casino bets with significant multipliers, providing insights into their best casino performances.

Authentication​

Required - This endpoint requires user authentication via access token.

Query​

query TopCasinoWins {
topCasinoWins {
data {
id
betAmount
wonAmount
gameName
gameThumbnailUrl
thumbnailBlurHash
thumbnailBlurHashWidth
thumbnailBlurHashHeight
}
}
}

Parameters​

This query takes no parameters - it automatically returns the authenticated user's top casino wins.

Response​

TopCasinoWinsResponse​

{
data: TopCasinoWinsModel[]
}

TopCasinoWinsModel​

FieldTypeDescription
idString!Unique identifier of the bet
betAmountString!Original bet amount in USDC
wonAmountString!Amount won in USDC
gameNameString!Name of the casino game
gameThumbnailUrlString!URL of the game thumbnail image
thumbnailBlurHashStringBlurHash for image placeholder (optional)
thumbnailBlurHashWidthNumberWidth for BlurHash rendering (optional)
thumbnailBlurHashHeightNumberHeight for BlurHash rendering (optional)

Business Logic​

Filtering Criteria​

  • Bet Type: Only casino bets are included
  • Status: Only winning bets (BetStatus.WON)
  • Minimum Win: Only bets with wonAmountSystem > 25
  • Multiplier: Only bets with multiplier ≥ 2.0 (wonAmount/betAmount)
  • User Specific: Only returns bets belonging to the authenticated user

Sorting and Limits​

  • Sorting: Ordered by betPlacedAt (most recent first)
  • Limit: Maximum 20 results
  • Currency: All amounts converted to USDC

Multiplier Calculation​

The multiplier is calculated as:

multiplier = wonAmountSystem / betAmountSystem

Only bets with multiplier ≥ 2.0 are included to show significant wins.

Currency Handling​

All monetary values are converted to USDC for consistency:

  • Uses real-time USDC exchange rates
  • Converts from system currency (EUR) to USDC
  • Formatted as strings for precision

Caching​

  • Cache Duration: 5 minutes per user
  • Cache Key: USER_BET_TOP_CASINO_WINS:{userId}
  • Cache Strategy: User-specific caching for personalized data

Example Response​

{
"data": {
"topCasinoWins": {
"data": [
{
"id": "507f1f77bcf86cd799439011",
"betAmount": "$50.00",
"wonAmount": "$1,250.00",
"gameName": "Sweet Bonanza",
"gameThumbnailUrl": "https://cdn.example.com/games/sweet-bonanza.jpg",
"thumbnailBlurHash": "LEHV6nWB2yk8pyo0adR*.7kCMdnj",
"thumbnailBlurHashWidth": 100,
"thumbnailBlurHashHeight": 100
},
{
"id": "507f1f77bcf86cd799439012",
"betAmount": "$25.00",
"wonAmount": "$500.00",
"gameName": "Gates of Olympus",
"gameThumbnailUrl": "https://cdn.example.com/games/gates-olympus.jpg",
"thumbnailBlurHash": "L6PZfSi_.AyE_3t7t7R**0o#DgR4",
"thumbnailBlurHashWidth": 100,
"thumbnailBlurHashHeight": 100
}
]
}
}
}

Error Handling​

Common Errors​

Authentication Required​

{
"errors": [
{
"message": "Unauthorized",
"extensions": {
"code": "UNAUTHENTICATED"
}
}
]
}

Token Service Errors​

{
"errors": [
{
"message": "USDC token not found",
"extensions": {
"code": "TOKEN_NOT_FOUND"
}
}
]
}

Rate Configuration Errors​

{
"errors": [
{
"message": "USDC exchange rate not found",
"extensions": {
"code": "TOKEN_RATE_NOT_FOUND"
}
}
]
}

Use Cases​

Gamification Features​

  • Display user's best casino wins
  • Achievement systems based on win multipliers
  • Leaderboards for top wins

User Engagement​

  • Showcase successful betting sessions
  • Encourage continued play with win highlights
  • Social sharing of big wins

Analytics​

  • Track user's best performing games
  • Identify high-value betting patterns
  • Measure user engagement with casino games

Performance Considerations​

Database Optimization​

  • Uses efficient MongoDB aggregation pipeline
  • Leverages indexes on user, status, and bet type
  • Limits result set to prevent excessive memory usage

Caching Strategy​

  • 5-minute cache reduces database load
  • User-specific cache keys for personalized data
  • Cache invalidation on new winning bets

Response Optimization​

  • Pre-calculated multipliers in database query
  • Efficient currency conversion with cached rates
  • Minimal data transfer with selective field projection

Integration Examples​

React Component​

import { useQuery } from '@apollo/client';
import { TOP_CASINO_WINS_QUERY } from './queries';

function TopWinsComponent() {
const { data, loading, error } = useQuery(TOP_CASINO_WINS_QUERY);

if (loading) return <div>Loading your top wins...</div>;
if (error) return <div>Error loading wins: {error.message}</div>;

return (
<div className="top-wins">
<h2>Your Top Casino Wins</h2>
{data.topCasinoWins.data.map((win) => (
<div key={win.id} className="win-card">
<img src={win.gameThumbnailUrl} alt={win.gameName} />
<div className="win-details">
<h3>{win.gameName}</h3>
<p>Bet: ${win.betAmount} USDC</p>
<p>Won: ${win.wonAmount} USDC</p>
<p>Multiplier: {(parseFloat(win.wonAmount) / parseFloat(win.betAmount)).toFixed(2)}x</p>
</div>
</div>
))}
</div>
);
}

JavaScript/Fetch​

async function fetchTopCasinoWins() {
const query = `
query TopCasinoWins {
topCasinoWins {
data {
id
betAmount
wonAmount
gameName
gameThumbnailUrl
}
}
}
`;

try {
const response = await fetch('/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
// Authentication handled via cookies
},
body: JSON.stringify({ query }),
credentials: 'include' // Include cookies for authentication
});

const result = await response.json();

if (result.errors) {
throw new Error(result.errors[0].message);
}

return result.data.topCasinoWins.data;
} catch (error) {
console.error('Error fetching top casino wins:', error);
throw error;
}
}
  • casinoBetInfo - Get detailed information about a specific casino bet
  • myBets - Get complete betting history with filtering
  • highRollers - Get high-value bets across all users

Notes​

  • This endpoint is specifically designed for casino bets only
  • The multiplier filter ensures only significant wins are shown
  • Currency conversion to USDC provides consistent value representation
  • BlurHash fields enable smooth image loading experiences
  • Results are cached for 5 minutes to balance performance and data freshness