shufflecom-calculations 6.12.0 → 6.13.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.
- package/lib/games/stonks/constants.d.ts +1 -5
- package/lib/games/stonks/constants.js +2 -6
- package/lib/games/stonks/constants.js.map +1 -1
- package/lib/games/stonks/stonks-rules.d.ts +6 -7
- package/lib/games/stonks/stonks-rules.js +20 -24
- package/lib/games/stonks/stonks-rules.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/games/stonks/constants.ts +1 -9
- package/src/games/stonks/stonks-rules.spec.ts +58 -64
- package/src/games/stonks/stonks-rules.ts +28 -35
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import BigNumber from 'bignumber.js';
|
|
2
2
|
export declare const STONKS_MIN_TAKE_PROFIT_MULTIPLIER: BigNumber;
|
|
3
|
-
export declare const STONKS_TP_MIN_PROXIMITY_TO_ENTRY: BigNumber;
|
|
4
|
-
export declare const STONKS_TP_MIN_PROXIMITY_TO_BUST: BigNumber;
|
|
5
3
|
export declare const STONKS_INTERNAL_PRICE_DECIMAL_PLACES = 10;
|
|
6
4
|
export declare const STONKS_MIN_LEVERAGE: BigNumber;
|
|
7
5
|
export declare const STONKS_MAX_LEVERAGE: BigNumber;
|
|
8
|
-
export declare const STONKS_MAX_ACTIVE_BETS_PER_ACCOUNT = 20;
|
|
9
6
|
export declare const STONKS_START_PRICE: BigNumber;
|
|
10
7
|
export declare const STONKS_VOLATILITY = 0.001;
|
|
11
8
|
export declare const STONKS_PRICE_DECIMAL_PLACES = 10;
|
|
@@ -17,5 +14,4 @@ export declare const STONKS_ROUND_TICK_COUNT: number;
|
|
|
17
14
|
export declare const STONKS_MAX_TICK_HISTORY_MS: number;
|
|
18
15
|
export declare const STONKS_CHECKPOINT_INTERVAL_TICKS = 500;
|
|
19
16
|
export declare const STONKS_PRICE_BAR_INTERVAL_TICKS: number;
|
|
20
|
-
export declare const
|
|
21
|
-
export declare const STONKS_CONTRACT_SCALE: BigNumber;
|
|
17
|
+
export declare const STONKS_PAYOUT_FEE_RATE: BigNumber;
|
|
@@ -3,15 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.STONKS_PAYOUT_FEE_RATE = exports.STONKS_PRICE_BAR_INTERVAL_TICKS = exports.STONKS_CHECKPOINT_INTERVAL_TICKS = exports.STONKS_MAX_TICK_HISTORY_MS = exports.STONKS_ROUND_TICK_COUNT = exports.STONKS_ROUND_DURATION_MS = exports.STONKS_MAX_STALE_CLIENT_TICKS = exports.STONKS_SET_TICK_RETRY_DELAY_MS = exports.STONKS_TICK_DURATION_MS = exports.STONKS_PRICE_DECIMAL_PLACES = exports.STONKS_VOLATILITY = exports.STONKS_START_PRICE = exports.STONKS_MAX_LEVERAGE = exports.STONKS_MIN_LEVERAGE = exports.STONKS_INTERNAL_PRICE_DECIMAL_PLACES = exports.STONKS_MIN_TAKE_PROFIT_MULTIPLIER = void 0;
|
|
7
7
|
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
8
|
exports.STONKS_MIN_TAKE_PROFIT_MULTIPLIER = (0, bignumber_js_1.default)(1.05);
|
|
9
|
-
exports.STONKS_TP_MIN_PROXIMITY_TO_ENTRY = (0, bignumber_js_1.default)(0.001);
|
|
10
|
-
exports.STONKS_TP_MIN_PROXIMITY_TO_BUST = (0, bignumber_js_1.default)(0.001);
|
|
11
9
|
exports.STONKS_INTERNAL_PRICE_DECIMAL_PLACES = 10;
|
|
12
10
|
exports.STONKS_MIN_LEVERAGE = (0, bignumber_js_1.default)(1);
|
|
13
11
|
exports.STONKS_MAX_LEVERAGE = (0, bignumber_js_1.default)(1000);
|
|
14
|
-
exports.STONKS_MAX_ACTIVE_BETS_PER_ACCOUNT = 20;
|
|
15
12
|
exports.STONKS_START_PRICE = (0, bignumber_js_1.default)(1000);
|
|
16
13
|
exports.STONKS_VOLATILITY = 0.001;
|
|
17
14
|
exports.STONKS_PRICE_DECIMAL_PLACES = 10;
|
|
@@ -23,6 +20,5 @@ exports.STONKS_ROUND_TICK_COUNT = exports.STONKS_ROUND_DURATION_MS / exports.STO
|
|
|
23
20
|
exports.STONKS_MAX_TICK_HISTORY_MS = 48 * 60 * 60 * 1000;
|
|
24
21
|
exports.STONKS_CHECKPOINT_INTERVAL_TICKS = 500;
|
|
25
22
|
exports.STONKS_PRICE_BAR_INTERVAL_TICKS = 5000 / exports.STONKS_TICK_DURATION_MS;
|
|
26
|
-
exports.
|
|
27
|
-
exports.STONKS_CONTRACT_SCALE = (0, bignumber_js_1.default)(10).pow(6);
|
|
23
|
+
exports.STONKS_PAYOUT_FEE_RATE = (0, bignumber_js_1.default)(0.02);
|
|
28
24
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/games/stonks/constants.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqC;AAExB,QAAA,iCAAiC,GAAG,IAAA,sBAAS,EAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/games/stonks/constants.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqC;AAExB,QAAA,iCAAiC,GAAG,IAAA,sBAAS,EAAC,IAAI,CAAC,CAAC;AAIpD,QAAA,oCAAoC,GAAG,EAAE,CAAC;AAG1C,QAAA,mBAAmB,GAAG,IAAA,sBAAS,EAAC,CAAC,CAAC,CAAC;AACnC,QAAA,mBAAmB,GAAG,IAAA,sBAAS,EAAC,IAAI,CAAC,CAAC;AAEtC,QAAA,kBAAkB,GAAG,IAAA,sBAAS,EAAC,IAAI,CAAC,CAAC;AACrC,QAAA,iBAAiB,GAAG,KAAK,CAAC;AAE1B,QAAA,2BAA2B,GAAG,EAAE,CAAC;AAEjC,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAE9B,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAErC,QAAA,6BAA6B,GAAG,EAAE,CAAC;AAEnC,QAAA,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAK,CAAC;AAChD,QAAA,uBAAuB,GAAG,gCAAwB,GAAG,+BAAuB,CAAC;AAI7E,QAAA,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAK,CAAC;AAGlD,QAAA,gCAAgC,GAAG,GAAG,CAAC;AAEvC,QAAA,+BAA+B,GAAG,IAAK,GAAG,+BAAuB,CAAC;AAElE,QAAA,sBAAsB,GAAG,IAAA,sBAAS,EAAC,IAAI,CAAC,CAAC"}
|
|
@@ -24,7 +24,6 @@ export interface StonksTerminalBetState extends StonksOpenBetState {
|
|
|
24
24
|
readonly terminalTick: number;
|
|
25
25
|
readonly terminalPrice: BigNumber;
|
|
26
26
|
readonly multiplier: BigNumber;
|
|
27
|
-
readonly grossPayout: BigNumber;
|
|
28
27
|
readonly netPayout: BigNumber;
|
|
29
28
|
}
|
|
30
29
|
export type StonksSettlementReason = {
|
|
@@ -51,8 +50,6 @@ export declare class StonksRules {
|
|
|
51
50
|
static position(amount: BigNumber, leverage: BigNumber, direction: StonksDirection): BigNumber;
|
|
52
51
|
static impliedPriceForMultiplier(bet: Pick<StonksOpenBetState, 'leverage' | 'entryPrice' | 'direction'>, targetMultiplier: BigNumber): BigNumber;
|
|
53
52
|
static isValidTakeProfitMultiplier(takeProfitMultiplier: BigNumber): boolean;
|
|
54
|
-
static isTakeProfitFarEnoughFromEntry(entryPrice: BigNumber, takeProfitImpliedPrice: BigNumber): boolean;
|
|
55
|
-
static isTakeProfitFarEnoughFromBust(entryPrice: BigNumber, bustPrice: BigNumber, takeProfitImpliedPrice: BigNumber): boolean;
|
|
56
53
|
static isBustPriceDistinctFromEntry(entryPrice: BigNumber, bustPrice: BigNumber): boolean;
|
|
57
54
|
static isFinalTick(activeTick: number): boolean;
|
|
58
55
|
static isClientTickWithinMaxLag(activeTick: number, lastSeenTick: number): boolean;
|
|
@@ -61,12 +58,14 @@ export declare class StonksRules {
|
|
|
61
58
|
static tickAtOrAfter(startedAtMs: number, atMs: number): number;
|
|
62
59
|
static tickBefore(startedAtMs: number, atMs: number): number;
|
|
63
60
|
static tickStartTime(startedAtMs: number, tick: number): Date;
|
|
64
|
-
static
|
|
61
|
+
static hasReachedTakeProfit(bet: Pick<StonksOpenBetState, 'leverage' | 'entryPrice' | 'direction'>, price: BigNumber, takeProfitMultiplier: BigNumber): boolean;
|
|
65
62
|
static hasReachedBust(direction: StonksDirection, price: BigNumber, bustPrice: BigNumber): boolean;
|
|
66
63
|
static evaluateTriggers(bet: StonksOpenBetState, tickPrice: BigNumber, liveMaxPayoutCap: BigNumber): StonksTriggerOutcome;
|
|
67
|
-
static multiplierAtPrice(bet: StonksOpenBetState, price: BigNumber): BigNumber;
|
|
64
|
+
static multiplierAtPrice(bet: Pick<StonksOpenBetState, 'leverage' | 'entryPrice' | 'direction'>, price: BigNumber): BigNumber;
|
|
68
65
|
static grossPayoutAtPrice(bet: StonksOpenBetState, price: BigNumber): BigNumber;
|
|
69
|
-
static
|
|
66
|
+
static netPayoutAtPrice(bet: StonksOpenBetState, price: BigNumber): BigNumber;
|
|
67
|
+
static netPayoutForReason(bet: StonksOpenBetState, reason: StonksSettlementReason, price: BigNumber): BigNumber;
|
|
70
68
|
static multiplierForReason(bet: StonksOpenBetState, reason: StonksSettlementReason, price: BigNumber): BigNumber;
|
|
71
|
-
static
|
|
69
|
+
static netOfFee(gross: BigNumber): BigNumber;
|
|
70
|
+
static grossOfFee(net: BigNumber): BigNumber;
|
|
72
71
|
}
|
|
@@ -31,18 +31,12 @@ class StonksRules {
|
|
|
31
31
|
}
|
|
32
32
|
static impliedPriceForMultiplier(bet, targetMultiplier) {
|
|
33
33
|
const directionSign = bet.direction === StonksDirection.UP ? 1 : -1;
|
|
34
|
-
const multiplierDelta = targetMultiplier.minus(1);
|
|
34
|
+
const multiplierDelta = StonksRules.grossOfFee(targetMultiplier).minus(1);
|
|
35
35
|
const priceChange = (0, bignumber_js_1.default)(directionSign).multipliedBy(multiplierDelta).dividedBy(bet.leverage);
|
|
36
36
|
return bet.entryPrice.multipliedBy((0, bignumber_js_1.default)(1).plus(priceChange));
|
|
37
37
|
}
|
|
38
38
|
static isValidTakeProfitMultiplier(takeProfitMultiplier) {
|
|
39
|
-
return takeProfitMultiplier.
|
|
40
|
-
}
|
|
41
|
-
static isTakeProfitFarEnoughFromEntry(entryPrice, takeProfitImpliedPrice) {
|
|
42
|
-
return takeProfitImpliedPrice.minus(entryPrice).abs().dividedBy(entryPrice).isGreaterThanOrEqualTo(constants_1.STONKS_TP_MIN_PROXIMITY_TO_ENTRY);
|
|
43
|
-
}
|
|
44
|
-
static isTakeProfitFarEnoughFromBust(entryPrice, bustPrice, takeProfitImpliedPrice) {
|
|
45
|
-
return takeProfitImpliedPrice.minus(bustPrice).abs().dividedBy(entryPrice).isGreaterThanOrEqualTo(constants_1.STONKS_TP_MIN_PROXIMITY_TO_BUST);
|
|
39
|
+
return takeProfitMultiplier.isGreaterThanOrEqualTo(constants_1.STONKS_MIN_TAKE_PROFIT_MULTIPLIER);
|
|
46
40
|
}
|
|
47
41
|
static isBustPriceDistinctFromEntry(entryPrice, bustPrice) {
|
|
48
42
|
return !entryPrice
|
|
@@ -70,8 +64,8 @@ class StonksRules {
|
|
|
70
64
|
static tickStartTime(startedAtMs, tick) {
|
|
71
65
|
return new Date(startedAtMs + tick * constants_1.STONKS_TICK_DURATION_MS);
|
|
72
66
|
}
|
|
73
|
-
static
|
|
74
|
-
return
|
|
67
|
+
static hasReachedTakeProfit(bet, price, takeProfitMultiplier) {
|
|
68
|
+
return StonksRules.multiplierAtPrice(bet, price).isGreaterThanOrEqualTo(takeProfitMultiplier);
|
|
75
69
|
}
|
|
76
70
|
static hasReachedBust(direction, price, bustPrice) {
|
|
77
71
|
return direction === StonksDirection.UP ? price.isLessThanOrEqualTo(bustPrice) : price.isGreaterThanOrEqualTo(bustPrice);
|
|
@@ -80,13 +74,13 @@ class StonksRules {
|
|
|
80
74
|
const hitBust = StonksRules.hasReachedBust(bet.direction, tickPrice, bet.bustPrice);
|
|
81
75
|
if (bet.takeProfitMultiplier != null) {
|
|
82
76
|
const takeProfitMultiplier = bet.takeProfitMultiplier;
|
|
83
|
-
const hitTakeProfit = StonksRules.
|
|
77
|
+
const hitTakeProfit = StonksRules.hasReachedTakeProfit(bet, tickPrice, takeProfitMultiplier);
|
|
84
78
|
if (hitTakeProfit && hitBust) {
|
|
85
79
|
throw new Error('StonksRules.evaluateTriggers: take profit and liquidation both fired');
|
|
86
80
|
}
|
|
87
81
|
if (hitTakeProfit) {
|
|
88
82
|
const reason = { kind: StonksBetTerminalReason.TAKE_PROFIT, takeProfitMultiplier };
|
|
89
|
-
if (StonksRules.
|
|
83
|
+
if (StonksRules.netPayoutForReason(bet, reason, tickPrice).isGreaterThan(liveMaxPayoutCap)) {
|
|
90
84
|
return { fired: true, reason: { kind: StonksBetTerminalReason.MAX_PAYOUT, appliedCap: liveMaxPayoutCap } };
|
|
91
85
|
}
|
|
92
86
|
return { fired: true, reason };
|
|
@@ -95,7 +89,7 @@ class StonksRules {
|
|
|
95
89
|
if (hitBust) {
|
|
96
90
|
return { fired: true, reason: { kind: StonksBetTerminalReason.LIQUIDATION } };
|
|
97
91
|
}
|
|
98
|
-
if (StonksRules.
|
|
92
|
+
if (StonksRules.netPayoutAtPrice(bet, tickPrice).isGreaterThanOrEqualTo(liveMaxPayoutCap)) {
|
|
99
93
|
return { fired: true, reason: { kind: StonksBetTerminalReason.MAX_PAYOUT, appliedCap: liveMaxPayoutCap } };
|
|
100
94
|
}
|
|
101
95
|
return { fired: false };
|
|
@@ -104,15 +98,18 @@ class StonksRules {
|
|
|
104
98
|
const directionSign = bet.direction === StonksDirection.UP ? 1 : -1;
|
|
105
99
|
const percentagePriceChange = price.minus(bet.entryPrice).dividedBy(bet.entryPrice);
|
|
106
100
|
const leveragedPriceChange = (0, bignumber_js_1.default)(directionSign).multipliedBy(bet.leverage).multipliedBy(percentagePriceChange);
|
|
107
|
-
const
|
|
108
|
-
return bignumber_js_1.default.maximum(0,
|
|
101
|
+
const grossMultiplier = (0, bignumber_js_1.default)(1).plus(leveragedPriceChange);
|
|
102
|
+
return StonksRules.netOfFee(bignumber_js_1.default.maximum(0, grossMultiplier));
|
|
109
103
|
}
|
|
110
104
|
static grossPayoutAtPrice(bet, price) {
|
|
111
105
|
const position = StonksRules.position(bet.amount, bet.leverage, bet.direction);
|
|
112
106
|
const pnl = position.multipliedBy(price.minus(bet.entryPrice)).dividedBy(bet.entryPrice);
|
|
113
107
|
return bignumber_js_1.default.maximum(0, bet.amount.plus(pnl));
|
|
114
108
|
}
|
|
115
|
-
static
|
|
109
|
+
static netPayoutAtPrice(bet, price) {
|
|
110
|
+
return StonksRules.netOfFee(StonksRules.grossPayoutAtPrice(bet, price));
|
|
111
|
+
}
|
|
112
|
+
static netPayoutForReason(bet, reason, price) {
|
|
116
113
|
switch (reason.kind) {
|
|
117
114
|
case StonksBetTerminalReason.TAKE_PROFIT:
|
|
118
115
|
return (0, calculate_payout_1.calculatePayoutBN)(bet.amount, reason.takeProfitMultiplier);
|
|
@@ -122,10 +119,10 @@ class StonksRules {
|
|
|
122
119
|
return reason.appliedCap;
|
|
123
120
|
case StonksBetTerminalReason.CASHOUT:
|
|
124
121
|
case StonksBetTerminalReason.ROUND_END:
|
|
125
|
-
return StonksRules.
|
|
122
|
+
return StonksRules.netPayoutAtPrice(bet, price);
|
|
126
123
|
default:
|
|
127
124
|
reason;
|
|
128
|
-
throw new Error(`StonksRules.
|
|
125
|
+
throw new Error(`StonksRules.netPayoutForReason: unhandled reason`);
|
|
129
126
|
}
|
|
130
127
|
}
|
|
131
128
|
static multiplierForReason(bet, reason, price) {
|
|
@@ -134,12 +131,11 @@ class StonksRules {
|
|
|
134
131
|
}
|
|
135
132
|
return StonksRules.multiplierAtPrice(bet, price);
|
|
136
133
|
}
|
|
137
|
-
static
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
return amount.plus(profit.multipliedBy((0, bignumber_js_1.default)(1).minus(constants_1.STONKS_PROFIT_FEE_RATE)));
|
|
134
|
+
static netOfFee(gross) {
|
|
135
|
+
return gross.multipliedBy((0, bignumber_js_1.default)(1).minus(constants_1.STONKS_PAYOUT_FEE_RATE));
|
|
136
|
+
}
|
|
137
|
+
static grossOfFee(net) {
|
|
138
|
+
return net.dividedBy((0, bignumber_js_1.default)(1).minus(constants_1.STONKS_PAYOUT_FEE_RATE));
|
|
143
139
|
}
|
|
144
140
|
}
|
|
145
141
|
exports.StonksRules = StonksRules;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stonks-rules.js","sourceRoot":"","sources":["../../../src/games/stonks/stonks-rules.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAqC;AACrC,mEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"stonks-rules.js","sourceRoot":"","sources":["../../../src/games/stonks/stonks-rules.ts"],"names":[],"mappings":"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"}
|