shufflecom-calculations 3.1.2 → 3.2.1
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.
- package/lib/games/baccarat.d.ts +1 -0
- package/lib/games/baccarat.js +38 -5
- package/lib/games/baccarat.js.map +1 -1
- package/lib/games/blitz.d.ts +15 -0
- package/lib/games/blitz.js +52 -0
- package/lib/games/blitz.js.map +1 -0
- package/lib/games/cardGames.d.ts +1 -0
- package/lib/games/cardGames.js +3 -2
- package/lib/games/cardGames.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +5 -0
- package/lib/index.js.map +1 -1
- package/lib/lottery/lottery.d.ts +1 -0
- package/lib/regex/index.js +1 -1
- package/lib/regex/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/utils/fisher-yates-shuffle.d.ts +1 -0
- package/lib/utils/sports.types.d.ts +2 -2
- package/lib/utils/sports.types.js +1 -1
- package/lib/utils/sports.types.js.map +1 -1
- package/package.json +2 -2
- package/src/games/baccarat.spec.ts +231 -5
- package/src/games/baccarat.ts +45 -4
- package/src/games/blitz.spec.ts +119 -0
- package/src/games/blitz.ts +62 -0
- package/src/games/cardGames.ts +2 -1
- package/src/index.ts +1 -0
- package/src/regex/index.ts +1 -1
- package/src/regex/regex.spec.ts +4 -0
- package/src/utils/sports.types.ts +3 -2
|
@@ -155,8 +155,8 @@ var Language;
|
|
|
155
155
|
Language["id"] = "id";
|
|
156
156
|
Language["ar"] = "ar";
|
|
157
157
|
Language["no"] = "no";
|
|
158
|
-
Language["sv"] = "sv";
|
|
159
158
|
Language["it"] = "it";
|
|
159
|
+
Language["sv"] = "sv";
|
|
160
160
|
})(Language || (exports.Language = Language = {}));
|
|
161
161
|
var SportsMatchPhaseWinner;
|
|
162
162
|
(function (SportsMatchPhaseWinner) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sports.types.js","sourceRoot":"","sources":["../../src/utils/sports.types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sports.types.js","sourceRoot":"","sources":["../../src/utils/sports.types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shufflecom-calculations",
|
|
3
|
-
"version": "3.1
|
|
3
|
+
"version": "3.2.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"types": "lib/index.d.ts",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
},
|
|
15
15
|
"author": "",
|
|
16
16
|
"license": "ISC",
|
|
17
|
-
"gitHead": "
|
|
17
|
+
"gitHead": "c4fd3f12c7694800e30b2cf82062547adfa01221"
|
|
18
18
|
}
|
|
@@ -431,13 +431,13 @@ describe('Baccarat', () => {
|
|
|
431
431
|
expect(multiplier.toNumber()).toBe(26);
|
|
432
432
|
});
|
|
433
433
|
|
|
434
|
-
it('pays
|
|
434
|
+
it('pays 25:1 when both hands have a perfect pair', () => {
|
|
435
435
|
const playerCard = ci('4', Suits.CLUBS);
|
|
436
436
|
const bankerCard = ci('K', Suits.DIAMONDS);
|
|
437
437
|
const result = mockResult([playerCard, playerCard], [bankerCard, bankerCard], 8, 0, BaccaratOutcome.PLAYER_WIN);
|
|
438
438
|
const { payout, multiplier } = Baccarat.calcBetPayouts([bet(BaccaratBetType.PERFECT_PAIR, 10)], result);
|
|
439
|
-
expect(payout.toNumber()).toBe(
|
|
440
|
-
expect(multiplier.toNumber()).toBe(
|
|
439
|
+
expect(payout.toNumber()).toBe(260);
|
|
440
|
+
expect(multiplier.toNumber()).toBe(26);
|
|
441
441
|
});
|
|
442
442
|
|
|
443
443
|
it('loses when player has a non-perfect pair and banker does not have a pair', () => {
|
|
@@ -684,8 +684,8 @@ describe('Baccarat', () => {
|
|
|
684
684
|
[bet(BaccaratBetType.PLAYER_PAIR, 10), bet(BaccaratBetType.BANKER_PAIR, 10), bet(BaccaratBetType.PERFECT_PAIR, 10)],
|
|
685
685
|
result,
|
|
686
686
|
);
|
|
687
|
-
expect(payout.toNumber()).toBe(
|
|
688
|
-
expect(multiplier.toNumber()).
|
|
687
|
+
expect(payout.toNumber()).toBe(500);
|
|
688
|
+
expect(multiplier.toNumber()).toBeCloseTo(16.67, 2);
|
|
689
689
|
});
|
|
690
690
|
|
|
691
691
|
it('player pair + banker pair + either pair + tie bet + player push on natural tie: pair and tie win, player pushes', () => {
|
|
@@ -793,6 +793,232 @@ describe('Baccarat', () => {
|
|
|
793
793
|
});
|
|
794
794
|
});
|
|
795
795
|
|
|
796
|
+
describe('getWinningBetTypes', () => {
|
|
797
|
+
describe('main bets', () => {
|
|
798
|
+
it('returns PLAYER on player win', () => {
|
|
799
|
+
const result = mockResult(
|
|
800
|
+
[ci('6', Suits.CLUBS), ci('3', Suits.CLUBS)],
|
|
801
|
+
[ci('2', Suits.CLUBS), ci('3', Suits.DIAMONDS)],
|
|
802
|
+
9,
|
|
803
|
+
5,
|
|
804
|
+
BaccaratOutcome.PLAYER_WIN,
|
|
805
|
+
);
|
|
806
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.PLAYER, BaccaratBetType.PLAYER_BONUS]));
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
it('returns BANKER on banker win', () => {
|
|
810
|
+
const result = mockResult(
|
|
811
|
+
[ci('3', Suits.CLUBS), ci('A', Suits.DIAMONDS)],
|
|
812
|
+
[ci('8', Suits.CLUBS), ci('Q', Suits.DIAMONDS)],
|
|
813
|
+
4,
|
|
814
|
+
8,
|
|
815
|
+
BaccaratOutcome.BANKER_WIN,
|
|
816
|
+
);
|
|
817
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.BANKER, BaccaratBetType.BANKER_BONUS]));
|
|
818
|
+
});
|
|
819
|
+
|
|
820
|
+
it('returns TIE on tie', () => {
|
|
821
|
+
const result = mockResult(
|
|
822
|
+
[ci('3', Suits.CLUBS), ci('3', Suits.DIAMONDS)],
|
|
823
|
+
[ci('2', Suits.CLUBS), ci('4', Suits.DIAMONDS)],
|
|
824
|
+
6,
|
|
825
|
+
6,
|
|
826
|
+
BaccaratOutcome.TIE,
|
|
827
|
+
);
|
|
828
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.TIE]));
|
|
829
|
+
});
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
describe('pair side bets', () => {
|
|
833
|
+
it('returns PLAYER_PAIR and EITHER_PAIR when player has a pair', () => {
|
|
834
|
+
const result = mockResult(
|
|
835
|
+
[ci('4', Suits.CLUBS), ci('4', Suits.HEARTS)],
|
|
836
|
+
[ci('3', Suits.CLUBS), ci('2', Suits.DIAMONDS)],
|
|
837
|
+
8,
|
|
838
|
+
5,
|
|
839
|
+
BaccaratOutcome.PLAYER_WIN,
|
|
840
|
+
);
|
|
841
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(
|
|
842
|
+
expect.arrayContaining([BaccaratBetType.PLAYER, BaccaratBetType.PLAYER_PAIR, BaccaratBetType.EITHER_PAIR]),
|
|
843
|
+
);
|
|
844
|
+
});
|
|
845
|
+
|
|
846
|
+
it('returns BANKER_PAIR and EITHER_PAIR when banker has a pair', () => {
|
|
847
|
+
const result = mockResult(
|
|
848
|
+
[ci('3', Suits.CLUBS), ci('2', Suits.DIAMONDS)],
|
|
849
|
+
[ci('9', Suits.DIAMONDS), ci('9', Suits.HEARTS)],
|
|
850
|
+
5,
|
|
851
|
+
8,
|
|
852
|
+
BaccaratOutcome.BANKER_WIN,
|
|
853
|
+
);
|
|
854
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(
|
|
855
|
+
expect.arrayContaining([BaccaratBetType.BANKER, BaccaratBetType.BANKER_PAIR, BaccaratBetType.EITHER_PAIR, BaccaratBetType.BANKER_BONUS]),
|
|
856
|
+
);
|
|
857
|
+
});
|
|
858
|
+
|
|
859
|
+
it('returns PLAYER_PAIR, BANKER_PAIR, and EITHER_PAIR when both have pairs', () => {
|
|
860
|
+
const result = mockResult(
|
|
861
|
+
[ci('4', Suits.CLUBS), ci('4', Suits.HEARTS)],
|
|
862
|
+
[ci('9', Suits.DIAMONDS), ci('9', Suits.HEARTS)],
|
|
863
|
+
8,
|
|
864
|
+
8,
|
|
865
|
+
BaccaratOutcome.TIE,
|
|
866
|
+
);
|
|
867
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(
|
|
868
|
+
expect.arrayContaining([BaccaratBetType.TIE, BaccaratBetType.PLAYER_PAIR, BaccaratBetType.BANKER_PAIR, BaccaratBetType.EITHER_PAIR]),
|
|
869
|
+
);
|
|
870
|
+
});
|
|
871
|
+
|
|
872
|
+
it('returns no pair bets when neither hand has a pair', () => {
|
|
873
|
+
const result = mockResult(
|
|
874
|
+
[ci('4', Suits.CLUBS), ci('3', Suits.DIAMONDS)],
|
|
875
|
+
[ci('A', Suits.CLUBS), ci('2', Suits.DIAMONDS), ci('3', Suits.HEARTS)],
|
|
876
|
+
7,
|
|
877
|
+
6,
|
|
878
|
+
BaccaratOutcome.PLAYER_WIN,
|
|
879
|
+
);
|
|
880
|
+
// margin is 1, so PLAYER_BONUS does not win
|
|
881
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.PLAYER]));
|
|
882
|
+
});
|
|
883
|
+
});
|
|
884
|
+
|
|
885
|
+
describe('perfect pair side bet', () => {
|
|
886
|
+
it('returns PERFECT_PAIR when player has a perfect pair', () => {
|
|
887
|
+
const card = ci('4', Suits.CLUBS);
|
|
888
|
+
const result = mockResult([card, card], [ci('3', Suits.CLUBS), ci('2', Suits.DIAMONDS)], 8, 5, BaccaratOutcome.PLAYER_WIN);
|
|
889
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(
|
|
890
|
+
expect.arrayContaining([BaccaratBetType.PLAYER, BaccaratBetType.PLAYER_PAIR, BaccaratBetType.EITHER_PAIR, BaccaratBetType.PERFECT_PAIR, BaccaratBetType.PLAYER_BONUS]),
|
|
891
|
+
);
|
|
892
|
+
});
|
|
893
|
+
|
|
894
|
+
it('returns PERFECT_PAIR when banker has a perfect pair', () => {
|
|
895
|
+
const card = ci('K', Suits.DIAMONDS);
|
|
896
|
+
const result = mockResult([ci('3', Suits.CLUBS), ci('2', Suits.DIAMONDS)], [card, card], 5, 0, BaccaratOutcome.PLAYER_WIN);
|
|
897
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(
|
|
898
|
+
expect.arrayContaining([BaccaratBetType.PLAYER, BaccaratBetType.BANKER_PAIR, BaccaratBetType.EITHER_PAIR, BaccaratBetType.PERFECT_PAIR, BaccaratBetType.PLAYER_BONUS]),
|
|
899
|
+
);
|
|
900
|
+
});
|
|
901
|
+
|
|
902
|
+
it('does not return PERFECT_PAIR for a non-perfect pair', () => {
|
|
903
|
+
const result = mockResult(
|
|
904
|
+
[ci('4', Suits.CLUBS), ci('4', Suits.HEARTS)],
|
|
905
|
+
[ci('3', Suits.CLUBS), ci('2', Suits.DIAMONDS)],
|
|
906
|
+
8,
|
|
907
|
+
5,
|
|
908
|
+
BaccaratOutcome.PLAYER_WIN,
|
|
909
|
+
);
|
|
910
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(
|
|
911
|
+
expect.arrayContaining([BaccaratBetType.PLAYER, BaccaratBetType.PLAYER_PAIR, BaccaratBetType.EITHER_PAIR, BaccaratBetType.PLAYER_BONUS]),
|
|
912
|
+
);
|
|
913
|
+
});
|
|
914
|
+
});
|
|
915
|
+
|
|
916
|
+
describe('bonus side bets', () => {
|
|
917
|
+
it('returns PLAYER_BONUS on natural player win', () => {
|
|
918
|
+
const result = mockResult(
|
|
919
|
+
[ci('8', Suits.CLUBS), ci('A', Suits.DIAMONDS)],
|
|
920
|
+
[ci('3', Suits.CLUBS), ci('2', Suits.DIAMONDS)],
|
|
921
|
+
9,
|
|
922
|
+
5,
|
|
923
|
+
BaccaratOutcome.PLAYER_WIN,
|
|
924
|
+
);
|
|
925
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.PLAYER, BaccaratBetType.PLAYER_BONUS]));
|
|
926
|
+
});
|
|
927
|
+
|
|
928
|
+
it('returns BANKER_BONUS on natural banker win', () => {
|
|
929
|
+
const result = mockResult(
|
|
930
|
+
[ci('3', Suits.CLUBS), ci('A', Suits.DIAMONDS)],
|
|
931
|
+
[ci('8', Suits.CLUBS), ci('A', Suits.CLUBS)],
|
|
932
|
+
4,
|
|
933
|
+
9,
|
|
934
|
+
BaccaratOutcome.BANKER_WIN,
|
|
935
|
+
);
|
|
936
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.BANKER, BaccaratBetType.BANKER_BONUS]));
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
it('returns PLAYER_BONUS on non-natural player win by 4', () => {
|
|
940
|
+
const result = mockResult(
|
|
941
|
+
[ci('4', Suits.CLUBS), ci('10', Suits.DIAMONDS), ci('Q', Suits.HEARTS)],
|
|
942
|
+
[ci('A', Suits.CLUBS), ci('2', Suits.DIAMONDS), ci('7', Suits.HEARTS)],
|
|
943
|
+
4,
|
|
944
|
+
0,
|
|
945
|
+
BaccaratOutcome.PLAYER_WIN,
|
|
946
|
+
);
|
|
947
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.PLAYER, BaccaratBetType.PLAYER_BONUS]));
|
|
948
|
+
});
|
|
949
|
+
|
|
950
|
+
it('does not return PLAYER_BONUS on non-natural win by fewer than 4 points', () => {
|
|
951
|
+
const result = mockResult(
|
|
952
|
+
[ci('4', Suits.CLUBS), ci('3', Suits.DIAMONDS)],
|
|
953
|
+
[ci('A', Suits.CLUBS), ci('2', Suits.DIAMONDS), ci('3', Suits.HEARTS)],
|
|
954
|
+
7,
|
|
955
|
+
6,
|
|
956
|
+
BaccaratOutcome.PLAYER_WIN,
|
|
957
|
+
);
|
|
958
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.PLAYER]));
|
|
959
|
+
});
|
|
960
|
+
|
|
961
|
+
it('does not return PLAYER_BONUS when player loses', () => {
|
|
962
|
+
const result = mockResult(
|
|
963
|
+
[ci('3', Suits.CLUBS), ci('10', Suits.DIAMONDS), ci('Q', Suits.HEARTS)],
|
|
964
|
+
[ci('3', Suits.CLUBS), ci('4', Suits.DIAMONDS)],
|
|
965
|
+
3,
|
|
966
|
+
7,
|
|
967
|
+
BaccaratOutcome.BANKER_WIN,
|
|
968
|
+
);
|
|
969
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.BANKER, BaccaratBetType.BANKER_BONUS]));
|
|
970
|
+
});
|
|
971
|
+
|
|
972
|
+
it('returns BANKER_BONUS on non-natural banker win by 5', () => {
|
|
973
|
+
const result = mockResult(
|
|
974
|
+
[ci('A', Suits.CLUBS), ci('2', Suits.DIAMONDS), ci('8', Suits.HEARTS)],
|
|
975
|
+
[ci('3', Suits.DIAMONDS), ci('3', Suits.HEARTS)],
|
|
976
|
+
1,
|
|
977
|
+
6,
|
|
978
|
+
BaccaratOutcome.BANKER_WIN,
|
|
979
|
+
);
|
|
980
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(
|
|
981
|
+
expect.arrayContaining([BaccaratBetType.BANKER, BaccaratBetType.BANKER_PAIR, BaccaratBetType.EITHER_PAIR, BaccaratBetType.BANKER_BONUS]),
|
|
982
|
+
);
|
|
983
|
+
});
|
|
984
|
+
|
|
985
|
+
it('does not return BANKER_BONUS when banker loses', () => {
|
|
986
|
+
const result = mockResult(
|
|
987
|
+
[ci('4', Suits.CLUBS), ci('3', Suits.DIAMONDS)],
|
|
988
|
+
[ci('A', Suits.CLUBS), ci('A', Suits.DIAMONDS), ci('10', Suits.HEARTS)],
|
|
989
|
+
7,
|
|
990
|
+
2,
|
|
991
|
+
BaccaratOutcome.PLAYER_WIN,
|
|
992
|
+
);
|
|
993
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.PLAYER, BaccaratBetType.PLAYER_BONUS]));
|
|
994
|
+
});
|
|
995
|
+
|
|
996
|
+
it('returns no PLAYER_BONUS or BANKER_BONUS on natural tie (push)', () => {
|
|
997
|
+
const result = mockResult(
|
|
998
|
+
[ci('8', Suits.CLUBS), ci('Q', Suits.DIAMONDS)],
|
|
999
|
+
[ci('8', Suits.DIAMONDS), ci('Q', Suits.HEARTS)],
|
|
1000
|
+
8,
|
|
1001
|
+
8,
|
|
1002
|
+
BaccaratOutcome.TIE,
|
|
1003
|
+
);
|
|
1004
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(
|
|
1005
|
+
expect.arrayContaining([BaccaratBetType.TIE]),
|
|
1006
|
+
);
|
|
1007
|
+
});
|
|
1008
|
+
|
|
1009
|
+
it('returns neither bonus on non-natural tie', () => {
|
|
1010
|
+
const result = mockResult(
|
|
1011
|
+
[ci('3', Suits.CLUBS), ci('3', Suits.DIAMONDS)],
|
|
1012
|
+
[ci('2', Suits.CLUBS), ci('4', Suits.DIAMONDS)],
|
|
1013
|
+
6,
|
|
1014
|
+
6,
|
|
1015
|
+
BaccaratOutcome.TIE,
|
|
1016
|
+
);
|
|
1017
|
+
expect(Baccarat.getWinningBetTypes(result)).toEqual(expect.arrayContaining([BaccaratBetType.TIE]));
|
|
1018
|
+
});
|
|
1019
|
+
});
|
|
1020
|
+
});
|
|
1021
|
+
|
|
796
1022
|
describe('getGameOutcome', () => {
|
|
797
1023
|
it('returns result, payout, and multiplier for a valid game', () => {
|
|
798
1024
|
const hex = hexString(SEED1.serverSeed, SEED1.clientSeed, '2');
|
package/src/games/baccarat.ts
CHANGED
|
@@ -44,7 +44,6 @@ const TIE_MULTIPLIER = new BigNumber(9); // 8:1
|
|
|
44
44
|
const PAIR_MULTIPLIER = new BigNumber(12); // 11:1
|
|
45
45
|
const EITHER_PAIR_MULTIPLIER = new BigNumber(6); // 5:1
|
|
46
46
|
const PERFECT_PAIR_ONE_HAND_MULTIPLIER = new BigNumber(26); // 25:1
|
|
47
|
-
const PERFECT_PAIR_BOTH_HANDS_MULTIPLIER = new BigNumber(201); // 200:1
|
|
48
47
|
const BONUS_NATURAL_WIN_MULTIPLIER = new BigNumber(2); // 1:1
|
|
49
48
|
const BONUS_NATURAL_TIE_MULTIPLIER = new BigNumber(1); // push
|
|
50
49
|
|
|
@@ -188,6 +187,50 @@ export class Baccarat {
|
|
|
188
187
|
return BONUS_NON_NATURAL_PAYOUT[margin] ?? new BigNumber(0);
|
|
189
188
|
}
|
|
190
189
|
|
|
190
|
+
static getWinningBetTypes(result: BaccaratGameResult): BaccaratBetType[] {
|
|
191
|
+
const { outcome } = result;
|
|
192
|
+
const winning: BaccaratBetType[] = [];
|
|
193
|
+
|
|
194
|
+
if (outcome === BaccaratOutcome.PLAYER_WIN) {
|
|
195
|
+
winning.push(BaccaratBetType.PLAYER);
|
|
196
|
+
}
|
|
197
|
+
if (outcome === BaccaratOutcome.BANKER_WIN) {
|
|
198
|
+
winning.push(BaccaratBetType.BANKER);
|
|
199
|
+
}
|
|
200
|
+
if (outcome === BaccaratOutcome.TIE) {
|
|
201
|
+
winning.push(BaccaratBetType.TIE);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const playerHasPair = this.hasPair(result.playerCards);
|
|
205
|
+
const bankerHasPair = this.hasPair(result.bankerCards);
|
|
206
|
+
|
|
207
|
+
if (playerHasPair) {
|
|
208
|
+
winning.push(BaccaratBetType.PLAYER_PAIR);
|
|
209
|
+
}
|
|
210
|
+
if (bankerHasPair) {
|
|
211
|
+
winning.push(BaccaratBetType.BANKER_PAIR);
|
|
212
|
+
}
|
|
213
|
+
if (playerHasPair || bankerHasPair) {
|
|
214
|
+
winning.push(BaccaratBetType.EITHER_PAIR);
|
|
215
|
+
}
|
|
216
|
+
if (this.hasPerfectPair(result.playerCards) || this.hasPerfectPair(result.bankerCards)) {
|
|
217
|
+
winning.push(BaccaratBetType.PERFECT_PAIR);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const { playerCards, bankerCards, playerHandValue, bankerHandValue } = result;
|
|
221
|
+
const playerIsNatural = this.isNatural(playerHandValue, playerCards);
|
|
222
|
+
const bankerIsNatural = this.isNatural(bankerHandValue, bankerCards);
|
|
223
|
+
|
|
224
|
+
if (outcome === BaccaratOutcome.PLAYER_WIN && (playerIsNatural || (!playerIsNatural && playerHandValue - bankerHandValue >= 4))) {
|
|
225
|
+
winning.push(BaccaratBetType.PLAYER_BONUS);
|
|
226
|
+
}
|
|
227
|
+
if (outcome === BaccaratOutcome.BANKER_WIN && (bankerIsNatural || (!bankerIsNatural && bankerHandValue - playerHandValue >= 4))) {
|
|
228
|
+
winning.push(BaccaratBetType.BANKER_BONUS);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return winning;
|
|
232
|
+
}
|
|
233
|
+
|
|
191
234
|
static calcBetPayouts(bets: BaccaratBet[], result: BaccaratGameResult): { payout: BigNumber; multiplier: BigNumber } {
|
|
192
235
|
const { outcome } = result;
|
|
193
236
|
|
|
@@ -239,9 +282,7 @@ export class Baccarat {
|
|
|
239
282
|
break;
|
|
240
283
|
|
|
241
284
|
case BaccaratBetType.PERFECT_PAIR:
|
|
242
|
-
if (playerHasPerfectPair
|
|
243
|
-
betPayout = bet.amount.times(PERFECT_PAIR_BOTH_HANDS_MULTIPLIER);
|
|
244
|
-
} else if (playerHasPerfectPair || bankerHasPerfectPair) {
|
|
285
|
+
if (playerHasPerfectPair || bankerHasPerfectPair) {
|
|
245
286
|
betPayout = bet.amount.times(PERFECT_PAIR_ONE_HAND_MULTIPLIER);
|
|
246
287
|
}
|
|
247
288
|
break;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { createHmac } from 'crypto';
|
|
2
|
+
import { Blitz } from './blitz';
|
|
3
|
+
|
|
4
|
+
const SERVER_SEED = 'ebd3ff712ee7ed3cabe3753146f95847b017f847758ed254c531ff0d45686cea';
|
|
5
|
+
const CLIENT_SEED = 'pf4jl5q97q';
|
|
6
|
+
|
|
7
|
+
const GAME_TABLE: [picks: number, probability: number, payout: number][] = [
|
|
8
|
+
[5, 0.8202837786, 1.194708497],
|
|
9
|
+
[6, 0.7414103383, 1.321805145],
|
|
10
|
+
[7, 0.6558629916, 1.494214512],
|
|
11
|
+
[8, 0.5675737427, 1.726647881],
|
|
12
|
+
[9, 0.4802547054, 2.040583859],
|
|
13
|
+
[10, 0.3971336987, 2.467682806],
|
|
14
|
+
[11, 0.3207618336, 3.055226331],
|
|
15
|
+
[12, 0.2529083688, 3.874921201],
|
|
16
|
+
[13, 0.194544899, 5.037397561],
|
|
17
|
+
[14, 0.1459086743, 6.716530082],
|
|
18
|
+
[15, 0.1066255697, 9.191041164],
|
|
19
|
+
[16, 0.0758681938, 12.917138933],
|
|
20
|
+
[17, 0.0525241342, 18.65808957],
|
|
21
|
+
[18, 0.0353527826, 27.720590219],
|
|
22
|
+
[19, 0.0231152809, 42.396196806],
|
|
23
|
+
[20, 0.0146693129, 66.8061283],
|
|
24
|
+
[21, 0.0090272695, 108.559958487],
|
|
25
|
+
[22, 0.0053816414, 182.100575526],
|
|
26
|
+
[23, 0.0031047931, 315.640997579],
|
|
27
|
+
[24, 0.0017315192, 565.976961176],
|
|
28
|
+
[25, 0.0009323565, 1051.100070756],
|
|
29
|
+
[26, 0.0004841082, 2024.340877012],
|
|
30
|
+
[27, 0.0002420541, 4048.681754024],
|
|
31
|
+
[28, 0.0001163722, 8421.25804837],
|
|
32
|
+
[29, 0.0000537102, 18246.059104802],
|
|
33
|
+
[30, 0.0000237564, 41251.959715205],
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
function generateDigestHex(nonce: string, rounds: number): string[] {
|
|
37
|
+
return Array.from({ length: rounds }, (_, round) => {
|
|
38
|
+
const hmac = createHmac('sha256', SERVER_SEED);
|
|
39
|
+
hmac.update(`${CLIENT_SEED}:${nonce}:${round}`);
|
|
40
|
+
return hmac.digest('hex');
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
describe('Blitz.getGameSeedRounds', () => {
|
|
45
|
+
it('returns 1 round for picks 1–8', () => {
|
|
46
|
+
expect(Blitz.getGameSeedRounds(5)).toBe(1);
|
|
47
|
+
expect(Blitz.getGameSeedRounds(8)).toBe(1);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('returns 2 rounds for picks 9–16', () => {
|
|
51
|
+
expect(Blitz.getGameSeedRounds(9)).toBe(2);
|
|
52
|
+
expect(Blitz.getGameSeedRounds(16)).toBe(2);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('returns 4 rounds for 30 picks (max)', () => {
|
|
56
|
+
expect(Blitz.getGameSeedRounds(30)).toBe(4);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe('Blitz.getGameOutcome', () => {
|
|
61
|
+
it('returns the correct number of cards', () => {
|
|
62
|
+
const hexStrings = generateDigestHex('1', Blitz.getGameSeedRounds(10));
|
|
63
|
+
const { cards } = Blitz.getGameOutcome(hexStrings, 10);
|
|
64
|
+
expect(cards).toHaveLength(10);
|
|
65
|
+
|
|
66
|
+
const hexStrings2 = generateDigestHex('2', Blitz.getGameSeedRounds(25));
|
|
67
|
+
const { cards: cards2 } = Blitz.getGameOutcome(hexStrings2, 25);
|
|
68
|
+
expect(cards2).toHaveLength(25);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('maxCount is 1 when all cards are unique', () => {
|
|
72
|
+
// Force a known set of unique cards by checking the outcome
|
|
73
|
+
const hexStrings = generateDigestHex('1', Blitz.getGameSeedRounds(5));
|
|
74
|
+
const { maxRepeatedCount, cards } = Blitz.getGameOutcome(hexStrings, 5);
|
|
75
|
+
const uniqueCount = new Set(cards).size;
|
|
76
|
+
if (uniqueCount === 5) {
|
|
77
|
+
expect(maxRepeatedCount).toBe(1);
|
|
78
|
+
} else {
|
|
79
|
+
expect(maxRepeatedCount).toBeGreaterThan(1);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('maxCount reflects the highest duplicate count', () => {
|
|
84
|
+
const hexStrings = generateDigestHex('5', Blitz.getGameSeedRounds(30));
|
|
85
|
+
const { maxRepeatedCount } = Blitz.getGameOutcome(hexStrings, 30);
|
|
86
|
+
|
|
87
|
+
expect(maxRepeatedCount).toBe(2);
|
|
88
|
+
|
|
89
|
+
const hexStrings2 = generateDigestHex('6', Blitz.getGameSeedRounds(30));
|
|
90
|
+
const { maxRepeatedCount: maxRepeatedCount2 } = Blitz.getGameOutcome(hexStrings2, 30);
|
|
91
|
+
expect(maxRepeatedCount2).toBe(3);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('Blitz.isCleanSweepWin', () => {
|
|
96
|
+
it('returns true when maxCount is 1 (all unique)', () => {
|
|
97
|
+
expect(Blitz.isCleanSweepWin(1)).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('returns false when any card is duplicated', () => {
|
|
101
|
+
expect(Blitz.isCleanSweepWin(2)).toBe(false);
|
|
102
|
+
expect(Blitz.isCleanSweepWin(3)).toBe(false);
|
|
103
|
+
expect(Blitz.isCleanSweepWin(5)).toBe(false);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe('Blitz.calculateWinChanceBN', () => {
|
|
108
|
+
it.each(GAME_TABLE)('N=%i matches expected probability', (picks, expected) => {
|
|
109
|
+
expect(Blitz.calculateWinChanceBN(picks).decimalPlaces(10).toNumber()).toBe(expected);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('Blitz.calculateMultiplierBN', () => {
|
|
114
|
+
const EDGE_BPS = 200;
|
|
115
|
+
|
|
116
|
+
it.each(GAME_TABLE)('N=%i payout matches expected multiplier', (picks, _probability, expectedPayout) => {
|
|
117
|
+
expect(Blitz.calculateMultiplierBN(picks, EDGE_BPS).decimalPlaces(9).toNumber()).toBe(expectedPayout);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
2
|
+
import { CardGames, CARDS_PER_DECK } from './cardGames';
|
|
3
|
+
import { calculateEdgeMultiplier } from '../utils/edge';
|
|
4
|
+
|
|
5
|
+
export const BLITZ_MIN_PICKS = 5;
|
|
6
|
+
export const BLITZ_MAX_PICKS = 30;
|
|
7
|
+
|
|
8
|
+
export interface BlitzResult {
|
|
9
|
+
maxRepeatedCount: number;
|
|
10
|
+
cards: number[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class Blitz {
|
|
14
|
+
static getGameSeedRounds(picks: number): number {
|
|
15
|
+
return Math.ceil(picks / 8);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
private static drawCards(hexStrings: string[], picks: number): number[] {
|
|
19
|
+
const cards = CardGames.getResults(hexStrings);
|
|
20
|
+
|
|
21
|
+
if (cards.length < picks) {
|
|
22
|
+
throw new Error('Not enough cards drawn');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return cards.slice(0, picks);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
static getGameOutcome(hexStrings: string[], picks: number): BlitzResult {
|
|
29
|
+
const cards = this.drawCards(hexStrings, picks);
|
|
30
|
+
const cardCounts: Record<number, number> = {};
|
|
31
|
+
let maxRepeatedCount = 0;
|
|
32
|
+
|
|
33
|
+
for (const card of cards) {
|
|
34
|
+
const count = (cardCounts[card] || 0) + 1;
|
|
35
|
+
cardCounts[card] = count;
|
|
36
|
+
|
|
37
|
+
if (count > maxRepeatedCount) maxRepeatedCount = count;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return { maxRepeatedCount, cards };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static calculateWinChanceBN(picks: number): BigNumber {
|
|
44
|
+
const deck = new BigNumber(CARDS_PER_DECK);
|
|
45
|
+
let result = new BigNumber(1);
|
|
46
|
+
|
|
47
|
+
for (let i = 0; i < picks; i++) {
|
|
48
|
+
result = result.multipliedBy(deck.minus(i)).dividedBy(deck);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static calculateMultiplierBN(picks: number, edgeBps: number): BigNumber {
|
|
55
|
+
const winChance = this.calculateWinChanceBN(picks);
|
|
56
|
+
return calculateEdgeMultiplier(edgeBps).div(winChance);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static isCleanSweepWin(maxRepeatedCount: number): boolean {
|
|
60
|
+
return maxRepeatedCount === 1;
|
|
61
|
+
}
|
|
62
|
+
}
|
package/src/games/cardGames.ts
CHANGED
|
@@ -2,6 +2,7 @@ import BigNumber from 'bignumber.js';
|
|
|
2
2
|
import { hexToBytes } from '../utils/hex-to-bytes';
|
|
3
3
|
|
|
4
4
|
const BYTE_TOTAL = new BigNumber(256);
|
|
5
|
+
export const CARDS_PER_DECK = 52;
|
|
5
6
|
|
|
6
7
|
const CARD_MAP: Record<string, 'A' | 'J' | 'Q' | 'K'> = {
|
|
7
8
|
'1': 'A',
|
|
@@ -53,7 +54,7 @@ export class CardGames {
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
static getCardDetailsArr(cardNums: readonly number[]): CardDetail[] {
|
|
56
|
-
return cardNums.map(
|
|
57
|
+
return cardNums.map(cardNum => this.getCardDetails(cardNum));
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
static getResult(hexStr: string, cardNo: number): number {
|
package/src/index.ts
CHANGED
|
@@ -35,3 +35,4 @@ export { Tower, TowerDifficulty, TOWER_DIFFICULTY_TO_CONFIG, TOWER_TOTAL_ROWS }
|
|
|
35
35
|
export { Wheel, WheelRiskLevel, WheelSegments, WHEEL_MULTIPLIERS, WHEEL_SEGMENTS_TO_NUMBER } from './games/wheel';
|
|
36
36
|
export { formatSelectionName } from './utils/sports-name';
|
|
37
37
|
export { SportsContentWithFixturesInfo } from './utils/sports-content-fixture.types';
|
|
38
|
+
export { Blitz, BlitzResult, BLITZ_MIN_PICKS, BLITZ_MAX_PICKS } from './games/blitz';
|
package/src/regex/index.ts
CHANGED
|
@@ -17,5 +17,5 @@ export const TIMEZONE_OFFSET_REGEX = /^(?:Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])
|
|
|
17
17
|
export const TXN_URL_REGEX = /^https:\/\/.*\{txId\}.*$/;
|
|
18
18
|
|
|
19
19
|
export const ADDRESS_URL_REGEX = /^https:\/\/.*\{address\}.*$/;
|
|
20
|
-
export const VALID_NAME_REGEX = /^[^0-9!@#$%^&*`~()+=[{\]};:"
|
|
20
|
+
export const VALID_NAME_REGEX = /^[^0-9!@#$%^&*`~()+=[{\]};:"\\|<>\/?\u3164]*$/;
|
|
21
21
|
export const US_PHONE_NUMBER_REGEX = /^\+1\d{10}$/;
|
package/src/regex/regex.spec.ts
CHANGED
|
@@ -139,6 +139,10 @@ describe('regex', () => {
|
|
|
139
139
|
it('should allow for empty string', () => {
|
|
140
140
|
expect(VALID_NAME_REGEX.test('')).toBe(true);
|
|
141
141
|
});
|
|
142
|
+
|
|
143
|
+
it('should not allow for U+3164(Hangul Filler) unicode character', () => {
|
|
144
|
+
expect(VALID_NAME_REGEX.test('ㅤ')).toBe(false); // there is an invisible unicode character in here
|
|
145
|
+
});
|
|
142
146
|
});
|
|
143
147
|
|
|
144
148
|
describe('US_PHONE_NUMBER_REGEX', () => {
|
|
@@ -39,7 +39,7 @@ export enum SportsFixtureStatus {
|
|
|
39
39
|
SCHEDULED = 'SCHEDULED',
|
|
40
40
|
PREMATCH = 'PREMATCH',
|
|
41
41
|
LIVE = 'LIVE',
|
|
42
|
-
// suspended: the fixture is suspended and may come back later, user can still see the fixture but all markets will show as suspended and not
|
|
42
|
+
// suspended: the fixture is suspended and may come back later, user can still see the fixture but all markets will show as suspended and not browseable
|
|
43
43
|
// return suspended especially because Premium Cricket will often go suspended during InPlay and come back again
|
|
44
44
|
SUSPENDED = 'SUSPENDED',
|
|
45
45
|
ENDED = 'ENDED',
|
|
@@ -258,8 +258,9 @@ export enum Language {
|
|
|
258
258
|
id = 'id',
|
|
259
259
|
ar = 'ar',
|
|
260
260
|
no = 'no',
|
|
261
|
-
sv = 'sv',
|
|
262
261
|
it = 'it',
|
|
262
|
+
// Deprecated
|
|
263
|
+
sv = 'sv',
|
|
263
264
|
}
|
|
264
265
|
|
|
265
266
|
export enum SportsMatchPhaseWinner {
|