shufflecom-calculations 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,521 @@
1
+ import { createHmac } from 'crypto';
2
+ import BigNumber from 'bignumber.js';
3
+ import {
4
+ Roulette,
5
+ RouletteColor,
6
+ RouletteColumn,
7
+ RouletteDozen,
8
+ RouletteHalf,
9
+ RouletteParity,
10
+ STRAIGHT_VALUES,
11
+ colorPayout,
12
+ columnPayout,
13
+ cornerNumbers,
14
+ cornerPayout,
15
+ doubleStreetPayout,
16
+ dozenPayout,
17
+ halfsPayout,
18
+ isValidCorner,
19
+ isValidDoubleStreet,
20
+ isValidSplit,
21
+ isValidStreet,
22
+ parityPayout,
23
+ splitPayout,
24
+ straightPayout,
25
+ straightValue,
26
+ streetPayout,
27
+ } from './roulette';
28
+
29
+ // if A is a subset of B and B is a subset of A, then A = B
30
+ function arrayEquals<T>(arr1: T, arr2: T) {
31
+ expect(arr1).toEqual(expect.arrayContaining(arr2 as any));
32
+ expect(arr2).toEqual(expect.arrayContaining(arr1 as any));
33
+ }
34
+
35
+ describe('Roulette', () => {
36
+ it('getResult should return 0-36 inclusive', () => {
37
+ const hexStrArr = generateDigestHex({ serverSeed: 'test', clientSeed: 'test', nonce: '0', rounds: 100000 });
38
+ const results = hexStrArr.map((hexStr) => Roulette.getResult(hexStr));
39
+ const uniqueResults = [...new Set(results)].sort((a, b) => a - b) as readonly straightValue[];
40
+ arrayEquals(uniqueResults, STRAIGHT_VALUES);
41
+ });
42
+ it('isValidStreet should work', () => {
43
+ expect(isValidStreet([1, 2, 3])).toEqual(true);
44
+ expect(isValidStreet([3, 1, 2] as any)).toEqual(true);
45
+ expect(isValidStreet([1, 2, 4] as any)).toEqual(false);
46
+ });
47
+ it('cornerNumbers should return the right numbers', () => {
48
+ expect(cornerNumbers(0)).toEqual([1, 2, 3]);
49
+ expect(cornerNumbers(1)).toEqual([0, 2, 3, 4, 5]);
50
+ expect(cornerNumbers(2)).toEqual([0, 1, 3, 4, 5, 6]);
51
+ expect(cornerNumbers(3)).toEqual([0, 1, 2, 5, 6]);
52
+ expect(cornerNumbers(4)).toEqual([1, 2, 5, 7, 8]);
53
+ expect(cornerNumbers(5)).toEqual([1, 2, 3, 4, 6, 7, 8, 9]);
54
+ expect(cornerNumbers(6)).toEqual([2, 3, 5, 8, 9]);
55
+ expect(cornerNumbers(7)).toEqual([4, 5, 8, 10, 11]);
56
+ expect(cornerNumbers(8)).toEqual([4, 5, 6, 7, 9, 10, 11, 12]);
57
+ expect(cornerNumbers(9)).toEqual([5, 6, 8, 11, 12]);
58
+ expect(cornerNumbers(10)).toEqual([7, 8, 11, 13, 14]);
59
+ expect(cornerNumbers(11)).toEqual([7, 8, 9, 10, 12, 13, 14, 15]);
60
+ expect(cornerNumbers(12)).toEqual([8, 9, 11, 14, 15]);
61
+ expect(cornerNumbers(13)).toEqual([10, 11, 14, 16, 17]);
62
+ expect(cornerNumbers(14)).toEqual([10, 11, 12, 13, 15, 16, 17, 18]);
63
+ expect(cornerNumbers(15)).toEqual([11, 12, 14, 17, 18]);
64
+ expect(cornerNumbers(16)).toEqual([13, 14, 17, 19, 20]);
65
+ expect(cornerNumbers(17)).toEqual([13, 14, 15, 16, 18, 19, 20, 21]);
66
+ expect(cornerNumbers(18)).toEqual([14, 15, 17, 20, 21]);
67
+ expect(cornerNumbers(19)).toEqual([16, 17, 20, 22, 23]);
68
+ expect(cornerNumbers(20)).toEqual([16, 17, 18, 19, 21, 22, 23, 24]);
69
+ expect(cornerNumbers(21)).toEqual([17, 18, 20, 23, 24]);
70
+ expect(cornerNumbers(22)).toEqual([19, 20, 23, 25, 26]);
71
+ expect(cornerNumbers(23)).toEqual([19, 20, 21, 22, 24, 25, 26, 27]);
72
+ expect(cornerNumbers(24)).toEqual([20, 21, 23, 26, 27]);
73
+ expect(cornerNumbers(25)).toEqual([22, 23, 26, 28, 29]);
74
+ expect(cornerNumbers(26)).toEqual([22, 23, 24, 25, 27, 28, 29, 30]);
75
+ expect(cornerNumbers(27)).toEqual([23, 24, 26, 29, 30]);
76
+ expect(cornerNumbers(28)).toEqual([25, 26, 29, 31, 32]);
77
+ expect(cornerNumbers(29)).toEqual([25, 26, 27, 28, 30, 31, 32, 33]);
78
+ expect(cornerNumbers(30)).toEqual([26, 27, 29, 32, 33]);
79
+ expect(cornerNumbers(31)).toEqual([28, 29, 32, 34, 35]);
80
+ expect(cornerNumbers(32)).toEqual([28, 29, 30, 31, 33, 34, 35, 36]);
81
+ expect(cornerNumbers(33)).toEqual([29, 30, 32, 35, 36]);
82
+ expect(cornerNumbers(34)).toEqual([31, 32, 35]);
83
+ expect(cornerNumbers(35)).toEqual([31, 32, 33, 34, 36]);
84
+ expect(cornerNumbers(36)).toEqual([32, 33, 35]);
85
+ });
86
+ it('isValidSplit to work correctly', () => {
87
+ // same value
88
+ expect(isValidSplit(4, 4)).toEqual(false);
89
+ // 0s
90
+ expect(isValidSplit(0, 1)).toEqual(true);
91
+ expect(isValidSplit(0, 2)).toEqual(true);
92
+ expect(isValidSplit(0, 3)).toEqual(true);
93
+ expect(isValidSplit(0, 4)).toEqual(false);
94
+ // adjacent to 0
95
+ expect(isValidSplit(6, 3)).toEqual(true);
96
+ expect(isValidSplit(2, 3)).toEqual(true);
97
+ expect(isValidSplit(5, 3)).toEqual(false);
98
+ // bottom
99
+ expect(isValidSplit(4, 1)).toEqual(true);
100
+ expect(isValidSplit(4, 2)).toEqual(false);
101
+ expect(isValidSplit(4, 3)).toEqual(false);
102
+ expect(isValidSplit(4, 5)).toEqual(true);
103
+ expect(isValidSplit(4, 6)).toEqual(false);
104
+ expect(isValidSplit(4, 7)).toEqual(true);
105
+ expect(isValidSplit(4, 8)).toEqual(false);
106
+ // center
107
+ expect(isValidSplit(1, 5)).toEqual(false);
108
+ expect(isValidSplit(2, 5)).toEqual(true);
109
+ expect(isValidSplit(3, 5)).toEqual(false);
110
+ expect(isValidSplit(4, 5)).toEqual(true);
111
+ expect(isValidSplit(6, 5)).toEqual(true);
112
+ expect(isValidSplit(7, 5)).toEqual(false);
113
+ expect(isValidSplit(8, 5)).toEqual(true);
114
+ expect(isValidSplit(9, 5)).toEqual(false);
115
+ // top
116
+ expect(isValidSplit(6, 1)).toEqual(false);
117
+ expect(isValidSplit(6, 2)).toEqual(false);
118
+ expect(isValidSplit(6, 3)).toEqual(true);
119
+ expect(isValidSplit(6, 4)).toEqual(false);
120
+ expect(isValidSplit(6, 5)).toEqual(true);
121
+ expect(isValidSplit(6, 7)).toEqual(false);
122
+ expect(isValidSplit(6, 8)).toEqual(false);
123
+ expect(isValidSplit(6, 9)).toEqual(true);
124
+ // right most side
125
+ // bottom
126
+ expect(isValidSplit(35, 34)).toEqual(true);
127
+ expect(isValidSplit(36, 34)).toEqual(false);
128
+ expect(isValidSplit(31, 34)).toEqual(true);
129
+ expect(isValidSplit(32, 34)).toEqual(false);
130
+ // center
131
+ expect(isValidSplit(35, 34)).toEqual(true);
132
+ expect(isValidSplit(35, 32)).toEqual(true);
133
+ expect(isValidSplit(35, 36)).toEqual(true);
134
+ expect(isValidSplit(35, 33)).toEqual(false);
135
+ // top
136
+ expect(isValidSplit(35, 36)).toEqual(true);
137
+ expect(isValidSplit(34, 36)).toEqual(false);
138
+ expect(isValidSplit(33, 36)).toEqual(true);
139
+ // random
140
+ expect(isValidSplit(33, 3)).toEqual(false);
141
+ expect(isValidSplit(13, 23)).toEqual(false);
142
+ });
143
+ it('isValidCorner works', () => {
144
+ // check 0 works
145
+ expect(isValidCorner(0, 1, 2, 3)).toEqual(true);
146
+ expect(isValidCorner(3, 0, 2, 1)).toEqual(true);
147
+ expect(isValidCorner(2, 3, 5, 6)).toEqual(true);
148
+ expect(isValidCorner(11, 12, 14, 15)).toEqual(true);
149
+ expect(isValidCorner(11, 10, 13, 14)).toEqual(true);
150
+ expect(isValidCorner(32, 33, 35, 36)).toEqual(true);
151
+ expect(isValidCorner(31, 32, 34, 35)).toEqual(true);
152
+ expect(isValidCorner(2, 3, 5, 7)).toEqual(false);
153
+ expect(isValidCorner(2, 4, 6, 1)).toEqual(false);
154
+ expect(isValidCorner(31, 32, 34, 30)).toEqual(false);
155
+ expect(isValidCorner(0, 1, 2, 4)).toEqual(false);
156
+ expect(isValidCorner(0, 1, 5, 2)).toEqual(false);
157
+ expect(isValidCorner(25, 26, 27, 28)).toEqual(false);
158
+ });
159
+
160
+ it('double street', () => {
161
+ expect(isValidDoubleStreet([0, 1, 2], [1, 2, 3])).toEqual(false);
162
+ expect(isValidDoubleStreet([0, 1, 2], [0, 2, 3])).toEqual(false);
163
+ expect(isValidDoubleStreet([1, 2, 3], [6, 5, 4] as any)).toEqual(true);
164
+ expect(isValidDoubleStreet([7, 8, 9], [6, 5, 4] as any)).toEqual(true);
165
+ expect(isValidDoubleStreet([7, 8, 9, 10] as any, [6, 5, 4] as any)).toEqual(false);
166
+ expect(isValidDoubleStreet([31, 32, 33], [34, 35, 36])).toEqual(true);
167
+ expect(isValidDoubleStreet([28, 29, 30], [34, 35, 36])).toEqual(false);
168
+ });
169
+
170
+ it('validate inputs works', () => {
171
+ expect(
172
+ Roulette.validateInputs({
173
+ colorValues: [],
174
+ columnValues: [],
175
+ cornerValues: [],
176
+ doubleStreetValues: [],
177
+ dozenValues: [],
178
+ halfValues: [],
179
+ parityValues: [],
180
+ splitValues: [],
181
+ straightValues: [],
182
+ streetValues: [],
183
+ }),
184
+ ).toEqual(false);
185
+
186
+ expect(
187
+ Roulette.validateInputs({
188
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
189
+ colorValues: [],
190
+ halfValues: [],
191
+ columnValues: [],
192
+ dozenValues: [],
193
+ straightValues: [],
194
+ splitValues: [],
195
+ streetValues: [],
196
+ cornerValues: [],
197
+ doubleStreetValues: [],
198
+ }),
199
+ ).toEqual(true);
200
+
201
+ expect(
202
+ Roulette.validateInputs({
203
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
204
+ colorValues: [
205
+ { amount: BigNumber(1), color: RouletteColor.BLACK },
206
+ { amount: BigNumber(1), color: RouletteColor.RED },
207
+ ],
208
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
209
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
210
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.FIRST }],
211
+
212
+ straightValues: [{ amount: BigNumber(1), straightNumber: 1 }],
213
+ splitValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2 }],
214
+ streetValues: [{ amount: BigNumber(1), street: [1, 2, 3] }],
215
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0 }],
216
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [1, 2, 3], secondStreet: [4, 5, 6] }],
217
+ }),
218
+ ).toEqual(true);
219
+
220
+ expect(
221
+ Roulette.validateInputs({
222
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
223
+ colorValues: [
224
+ { amount: BigNumber(1), color: RouletteColor.BLACK },
225
+ { amount: BigNumber(1), color: RouletteColor.RED },
226
+ ],
227
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
228
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
229
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.FIRST }],
230
+
231
+ straightValues: [{ amount: BigNumber(1), straightNumber: 37 as any }],
232
+ splitValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2 }],
233
+ streetValues: [{ amount: BigNumber(1), street: [1, 2, 3] }],
234
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0 }],
235
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [1, 2, 3], secondStreet: [4, 5, 6] }],
236
+ }),
237
+ ).toEqual(false);
238
+
239
+ expect(
240
+ Roulette.validateInputs({
241
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
242
+ colorValues: [
243
+ { amount: BigNumber(1), color: RouletteColor.BLACK },
244
+ { amount: BigNumber(1), color: RouletteColor.RED },
245
+ ],
246
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
247
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
248
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.FIRST }],
249
+
250
+ straightValues: [{ amount: BigNumber(1), straightNumber: 1 }],
251
+ splitValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 3 }],
252
+ streetValues: [{ amount: BigNumber(1), street: [1, 2, 3] }],
253
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0 }],
254
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [1, 2, 3], secondStreet: [4, 5, 6] }],
255
+ }),
256
+ ).toEqual(false);
257
+
258
+ expect(
259
+ Roulette.validateInputs({
260
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
261
+ colorValues: [
262
+ { amount: BigNumber(1), color: RouletteColor.BLACK },
263
+ { amount: BigNumber(1), color: RouletteColor.RED },
264
+ ],
265
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
266
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
267
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.FIRST }],
268
+ straightValues: [{ amount: BigNumber(1), straightNumber: 1 }],
269
+ splitValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2 }],
270
+ streetValues: [{ amount: BigNumber(1), street: [1, 2, 4] as any }],
271
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0 }],
272
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [1, 2, 3], secondStreet: [4, 5, 6] }],
273
+ }),
274
+ ).toEqual(false);
275
+
276
+ expect(
277
+ Roulette.validateInputs({
278
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
279
+ colorValues: [
280
+ { amount: BigNumber(1), color: RouletteColor.BLACK },
281
+ { amount: BigNumber(1), color: RouletteColor.RED },
282
+ ],
283
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
284
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
285
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.FIRST }],
286
+ straightValues: [{ amount: BigNumber(1), straightNumber: 1 }],
287
+ splitValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2 }],
288
+ streetValues: [{ amount: BigNumber(1), street: [1, 2, 3] }],
289
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 5, secondNumber: 2, thirdNumber: 3, fourthNumber: 0 }],
290
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [1, 2, 3], secondStreet: [4, 5, 6] }],
291
+ }),
292
+ ).toEqual(false);
293
+
294
+ expect(
295
+ Roulette.validateInputs({
296
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
297
+ colorValues: [
298
+ { amount: BigNumber(1), color: RouletteColor.BLACK },
299
+ { amount: BigNumber(1), color: RouletteColor.RED },
300
+ ],
301
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
302
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
303
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.FIRST }],
304
+ straightValues: [{ amount: BigNumber(1), straightNumber: 1 }],
305
+ splitValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2 }],
306
+ streetValues: [{ amount: BigNumber(1), street: [1, 2, 3] }],
307
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0 }],
308
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [10, 11, 12], secondStreet: [4, 5, 6] }],
309
+ }),
310
+ ).toEqual(false);
311
+ });
312
+
313
+ it('parity Payout', () => {
314
+ expect(parityPayout({ parity: RouletteParity.EVEN, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
315
+ expect(parityPayout({ parity: RouletteParity.ODD, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
316
+ expect(parityPayout({ parity: RouletteParity.ODD, amount: BigNumber(1) }, 5).toNumber()).toEqual(2);
317
+ expect(parityPayout({ parity: RouletteParity.EVEN, amount: BigNumber(1) }, 5).toNumber()).toEqual(0);
318
+ expect(parityPayout({ parity: RouletteParity.ODD, amount: BigNumber(1) }, 10).toNumber()).toEqual(0);
319
+ expect(parityPayout({ parity: RouletteParity.EVEN, amount: BigNumber(1) }, 10).toNumber()).toEqual(2);
320
+ });
321
+
322
+ it('color Payout', () => {
323
+ expect(colorPayout({ color: RouletteColor.RED, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
324
+ expect(colorPayout({ color: RouletteColor.BLACK, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
325
+ expect(colorPayout({ color: RouletteColor.RED, amount: BigNumber(1) }, 1).toNumber()).toEqual(2);
326
+ expect(colorPayout({ color: RouletteColor.BLACK, amount: BigNumber(1) }, 1).toNumber()).toEqual(0);
327
+ expect(colorPayout({ color: RouletteColor.RED, amount: BigNumber(1) }, 2).toNumber()).toEqual(0);
328
+ expect(colorPayout({ color: RouletteColor.BLACK, amount: BigNumber(1) }, 2).toNumber()).toEqual(2);
329
+ });
330
+
331
+ it('halfs payout', () => {
332
+ expect(halfsPayout({ half: RouletteHalf.HIGH, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
333
+ expect(halfsPayout({ half: RouletteHalf.LOW, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
334
+ expect(halfsPayout({ half: RouletteHalf.LOW, amount: BigNumber(1) }, 1).toNumber()).toEqual(2);
335
+ expect(halfsPayout({ half: RouletteHalf.HIGH, amount: BigNumber(1) }, 1).toNumber()).toEqual(0);
336
+ expect(halfsPayout({ half: RouletteHalf.LOW, amount: BigNumber(1) }, 18).toNumber()).toEqual(2);
337
+ expect(halfsPayout({ half: RouletteHalf.HIGH, amount: BigNumber(1) }, 18).toNumber()).toEqual(0);
338
+ expect(halfsPayout({ half: RouletteHalf.LOW, amount: BigNumber(1) }, 19).toNumber()).toEqual(0);
339
+ expect(halfsPayout({ half: RouletteHalf.HIGH, amount: BigNumber(1) }, 19).toNumber()).toEqual(2);
340
+ expect(halfsPayout({ half: RouletteHalf.LOW, amount: BigNumber(1) }, 36).toNumber()).toEqual(0);
341
+ expect(halfsPayout({ half: RouletteHalf.HIGH, amount: BigNumber(1) }, 36).toNumber()).toEqual(2);
342
+ });
343
+
344
+ it('column payout', () => {
345
+ expect(columnPayout({ column: RouletteColumn.BOTTOM, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
346
+ expect(columnPayout({ column: RouletteColumn.MIDDLE, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
347
+ expect(columnPayout({ column: RouletteColumn.TOP, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
348
+
349
+ expect(columnPayout({ column: RouletteColumn.TOP, amount: BigNumber(1) }, 1).toNumber()).toEqual(0);
350
+ expect(columnPayout({ column: RouletteColumn.MIDDLE, amount: BigNumber(1) }, 1).toNumber()).toEqual(0);
351
+ expect(columnPayout({ column: RouletteColumn.BOTTOM, amount: BigNumber(1) }, 1).toNumber()).toEqual(3);
352
+
353
+ expect(columnPayout({ column: RouletteColumn.TOP, amount: BigNumber(1) }, 2).toNumber()).toEqual(0);
354
+ expect(columnPayout({ column: RouletteColumn.MIDDLE, amount: BigNumber(1) }, 2).toNumber()).toEqual(3);
355
+ expect(columnPayout({ column: RouletteColumn.BOTTOM, amount: BigNumber(1) }, 2).toNumber()).toEqual(0);
356
+ });
357
+
358
+ it('dozen payout', () => {
359
+ expect(dozenPayout({ dozen: RouletteDozen.FIRST, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
360
+ expect(dozenPayout({ dozen: RouletteDozen.SECOND, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
361
+ expect(dozenPayout({ dozen: RouletteDozen.THIRD, amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
362
+
363
+ expect(dozenPayout({ dozen: RouletteDozen.FIRST, amount: BigNumber(1) }, 1).toNumber()).toEqual(3);
364
+ expect(dozenPayout({ dozen: RouletteDozen.SECOND, amount: BigNumber(1) }, 1).toNumber()).toEqual(0);
365
+ expect(dozenPayout({ dozen: RouletteDozen.THIRD, amount: BigNumber(1) }, 1).toNumber()).toEqual(0);
366
+
367
+ expect(dozenPayout({ dozen: RouletteDozen.FIRST, amount: BigNumber(1) }, 20).toNumber()).toEqual(0);
368
+ expect(dozenPayout({ dozen: RouletteDozen.SECOND, amount: BigNumber(1) }, 20).toNumber()).toEqual(3);
369
+ expect(dozenPayout({ dozen: RouletteDozen.THIRD, amount: BigNumber(1) }, 20).toNumber()).toEqual(0);
370
+
371
+ expect(dozenPayout({ dozen: RouletteDozen.FIRST, amount: BigNumber(1) }, 30).toNumber()).toEqual(0);
372
+ expect(dozenPayout({ dozen: RouletteDozen.SECOND, amount: BigNumber(1) }, 30).toNumber()).toEqual(0);
373
+ expect(dozenPayout({ dozen: RouletteDozen.THIRD, amount: BigNumber(1) }, 30).toNumber()).toEqual(3);
374
+ });
375
+
376
+ it('straight payout', () => {
377
+ expect(straightPayout({ straightNumber: 0, amount: BigNumber(1) }, 0).toNumber()).toEqual(36);
378
+ expect(straightPayout({ straightNumber: 0, amount: BigNumber(1) }, 1).toNumber()).toEqual(0);
379
+ expect(straightPayout({ straightNumber: 2, amount: BigNumber(1) }, 2).toNumber()).toEqual(36);
380
+ expect(straightPayout({ straightNumber: 2, amount: BigNumber(1) }, 3).toNumber()).toEqual(0);
381
+ });
382
+
383
+ it('split payout', () => {
384
+ expect(splitPayout({ firstNumber: 0, secondNumber: 1, amount: BigNumber(1) }, 0).toNumber()).toEqual(18);
385
+ expect(splitPayout({ firstNumber: 0, secondNumber: 1, amount: BigNumber(1) }, 1).toNumber()).toEqual(18);
386
+ expect(splitPayout({ firstNumber: 2, secondNumber: 3, amount: BigNumber(1) }, 3).toNumber()).toEqual(18);
387
+ expect(splitPayout({ firstNumber: 2, secondNumber: 3, amount: BigNumber(1) }, 1).toNumber()).toEqual(0);
388
+ });
389
+
390
+ it('street payout', () => {
391
+ expect(streetPayout({ street: [0, 1, 2], amount: BigNumber(1) }, 0).toNumber()).toEqual(12);
392
+ expect(streetPayout({ street: [0, 2, 3], amount: BigNumber(1) }, 0).toNumber()).toEqual(12);
393
+ expect(streetPayout({ street: [1, 2, 3], amount: BigNumber(1) }, 0).toNumber()).toEqual(0);
394
+ expect(streetPayout({ street: [1, 2, 3], amount: BigNumber(1) }, 1).toNumber()).toEqual(12);
395
+ expect(streetPayout({ street: [1, 2, 3], amount: BigNumber(1) }, 3).toNumber()).toEqual(12);
396
+ expect(streetPayout({ street: [1, 2, 3], amount: BigNumber(1) }, 2).toNumber()).toEqual(12);
397
+ expect(streetPayout({ street: [4, 5, 6], amount: BigNumber(1) }, 5).toNumber()).toEqual(12);
398
+ expect(streetPayout({ street: [1, 2, 3], amount: BigNumber(1) }, 8).toNumber()).toEqual(0);
399
+ });
400
+
401
+ it('corner payout', () => {
402
+ expect(cornerPayout({ firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0, amount: BigNumber(1) }, 1).toNumber()).toEqual(9);
403
+ expect(cornerPayout({ firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0, amount: BigNumber(1) }, 2).toNumber()).toEqual(9);
404
+ expect(cornerPayout({ firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0, amount: BigNumber(1) }, 3).toNumber()).toEqual(9);
405
+ expect(cornerPayout({ firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0, amount: BigNumber(1) }, 0).toNumber()).toEqual(9);
406
+ expect(cornerPayout({ firstNumber: 1, secondNumber: 2, thirdNumber: 3, fourthNumber: 0, amount: BigNumber(1) }, 7).toNumber()).toEqual(0);
407
+ });
408
+
409
+ it('double street payout', () => {
410
+ expect(doubleStreetPayout({ firstStreet: [1, 2, 3], secondStreet: [4, 5, 6], amount: BigNumber(1) }, 1).toNumber()).toEqual(6);
411
+ expect(doubleStreetPayout({ firstStreet: [1, 2, 3], secondStreet: [4, 5, 6], amount: BigNumber(1) }, 5).toNumber()).toEqual(6);
412
+ expect(doubleStreetPayout({ firstStreet: [1, 2, 3], secondStreet: [4, 5, 6], amount: BigNumber(1) }, 8).toNumber()).toEqual(0);
413
+ });
414
+
415
+ it('getPayouts', () => {
416
+ expect(
417
+ Roulette.getPayout(
418
+ {
419
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
420
+ colorValues: [
421
+ { amount: BigNumber(1), color: RouletteColor.BLACK },
422
+ { amount: BigNumber(1), color: RouletteColor.RED },
423
+ ],
424
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
425
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
426
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.FIRST }],
427
+ straightValues: [{ amount: BigNumber(1), straightNumber: 1 }],
428
+ splitValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2 }],
429
+ streetValues: [{ amount: BigNumber(1), street: [1, 2, 3] }],
430
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2, thirdNumber: 4, fourthNumber: 5 }],
431
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [1, 2, 3], secondStreet: [4, 5, 6] }],
432
+ },
433
+ 0,
434
+ ).toNumber(),
435
+ ).toEqual(0);
436
+
437
+ expect(
438
+ Roulette.getPayout(
439
+ {
440
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
441
+ colorValues: [
442
+ { amount: BigNumber(1), color: RouletteColor.BLACK },
443
+ { amount: BigNumber(1), color: RouletteColor.RED },
444
+ { amount: BigNumber(2), color: RouletteColor.RED },
445
+ ],
446
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
447
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
448
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.FIRST }],
449
+ straightValues: [{ amount: BigNumber(1), straightNumber: 1 }],
450
+ splitValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2 }],
451
+ streetValues: [{ amount: BigNumber(1), street: [1, 2, 3] }],
452
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 10, secondNumber: 11, thirdNumber: 13, fourthNumber: 14 }],
453
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [1, 2, 3], secondStreet: [4, 5, 6] }],
454
+ },
455
+ 1,
456
+ ).toNumber(),
457
+ ).toEqual(84); // 3*2 for color, 1*3 for column, 1*3 for dozen,1*36 for straight, 1*18 for split, 1*12 for street, 1*6 for double street
458
+
459
+ // win everything
460
+ expect(
461
+ Roulette.getPayout(
462
+ {
463
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
464
+ colorValues: [{ amount: BigNumber(1), color: RouletteColor.RED }],
465
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
466
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
467
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.THIRD }],
468
+ straightValues: [{ amount: BigNumber(1), straightNumber: 34 }],
469
+ splitValues: [{ amount: BigNumber(1), firstNumber: 34, secondNumber: 35 }],
470
+ streetValues: [{ amount: BigNumber(1), street: [34, 35, 36] }],
471
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 31, secondNumber: 32, thirdNumber: 34, fourthNumber: 35 }],
472
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [31, 32, 33], secondStreet: [34, 35, 36] }],
473
+ },
474
+ 34,
475
+ ).toNumber(),
476
+ ).toEqual(93); // 2 for parity, 2 for color, 2 for half, 3 for column, 3 for dozen, 36 for straight, 18 for split, 12 for street, 6 for double street, 9 for corner
477
+
478
+ // win nothing
479
+ expect(
480
+ Roulette.getPayout(
481
+ {
482
+ parityValues: [{ amount: BigNumber(1), parity: RouletteParity.EVEN }],
483
+ colorValues: [
484
+ { amount: BigNumber(1), color: RouletteColor.BLACK },
485
+ { amount: BigNumber(1), color: RouletteColor.RED },
486
+ { amount: BigNumber(2), color: RouletteColor.RED },
487
+ ],
488
+ halfValues: [{ amount: BigNumber(1), half: RouletteHalf.HIGH }],
489
+ columnValues: [{ amount: BigNumber(1), column: RouletteColumn.BOTTOM }],
490
+ dozenValues: [{ amount: BigNumber(1), dozen: RouletteDozen.FIRST }],
491
+ straightValues: [{ amount: BigNumber(1), straightNumber: 1 }],
492
+ splitValues: [{ amount: BigNumber(1), firstNumber: 1, secondNumber: 2 }],
493
+ streetValues: [{ amount: BigNumber(1), street: [1, 2, 3] }],
494
+ cornerValues: [{ amount: BigNumber(1), firstNumber: 10, secondNumber: 11, thirdNumber: 13, fourthNumber: 14 }],
495
+ doubleStreetValues: [{ amount: BigNumber(1), firstStreet: [1, 2, 3], secondStreet: [4, 5, 6] }],
496
+ },
497
+ 0,
498
+ ).toNumber(),
499
+ ).toEqual(0);
500
+ });
501
+ });
502
+
503
+ function generateDigestHex({
504
+ serverSeed,
505
+ clientSeed,
506
+ nonce,
507
+ rounds = 2,
508
+ }: {
509
+ serverSeed: string;
510
+ clientSeed: string;
511
+ nonce: string;
512
+ rounds?: number;
513
+ }): string[] {
514
+ const results = Array.from(Array(rounds).keys()).map((round) => {
515
+ const hmac = createHmac('sha256', serverSeed);
516
+ hmac.update(`${clientSeed}:${nonce}:${round}`);
517
+ return hmac.digest('hex');
518
+ });
519
+
520
+ return results;
521
+ }