shufflecom-calculations 6.11.0 → 6.12.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.
Files changed (45) hide show
  1. package/lib/games/stonks/constants.d.ts +21 -0
  2. package/lib/games/stonks/constants.js +28 -0
  3. package/lib/games/stonks/constants.js.map +1 -0
  4. package/lib/games/stonks/rng/index.d.ts +2 -0
  5. package/lib/games/stonks/rng/index.js +8 -0
  6. package/lib/games/stonks/rng/index.js.map +1 -0
  7. package/lib/games/stonks/rng/shuffle-stonks-rng.d.ts +2 -0
  8. package/lib/games/{rollercoaster/rng/shuffle-rollercoaster-rng.js → stonks/rng/shuffle-stonks-rng.js} +5 -5
  9. package/lib/games/stonks/rng/shuffle-stonks-rng.js.map +1 -0
  10. package/lib/games/stonks/rng/stonks-price-calculator.d.ts +21 -0
  11. package/lib/games/{rollercoaster/rng/rollercoaster-price-calculator.js → stonks/rng/stonks-price-calculator.js} +12 -12
  12. package/lib/games/stonks/rng/stonks-price-calculator.js.map +1 -0
  13. package/lib/games/{rollercoaster/rollercoaster-rules.d.ts → stonks/stonks-rules.d.ts} +25 -25
  14. package/lib/games/stonks/stonks-rules.js +146 -0
  15. package/lib/games/stonks/stonks-rules.js.map +1 -0
  16. package/lib/index.d.ts +3 -3
  17. package/lib/index.js +3 -3
  18. package/lib/index.js.map +1 -1
  19. package/lib/tsconfig.tsbuildinfo +1 -1
  20. package/package.json +2 -2
  21. package/src/games/stonks/constants.ts +44 -0
  22. package/src/games/stonks/rng/index.ts +7 -0
  23. package/src/games/{rollercoaster/rng/shuffle-rollercoaster-rng.spec.ts → stonks/rng/shuffle-stonks-rng.spec.ts} +5 -5
  24. package/src/games/{rollercoaster/rng/shuffle-rollercoaster-rng.ts → stonks/rng/shuffle-stonks-rng.ts} +6 -6
  25. package/src/games/{rollercoaster/rng/rollercoaster-price-calculator.spec.ts → stonks/rng/stonks-price-calculator.spec.ts} +12 -12
  26. package/src/games/{rollercoaster/rng/rollercoaster-price-calculator.ts → stonks/rng/stonks-price-calculator.ts} +19 -19
  27. package/src/games/stonks/stonks-rules.spec.ts +348 -0
  28. package/src/games/stonks/stonks-rules.ts +217 -0
  29. package/src/index.ts +3 -3
  30. package/lib/games/rollercoaster/constants.d.ts +0 -21
  31. package/lib/games/rollercoaster/constants.js +0 -28
  32. package/lib/games/rollercoaster/constants.js.map +0 -1
  33. package/lib/games/rollercoaster/rng/index.d.ts +0 -2
  34. package/lib/games/rollercoaster/rng/index.js +0 -8
  35. package/lib/games/rollercoaster/rng/index.js.map +0 -1
  36. package/lib/games/rollercoaster/rng/rollercoaster-price-calculator.d.ts +0 -21
  37. package/lib/games/rollercoaster/rng/rollercoaster-price-calculator.js.map +0 -1
  38. package/lib/games/rollercoaster/rng/shuffle-rollercoaster-rng.d.ts +0 -2
  39. package/lib/games/rollercoaster/rng/shuffle-rollercoaster-rng.js.map +0 -1
  40. package/lib/games/rollercoaster/rollercoaster-rules.js +0 -146
  41. package/lib/games/rollercoaster/rollercoaster-rules.js.map +0 -1
  42. package/src/games/rollercoaster/constants.ts +0 -44
  43. package/src/games/rollercoaster/rng/index.ts +0 -7
  44. package/src/games/rollercoaster/rollercoaster-rules.spec.ts +0 -348
  45. package/src/games/rollercoaster/rollercoaster-rules.ts +0 -217
@@ -0,0 +1,21 @@
1
+ import BigNumber from 'bignumber.js';
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
+ export declare const STONKS_INTERNAL_PRICE_DECIMAL_PLACES = 10;
6
+ export declare const STONKS_MIN_LEVERAGE: BigNumber;
7
+ export declare const STONKS_MAX_LEVERAGE: BigNumber;
8
+ export declare const STONKS_MAX_ACTIVE_BETS_PER_ACCOUNT = 20;
9
+ export declare const STONKS_START_PRICE: BigNumber;
10
+ export declare const STONKS_VOLATILITY = 0.001;
11
+ export declare const STONKS_PRICE_DECIMAL_PLACES = 10;
12
+ export declare const STONKS_TICK_DURATION_MS = 500;
13
+ export declare const STONKS_SET_TICK_RETRY_DELAY_MS = 400;
14
+ export declare const STONKS_MAX_STALE_CLIENT_TICKS = 10;
15
+ export declare const STONKS_ROUND_DURATION_MS: number;
16
+ export declare const STONKS_ROUND_TICK_COUNT: number;
17
+ export declare const STONKS_MAX_TICK_HISTORY_MS: number;
18
+ export declare const STONKS_CHECKPOINT_INTERVAL_TICKS = 500;
19
+ export declare const STONKS_PRICE_BAR_INTERVAL_TICKS: number;
20
+ export declare const STONKS_PROFIT_FEE_RATE: BigNumber;
21
+ export declare const STONKS_CONTRACT_SCALE: BigNumber;
@@ -0,0 +1,28 @@
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.STONKS_CONTRACT_SCALE = exports.STONKS_PROFIT_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_ACTIVE_BETS_PER_ACCOUNT = exports.STONKS_MAX_LEVERAGE = exports.STONKS_MIN_LEVERAGE = exports.STONKS_INTERNAL_PRICE_DECIMAL_PLACES = exports.STONKS_TP_MIN_PROXIMITY_TO_BUST = exports.STONKS_TP_MIN_PROXIMITY_TO_ENTRY = exports.STONKS_MIN_TAKE_PROFIT_MULTIPLIER = void 0;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
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
+ exports.STONKS_INTERNAL_PRICE_DECIMAL_PLACES = 10;
12
+ exports.STONKS_MIN_LEVERAGE = (0, bignumber_js_1.default)(1);
13
+ exports.STONKS_MAX_LEVERAGE = (0, bignumber_js_1.default)(1000);
14
+ exports.STONKS_MAX_ACTIVE_BETS_PER_ACCOUNT = 20;
15
+ exports.STONKS_START_PRICE = (0, bignumber_js_1.default)(1000);
16
+ exports.STONKS_VOLATILITY = 0.001;
17
+ exports.STONKS_PRICE_DECIMAL_PLACES = 10;
18
+ exports.STONKS_TICK_DURATION_MS = 500;
19
+ exports.STONKS_SET_TICK_RETRY_DELAY_MS = 400;
20
+ exports.STONKS_MAX_STALE_CLIENT_TICKS = 10;
21
+ exports.STONKS_ROUND_DURATION_MS = 24 * 60 * 60 * 1000;
22
+ exports.STONKS_ROUND_TICK_COUNT = exports.STONKS_ROUND_DURATION_MS / exports.STONKS_TICK_DURATION_MS;
23
+ exports.STONKS_MAX_TICK_HISTORY_MS = 48 * 60 * 60 * 1000;
24
+ exports.STONKS_CHECKPOINT_INTERVAL_TICKS = 500;
25
+ exports.STONKS_PRICE_BAR_INTERVAL_TICKS = 5000 / exports.STONKS_TICK_DURATION_MS;
26
+ exports.STONKS_PROFIT_FEE_RATE = (0, bignumber_js_1.default)(0.05);
27
+ exports.STONKS_CONTRACT_SCALE = (0, bignumber_js_1.default)(10).pow(6);
28
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +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;AAEpD,QAAA,gCAAgC,GAAG,IAAA,sBAAS,EAAC,KAAK,CAAC,CAAC;AACpD,QAAA,+BAA+B,GAAG,IAAA,sBAAS,EAAC,KAAK,CAAC,CAAC;AAInD,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,kCAAkC,GAAG,EAAE,CAAC;AAExC,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;AAGzC,QAAA,qBAAqB,GAAG,IAAA,sBAAS,EAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { StonksPriceCalculator, StonksRandomState, StonksRngCheckpoint, StonksRngFn, } from './stonks-price-calculator';
2
+ export { shuffleStonksRng } from './shuffle-stonks-rng';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shuffleStonksRng = exports.StonksPriceCalculator = void 0;
4
+ var stonks_price_calculator_1 = require("./stonks-price-calculator");
5
+ Object.defineProperty(exports, "StonksPriceCalculator", { enumerable: true, get: function () { return stonks_price_calculator_1.StonksPriceCalculator; } });
6
+ var shuffle_stonks_rng_1 = require("./shuffle-stonks-rng");
7
+ Object.defineProperty(exports, "shuffleStonksRng", { enumerable: true, get: function () { return shuffle_stonks_rng_1.shuffleStonksRng; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/games/stonks/rng/index.ts"],"names":[],"mappings":";;;AAAA,qEAKmC;AAJjC,gIAAA,qBAAqB,OAAA;AAKvB,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,2 @@
1
+ import { StonksRngFn } from './stonks-price-calculator';
2
+ export declare function shuffleStonksRng(serverSeed: string, bitcoinBlockHash: string): StonksRngFn;
@@ -3,10 +3,10 @@ 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.shuffleRollercoasterRng = void 0;
6
+ exports.shuffleStonksRng = void 0;
7
7
  const crypto_1 = require("crypto");
8
8
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
- function shuffleRollercoasterRng(serverSeed, bitcoinBlockHash) {
9
+ function shuffleStonksRng(serverSeed, bitcoinBlockHash) {
10
10
  function initialDigest() {
11
11
  return (0, crypto_1.createHmac)('sha256', serverSeed).update(bitcoinBlockHash).digest();
12
12
  }
@@ -16,7 +16,7 @@ function shuffleRollercoasterRng(serverSeed, bitcoinBlockHash) {
16
16
  function digestFromCheckpoint(checkpoint) {
17
17
  const digest = Buffer.from(checkpoint.digest, 'hex');
18
18
  if (digest.length !== 32) {
19
- throw new Error('shuffleRollercoasterRng: invalid checkpoint');
19
+ throw new Error('shuffleStonksRng: invalid checkpoint');
20
20
  }
21
21
  return digest;
22
22
  }
@@ -34,5 +34,5 @@ function shuffleRollercoasterRng(serverSeed, bitcoinBlockHash) {
34
34
  return states;
35
35
  };
36
36
  }
37
- exports.shuffleRollercoasterRng = shuffleRollercoasterRng;
38
- //# sourceMappingURL=shuffle-rollercoaster-rng.js.map
37
+ exports.shuffleStonksRng = shuffleStonksRng;
38
+ //# sourceMappingURL=shuffle-stonks-rng.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shuffle-stonks-rng.js","sourceRoot":"","sources":["../../../../src/games/stonks/rng/shuffle-stonks-rng.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAoC;AACpC,gEAAqC;AAGrC,SAAgB,gBAAgB,CAAC,UAAkB,EAAE,gBAAwB;IAC3E,SAAS,aAAa;QACpB,OAAO,IAAA,mBAAU,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5E,CAAC;IAED,SAAS,UAAU,CAAC,MAAc;QAChC,OAAO,IAAA,mBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC;IACxE,CAAC;IAED,SAAS,oBAAoB,CAAC,UAA+B;QAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,cAAsB,EAAE,YAAoB,EAAE,UAAgC,EAAuB,EAAE;QAC7G,IAAI,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC7E,MAAM,MAAM,GAAwB,EAAE,CAAC;QAEvC,KAAK,IAAI,IAAI,GAAG,cAAc,EAAE,IAAI,IAAI,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,YAAY,EAAE,IAAA,sBAAS,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC/C,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;aAC/B,CAAC,CAAC;YACH,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAhCD,4CAgCC"}
@@ -0,0 +1,21 @@
1
+ import BigNumber from 'bignumber.js';
2
+ export type StonksRngCheckpoint = {
3
+ tick: number;
4
+ price: BigNumber;
5
+ digest: string;
6
+ };
7
+ export type StonksRandomState = {
8
+ tick: number;
9
+ randomNumber: BigNumber;
10
+ digest: string;
11
+ };
12
+ export type StonksRngFn = (startTickIndex: number, endTickIndex: number, checkpoint?: StonksRngCheckpoint) => StonksRandomState[];
13
+ export declare class StonksPriceCalculator {
14
+ private readonly getRngInRange;
15
+ constructor(getRngInRange: StonksRngFn);
16
+ getPriceAtTick(tickIndex: number, checkpoint?: StonksRngCheckpoint): BigNumber;
17
+ getPricesInTickRange(startTickIndex: number, endTickIndex: number, checkpoint?: StonksRngCheckpoint): StonksRngCheckpoint[];
18
+ private calculateNextPrice;
19
+ private validateRandomNumber;
20
+ private validateRange;
21
+ }
@@ -3,13 +3,13 @@ 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.RollercoasterPriceCalculator = void 0;
6
+ exports.StonksPriceCalculator = void 0;
7
7
  const stats_base_dists_normal_quantile_1 = __importDefault(require("@stdlib/stats-base-dists-normal-quantile"));
8
8
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
9
  const constants_1 = require("../constants");
10
10
  const UINT32_RANGE = new bignumber_js_1.default(2).pow(32);
11
11
  const MAX_UINT32 = UINT32_RANGE.minus(1);
12
- class RollercoasterPriceCalculator {
12
+ class StonksPriceCalculator {
13
13
  constructor(getRngInRange) {
14
14
  this.getRngInRange = getRngInRange;
15
15
  }
@@ -21,19 +21,19 @@ class RollercoasterPriceCalculator {
21
21
  this.validateRange(startTickIndex, endTickIndex);
22
22
  const calculationStartTick = (_a = checkpoint === null || checkpoint === void 0 ? void 0 : checkpoint.tick) !== null && _a !== void 0 ? _a : 0;
23
23
  if (!Number.isInteger(calculationStartTick) || calculationStartTick < 0 || calculationStartTick > startTickIndex) {
24
- throw new Error(`RollercoasterPriceCalculator: checkpoint at tick ${calculationStartTick} is after requested range ${startTickIndex}..${endTickIndex}`);
24
+ throw new Error(`StonksPriceCalculator: checkpoint at tick ${calculationStartTick} is after requested range ${startTickIndex}..${endTickIndex}`);
25
25
  }
26
- let price = (_b = checkpoint === null || checkpoint === void 0 ? void 0 : checkpoint.price) !== null && _b !== void 0 ? _b : constants_1.ROLLERCOASTER_START_PRICE;
26
+ let price = (_b = checkpoint === null || checkpoint === void 0 ? void 0 : checkpoint.price) !== null && _b !== void 0 ? _b : constants_1.STONKS_START_PRICE;
27
27
  const ticks = [];
28
28
  const randomStates = this.getRngInRange(calculationStartTick, endTickIndex, checkpoint);
29
29
  const expectedRandomStateCount = endTickIndex - calculationStartTick + 1;
30
30
  if (randomStates.length !== expectedRandomStateCount) {
31
- throw new Error(`RollercoasterPriceCalculator: expected ${expectedRandomStateCount} random states for ${calculationStartTick}..${endTickIndex}, got ${randomStates.length}`);
31
+ throw new Error(`StonksPriceCalculator: expected ${expectedRandomStateCount} random states for ${calculationStartTick}..${endTickIndex}, got ${randomStates.length}`);
32
32
  }
33
33
  for (const [index, { tick, randomNumber, digest }] of randomStates.entries()) {
34
34
  const expectedTick = calculationStartTick + index;
35
35
  if (tick !== expectedTick) {
36
- throw new Error(`RollercoasterPriceCalculator: expected random state at tick ${expectedTick}, got ${tick}`);
36
+ throw new Error(`StonksPriceCalculator: expected random state at tick ${expectedTick}, got ${tick}`);
37
37
  }
38
38
  this.validateRandomNumber(randomNumber);
39
39
  if (tick >= startTickIndex) {
@@ -47,19 +47,19 @@ class RollercoasterPriceCalculator {
47
47
  }
48
48
  calculateNextPrice(price, randomNumber) {
49
49
  const unitRangeFloat = randomNumber.plus(0.5).dividedBy(UINT32_RANGE).toNumber();
50
- const tickReturn = (0, stats_base_dists_normal_quantile_1.default)(unitRangeFloat, 0, constants_1.ROLLERCOASTER_VOLATILITY);
51
- return price.multipliedBy((0, bignumber_js_1.default)(1).plus(tickReturn)).decimalPlaces(constants_1.ROLLERCOASTER_PRICE_DECIMAL_PLACES);
50
+ const tickReturn = (0, stats_base_dists_normal_quantile_1.default)(unitRangeFloat, 0, constants_1.STONKS_VOLATILITY);
51
+ return price.multipliedBy((0, bignumber_js_1.default)(1).plus(tickReturn)).decimalPlaces(constants_1.STONKS_PRICE_DECIMAL_PLACES);
52
52
  }
53
53
  validateRandomNumber(randomNumber) {
54
54
  if (!randomNumber.isInteger() || randomNumber.lt(0) || randomNumber.gt(MAX_UINT32)) {
55
- throw new Error(`RollercoasterPriceCalculator: invalid random number ${randomNumber}`);
55
+ throw new Error(`StonksPriceCalculator: invalid random number ${randomNumber}`);
56
56
  }
57
57
  }
58
58
  validateRange(startTickIndex, endTickIndex) {
59
59
  if (!Number.isInteger(startTickIndex) || !Number.isInteger(endTickIndex) || startTickIndex < 0 || endTickIndex < startTickIndex) {
60
- throw new Error(`RollercoasterPriceCalculator: invalid tick range ${startTickIndex}..${endTickIndex}`);
60
+ throw new Error(`StonksPriceCalculator: invalid tick range ${startTickIndex}..${endTickIndex}`);
61
61
  }
62
62
  }
63
63
  }
64
- exports.RollercoasterPriceCalculator = RollercoasterPriceCalculator;
65
- //# sourceMappingURL=rollercoaster-price-calculator.js.map
64
+ exports.StonksPriceCalculator = StonksPriceCalculator;
65
+ //# sourceMappingURL=stonks-price-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stonks-price-calculator.js","sourceRoot":"","sources":["../../../../src/games/stonks/rng/stonks-price-calculator.ts"],"names":[],"mappings":";;;;;;AAAA,gHAAgE;AAChE,gEAAqC;AACrC,4CAAkG;AAElG,MAAM,YAAY,GAAG,IAAI,sBAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC9C,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAoBzC,MAAa,qBAAqB;IAChC,YAA6B,aAA0B;QAA1B,kBAAa,GAAb,aAAa,CAAa;IAAG,CAAC;IAEpD,cAAc,CAAC,SAAiB,EAAE,UAAgC;QACvE,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;IAC/E,CAAC;IAEM,oBAAoB,CAAC,cAAsB,EAAE,YAAoB,EAAE,UAAgC;;QACxG,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAEjD,MAAM,oBAAoB,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,mCAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,oBAAoB,GAAG,CAAC,IAAI,oBAAoB,GAAG,cAAc,EAAE,CAAC;YACjH,MAAM,IAAI,KAAK,CACb,6CAA6C,oBAAoB,6BAA6B,cAAc,KAAK,YAAY,EAAE,CAChI,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,mCAAI,8BAAkB,CAAC;QACpD,MAAM,KAAK,GAA0B,EAAE,CAAC;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACxF,MAAM,wBAAwB,GAAG,YAAY,GAAG,oBAAoB,GAAG,CAAC,CAAC;QAEzE,IAAI,YAAY,CAAC,MAAM,KAAK,wBAAwB,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CACb,mCAAmC,wBAAwB,sBAAsB,oBAAoB,KAAK,YAAY,SAAS,YAAY,CAAC,MAAM,EAAE,CACrJ,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7E,MAAM,YAAY,GAAG,oBAAoB,GAAG,KAAK,CAAC;YAClD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,wDAAwD,YAAY,SAAS,IAAI,EAAE,CAAC,CAAC;YACvG,CAAC;YAED,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAExC,IAAI,IAAI,IAAI,cAAc,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,CAAC;YAED,IAAI,IAAI,GAAG,YAAY,EAAE,CAAC;gBACxB,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,kBAAkB,CAAC,KAAgB,EAAE,YAAuB;QAClE,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjF,MAAM,UAAU,GAAG,IAAA,0CAAQ,EAAC,cAAc,EAAE,CAAC,EAAE,6BAAiB,CAAC,CAAC;QAElE,OAAO,KAAK,CAAC,YAAY,CAAC,IAAA,sBAAS,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,uCAA2B,CAAC,CAAC;IACtG,CAAC;IAEO,oBAAoB,CAAC,YAAuB;QAClD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,KAAK,CAAC,gDAAgD,YAAY,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,cAAsB,EAAE,YAAoB;QAChE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,cAAc,GAAG,CAAC,IAAI,YAAY,GAAG,cAAc,EAAE,CAAC;YAChI,MAAM,IAAI,KAAK,CAAC,6CAA6C,cAAc,KAAK,YAAY,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;CACF;AAlED,sDAkEC"}
@@ -1,17 +1,17 @@
1
1
  import BigNumber from 'bignumber.js';
2
- export declare enum RollercoasterDirection {
2
+ export declare enum StonksDirection {
3
3
  UP = "UP",
4
4
  DOWN = "DOWN"
5
5
  }
6
- export declare enum RollercoasterBetTerminalReason {
6
+ export declare enum StonksBetTerminalReason {
7
7
  CASHOUT = "CASHOUT",
8
8
  TAKE_PROFIT = "TAKE_PROFIT",
9
9
  LIQUIDATION = "LIQUIDATION",
10
10
  MAX_PAYOUT = "MAX_PAYOUT",
11
11
  ROUND_END = "ROUND_END"
12
12
  }
13
- export interface RollercoasterOpenBetState {
14
- readonly direction: RollercoasterDirection;
13
+ export interface StonksOpenBetState {
14
+ readonly direction: StonksDirection;
15
15
  readonly amount: BigNumber;
16
16
  readonly leverage: BigNumber;
17
17
  readonly entryPrice: BigNumber;
@@ -19,37 +19,37 @@ export interface RollercoasterOpenBetState {
19
19
  readonly bustPrice: BigNumber;
20
20
  readonly takeProfitMultiplier: BigNumber | null;
21
21
  }
22
- export interface RollercoasterTerminalBetState extends RollercoasterOpenBetState {
23
- readonly terminalReason: RollercoasterBetTerminalReason;
22
+ export interface StonksTerminalBetState extends StonksOpenBetState {
23
+ readonly terminalReason: StonksBetTerminalReason;
24
24
  readonly terminalTick: number;
25
25
  readonly terminalPrice: BigNumber;
26
26
  readonly multiplier: BigNumber;
27
27
  readonly grossPayout: BigNumber;
28
28
  readonly netPayout: BigNumber;
29
29
  }
30
- export type RollercoasterSettlementReason = {
31
- kind: RollercoasterBetTerminalReason.CASHOUT;
30
+ export type StonksSettlementReason = {
31
+ kind: StonksBetTerminalReason.CASHOUT;
32
32
  } | {
33
- kind: RollercoasterBetTerminalReason.TAKE_PROFIT;
33
+ kind: StonksBetTerminalReason.TAKE_PROFIT;
34
34
  takeProfitMultiplier: BigNumber;
35
35
  } | {
36
- kind: RollercoasterBetTerminalReason.LIQUIDATION;
36
+ kind: StonksBetTerminalReason.LIQUIDATION;
37
37
  } | {
38
- kind: RollercoasterBetTerminalReason.MAX_PAYOUT;
38
+ kind: StonksBetTerminalReason.MAX_PAYOUT;
39
39
  appliedCap: BigNumber;
40
40
  } | {
41
- kind: RollercoasterBetTerminalReason.ROUND_END;
41
+ kind: StonksBetTerminalReason.ROUND_END;
42
42
  };
43
- export type RollercoasterTriggerOutcome = {
43
+ export type StonksTriggerOutcome = {
44
44
  fired: false;
45
45
  } | {
46
46
  fired: true;
47
- reason: RollercoasterSettlementReason;
47
+ reason: StonksSettlementReason;
48
48
  };
49
- export declare class RollercoasterRules {
50
- static bustPrice(entryPrice: BigNumber, leverage: BigNumber, direction: RollercoasterDirection): BigNumber;
51
- static position(amount: BigNumber, leverage: BigNumber, direction: RollercoasterDirection): BigNumber;
52
- static impliedPriceForMultiplier(bet: Pick<RollercoasterOpenBetState, 'leverage' | 'entryPrice' | 'direction'>, targetMultiplier: BigNumber): BigNumber;
49
+ export declare class StonksRules {
50
+ static bustPrice(entryPrice: BigNumber, leverage: BigNumber, direction: StonksDirection): BigNumber;
51
+ static position(amount: BigNumber, leverage: BigNumber, direction: StonksDirection): BigNumber;
52
+ static impliedPriceForMultiplier(bet: Pick<StonksOpenBetState, 'leverage' | 'entryPrice' | 'direction'>, targetMultiplier: BigNumber): BigNumber;
53
53
  static isValidTakeProfitMultiplier(takeProfitMultiplier: BigNumber): boolean;
54
54
  static isTakeProfitFarEnoughFromEntry(entryPrice: BigNumber, takeProfitImpliedPrice: BigNumber): boolean;
55
55
  static isTakeProfitFarEnoughFromBust(entryPrice: BigNumber, bustPrice: BigNumber, takeProfitImpliedPrice: BigNumber): boolean;
@@ -61,12 +61,12 @@ export declare class RollercoasterRules {
61
61
  static tickAtOrAfter(startedAtMs: number, atMs: number): number;
62
62
  static tickBefore(startedAtMs: number, atMs: number): number;
63
63
  static tickStartTime(startedAtMs: number, tick: number): Date;
64
- static hasReachedTargetPrice(direction: RollercoasterDirection, currentPrice: BigNumber, targetPrice: BigNumber): boolean;
65
- static hasReachedBust(direction: RollercoasterDirection, price: BigNumber, bustPrice: BigNumber): boolean;
66
- static evaluateTriggers(bet: RollercoasterOpenBetState, tickPrice: BigNumber, liveMaxPayoutCap: BigNumber): RollercoasterTriggerOutcome;
67
- static multiplierAtPrice(bet: RollercoasterOpenBetState, price: BigNumber): BigNumber;
68
- static grossPayoutAtPrice(bet: RollercoasterOpenBetState, price: BigNumber): BigNumber;
69
- static grossPayoutForReason(bet: RollercoasterOpenBetState, reason: RollercoasterSettlementReason, price: BigNumber): BigNumber;
70
- static multiplierForReason(bet: RollercoasterOpenBetState, reason: RollercoasterSettlementReason, price: BigNumber): BigNumber;
64
+ static hasReachedTargetPrice(direction: StonksDirection, currentPrice: BigNumber, targetPrice: BigNumber): boolean;
65
+ static hasReachedBust(direction: StonksDirection, price: BigNumber, bustPrice: BigNumber): boolean;
66
+ static evaluateTriggers(bet: StonksOpenBetState, tickPrice: BigNumber, liveMaxPayoutCap: BigNumber): StonksTriggerOutcome;
67
+ static multiplierAtPrice(bet: StonksOpenBetState, price: BigNumber): BigNumber;
68
+ static grossPayoutAtPrice(bet: StonksOpenBetState, price: BigNumber): BigNumber;
69
+ static grossPayoutForReason(bet: StonksOpenBetState, reason: StonksSettlementReason, price: BigNumber): BigNumber;
70
+ static multiplierForReason(bet: StonksOpenBetState, reason: StonksSettlementReason, price: BigNumber): BigNumber;
71
71
  static netPayout(grossPayout: BigNumber, amount: BigNumber): BigNumber;
72
72
  }
@@ -0,0 +1,146 @@
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.StonksRules = exports.StonksBetTerminalReason = exports.StonksDirection = void 0;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const calculate_payout_1 = require("../../utils/calculate-payout");
9
+ const constants_1 = require("./constants");
10
+ var StonksDirection;
11
+ (function (StonksDirection) {
12
+ StonksDirection["UP"] = "UP";
13
+ StonksDirection["DOWN"] = "DOWN";
14
+ })(StonksDirection || (exports.StonksDirection = StonksDirection = {}));
15
+ var StonksBetTerminalReason;
16
+ (function (StonksBetTerminalReason) {
17
+ StonksBetTerminalReason["CASHOUT"] = "CASHOUT";
18
+ StonksBetTerminalReason["TAKE_PROFIT"] = "TAKE_PROFIT";
19
+ StonksBetTerminalReason["LIQUIDATION"] = "LIQUIDATION";
20
+ StonksBetTerminalReason["MAX_PAYOUT"] = "MAX_PAYOUT";
21
+ StonksBetTerminalReason["ROUND_END"] = "ROUND_END";
22
+ })(StonksBetTerminalReason || (exports.StonksBetTerminalReason = StonksBetTerminalReason = {}));
23
+ class StonksRules {
24
+ static bustPrice(entryPrice, leverage, direction) {
25
+ const offset = entryPrice.dividedBy(leverage);
26
+ return direction === StonksDirection.UP ? entryPrice.minus(offset) : entryPrice.plus(offset);
27
+ }
28
+ static position(amount, leverage, direction) {
29
+ const magnitude = amount.multipliedBy(leverage);
30
+ return direction === StonksDirection.UP ? magnitude : magnitude.negated();
31
+ }
32
+ static impliedPriceForMultiplier(bet, targetMultiplier) {
33
+ const directionSign = bet.direction === StonksDirection.UP ? 1 : -1;
34
+ const multiplierDelta = targetMultiplier.minus(1);
35
+ const priceChange = (0, bignumber_js_1.default)(directionSign).multipliedBy(multiplierDelta).dividedBy(bet.leverage);
36
+ return bet.entryPrice.multipliedBy((0, bignumber_js_1.default)(1).plus(priceChange));
37
+ }
38
+ static isValidTakeProfitMultiplier(takeProfitMultiplier) {
39
+ return takeProfitMultiplier.isGreaterThan(constants_1.STONKS_MIN_TAKE_PROFIT_MULTIPLIER);
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);
46
+ }
47
+ static isBustPriceDistinctFromEntry(entryPrice, bustPrice) {
48
+ return !entryPrice
49
+ .decimalPlaces(constants_1.STONKS_INTERNAL_PRICE_DECIMAL_PLACES)
50
+ .isEqualTo(bustPrice.decimalPlaces(constants_1.STONKS_INTERNAL_PRICE_DECIMAL_PLACES));
51
+ }
52
+ static isFinalTick(activeTick) {
53
+ return activeTick >= constants_1.STONKS_ROUND_TICK_COUNT - 1;
54
+ }
55
+ static isClientTickWithinMaxLag(activeTick, lastSeenTick) {
56
+ return activeTick - lastSeenTick <= constants_1.STONKS_MAX_STALE_CLIENT_TICKS;
57
+ }
58
+ static getScheduledRoundId(now, epochMs) {
59
+ return Math.floor((now.getTime() - epochMs) / constants_1.STONKS_ROUND_DURATION_MS);
60
+ }
61
+ static getScheduledRoundStartTime(roundId, epochMs) {
62
+ return new Date(epochMs + roundId * constants_1.STONKS_ROUND_DURATION_MS);
63
+ }
64
+ static tickAtOrAfter(startedAtMs, atMs) {
65
+ return Math.ceil((atMs - startedAtMs) / constants_1.STONKS_TICK_DURATION_MS);
66
+ }
67
+ static tickBefore(startedAtMs, atMs) {
68
+ return StonksRules.tickAtOrAfter(startedAtMs, atMs) - 1;
69
+ }
70
+ static tickStartTime(startedAtMs, tick) {
71
+ return new Date(startedAtMs + tick * constants_1.STONKS_TICK_DURATION_MS);
72
+ }
73
+ static hasReachedTargetPrice(direction, currentPrice, targetPrice) {
74
+ return direction === StonksDirection.UP ? currentPrice.isGreaterThanOrEqualTo(targetPrice) : currentPrice.isLessThanOrEqualTo(targetPrice);
75
+ }
76
+ static hasReachedBust(direction, price, bustPrice) {
77
+ return direction === StonksDirection.UP ? price.isLessThanOrEqualTo(bustPrice) : price.isGreaterThanOrEqualTo(bustPrice);
78
+ }
79
+ static evaluateTriggers(bet, tickPrice, liveMaxPayoutCap) {
80
+ const hitBust = StonksRules.hasReachedBust(bet.direction, tickPrice, bet.bustPrice);
81
+ if (bet.takeProfitMultiplier != null) {
82
+ const takeProfitMultiplier = bet.takeProfitMultiplier;
83
+ const hitTakeProfit = StonksRules.hasReachedTargetPrice(bet.direction, tickPrice, StonksRules.impliedPriceForMultiplier(bet, takeProfitMultiplier));
84
+ if (hitTakeProfit && hitBust) {
85
+ throw new Error('StonksRules.evaluateTriggers: take profit and liquidation both fired');
86
+ }
87
+ if (hitTakeProfit) {
88
+ const reason = { kind: StonksBetTerminalReason.TAKE_PROFIT, takeProfitMultiplier };
89
+ if (StonksRules.grossPayoutForReason(bet, reason, tickPrice).isGreaterThan(liveMaxPayoutCap)) {
90
+ return { fired: true, reason: { kind: StonksBetTerminalReason.MAX_PAYOUT, appliedCap: liveMaxPayoutCap } };
91
+ }
92
+ return { fired: true, reason };
93
+ }
94
+ }
95
+ if (hitBust) {
96
+ return { fired: true, reason: { kind: StonksBetTerminalReason.LIQUIDATION } };
97
+ }
98
+ if (StonksRules.grossPayoutAtPrice(bet, tickPrice).isGreaterThanOrEqualTo(liveMaxPayoutCap)) {
99
+ return { fired: true, reason: { kind: StonksBetTerminalReason.MAX_PAYOUT, appliedCap: liveMaxPayoutCap } };
100
+ }
101
+ return { fired: false };
102
+ }
103
+ static multiplierAtPrice(bet, price) {
104
+ const directionSign = bet.direction === StonksDirection.UP ? 1 : -1;
105
+ const percentagePriceChange = price.minus(bet.entryPrice).dividedBy(bet.entryPrice);
106
+ const leveragedPriceChange = (0, bignumber_js_1.default)(directionSign).multipliedBy(bet.leverage).multipliedBy(percentagePriceChange);
107
+ const multiplier = (0, bignumber_js_1.default)(1).plus(leveragedPriceChange);
108
+ return bignumber_js_1.default.maximum(0, multiplier);
109
+ }
110
+ static grossPayoutAtPrice(bet, price) {
111
+ const position = StonksRules.position(bet.amount, bet.leverage, bet.direction);
112
+ const pnl = position.multipliedBy(price.minus(bet.entryPrice)).dividedBy(bet.entryPrice);
113
+ return bignumber_js_1.default.maximum(0, bet.amount.plus(pnl));
114
+ }
115
+ static grossPayoutForReason(bet, reason, price) {
116
+ switch (reason.kind) {
117
+ case StonksBetTerminalReason.TAKE_PROFIT:
118
+ return (0, calculate_payout_1.calculatePayoutBN)(bet.amount, reason.takeProfitMultiplier);
119
+ case StonksBetTerminalReason.LIQUIDATION:
120
+ return (0, bignumber_js_1.default)(0);
121
+ case StonksBetTerminalReason.MAX_PAYOUT:
122
+ return reason.appliedCap;
123
+ case StonksBetTerminalReason.CASHOUT:
124
+ case StonksBetTerminalReason.ROUND_END:
125
+ return StonksRules.grossPayoutAtPrice(bet, price);
126
+ default:
127
+ reason;
128
+ throw new Error(`StonksRules.grossPayoutForReason: unhandled reason`);
129
+ }
130
+ }
131
+ static multiplierForReason(bet, reason, price) {
132
+ if (reason.kind === StonksBetTerminalReason.TAKE_PROFIT) {
133
+ return reason.takeProfitMultiplier;
134
+ }
135
+ return StonksRules.multiplierAtPrice(bet, price);
136
+ }
137
+ static netPayout(grossPayout, amount) {
138
+ if (grossPayout.lte(amount)) {
139
+ return grossPayout;
140
+ }
141
+ const profit = grossPayout.minus(amount);
142
+ return amount.plus(profit.multipliedBy((0, bignumber_js_1.default)(1).minus(constants_1.STONKS_PROFIT_FEE_RATE)));
143
+ }
144
+ }
145
+ exports.StonksRules = StonksRules;
146
+ //# sourceMappingURL=stonks-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stonks-rules.js","sourceRoot":"","sources":["../../../src/games/stonks/stonks-rules.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -44,6 +44,6 @@ export * from './games/rng/shuffle-random-number-generator';
44
44
  export * from './games/rng/random-number-generator.interface';
45
45
  export * from './games/rng/true-random-rng';
46
46
  export * from './games/rng/fixed-rng';
47
- export * from './games/rollercoaster/rollercoaster-rules';
48
- export * from './games/rollercoaster/constants';
49
- export * from './games/rollercoaster/rng';
47
+ export * from './games/stonks/stonks-rules';
48
+ export * from './games/stonks/constants';
49
+ export * from './games/stonks/rng';
package/lib/index.js CHANGED
@@ -130,7 +130,7 @@ __exportStar(require("./games/rng/shuffle-random-number-generator"), exports);
130
130
  __exportStar(require("./games/rng/random-number-generator.interface"), exports);
131
131
  __exportStar(require("./games/rng/true-random-rng"), exports);
132
132
  __exportStar(require("./games/rng/fixed-rng"), exports);
133
- __exportStar(require("./games/rollercoaster/rollercoaster-rules"), exports);
134
- __exportStar(require("./games/rollercoaster/constants"), exports);
135
- __exportStar(require("./games/rollercoaster/rng"), exports);
133
+ __exportStar(require("./games/stonks/stonks-rules"), exports);
134
+ __exportStar(require("./games/stonks/constants"), exports);
135
+ __exportStar(require("./games/stonks/rng"), exports);
136
136
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,kDAAgC;AAEhC,qDAAkD;AAAzC,0GAAA,UAAU,OAAA;AACnB,qCAAuD;AAA9C,+GAAA,uBAAuB,OAAA;AAChC,qEAAqF;AAA5E,uHAAA,eAAe,OAAA;AAAE,4HAAA,oBAAoB,OAAA;AAC9C,+DAAyE;AAAhE,oHAAA,eAAe,OAAA;AACxB,6DAA2D;AAAlD,mHAAA,eAAe,OAAA;AACxB,yDAAgE;AAAvD,wHAAA,sBAAsB,OAAA;AAC/B,6DAAgE;AAAvD,wHAAA,oBAAoB,OAAA;AAC7B,oGAAgG;AAAvF,iJAAA,6BAA6B,OAAA;AACtC,4EAAyH;AAAhH,2IAAA,mCAAmC,OAAA;AAAE,qIAAA,6BAA6B,OAAA;AAC3E,yDAA8E;AAArE,mHAAA,iBAAiB,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAC7C,qCAAmD;AAA1C,4FAAA,IAAI,OAAA;AAAE,qGAAA,aAAa,OAAA;AAC5B,6CAA4C;AAAnC,oGAAA,QAAQ,OAAA;AACjB,uCAAsC;AAA7B,8FAAA,KAAK,OAAA;AACd,yCAAyD;AAAhD,gGAAA,MAAM,OAAA;AAAE,yGAAA,eAAe,OAAA;AAChC,uCAAsC;AAA7B,8FAAA,KAAK,OAAA;AACd,uCASuB;AARrB,8FAAA,KAAK,OAAA;AACL,oHAAA,2BAA2B,OAAA;AAC3B,oHAAA,2BAA2B,OAAA;AAC3B,+GAAA,sBAAsB,OAAA;AACtB,4GAAA,mBAAmB,OAAA;AACnB,oHAAA,2BAA2B,OAAA;AAC3B,oHAAA,2BAA2B,OAAA;AAC3B,yGAAA,gBAAgB,OAAA;AAElB,uCAAsC;AAA7B,8FAAA,KAAK,OAAA;AACd,qCAAmD;AAA1C,4FAAA,IAAI,OAAA;AAAE,qGAAA,aAAa,OAAA;AAC5B,qCAA+C;AAAtC,4FAAA,IAAI,OAAA;AAAE,iGAAA,SAAS,OAAA;AACxB,+CAAsF;AAA7E,sGAAA,SAAS,OAAA;AAAyB,kGAAA,KAAK,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAC1D,mEAAwF;AAA/E,uHAAA,iBAAiB,OAAA;AAC1B,+CAS2B;AARzB,4GAAA,eAAe,OAAA;AACf,sGAAA,SAAS,OAAA;AACT,4GAAA,eAAe,OAAA;AACf,4GAAA,eAAe,OAAA;AACf,mHAAA,sBAAsB,OAAA;AACtB,8GAAA,iBAAiB,OAAA;AACjB,qHAAA,wBAAwB,OAAA;AACxB,wGAAA,WAAW,OAAA;AAEb,6CAA8E;AAArE,oGAAA,QAAQ,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,2GAAA,eAAe,OAAA;AAEnD,2CAA6D;AAApD,kGAAA,OAAO,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AACnC,uCAAqG;AAA5F,8FAAA,KAAK,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,mHAAA,0BAA0B,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAC7E,uCAAkH;AAAzG,8FAAA,KAAK,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,sGAAA,aAAa,OAAA;AAAE,0GAAA,iBAAiB,OAAA;AAAE,iHAAA,wBAAwB,OAAA;AAC1F,oDAA2D;AAAlD,kHAAA,mBAAmB,OAAA;AAC5B,0EAAsI;AAA7H,8HAAA,oBAAoB,OAAA;AAAE,mIAAA,yBAAyB,OAAA;AAAE,4IAAA,kCAAkC,OAAA;AAC5F,kDAAiE;AAAxD,wHAAA,0BAA0B,OAAA;AACnC,uCAAqF;AAA5E,8FAAA,KAAK,OAAA;AAAe,wGAAA,eAAe,OAAA;AAAE,wGAAA,eAAe,OAAA;AAC7D,wDAAiE;AAAxD,qGAAA,QAAQ,OAAA;AAAE,sGAAA,SAAS,OAAA;AAC5B,kEAAgD;AAChD,oEAAkD;AAClD,gFAA8D;AAC9D,mEAAiD;AACjD,sEAAoD;AACpD,8EAA4D;AAC5D,4EAA0D;AAC1D,4EAA0D;AAC1D,8EAA4D;AAC5D,gFAA8D;AAC9D,8DAA4C;AAC5C,wDAAsC;AACtC,8DAA4C;AAC5C,2DAAyC;AACzC,qDAAmC"}