shufflecom-calculations 1.0.11 → 1.0.13
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/enums/chain.d.ts +8 -0
- package/lib/enums/chain.js +13 -0
- package/lib/enums/chain.js.map +1 -0
- package/lib/games/dice.d.ts +20 -0
- package/lib/games/dice.js +95 -0
- package/lib/games/dice.js.map +1 -0
- package/lib/games/dice.spec.d.ts +1 -0
- package/lib/games/dice.spec.js +58 -0
- package/lib/games/dice.spec.js.map +1 -0
- package/lib/games/mines.d.ts +10 -0
- package/lib/games/mines.js +44 -0
- package/lib/games/mines.js.map +1 -0
- package/lib/games/mines.spec.d.ts +1 -0
- package/lib/games/mines.spec.js +24 -0
- package/lib/games/mines.spec.js.map +1 -0
- package/lib/games/plinko.d.ts +20 -0
- package/lib/games/plinko.js +131 -0
- package/lib/games/plinko.js.map +1 -0
- package/lib/games/plinko.spec.d.ts +1 -0
- package/lib/games/plinko.spec.js +32 -0
- package/lib/games/plinko.spec.js.map +1 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +31 -0
- package/lib/index.js.map +1 -0
- package/lib/regex/index.d.ts +3 -0
- package/lib/regex/index.js +7 -0
- package/lib/regex/index.js.map +1 -0
- package/lib/regex/regex.spec.d.ts +1 -0
- package/lib/regex/regex.spec.js +64 -0
- package/lib/regex/regex.spec.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/utils/edge.d.ts +2 -0
- package/lib/utils/edge.js +17 -0
- package/lib/utils/edge.js.map +1 -0
- package/lib/utils/factorial.d.ts +2 -0
- package/lib/utils/factorial.js +20 -0
- package/lib/utils/factorial.js.map +1 -0
- package/lib/utils/factorial.spec.d.ts +1 -0
- package/lib/utils/factorial.spec.js +19 -0
- package/lib/utils/factorial.spec.js.map +1 -0
- package/lib/utils/generate-concurrency-id.d.ts +1 -0
- package/lib/utils/generate-concurrency-id.js +9 -0
- package/lib/utils/generate-concurrency-id.js.map +1 -0
- package/lib/utils/hex-to-bytes.d.ts +1 -0
- package/lib/utils/hex-to-bytes.js +15 -0
- package/lib/utils/hex-to-bytes.js.map +1 -0
- package/lib/utils/index.d.ts +4 -0
- package/lib/utils/index.js +12 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/is-valid-address.d.ts +2 -0
- package/lib/utils/is-valid-address.js +25 -0
- package/lib/utils/is-valid-address.js.map +1 -0
- package/lib/utils/is-valid-address.spec.d.ts +1 -0
- package/lib/utils/is-valid-address.spec.js +26 -0
- package/lib/utils/is-valid-address.spec.js.map +1 -0
- package/lib/utils/ncr.d.ts +2 -0
- package/lib/utils/ncr.js +15 -0
- package/lib/utils/ncr.js.map +1 -0
- package/lib/utils/ncr.spec.d.ts +1 -0
- package/lib/utils/ncr.spec.js +21 -0
- package/lib/utils/ncr.spec.js.map +1 -0
- package/package.json +5 -2
- package/src/enums/chain.ts +3 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Chain = void 0;
|
|
4
|
+
var Chain;
|
|
5
|
+
(function (Chain) {
|
|
6
|
+
Chain["BITCOIN"] = "BITCOIN";
|
|
7
|
+
Chain["ETHEREUM"] = "ETHEREUM";
|
|
8
|
+
Chain["SOLANA"] = "SOLANA";
|
|
9
|
+
Chain["LITECOIN"] = "LITECOIN";
|
|
10
|
+
Chain["TRON"] = "TRON";
|
|
11
|
+
Chain["MATIC_POLYGON"] = "MATIC_POLYGON";
|
|
12
|
+
})(Chain = exports.Chain || (exports.Chain = {}));
|
|
13
|
+
//# sourceMappingURL=chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.js","sourceRoot":"","sources":["../../src/enums/chain.ts"],"names":[],"mappings":";;;AAAA,IAAY,KAOX;AAPD,WAAY,KAAK;IACf,4BAAmB,CAAA;IACnB,8BAAqB,CAAA;IACrB,0BAAiB,CAAA;IACjB,8BAAqB,CAAA;IACrB,sBAAa,CAAA;IACb,wCAA+B,CAAA;AACjC,CAAC,EAPW,KAAK,GAAL,aAAK,KAAL,aAAK,QAOhB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
2
|
+
export declare enum DiceDirection {
|
|
3
|
+
ABOVE = "ABOVE",
|
|
4
|
+
BELOW = "BELOW"
|
|
5
|
+
}
|
|
6
|
+
declare class Dice {
|
|
7
|
+
getResult(hexStr: string): BigNumber;
|
|
8
|
+
private convertToBN;
|
|
9
|
+
isWin(direction: DiceDirection, playerBet: number, result: number): boolean;
|
|
10
|
+
isWinBN(direction: DiceDirection, playerBet: BigNumber, result: BigNumber): boolean;
|
|
11
|
+
calculateMultiplier(direction: DiceDirection, playerBet: number, edgeBps: number): number;
|
|
12
|
+
calculateMultiplierBN(direction: DiceDirection, playerBet: BigNumber, edgeBps: number): BigNumber;
|
|
13
|
+
calculateWinChance(direction: DiceDirection, playerBet: number): number;
|
|
14
|
+
calculateWinChanceBN(direction: DiceDirection, playerBet: BigNumber): BigNumber;
|
|
15
|
+
calculateBetFromMultiplier(direction: DiceDirection, multiplier: number, edgeBps: number): number;
|
|
16
|
+
calculateBetFromWinChance(direction: DiceDirection, winChance: number): number;
|
|
17
|
+
calculatePayoutBN(amount: BigNumber, multiplier: BigNumber): BigNumber;
|
|
18
|
+
}
|
|
19
|
+
declare const _default: Dice;
|
|
20
|
+
export default _default;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DiceDirection = void 0;
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const edge_1 = require("../utils/edge");
|
|
9
|
+
const hex_to_bytes_1 = require("../utils/hex-to-bytes");
|
|
10
|
+
var DiceDirection;
|
|
11
|
+
(function (DiceDirection) {
|
|
12
|
+
DiceDirection["ABOVE"] = "ABOVE";
|
|
13
|
+
DiceDirection["BELOW"] = "BELOW";
|
|
14
|
+
})(DiceDirection = exports.DiceDirection || (exports.DiceDirection = {}));
|
|
15
|
+
const BYTE_TOTAL = new bignumber_js_1.default(256);
|
|
16
|
+
const TOTAL_DICE_RESULTS = new bignumber_js_1.default(10001);
|
|
17
|
+
const TOTAL_DICE_RESULTS_EFFECTIVE = TOTAL_DICE_RESULTS.minus(1);
|
|
18
|
+
const DICE_CONVERSION_MULTIPLIER = new bignumber_js_1.default(100);
|
|
19
|
+
const WIN_CHANCE_CONVERSION_MULTIPLIER = new bignumber_js_1.default(100);
|
|
20
|
+
class Dice {
|
|
21
|
+
getResult(hexStr) {
|
|
22
|
+
const gameResultBytes = (0, hex_to_bytes_1.hexToBytes)(hexStr);
|
|
23
|
+
let result = new bignumber_js_1.default(0);
|
|
24
|
+
for (let i = 0; i < 4; i++) {
|
|
25
|
+
const value = gameResultBytes[i];
|
|
26
|
+
result = result.plus(new bignumber_js_1.default(value).dividedBy(BYTE_TOTAL.pow(i + 1)));
|
|
27
|
+
}
|
|
28
|
+
result = result.multipliedBy(TOTAL_DICE_RESULTS).integerValue(bignumber_js_1.default.ROUND_DOWN);
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
convertToBN(playerBet) {
|
|
32
|
+
return new bignumber_js_1.default(playerBet).multipliedBy(DICE_CONVERSION_MULTIPLIER);
|
|
33
|
+
}
|
|
34
|
+
isWin(direction, playerBet, result) {
|
|
35
|
+
return this.isWinBN(direction, this.convertToBN(playerBet), this.convertToBN(result));
|
|
36
|
+
}
|
|
37
|
+
isWinBN(direction, playerBet, result) {
|
|
38
|
+
if (direction === DiceDirection.ABOVE && result.isGreaterThan(playerBet)) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
else if (direction === DiceDirection.BELOW && result.isLessThan(playerBet)) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
calculateMultiplier(direction, playerBet, edgeBps) {
|
|
47
|
+
const result = this.calculateMultiplierBN(direction, this.convertToBN(playerBet), edgeBps);
|
|
48
|
+
return result.toNumber();
|
|
49
|
+
}
|
|
50
|
+
calculateMultiplierBN(direction, playerBet, edgeBps) {
|
|
51
|
+
const winChance = this.calculateWinChanceBN(direction, playerBet);
|
|
52
|
+
return winChance.pow(-1).multipliedBy((0, edge_1.calculateEdgeMultiplier)(edgeBps)).decimalPlaces(4);
|
|
53
|
+
}
|
|
54
|
+
calculateWinChance(direction, playerBet) {
|
|
55
|
+
const result = this.calculateWinChanceBN(direction, this.convertToBN(playerBet));
|
|
56
|
+
return result.multipliedBy(100).decimalPlaces(4).toNumber();
|
|
57
|
+
}
|
|
58
|
+
calculateWinChanceBN(direction, playerBet) {
|
|
59
|
+
let possibleOutcomes;
|
|
60
|
+
if (direction === DiceDirection.ABOVE) {
|
|
61
|
+
possibleOutcomes = TOTAL_DICE_RESULTS_EFFECTIVE.minus(playerBet);
|
|
62
|
+
}
|
|
63
|
+
else if (direction === DiceDirection.BELOW) {
|
|
64
|
+
possibleOutcomes = playerBet;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
throw new Error(`Dice Direction does not include ${direction}`);
|
|
68
|
+
}
|
|
69
|
+
return possibleOutcomes.dividedBy(TOTAL_DICE_RESULTS_EFFECTIVE);
|
|
70
|
+
}
|
|
71
|
+
calculateBetFromMultiplier(direction, multiplier, edgeBps) {
|
|
72
|
+
const multiplierBeforeEdge = new bignumber_js_1.default(multiplier).dividedBy((0, edge_1.calculateEdgeMultiplier)(edgeBps));
|
|
73
|
+
const winChance = new bignumber_js_1.default(1).dividedBy(multiplierBeforeEdge).multipliedBy(WIN_CHANCE_CONVERSION_MULTIPLIER).toNumber();
|
|
74
|
+
return this.calculateBetFromWinChance(direction, winChance);
|
|
75
|
+
}
|
|
76
|
+
calculateBetFromWinChance(direction, winChance) {
|
|
77
|
+
const winChanceBN = new bignumber_js_1.default(winChance).dividedBy(WIN_CHANCE_CONVERSION_MULTIPLIER);
|
|
78
|
+
let result;
|
|
79
|
+
if (direction === DiceDirection.BELOW) {
|
|
80
|
+
result = TOTAL_DICE_RESULTS_EFFECTIVE.multipliedBy(winChanceBN);
|
|
81
|
+
}
|
|
82
|
+
else if (direction === DiceDirection.ABOVE) {
|
|
83
|
+
result = TOTAL_DICE_RESULTS_EFFECTIVE.minus(TOTAL_DICE_RESULTS_EFFECTIVE.multipliedBy(winChanceBN));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
throw new Error(`Dice Direction not acceptable - "${direction}"`);
|
|
87
|
+
}
|
|
88
|
+
return result.dividedBy(DICE_CONVERSION_MULTIPLIER).decimalPlaces(2).toNumber();
|
|
89
|
+
}
|
|
90
|
+
calculatePayoutBN(amount, multiplier) {
|
|
91
|
+
return amount.multipliedBy(multiplier);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.default = new Dice();
|
|
95
|
+
//# sourceMappingURL=dice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dice.js","sourceRoot":"","sources":["../../src/games/dice.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqC;AACrC,wCAAwD;AACxD,wDAAmD;AAEnD,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,gCAAe,CAAA;IACf,gCAAe,CAAA;AACjB,CAAC,EAHW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAGxB;AAED,MAAM,UAAU,GAAG,IAAI,sBAAS,CAAC,GAAG,CAAC,CAAC;AAGtC,MAAM,kBAAkB,GAAG,IAAI,sBAAS,CAAC,KAAK,CAAC,CAAC;AAGhD,MAAM,4BAA4B,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEjE,MAAM,0BAA0B,GAAG,IAAI,sBAAS,CAAC,GAAG,CAAC,CAAC;AACtD,MAAM,gCAAgC,GAAG,IAAI,sBAAS,CAAC,GAAG,CAAC,CAAC;AAE5D,MAAM,IAAI;IACR,SAAS,CAAC,MAAc;QACtB,MAAM,eAAe,GAAG,IAAA,yBAAU,EAAC,MAAM,CAAC,CAAC;QAE3C,IAAI,MAAM,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC;QAG9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAEjC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAS,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7E;QAED,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,sBAAS,CAAC,UAAU,CAAC,CAAC;QAEpF,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,WAAW,CAAC,SAA0B;QAC5C,OAAO,IAAI,sBAAS,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,SAAwB,EAAE,SAAiB,EAAE,MAAc;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,SAAwB,EAAE,SAAoB,EAAE,MAAiB;QACvE,IAAI,SAAS,KAAK,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;YACxE,OAAO,IAAI,CAAC;SACb;aAAM,IAAI,SAAS,KAAK,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAC5E,OAAO,IAAI,CAAC;SACb;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mBAAmB,CAAC,SAAwB,EAAE,SAAiB,EAAE,OAAe;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAE3F,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED,qBAAqB,CAAC,SAAwB,EAAE,SAAoB,EAAE,OAAe;QACnF,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAElE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAA,8BAAuB,EAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,kBAAkB,CAAC,SAAwB,EAAE,SAAiB;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAEjF,OAAO,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9D,CAAC;IAED,oBAAoB,CAAC,SAAwB,EAAE,SAAoB;QACjE,IAAI,gBAAgB,CAAC;QAErB,IAAI,SAAS,KAAK,aAAa,CAAC,KAAK,EAAE;YACrC,gBAAgB,GAAG,4BAA4B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;SAClE;aAAM,IAAI,SAAS,KAAK,aAAa,CAAC,KAAK,EAAE;YAC5C,gBAAgB,GAAG,SAAS,CAAC;SAC9B;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;SACjE;QAED,OAAO,gBAAgB,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IAClE,CAAC;IAED,0BAA0B,CAAC,SAAwB,EAAE,UAAkB,EAAE,OAAe;QACtF,MAAM,oBAAoB,GAAG,IAAI,sBAAS,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,IAAA,8BAAuB,EAAC,OAAO,CAAC,CAAC,CAAC;QAEnG,MAAM,SAAS,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,YAAY,CAAC,gCAAgC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7H,OAAO,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,yBAAyB,CAAC,SAAwB,EAAE,SAAiB;QACnE,MAAM,WAAW,GAAG,IAAI,sBAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAEzF,IAAI,MAAM,CAAC;QACX,IAAI,SAAS,KAAK,aAAa,CAAC,KAAK,EAAE;YACrC,MAAM,GAAG,4BAA4B,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;SACjE;aAAM,IAAI,SAAS,KAAK,aAAa,CAAC,KAAK,EAAE;YAC5C,MAAM,GAAG,4BAA4B,CAAC,KAAK,CAAC,4BAA4B,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;SACrG;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,GAAG,CAAC,CAAC;SACnE;QAED,OAAO,MAAM,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClF,CAAC;IAED,iBAAiB,CAAC,MAAiB,EAAE,UAAqB;QACxD,OAAO,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;CACF;AAED,kBAAe,IAAI,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const dice_1 = __importStar(require("./dice"));
|
|
27
|
+
const edgeBps = 100;
|
|
28
|
+
const results = [
|
|
29
|
+
{ direction: dice_1.DiceDirection.ABOVE, multiplier: 2, bet: 50.50, winChance: 49.5 },
|
|
30
|
+
{ direction: dice_1.DiceDirection.BELOW, multiplier: 1.9412, bet: 51, winChance: 51 },
|
|
31
|
+
{ direction: dice_1.DiceDirection.BELOW, multiplier: 2.3571, bet: 42, winChance: 42 },
|
|
32
|
+
{ direction: dice_1.DiceDirection.BELOW, multiplier: 6.7762, bet: 14.61, winChance: 14.61 }
|
|
33
|
+
];
|
|
34
|
+
describe('Dice', () => {
|
|
35
|
+
results.forEach((item) => {
|
|
36
|
+
describe(`${JSON.stringify(item)}`, () => {
|
|
37
|
+
it('be able to calculate the correct win chances', () => {
|
|
38
|
+
expect(dice_1.default.calculateWinChance(item.direction, item.bet)).toBe(item.winChance);
|
|
39
|
+
});
|
|
40
|
+
it('should be able to calulate the correct multiplier', () => {
|
|
41
|
+
expect(dice_1.default.calculateMultiplier(item.direction, item.bet, edgeBps)).toBe(item.multiplier);
|
|
42
|
+
});
|
|
43
|
+
it('should calculate the bet number based on win chance', () => {
|
|
44
|
+
expect(dice_1.default.calculateBetFromWinChance(item.direction, item.winChance)).toEqual(item.bet);
|
|
45
|
+
});
|
|
46
|
+
it('should calculate the bet number based on multiplier', () => {
|
|
47
|
+
expect(dice_1.default.calculateBetFromMultiplier(item.direction, item.multiplier, edgeBps)).toEqual(item.bet);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
it('should be able to determine win or loss', () => {
|
|
52
|
+
expect(dice_1.default.isWin(dice_1.DiceDirection.ABOVE, 50, 49)).toBe(false);
|
|
53
|
+
expect(dice_1.default.isWin(dice_1.DiceDirection.ABOVE, 50, 51)).toBe(true);
|
|
54
|
+
expect(dice_1.default.isWin(dice_1.DiceDirection.BELOW, 50, 49)).toBe(true);
|
|
55
|
+
expect(dice_1.default.isWin(dice_1.DiceDirection.BELOW, 50, 51)).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=dice.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dice.spec.js","sourceRoot":"","sources":["../../src/games/dice.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA6C;AAE7C,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,MAAM,OAAO,GAAG;IACd,EAAE,SAAS,EAAE,oBAAa,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE;IAC9E,EAAE,SAAS,EAAE,oBAAa,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9E,EAAE,SAAS,EAAE,oBAAa,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IAC9E,EAAE,SAAS,EAAE,oBAAa,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;CACrF,CAAA;AAED,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE;YACvC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;gBACtD,MAAM,CAAC,cAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjF,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;gBAC3D,MAAM,CAAC,cAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5F,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;gBAC7D,MAAM,CAAC,cAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3F,CAAC,CAAC,CAAA;YAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;gBAC7D,MAAM,CAAC,cAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtG,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,cAAI,CAAC,KAAK,CAAC,oBAAa,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,cAAI,CAAC,KAAK,CAAC,oBAAa,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,cAAI,CAAC,KAAK,CAAC,oBAAa,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,cAAI,CAAC,KAAK,CAAC,oBAAa,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
2
|
+
declare class Mines {
|
|
3
|
+
getResults(hexStr: string[]): number[];
|
|
4
|
+
hitMine: (field: number, results: number[]) => boolean;
|
|
5
|
+
calculateMultiplierBN(diamonds: number, mines: number, edgeBps: number): BigNumber;
|
|
6
|
+
calculateWinChanceBN(diamonds: number, mines: number): BigNumber;
|
|
7
|
+
calculatePayoutBN(amount: BigNumber, multiplier: BigNumber): BigNumber;
|
|
8
|
+
}
|
|
9
|
+
declare const _default: Mines;
|
|
10
|
+
export default _default;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
7
|
+
const utils_1 = require("../utils");
|
|
8
|
+
const ncr_1 = require("../utils/ncr");
|
|
9
|
+
const BYTE_TOTAL = new bignumber_js_1.default(256);
|
|
10
|
+
const TOTAL_TILES = new bignumber_js_1.default(25);
|
|
11
|
+
class Mines {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.hitMine = (field, results) => {
|
|
14
|
+
return results.some((result) => result === field);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
getResults(hexStr) {
|
|
18
|
+
const results = [];
|
|
19
|
+
const grids = Array.from(Array(TOTAL_TILES.toNumber()).keys());
|
|
20
|
+
hexStr
|
|
21
|
+
.map((hex) => (0, utils_1.hexToBytes)(hex))
|
|
22
|
+
.map((gameResultBytes, counter) => {
|
|
23
|
+
let position = new bignumber_js_1.default(0);
|
|
24
|
+
for (let i = 0; i < 4; i++) {
|
|
25
|
+
const value = gameResultBytes[i];
|
|
26
|
+
position = position.plus(new bignumber_js_1.default(value).dividedBy(BYTE_TOTAL.pow(i + 1)));
|
|
27
|
+
}
|
|
28
|
+
position = position.multipliedBy(TOTAL_TILES.minus(new bignumber_js_1.default(counter))).integerValue(bignumber_js_1.default.ROUND_DOWN);
|
|
29
|
+
results.push(grids.splice(position.toNumber(), 1)[0]);
|
|
30
|
+
});
|
|
31
|
+
return results;
|
|
32
|
+
}
|
|
33
|
+
calculateMultiplierBN(diamonds, mines, edgeBps) {
|
|
34
|
+
return this.calculateWinChanceBN(diamonds, mines).pow(-1).multipliedBy((0, utils_1.calculateEdgeMultiplier)(edgeBps));
|
|
35
|
+
}
|
|
36
|
+
calculateWinChanceBN(diamonds, mines) {
|
|
37
|
+
return (0, ncr_1.nCr)(TOTAL_TILES.minus(mines).toNumber(), diamonds).dividedBy((0, ncr_1.nCr)(TOTAL_TILES.toNumber(), diamonds));
|
|
38
|
+
}
|
|
39
|
+
calculatePayoutBN(amount, multiplier) {
|
|
40
|
+
return amount.multipliedBy(multiplier);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.default = new Mines();
|
|
44
|
+
//# sourceMappingURL=mines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mines.js","sourceRoot":"","sources":["../../src/games/mines.ts"],"names":[],"mappings":";;;;;AAAA,gEAAqC;AACrC,oCAA+D;AAC/D,sCAAmC;AACnC,MAAM,UAAU,GAAG,IAAI,sBAAS,CAAC,GAAG,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,sBAAS,CAAC,EAAE,CAAC,CAAC;AACtC,MAAM,KAAK;IAAX;QAoBE,YAAO,GAAG,CAAC,KAAa,EAAE,OAAiB,EAAE,EAAE;YAC7C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC;IAaJ,CAAC;IAlCC,UAAU,CAAC,MAAgB;QACzB,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM;aACH,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,kBAAU,EAAC,GAAG,CAAC,CAAC;aAC7B,GAAG,CAAC,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE;YAChC,IAAI,QAAQ,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC;YAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;gBACjC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,sBAAS,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aACjF;YACD,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,sBAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,sBAAS,CAAC,UAAU,CAAC,CAAC;YAC/G,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEL,OAAO,OAAO,CAAC;IACjB,CAAC;IAMD,qBAAqB,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAe;QACpE,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAA,+BAAuB,EAAC,OAAO,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,oBAAoB,CAAC,QAAgB,EAAE,KAAa;QAClD,OAAO,IAAA,SAAG,EAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAA,SAAG,EAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7G,CAAC;IAED,iBAAiB,CAAC,MAAiB,EAAE,UAAqB;QACxD,OAAO,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;CACF;AAED,kBAAe,IAAI,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const mines_1 = __importDefault(require("./mines"));
|
|
7
|
+
const edgeBps = 100;
|
|
8
|
+
const results = [
|
|
9
|
+
{ mines: 5, diamonds: 20, multiplier: 52598.7, winChance: 0.00001882 },
|
|
10
|
+
{ mines: 4, diamonds: 6, multiplier: 3.231037, winChance: 0.30640316 },
|
|
11
|
+
{ mines: 3, diamonds: 10, multiplier: 5.004396, winChance: 0.19782609 },
|
|
12
|
+
{ mines: 17, diamonds: 3, multiplier: 40.660714, winChance: 0.02434783 },
|
|
13
|
+
];
|
|
14
|
+
describe('Mines', () => {
|
|
15
|
+
it('be able to calculate the correct win chances', () => {
|
|
16
|
+
results.forEach((item) => {
|
|
17
|
+
expect(mines_1.default.calculateMultiplierBN(item.diamonds, item.mines, edgeBps).decimalPlaces(6).toNumber()).toBe(item.multiplier);
|
|
18
|
+
});
|
|
19
|
+
results.forEach((item) => {
|
|
20
|
+
expect(mines_1.default.calculateWinChanceBN(item.diamonds, item.mines).decimalPlaces(8).toNumber()).toBe(item.winChance);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=mines.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mines.spec.js","sourceRoot":"","sources":["../../src/games/mines.spec.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAE5B,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,OAAO,GAAG;IACd,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE;IACtE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE;IACtE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE;IACvE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE;CACzE,CAAC;AAEF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACvB,MAAM,CAAC,eAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5H,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACvB,MAAM,CAAC,eAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
2
|
+
export declare enum PlinkoRiskLevel {
|
|
3
|
+
LOW_RISK = "LOW_RISK",
|
|
4
|
+
MEDIUM_RISK = "MEDIUM_RISK",
|
|
5
|
+
HIGH_RISK = "HIGH_RISK"
|
|
6
|
+
}
|
|
7
|
+
interface PlinkConfig {
|
|
8
|
+
rows: number;
|
|
9
|
+
payout: Record<PlinkoRiskLevel, number[]>;
|
|
10
|
+
}
|
|
11
|
+
declare class Plinko {
|
|
12
|
+
configs(): PlinkConfig[];
|
|
13
|
+
calculateChance(rows: number, position: number): BigNumber;
|
|
14
|
+
calculateChances(rows: number): BigNumber[];
|
|
15
|
+
calculateMultiplier(risk: PlinkoRiskLevel, rows: number, results: number[]): BigNumber;
|
|
16
|
+
getResults(hexStr: string[], rows: number): number[];
|
|
17
|
+
calculatePayoutBN(amount: BigNumber, multiplier: BigNumber): BigNumber;
|
|
18
|
+
}
|
|
19
|
+
declare const _default: Plinko;
|
|
20
|
+
export default _default;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PlinkoRiskLevel = void 0;
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const ncr_1 = require("../utils/ncr");
|
|
9
|
+
const utils_1 = require("../utils");
|
|
10
|
+
var PlinkoRiskLevel;
|
|
11
|
+
(function (PlinkoRiskLevel) {
|
|
12
|
+
PlinkoRiskLevel["LOW_RISK"] = "LOW_RISK";
|
|
13
|
+
PlinkoRiskLevel["MEDIUM_RISK"] = "MEDIUM_RISK";
|
|
14
|
+
PlinkoRiskLevel["HIGH_RISK"] = "HIGH_RISK";
|
|
15
|
+
})(PlinkoRiskLevel = exports.PlinkoRiskLevel || (exports.PlinkoRiskLevel = {}));
|
|
16
|
+
const BYTE_TOTAL = new bignumber_js_1.default(256);
|
|
17
|
+
const plinkoConfigs = [
|
|
18
|
+
{
|
|
19
|
+
rows: 8,
|
|
20
|
+
payout: {
|
|
21
|
+
[PlinkoRiskLevel.LOW_RISK]: [5.6, 2.1, 1.1, 1, 0.5, 1, 1.1, 2.1, 5.6],
|
|
22
|
+
[PlinkoRiskLevel.MEDIUM_RISK]: [13, 3, 1.3, 0.7, 0.4, 0.7, 1.3, 3, 13],
|
|
23
|
+
[PlinkoRiskLevel.HIGH_RISK]: [29, 4, 1.5, 0.3, 0.2, 0.3, 1.5, 4, 29],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
rows: 9,
|
|
28
|
+
payout: {
|
|
29
|
+
[PlinkoRiskLevel.LOW_RISK]: [5.6, 2, 1.6, 1, 0.7, 0.7, 1, 1.6, 2, 5.6],
|
|
30
|
+
[PlinkoRiskLevel.MEDIUM_RISK]: [18, 4, 1.7, 0.9, 0.5, 0.5, 0.9, 1.7, 4, 18],
|
|
31
|
+
[PlinkoRiskLevel.HIGH_RISK]: [43, 7, 2, 0.6, 0.2, 0.2, 0.6, 2, 7, 43],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
rows: 10,
|
|
36
|
+
payout: {
|
|
37
|
+
[PlinkoRiskLevel.LOW_RISK]: [8.9, 3, 1.4, 1.1, 1, 0.5, 1, 1.1, 1.4, 3, 8.9],
|
|
38
|
+
[PlinkoRiskLevel.MEDIUM_RISK]: [22, 5, 2, 1.4, 0.6, 0.4, 0.6, 1.4, 2, 5, 22],
|
|
39
|
+
[PlinkoRiskLevel.HIGH_RISK]: [76, 10, 3, 0.9, 0.3, 0.2, 0.3, 0.9, 3, 10, 76],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
rows: 11,
|
|
44
|
+
payout: {
|
|
45
|
+
[PlinkoRiskLevel.LOW_RISK]: [8.4, 3, 1.9, 1.3, 1, 0.7, 0.7, 1, 1.3, 1.9, 3, 8.4],
|
|
46
|
+
[PlinkoRiskLevel.MEDIUM_RISK]: [24, 6, 3, 1.8, 0.7, 0.5, 0.5, 0.7, 1.8, 3, 6, 24],
|
|
47
|
+
[PlinkoRiskLevel.HIGH_RISK]: [120, 14, 5.2, 1.4, 0.4, 0.2, 0.2, 0.4, 1.4, 5.2, 14, 120],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
rows: 12,
|
|
52
|
+
payout: {
|
|
53
|
+
[PlinkoRiskLevel.LOW_RISK]: [10, 3, 1.6, 1.4, 1.1, 1, 0.5, 1, 1.1, 1.4, 1.6, 3, 10],
|
|
54
|
+
[PlinkoRiskLevel.MEDIUM_RISK]: [33, 11, 4, 2, 1.1, 0.6, 0.3, 0.6, 1.1, 2, 4, 11, 33],
|
|
55
|
+
[PlinkoRiskLevel.HIGH_RISK]: [170, 24, 8.1, 2, 0.7, 0.2, 0.2, 0.2, 0.7, 2, 8.1, 24, 170],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
rows: 13,
|
|
60
|
+
payout: {
|
|
61
|
+
[PlinkoRiskLevel.LOW_RISK]: [8.1, 4, 3, 1.9, 1.2, 0.9, 0.7, 0.7, 0.9, 1.2, 1.9, 3, 4, 8.1],
|
|
62
|
+
[PlinkoRiskLevel.MEDIUM_RISK]: [43, 13, 6, 3, 1.3, 0.7, 0.4, 0.4, 0.7, 1.3, 3, 6, 13, 43],
|
|
63
|
+
[PlinkoRiskLevel.HIGH_RISK]: [260, 37, 11, 4, 1, 0.2, 0.2, 0.2, 0.2, 1, 4, 11, 37, 260],
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
rows: 14,
|
|
68
|
+
payout: {
|
|
69
|
+
[PlinkoRiskLevel.LOW_RISK]: [7.1, 4, 1.9, 1.4, 1.3, 1.1, 1, 0.5, 1, 1.1, 1.3, 1.4, 1.9, 4, 7.1],
|
|
70
|
+
[PlinkoRiskLevel.MEDIUM_RISK]: [58, 15, 7, 4, 1.9, 1, 0.5, 0.2, 0.5, 1, 1.9, 4, 7, 15, 58],
|
|
71
|
+
[PlinkoRiskLevel.HIGH_RISK]: [420, 56, 18, 5, 1.9, 0.3, 0.2, 0.2, 0.2, 0.3, 1.9, 5, 18, 56, 420],
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
rows: 15,
|
|
76
|
+
payout: {
|
|
77
|
+
[PlinkoRiskLevel.LOW_RISK]: [15, 8, 3, 2, 1.5, 1.1, 1, 0.7, 0.7, 1, 1.1, 1.5, 2, 3, 8, 15],
|
|
78
|
+
[PlinkoRiskLevel.MEDIUM_RISK]: [88, 18, 11, 5, 3, 1.3, 0.5, 0.3, 0.3, 0.5, 1.3, 3, 5, 11, 18, 88],
|
|
79
|
+
[PlinkoRiskLevel.HIGH_RISK]: [620, 83, 27, 8, 3, 0.5, 0.2, 0.2, 0.2, 0.2, 0.5, 3, 8, 27, 83, 620],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
rows: 16,
|
|
84
|
+
payout: {
|
|
85
|
+
[PlinkoRiskLevel.LOW_RISK]: [16, 9, 2, 1.4, 1.4, 1.2, 1.1, 1, 0.5, 1, 1.1, 1.2, 1.4, 1.4, 2, 9, 16],
|
|
86
|
+
[PlinkoRiskLevel.MEDIUM_RISK]: [110, 41, 10, 5, 3, 1.5, 1, 0.5, 0.3, 0.5, 1, 1.5, 3, 5, 10, 41, 110],
|
|
87
|
+
[PlinkoRiskLevel.HIGH_RISK]: [1000, 130, 26, 9, 4, 2, 0.2, 0.2, 0.2, 0.2, 0.2, 2, 4, 9, 26, 130, 1000],
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
class Plinko {
|
|
92
|
+
configs() {
|
|
93
|
+
return plinkoConfigs;
|
|
94
|
+
}
|
|
95
|
+
calculateChance(rows, position) {
|
|
96
|
+
const possibleOutcomes = (0, ncr_1.nCr)(rows, position);
|
|
97
|
+
const sampleSpace = new bignumber_js_1.default(2).pow(rows);
|
|
98
|
+
return possibleOutcomes.dividedBy(sampleSpace);
|
|
99
|
+
}
|
|
100
|
+
calculateChances(rows) {
|
|
101
|
+
return [...Array(rows + 1).keys()].map((position) => this.calculateChance(rows, position));
|
|
102
|
+
}
|
|
103
|
+
calculateMultiplier(risk, rows, results) {
|
|
104
|
+
const position = results.reduce((sum, result) => sum + result, 0);
|
|
105
|
+
return new bignumber_js_1.default(this.configs().find((config) => config.rows === rows).payout[risk][position]);
|
|
106
|
+
}
|
|
107
|
+
getResults(hexStr, rows) {
|
|
108
|
+
const results = [];
|
|
109
|
+
hexStr.map(utils_1.hexToBytes).every((gameResultBytes) => {
|
|
110
|
+
for (let i = 0; i < 8; i++) {
|
|
111
|
+
if (results.length >= rows) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
let position = new bignumber_js_1.default(0);
|
|
115
|
+
for (let j = 0; j < 4; j++) {
|
|
116
|
+
const value = gameResultBytes[3 * i + j];
|
|
117
|
+
position = position.plus(new bignumber_js_1.default(value).dividedBy(BYTE_TOTAL.pow(j + 1)));
|
|
118
|
+
}
|
|
119
|
+
position = position.multipliedBy(2).integerValue(bignumber_js_1.default.ROUND_DOWN);
|
|
120
|
+
results.push(position.toNumber());
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
});
|
|
124
|
+
return results;
|
|
125
|
+
}
|
|
126
|
+
calculatePayoutBN(amount, multiplier) {
|
|
127
|
+
return amount.multipliedBy(multiplier);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.default = new Plinko();
|
|
131
|
+
//# sourceMappingURL=plinko.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plinko.js","sourceRoot":"","sources":["../../src/games/plinko.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
7
|
+
const plinko_1 = __importDefault(require("./plinko"));
|
|
8
|
+
const edgeBps = 100;
|
|
9
|
+
const thresholdBps = 20;
|
|
10
|
+
const upperThreshold = edgeBps + thresholdBps;
|
|
11
|
+
const lowerThreshold = edgeBps - thresholdBps;
|
|
12
|
+
describe('Plinko', () => {
|
|
13
|
+
it('ensure we we maintain enough edge', () => {
|
|
14
|
+
plinko_1.default.configs().forEach(({ rows, payout }) => {
|
|
15
|
+
Object.entries(payout).forEach(([riskLevel, riskPayout]) => {
|
|
16
|
+
if (riskPayout.length !== rows + 1) {
|
|
17
|
+
throw new Error(`rows: ${rows} riskLevel: ${riskLevel} has too many or too few payout options`);
|
|
18
|
+
}
|
|
19
|
+
let expectedPayout = new bignumber_js_1.default(0);
|
|
20
|
+
Object.values(riskPayout).forEach((payoutValue, position) => {
|
|
21
|
+
const chance = plinko_1.default.calculateChance(rows, position);
|
|
22
|
+
expectedPayout = expectedPayout.plus(chance.multipliedBy(payoutValue));
|
|
23
|
+
});
|
|
24
|
+
const riskLevelEdge = new bignumber_js_1.default(1).minus(expectedPayout).multipliedBy(10000).toNumber();
|
|
25
|
+
if (riskLevelEdge < lowerThreshold || riskLevelEdge > upperThreshold) {
|
|
26
|
+
throw new Error(`rows: ${rows} riskLevel: ${riskLevel} exceeding edge threshold. Currently at ${riskLevelEdge}% edge`);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=plinko.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plinko.spec.js","sourceRoot":"","sources":["../../src/games/plinko.spec.ts"],"names":[],"mappings":";;;;;AAAA,gEAAqC;AACrC,sDAA8B;AAE9B,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,MAAM,cAAc,GAAG,OAAO,GAAG,YAAY,CAAC;AAC9C,MAAM,cAAc,GAAG,OAAO,GAAG,YAAY,CAAC;AAE9C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,gBAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;YAC5C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE;gBACzD,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,EAAE;oBAClC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,eAAe,SAAS,yCAAyC,CAAC,CAAC;iBACjG;gBAED,IAAI,cAAc,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC;gBACtC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE;oBAC1D,MAAM,MAAM,GAAG,gBAAM,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAEtD,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;gBACzE,CAAC,CAAC,CAAC;gBAEH,MAAM,aAAa,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,KAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAE7F,IAAI,aAAa,GAAG,cAAc,IAAI,aAAa,GAAG,cAAc,EAAE;oBACpE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,eAAe,SAAS,2CAA2C,aAAa,QAAQ,CAAC,CAAC;iBACxH;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.plinko = exports.mines = exports.Chain = exports.dice = void 0;
|
|
21
|
+
var dice_1 = require("./games/dice");
|
|
22
|
+
Object.defineProperty(exports, "dice", { enumerable: true, get: function () { return __importDefault(dice_1).default; } });
|
|
23
|
+
__exportStar(require("./regex"), exports);
|
|
24
|
+
var chain_1 = require("./enums/chain");
|
|
25
|
+
Object.defineProperty(exports, "Chain", { enumerable: true, get: function () { return chain_1.Chain; } });
|
|
26
|
+
__exportStar(require("./utils"), exports);
|
|
27
|
+
var mines_1 = require("./games/mines");
|
|
28
|
+
Object.defineProperty(exports, "mines", { enumerable: true, get: function () { return __importDefault(mines_1).default; } });
|
|
29
|
+
var plinko_1 = require("./games/plinko");
|
|
30
|
+
Object.defineProperty(exports, "plinko", { enumerable: true, get: function () { return __importDefault(plinko_1).default; } });
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,qCAA+C;AAAtC,6GAAA,OAAO,OAAQ;AACxB,0CAAwB;AACxB,uCAAsC;AAA7B,8FAAA,KAAK,OAAA;AACd,0CAAwB;AACxB,uCAAiD;AAAxC,+GAAA,OAAO,OAAS;AACzB,yCAAmD;AAA1C,iHAAA,OAAO,OAAU"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PROMOTION_CODE_REGEX = exports.USERNAME_REGEX = exports.PWD_REGEX = void 0;
|
|
4
|
+
exports.PWD_REGEX = /^(?=.*[0-9])(?=.*[a-zA-Z])(?=\S+$).{8,24}$/i;
|
|
5
|
+
exports.USERNAME_REGEX = /^[a-zA-Z\d]{3,16}$/i;
|
|
6
|
+
exports.PROMOTION_CODE_REGEX = /^[A-Z_\-\d]{3,25}$/;
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/regex/index.ts"],"names":[],"mappings":";;;AACa,QAAA,SAAS,GAAG,6CAA6C,CAAC;AAE1D,QAAA,cAAc,GAAG,qBAAqB,CAAC;AAEvC,QAAA,oBAAoB,GAAG,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|