Transparence de l'algorithme

Comment ScopliDrop tire les gagnants au sort,
et pourquoi c'est vérifiable

Notre algorithme open source garantit un tirage équitable. Plus de tâches, plus de chances, mais chaque participant peut vraiment gagner. Aucune manipulation, aucun favoritisme, aucune exception.

Notre promesse de transparence

La confiance se gagne par la transparence. Chaque étape de notre tirage au sort peut être inspectée. Il n'y a ni boîte noire, ni algorithme caché, ni paramètre secret. Ce que vous voyez est exactement ce qui se passe.

L'algorithme derrière le tirage

Chaque gagnant est tiré par ce code, pris tel quel dans notre base de code. Un aléatoire cryptographiquement sûr, sans fonction cachée ni paramètre secret.

WinnerSelection.ts
1
2// src/lib/services/WinnerSelection.ts
3import { randomInt } from 'crypto';
4import { GiveawayEntry } from '@/components/dashboard/giveaways/types';
5
6/**
7 * Select winners using weighted random selection.
8 * @param entries All entries, each with a user_id and entries_count
9 * @param winnerCount Number of winners to draw
10 * @param hasFraudDetection Premium+ servers exclude fraud-flagged entries
11 * @param cooldownExcludedUserIds Users on winner cooldown (recent wins)
12 * @returns Array of selected winner user IDs
13 */
14export function selectWinners(
15 entries: GiveawayEntry[],
16 winnerCount: number,
17 hasFraudDetection: boolean = true,
18 cooldownExcludedUserIds: string[] = []
19): string[] {
20 if (!entries || entries.length === 0) {
21 return [];
22 }
23
24 // 1. Exclude fraud-flagged entries (premium+) and users on winner cooldown.
25 // Flags are set only by automated fraud detection; a server admin can never
26 // manually flag, unflag, or hand-pick who gets excluded from the draw.
27 // Free servers keep every entry; fraud flags are ignored.
28 const cooldownExcluded = new Set(cooldownExcludedUserIds);
29 const eligibleEntries = (hasFraudDetection
30 ? entries.filter(entry => entry.fraud_flag !== 'red')
31 : entries
32 ).filter(entry => !cooldownExcluded.has(entry.user_id));
33
34 if (eligibleEntries.length === 0) {
35 return [];
36 }
37
38 // 2. Build a weighted pool: one slot per entry earned.
39 // 5 entries = 5 slots = 5 chances to win.
40 const entryPool: string[] = [];
41 for (const entry of eligibleEntries) {
42 for (let i = 0; i < entry.entries_count; i++) {
43 entryPool.push(entry.user_id);
44 }
45 }
46
47 // 3. Draw winners with cryptographically secure randomness.
48 const winners: string[] = [];
49 const winnerSet = new Set<string>();
50
51 // A user can only win once, so never draw more winners than unique people.
52 const uniqueParticipants = new Set(eligibleEntries.map(entry => entry.user_id));
53 const availableWinnerCount = Math.min(winnerCount, uniqueParticipants.size);
54
55 if (availableWinnerCount === 0 || entryPool.length === 0) {
56 return [];
57 }
58
59 while (winners.length < availableWinnerCount && entryPool.length > 0) {
60 // crypto.randomInt is a CSPRNG: no seed, no bias, not manipulable.
61 const randomIndex = randomInt(entryPool.length);
62 const selectedUserId = entryPool[randomIndex];
63
64 // Only add first-time winners; duplicates are skipped.
65 if (!winnerSet.has(selectedUserId)) {
66 winners.push(selectedUserId);
67 winnerSet.add(selectedUserId);
68 }
69
70 // Remove the drawn slot via swap-and-pop (O(1)).
71 entryPool[randomIndex] = entryPool[entryPool.length - 1];
72 entryPool.pop();
73 }
74
75 return winners;
76}

Les étapes clés de l'algorithme

Cliquez sur une étape pour voir son implémentation dans le code

Ligne 3

Aléatoire sécurisé

Les gagnants sont tirés avec crypto.randomInt de Node, un générateur cryptographiquement sûr. Aucune graine à prédire, rien à manipuler, pas même par nous.

Ligne 30

Filtrage fraude et cooldown

Avant le tirage, les participations signalées comme frauduleuses sont retirées sur les serveurs avec détection de fraude, et les membres encore sous cooldown des gagnants sont mis de côté. Les serveurs gratuits gardent toutes les participations.

Ligne 43

Création du pool pondéré

L'équité commence ici. Chaque membre est ajouté au pool une fois par chance gagnée : 5 chances, 5 places. Proportionnel, jamais garanti.

Ligne 61

Le tirage

Un index aléatoire dans le pool pondéré désigne chaque gagnant. Plus de chances veut simplement dire plus de places, et chaque place a exactement la même probabilité.

Ligne 65

Pas de doublon

Un ensemble de gagnants garantit que personne ne gagne deux fois, et nous ne tirons jamais plus de gagnants qu'il n'y a de participants éligibles distincts.

Comment fonctionne l'équité

Voyez exactement comment notre algorithme donne à chaque participant une chance équitable, avec de meilleures chances pour ceux qui s'impliquent le plus.

1

Collecte des chances

Les membres font des tâches et gagnent des chances selon leurs actions

2

Création du pool pondéré

Chaque chance est ajoutée au pool de sélection selon les tâches validées

3

Sélection aléatoire

Un aléatoire cryptographiquement sûr pioche dans le pool pondéré

4

Pas de doublon

Chaque membre ne peut gagner qu'une fois par giveaway

5

Confirmation des gagnants

Les gagnants tirés sont vérifiés et annoncés

Exemple concret

Alice fait 3 tâches, Bob en fait 1, Charlie en fait 5. Le pool contient 9 chances au total, avec des probabilités proportionnelles.

Alice

3 chances gagnées

33 % de chances

Bob

1 chance gagnée

11 % de chances

Charlie

5 chances gagnées

56 % de chances

Le pool (9 chances au total)

Chaque point représente une chance. Le gagnant est tiré au hasard parmi toutes les chances.

Fini les giveaways truqués

Un bot giveaway Discord qui montre exactement comment les gagnants sont choisis

Le problème

La plupart des bots giveaway Discord sont des boîtes noires. Même quand le bot est honnête et vraiment aléatoire, votre communauté n'a aucun moyen de le vérifier. Elle ne voit pas l'algorithme, ne peut pas contrôler le processus, ne peut pas prouver que les gagnants n'ont pas été choisis à la main.

Sans transparence, chaque giveaway paraît suspect. Vos membres commencent à se demander si c'est vraiment équitable. La confiance meurt, l'engagement chute.

On en avait assez de voir des communautés mourir parce que la confiance était rompue

La solution

Ne craignez plus jamais une baisse d'engagement à cause d'accusations de giveaway truqué. Quand un membre doute de l'équité, envoyez-lui le lien de cette page.

ScopliDrop certifie que les propriétaires de serveur ne peuvent ni modifier un giveaway ni choisir les gagnants. Point.

Il existe bien un bouton « Terminer le giveaway », mais il ne fait que déclencher notre algorithme de tirage, rien d'autre. Les admins du serveur NE PEUVENT PAS choisir les gagnants, par aucun moyen. C'est notre promesse.

Vos questions sur l'équité

Comment nous garantissons des giveaways transparents, sûrs et vraiment équitables pour tous les participants.

Rejoignez la révolution de l'équité

Prêt à lancer des giveaways vraiment équitables
dès aujourd'hui ?

Rejoignez des milliers de communautés Discord passées à des giveaways transparents et vérifiables. Commencez gratuitement, prouvez l'équité dès le premier jour.