@sly-rentals/core 1.1.2 → 2.0.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 (164) hide show
  1. package/dist/api.json +12242 -9231
  2. package/dist/cjs/calculator/ContestTimeline.js +396 -0
  3. package/dist/cjs/calculator/ContestTimeline.js.map +1 -0
  4. package/dist/cjs/calculator/MinBidChart.js +419 -0
  5. package/dist/cjs/calculator/MinBidChart.js.map +1 -0
  6. package/dist/cjs/calculator/dom.js +39 -0
  7. package/dist/cjs/calculator/dom.js.map +1 -0
  8. package/dist/cjs/calculator/emitter.js +36 -0
  9. package/dist/cjs/calculator/emitter.js.map +1 -0
  10. package/dist/cjs/calculator/index.js +20 -0
  11. package/dist/cjs/calculator/index.js.map +1 -0
  12. package/dist/cjs/cost/constants.js +54 -5
  13. package/dist/cjs/cost/constants.js.map +1 -1
  14. package/dist/cjs/cost/estimate.js +7 -4
  15. package/dist/cjs/cost/estimate.js.map +1 -1
  16. package/dist/cjs/cost/estimate.test.js +16 -4
  17. package/dist/cjs/cost/estimate.test.js.map +1 -1
  18. package/dist/cjs/cost/index.js +32 -17
  19. package/dist/cjs/cost/index.js.map +1 -1
  20. package/dist/cjs/cost/sizes.js +20 -3
  21. package/dist/cjs/cost/sizes.js.map +1 -1
  22. package/dist/cjs/instructions/acceptRental.js +39 -53
  23. package/dist/cjs/instructions/acceptRental.js.map +1 -1
  24. package/dist/cjs/instructions/closeContract.js +18 -50
  25. package/dist/cjs/instructions/closeContract.js.map +1 -1
  26. package/dist/cjs/instructions/closeRental.js +19 -15
  27. package/dist/cjs/instructions/closeRental.js.map +1 -1
  28. package/dist/cjs/instructions/createContract.js +2 -4
  29. package/dist/cjs/instructions/createContract.js.map +1 -1
  30. package/dist/cjs/instructions/createContractThread.js +1 -2
  31. package/dist/cjs/instructions/createContractThread.js.map +1 -1
  32. package/dist/cjs/instructions/index.js +65 -42
  33. package/dist/cjs/instructions/index.js.map +1 -1
  34. package/dist/cjs/instructions/reserveRental.js +34 -46
  35. package/dist/cjs/instructions/reserveRental.js.map +1 -1
  36. package/dist/cjs/kit/index.js +5 -27
  37. package/dist/cjs/kit/index.js.map +1 -1
  38. package/dist/cjs/legacy/index.js +6 -3
  39. package/dist/cjs/legacy/index.js.map +1 -1
  40. package/dist/cjs/package.json +1 -1
  41. package/dist/cjs/react/ContestTimeline.js +59 -0
  42. package/dist/cjs/react/ContestTimeline.js.map +1 -0
  43. package/dist/cjs/react/MinBidChart.js +34 -0
  44. package/dist/cjs/react/MinBidChart.js.map +1 -0
  45. package/dist/cjs/react/index.js +18 -0
  46. package/dist/cjs/react/index.js.map +1 -0
  47. package/dist/cjs/utils/bidMath.js +6 -115
  48. package/dist/cjs/utils/bidMath.js.map +1 -1
  49. package/dist/cjs/utils/contestChain.js +199 -0
  50. package/dist/cjs/utils/contestChain.js.map +1 -0
  51. package/dist/cjs/utils/contractSnapshot.js +207 -0
  52. package/dist/cjs/utils/contractSnapshot.js.map +1 -0
  53. package/dist/cjs/utils/contractSnapshot.test.js +247 -0
  54. package/dist/cjs/utils/contractSnapshot.test.js.map +1 -0
  55. package/dist/cjs/utils/index.js +8 -3
  56. package/dist/cjs/utils/index.js.map +1 -1
  57. package/dist/cjs/version.js +1 -1
  58. package/dist/esm/calculator/ContestTimeline.js +392 -0
  59. package/dist/esm/calculator/ContestTimeline.js.map +1 -0
  60. package/dist/esm/calculator/MinBidChart.js +412 -0
  61. package/dist/esm/calculator/MinBidChart.js.map +1 -0
  62. package/dist/esm/calculator/dom.js +35 -0
  63. package/dist/esm/calculator/dom.js.map +1 -0
  64. package/dist/esm/calculator/emitter.js +32 -0
  65. package/dist/esm/calculator/emitter.js.map +1 -0
  66. package/dist/esm/calculator/index.js +13 -0
  67. package/dist/esm/calculator/index.js.map +1 -0
  68. package/dist/esm/cost/constants.js +52 -4
  69. package/dist/esm/cost/constants.js.map +1 -1
  70. package/dist/esm/cost/estimate.js +9 -6
  71. package/dist/esm/cost/estimate.js.map +1 -1
  72. package/dist/esm/cost/estimate.test.js +18 -6
  73. package/dist/esm/cost/estimate.test.js.map +1 -1
  74. package/dist/esm/cost/index.js +13 -3
  75. package/dist/esm/cost/index.js.map +1 -1
  76. package/dist/esm/cost/sizes.js +19 -2
  77. package/dist/esm/cost/sizes.js.map +1 -1
  78. package/dist/esm/instructions/acceptRental.js +40 -54
  79. package/dist/esm/instructions/acceptRental.js.map +1 -1
  80. package/dist/esm/instructions/closeContract.js +16 -15
  81. package/dist/esm/instructions/closeContract.js.map +1 -1
  82. package/dist/esm/instructions/closeRental.js +20 -16
  83. package/dist/esm/instructions/closeRental.js.map +1 -1
  84. package/dist/esm/instructions/createContract.js +2 -4
  85. package/dist/esm/instructions/createContract.js.map +1 -1
  86. package/dist/esm/instructions/createContractThread.js +2 -3
  87. package/dist/esm/instructions/createContractThread.js.map +1 -1
  88. package/dist/esm/instructions/index.js +36 -28
  89. package/dist/esm/instructions/index.js.map +1 -1
  90. package/dist/esm/instructions/reserveRental.js +34 -46
  91. package/dist/esm/instructions/reserveRental.js.map +1 -1
  92. package/dist/esm/kit/index.js +4 -4
  93. package/dist/esm/kit/index.js.map +1 -1
  94. package/dist/esm/legacy/index.js +5 -2
  95. package/dist/esm/legacy/index.js.map +1 -1
  96. package/dist/esm/package.json +1 -1
  97. package/dist/esm/react/ContestTimeline.js +56 -0
  98. package/dist/esm/react/ContestTimeline.js.map +1 -0
  99. package/dist/esm/react/MinBidChart.js +30 -0
  100. package/dist/esm/react/MinBidChart.js.map +1 -0
  101. package/dist/esm/react/index.js +12 -0
  102. package/dist/esm/react/index.js.map +1 -0
  103. package/dist/esm/utils/bidMath.js +6 -114
  104. package/dist/esm/utils/bidMath.js.map +1 -1
  105. package/dist/esm/utils/contestChain.js +191 -0
  106. package/dist/esm/utils/contestChain.js.map +1 -0
  107. package/dist/esm/utils/contractSnapshot.js +201 -0
  108. package/dist/esm/utils/contractSnapshot.js.map +1 -0
  109. package/dist/esm/utils/contractSnapshot.test.js +245 -0
  110. package/dist/esm/utils/contractSnapshot.test.js.map +1 -0
  111. package/dist/esm/utils/index.js +4 -2
  112. package/dist/esm/utils/index.js.map +1 -1
  113. package/dist/esm/version.js +1 -1
  114. package/dist/types/calculator/ContestTimeline.d.ts +69 -0
  115. package/dist/types/calculator/ContestTimeline.d.ts.map +1 -0
  116. package/dist/types/calculator/MinBidChart.d.ts +73 -0
  117. package/dist/types/calculator/MinBidChart.d.ts.map +1 -0
  118. package/dist/types/calculator/dom.d.ts +16 -0
  119. package/dist/types/calculator/dom.d.ts.map +1 -0
  120. package/dist/types/calculator/emitter.d.ts +13 -0
  121. package/dist/types/calculator/emitter.d.ts.map +1 -0
  122. package/dist/types/calculator/index.d.ts +13 -0
  123. package/dist/types/calculator/index.d.ts.map +1 -0
  124. package/dist/types/cost/constants.d.ts +49 -4
  125. package/dist/types/cost/constants.d.ts.map +1 -1
  126. package/dist/types/cost/estimate.d.ts +12 -1
  127. package/dist/types/cost/estimate.d.ts.map +1 -1
  128. package/dist/types/cost/index.d.ts +13 -3
  129. package/dist/types/cost/index.d.ts.map +1 -1
  130. package/dist/types/cost/sizes.d.ts +19 -2
  131. package/dist/types/cost/sizes.d.ts.map +1 -1
  132. package/dist/types/instructions/acceptRental.d.ts +8 -0
  133. package/dist/types/instructions/acceptRental.d.ts.map +1 -1
  134. package/dist/types/instructions/closeContract.d.ts +9 -0
  135. package/dist/types/instructions/closeContract.d.ts.map +1 -1
  136. package/dist/types/instructions/closeRental.d.ts +8 -0
  137. package/dist/types/instructions/closeRental.d.ts.map +1 -1
  138. package/dist/types/instructions/createContract.d.ts.map +1 -1
  139. package/dist/types/instructions/index.d.ts +36 -28
  140. package/dist/types/instructions/index.d.ts.map +1 -1
  141. package/dist/types/instructions/reserveRental.d.ts +8 -0
  142. package/dist/types/instructions/reserveRental.d.ts.map +1 -1
  143. package/dist/types/kit/index.d.ts +0 -2
  144. package/dist/types/kit/index.d.ts.map +1 -1
  145. package/dist/types/legacy/index.d.ts +1 -2
  146. package/dist/types/legacy/index.d.ts.map +1 -1
  147. package/dist/types/react/ContestTimeline.d.ts +17 -0
  148. package/dist/types/react/ContestTimeline.d.ts.map +1 -0
  149. package/dist/types/react/MinBidChart.d.ts +12 -0
  150. package/dist/types/react/MinBidChart.d.ts.map +1 -0
  151. package/dist/types/react/index.d.ts +12 -0
  152. package/dist/types/react/index.d.ts.map +1 -0
  153. package/dist/types/utils/bidMath.d.ts +6 -44
  154. package/dist/types/utils/bidMath.d.ts.map +1 -1
  155. package/dist/types/utils/contestChain.d.ts +118 -0
  156. package/dist/types/utils/contestChain.d.ts.map +1 -0
  157. package/dist/types/utils/contractSnapshot.d.ts +123 -0
  158. package/dist/types/utils/contractSnapshot.d.ts.map +1 -0
  159. package/dist/types/utils/contractSnapshot.test.d.ts +2 -0
  160. package/dist/types/utils/contractSnapshot.test.d.ts.map +1 -0
  161. package/dist/types/utils/index.d.ts +2 -1
  162. package/dist/types/utils/index.d.ts.map +1 -1
  163. package/dist/types/version.d.ts +1 -1
  164. package/package.json +15 -1
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContestTimeline = ContestTimeline;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * @purpose Thin React wrapper around the vanilla `ContestTimeline` class.
7
+ * Owns container ref + lifecycle; converts emitter events back into the
8
+ * React-style callback props (`onKnobsChange` etc.).
9
+ *
10
+ * Logic lives in `@sly-rentals/core/calculator`.
11
+ */
12
+ const react_1 = require("react");
13
+ const calculator_1 = require("../calculator");
14
+ function ContestTimeline(props) {
15
+ const hostRef = (0, react_1.useRef)(null);
16
+ const instRef = (0, react_1.useRef)(null);
17
+ const handlersRef = (0, react_1.useRef)({
18
+ onKnobsChange: props.onKnobsChange,
19
+ onPresetChange: props.onPresetChange,
20
+ onCalcDefenderAtDayChange: props.onCalcDefenderAtDayChange,
21
+ });
22
+ handlersRef.current.onKnobsChange = props.onKnobsChange;
23
+ handlersRef.current.onPresetChange = props.onPresetChange;
24
+ handlersRef.current.onCalcDefenderAtDayChange = props.onCalcDefenderAtDayChange;
25
+ (0, react_1.useLayoutEffect)(() => {
26
+ if (!hostRef.current)
27
+ return;
28
+ const inst = new calculator_1.ContestTimeline(hostRef.current, propsToVanilla(props));
29
+ instRef.current = inst;
30
+ const offKnobs = inst.on('knobsChange', next => handlersRef.current.onKnobsChange(next));
31
+ const offPreset = inst.on('presetChange', next => handlersRef.current.onPresetChange(next));
32
+ const offCalc = inst.on('calcDefenderAtDayChange', at => handlersRef.current.onCalcDefenderAtDayChange(at));
33
+ return () => {
34
+ offKnobs();
35
+ offPreset();
36
+ offCalc();
37
+ inst.destroy();
38
+ instRef.current = null;
39
+ };
40
+ // eslint-disable-next-line react-hooks/exhaustive-deps
41
+ }, []);
42
+ (0, react_1.useEffect)(() => {
43
+ instRef.current?.update(propsToVanilla(props));
44
+ }, [props]);
45
+ return (0, jsx_runtime_1.jsx)("div", { ref: hostRef });
46
+ }
47
+ function propsToVanilla(p) {
48
+ return {
49
+ activeDays: p.activeDays,
50
+ nowDay: p.nowDay,
51
+ challengeCur: p.challengeCur,
52
+ knobs: p.knobs,
53
+ chain: p.chain,
54
+ preset: p.preset,
55
+ chainDefenderExists: p.chainDefenderExists,
56
+ classNames: p.classNames,
57
+ };
58
+ }
59
+ //# sourceMappingURL=ContestTimeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContestTimeline.js","sourceRoot":"","sources":["../../../src/react/ContestTimeline.tsx"],"names":[],"mappings":";;AAwBA,0CAoCC;;AA5DD;;;;;;GAMG;AAEH,iCAA2D;AAC3D,8CAIuB;AAWvB,SAAgB,eAAe,CAAC,KAA2B;IACzD,MAAM,OAAO,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAA,cAAM,EAAgC,IAAI,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAA,cAAM,EAAC;QACzB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,yBAAyB,EAAE,KAAK,CAAC,yBAAyB;KAC3D,CAAC,CAAC;IACH,WAAW,CAAC,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IACxD,WAAW,CAAC,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IAC1D,WAAW,CAAC,OAAO,CAAC,yBAAyB,GAAG,KAAK,CAAC,yBAAyB,CAAC;IAEhF,IAAA,uBAAe,EAAC,GAAG,EAAE;QACnB,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO;QAC7B,MAAM,IAAI,GAAG,IAAI,4BAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,yBAAyB,EAAE,EAAE,CAAC,EAAE,CACtD,WAAW,CAAC,OAAO,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAClD,CAAC;QACF,OAAO,GAAG,EAAE;YACV,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,gCAAK,GAAG,EAAE,OAAO,GAAI,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CAAC,CAAuB;IAC7C,OAAO;QACL,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,mBAAmB,EAAE,CAAC,CAAC,mBAAmB;QAC1C,UAAU,EAAE,CAAC,CAAC,UAAU;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_MIN_BID_CHART_THEME = void 0;
4
+ exports.MinBidChart = MinBidChart;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * @purpose Thin React wrapper around the vanilla `MinBidChart` class.
8
+ * Owns container ref + lifecycle; forwards prop changes via `.update()`.
9
+ *
10
+ * Visual + math logic lives in `@sly-rentals/core/calculator` so non-React
11
+ * consumers can use the same code without paying for React.
12
+ */
13
+ const react_1 = require("react");
14
+ const calculator_1 = require("../calculator");
15
+ Object.defineProperty(exports, "DEFAULT_MIN_BID_CHART_THEME", { enumerable: true, get: function () { return calculator_1.DEFAULT_MIN_BID_CHART_THEME; } });
16
+ function MinBidChart(props) {
17
+ const hostRef = (0, react_1.useRef)(null);
18
+ const instRef = (0, react_1.useRef)(null);
19
+ (0, react_1.useLayoutEffect)(() => {
20
+ if (!hostRef.current)
21
+ return;
22
+ instRef.current = new calculator_1.MinBidChart(hostRef.current, props);
23
+ return () => {
24
+ instRef.current?.destroy();
25
+ instRef.current = null;
26
+ };
27
+ // eslint-disable-next-line react-hooks/exhaustive-deps
28
+ }, []);
29
+ (0, react_1.useEffect)(() => {
30
+ instRef.current?.update(props);
31
+ }, [props]);
32
+ return (0, jsx_runtime_1.jsx)("div", { ref: hostRef });
33
+ }
34
+ //# sourceMappingURL=MinBidChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MinBidChart.js","sourceRoot":"","sources":["../../../src/react/MinBidChart.tsx"],"names":[],"mappings":";;;AAoBA,kCAmBC;;AAvCD;;;;;;GAMG;AAEH,iCAA2D;AAC3D,8CAMuB;AAEd,4GANP,wCAA2B,OAMO;AAGpC,SAAgB,WAAW,CAAC,KAAuB;IACjD,MAAM,OAAO,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAA,cAAM,EAA4B,IAAI,CAAC,CAAC;IAExD,IAAA,uBAAe,EAAC,GAAG,EAAE;QACnB,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO;QAC7B,OAAO,CAAC,OAAO,GAAG,IAAI,wBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,gCAAK,GAAG,EAAE,OAAO,GAAI,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * @purpose React component entry point for the SRSLY reservation
4
+ * calculator. Sits behind the `@sly-rentals/core/react` subpath export
5
+ * so non-React consumers don't pay the import cost.
6
+ *
7
+ * Pair with `@sly-rentals/core/react/styles.css` for the default
8
+ * SRSLY-themed look, or pass `classNames` / `theme` props for custom
9
+ * styling.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ContestTimeline = exports.DEFAULT_MIN_BID_CHART_THEME = exports.MinBidChart = void 0;
13
+ var MinBidChart_1 = require("./MinBidChart");
14
+ Object.defineProperty(exports, "MinBidChart", { enumerable: true, get: function () { return MinBidChart_1.MinBidChart; } });
15
+ Object.defineProperty(exports, "DEFAULT_MIN_BID_CHART_THEME", { enumerable: true, get: function () { return MinBidChart_1.DEFAULT_MIN_BID_CHART_THEME; } });
16
+ var ContestTimeline_1 = require("./ContestTimeline");
17
+ Object.defineProperty(exports, "ContestTimeline", { enumerable: true, get: function () { return ContestTimeline_1.ContestTimeline; } });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,6CAMuB;AALrB,0GAAA,WAAW,OAAA;AACX,0HAAA,2BAA2B,OAAA;AAM7B,qDAI2B;AAHzB,kHAAA,eAAe,OAAA"}
@@ -1,23 +1,15 @@
1
1
  "use strict";
2
2
  /**
3
- * @purpose Reservation bid math helpers
3
+ * @purpose Reservation bid math (pure formula + type)
4
4
  *
5
- * Pure-math + on-chain-fetch helpers for computing the contest minimum-bid
6
- * floor that a challenger must clear to take an existing reservation.
7
- * Mirrors the on-chain `ConfigState::bid_min_stardust` formula so client UIs
8
- * (and on-chain-aware tooling) can preview the floor without hitting an RPC
9
- * for every keystroke.
5
+ * Mirror of the on-chain `ConfigState::bid_min_stardust` formula so UIs
6
+ * can preview the contest minimum-bid floor without hitting an RPC for
7
+ * every keystroke. Fetch-aware helpers (`getMinimumBid`,
8
+ * `computeMinimumBidFromSnapshot`) live in `./contractSnapshot` they
9
+ * call into the pure formula here.
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.computeMinimumBid = computeMinimumBid;
13
- exports.getMinimumBid = getMinimumBid;
14
- const config_1 = require("../accounts/config");
15
- const contract_1 = require("../accounts/contract");
16
- const rental_1 = require("../accounts/rental");
17
- const srsly_1 = require("../pda/srsly");
18
- const config_2 = require("./config");
19
- const rpc_1 = require("./rpc");
20
- const SYSTEM_PROGRAM_ID = '11111111111111111111111111111111';
21
13
  /**
22
14
  * Pure math: contest minimum-bid floor in stardust.
23
15
  *
@@ -46,105 +38,4 @@ function computeMinimumBid(args) {
46
38
  const base = args.rateStardust > defenderBid ? args.rateStardust : defenderBid;
47
39
  return (base * effBps) / 10000n;
48
40
  }
49
- /**
50
- * High-level helper: compute the contest minimum bid for a contract right
51
- * now (or at `now + delaySeconds`).
52
- *
53
- * Fetches `ConfigState`, `ContractState`, and the active/queued `RentalState`
54
- * accounts, derives `closeness` from the active rental window, and returns
55
- * the floor a challenger must clear plus enough context to render a UI.
56
- *
57
- * @example
58
- * ```ts
59
- * const floor = await getMinimumBid({ contractAddress: 'Abc...' });
60
- * console.log('Bid at least', floor.minBidStardust, 'stardust');
61
- *
62
- * // Preview the floor 4 hours from now (snipe-window pricing):
63
- * const later = await getMinimumBid({
64
- * contractAddress: 'Abc...',
65
- * delaySeconds: 4 * 60 * 60,
66
- * });
67
- * ```
68
- *
69
- * If the contract has no active rental yet, closeness = 0 and the floor
70
- * collapses to the rate-bump floor (`rate × captureRate`).
71
- */
72
- async function getMinimumBid(args) {
73
- const rpcUrl = args.rpcUrl ?? (0, config_2.getRpcUrl)();
74
- const rpc = (0, rpc_1.createRpc)(rpcUrl);
75
- const cfgPromise = (0, config_1.fetchConfig)(rpcUrl);
76
- const contractPromise = (0, contract_1.fetchContract)(args.contractAddress, rpcUrl);
77
- const [cfg, contract] = await Promise.all([cfgPromise, contractPromise]);
78
- const cfgData = cfg.data;
79
- const contractData = contract.data;
80
- const rateStardust = BigInt(contractData.rate);
81
- const atlasPerPoint = args.atlasPerPoint ?? BigInt(cfgData.atlasPerPoint);
82
- const stardustPerAtlas = BigInt(cfgData.stardustToAtlas);
83
- const activeAddr = await (0, srsly_1.deriveActiveRental)(contract.address);
84
- const queuedAddr = await (0, srsly_1.deriveQueuedRental)(contract.address);
85
- // Active rental — only meaningful if the contract field points at it.
86
- let activeStart = null;
87
- let activeEnd = null;
88
- if (contractData.activeRental && contractData.activeRental.toString() !== SYSTEM_PROGRAM_ID) {
89
- try {
90
- const active = await (0, rental_1.fetchRental)(activeAddr, rpcUrl);
91
- const a = active.data;
92
- activeStart = Number(a.startTime);
93
- activeEnd = Number(a.endTime);
94
- }
95
- catch {
96
- // Account missing despite contract pointer — treat as no active rental.
97
- }
98
- }
99
- // Queued rental — defender bid lives here if a reservation exists.
100
- let defenderBidStardust = 0n;
101
- if (contractData.queuedRental && contractData.queuedRental.toString() !== SYSTEM_PROGRAM_ID) {
102
- try {
103
- const queued = await (0, rental_1.fetchRental)(queuedAddr, rpcUrl);
104
- const q = queued.data;
105
- const bidAtlas = BigInt(q.bidAtlas);
106
- const bidPoints = BigInt(q.bidPoints);
107
- // Points are 8-decimal dust; converting to stardust requires the same
108
- // 8-decimal precision: stardust = points_dust * atlasPerPoint *
109
- // stardustPerAtlas / 1e8. With both at 1e8 precision this collapses
110
- // to points_dust * atlasPerPoint.
111
- const pointsAsStardust = bidPoints > 0n ? (bidPoints * atlasPerPoint * stardustPerAtlas) / 100000000n : 0n;
112
- defenderBidStardust = bidAtlas + pointsAsStardust;
113
- }
114
- catch {
115
- // Missing queued account — leave defenderBidStardust = 0.
116
- }
117
- }
118
- const evaluatedAtSeconds = args.nowSeconds !== undefined
119
- ? Math.floor(args.nowSeconds)
120
- : Math.floor(Date.now() / 1000) + Math.max(0, args.delaySeconds ?? 0);
121
- let closeness = 0;
122
- if (activeStart !== null && activeEnd !== null && activeEnd > activeStart) {
123
- const span = activeEnd - activeStart;
124
- const elapsed = evaluatedAtSeconds - activeStart;
125
- closeness = Math.max(0, Math.min(1, elapsed / span));
126
- }
127
- const minBidStardust = computeMinimumBid({
128
- rateStardust,
129
- defenderBidStardust,
130
- contestedMultiplierMaxBps: cfgData.contestedMultiplierMaxBps,
131
- captureRateBps: BigInt(cfgData.captureRateBps),
132
- closenessFraction: closeness,
133
- });
134
- const baseStardust = rateStardust > defenderBidStardust ? rateStardust : defenderBidStardust;
135
- const rampMultiplier = baseStardust > 0n ? Number(minBidStardust) / Number(baseStardust) : 1;
136
- // RPC reference kept to match the codebase pattern even when unused;
137
- // future refinements (e.g. fetching chain time) can plug in here.
138
- void rpc;
139
- return {
140
- minBidStardust,
141
- defenderBidStardust,
142
- rateStardust,
143
- closenessFraction: closeness,
144
- rampMultiplier,
145
- evaluatedAtSeconds,
146
- activeEndSeconds: activeEnd,
147
- activeStartSeconds: activeStart,
148
- };
149
- }
150
41
  //# sourceMappingURL=bidMath.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bidMath.js","sourceRoot":"","sources":["../../../src/utils/bidMath.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bidMath.js","sourceRoot":"","sources":["../../../src/utils/bidMath.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAiBH,8CAkBC;AAjCD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,iBAAiB,CAAC,IAMjC;IACC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,kEAAkE;IAClE,MAAM,SAAS,GAAG,MAAO,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,GAAG,MAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,MAAO,CAAC;IAC7E,MAAM,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;IAC/E,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,MAAO,CAAC;AACnC,CAAC"}
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ /**
3
+ * @purpose Pure-math chain-of-contests simulator.
4
+ *
5
+ * Walks a sequence of reservation events (calc defender + user-added
6
+ * takeovers) and produces per-row floor / bonus / owner-take values
7
+ * plus the segment breakdown UIs use to render piecewise curves.
8
+ *
9
+ * No React, no IO, no RPC. Feeds a calculator/visualization layer
10
+ * (`@sly-rentals/core/react/calculator`) but is callable standalone
11
+ * from any environment.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.nextKnobId = void 0;
15
+ exports.stardustToDisplay = stardustToDisplay;
16
+ exports.computeContestChain = computeContestChain;
17
+ exports.distributeEven = distributeEven;
18
+ exports.distributeSnipeHeavy = distributeSnipeHeavy;
19
+ const bidMath_1 = require("./bidMath");
20
+ function clamp(n, lo, hi) {
21
+ return Math.max(lo, Math.min(hi, n));
22
+ }
23
+ /**
24
+ * Convert a stardust value into the caller's display currency.
25
+ *
26
+ * ATLAS: stardust / stardustPerAtlas.
27
+ * POINTS: stardust / (stardustPerAtlas × atlasPerPoint), with a
28
+ * min-capture floor since the on-chain threshold rejects sub-floor bids.
29
+ */
30
+ function stardustToDisplay(stardust, cur, stardustPerAtlas, atlasPerPoint, minCaptureThresholdPoints) {
31
+ const atlas = Number(stardust) / stardustPerAtlas;
32
+ if (cur === 'ATLAS')
33
+ return atlas;
34
+ return Math.max(atlas / atlasPerPoint, minCaptureThresholdPoints);
35
+ }
36
+ /**
37
+ * Walk a chain of contest events and produce per-contest math + segment
38
+ * breakdown.
39
+ *
40
+ * The chain begins with an optional calc defender row (the simulator's
41
+ * "your bid" entry). Subsequent takeover knobs are computed via
42
+ * `computeMinimumBid` against the previous row's bid.
43
+ *
44
+ * v1 assumes same-currency ATLAS knockoffs; tier-upgrade compensation
45
+ * is not modeled.
46
+ */
47
+ function computeContestChain(args) {
48
+ const { cfg, rateStardust, activeDays, userDefender, takeoverKnobs, displayCur, stardustPerAtlas, atlasPerPoint, minCaptureThresholdPoints, contestedThreshold, contestedCountStart, } = args;
49
+ const safeSpan = Math.max(0.0001, activeDays);
50
+ const sorted = [...takeoverKnobs].sort((a, b) => a.atDay - b.atDay);
51
+ const rows = [];
52
+ const segments = [];
53
+ const toDisplay = (s) => stardustToDisplay(s, displayCur, stardustPerAtlas, atlasPerPoint, minCaptureThresholdPoints);
54
+ const callMinBid = (closeness, defenderBidStardust) => (0, bidMath_1.computeMinimumBid)({
55
+ rateStardust,
56
+ defenderBidStardust,
57
+ contestedMultiplierMaxBps: cfg.contestedMultiplierMaxBps,
58
+ captureRateBps: cfg.captureRateBps,
59
+ closenessFraction: closeness,
60
+ });
61
+ const tmp = [];
62
+ if (userDefender) {
63
+ tmp.push({
64
+ id: '__calc',
65
+ atDay: userDefender.atDay,
66
+ bidStardust: userDefender.bidStardust,
67
+ bidDisplay: toDisplay(userDefender.bidStardust),
68
+ defenderBidStardust: 0n,
69
+ defenderAtDay: 0,
70
+ source: 'calc',
71
+ });
72
+ }
73
+ const firstEventAt = tmp[0]?.atDay ?? 0;
74
+ if (firstEventAt > 0) {
75
+ segments.push({
76
+ startDay: 0,
77
+ endDay: firstEventAt,
78
+ defenderBidStardust: 0n,
79
+ hasDefender: false,
80
+ });
81
+ }
82
+ let cursorBid = userDefender?.bidStardust ?? 0n;
83
+ let cursorAt = userDefender?.atDay ?? 0;
84
+ for (const k of sorted) {
85
+ segments.push({
86
+ startDay: cursorAt,
87
+ endDay: k.atDay,
88
+ defenderBidStardust: cursorBid,
89
+ hasDefender: true,
90
+ });
91
+ const closeness = clamp(k.atDay / safeSpan, 0, 1);
92
+ const floor = callMinBid(closeness, cursorBid);
93
+ tmp.push({
94
+ id: k.id,
95
+ atDay: k.atDay,
96
+ bidStardust: floor,
97
+ bidDisplay: toDisplay(floor),
98
+ defenderBidStardust: cursorBid,
99
+ defenderAtDay: cursorAt,
100
+ source: 'knob',
101
+ });
102
+ cursorBid = floor;
103
+ cursorAt = k.atDay;
104
+ }
105
+ if (tmp.length > 0) {
106
+ segments.push({
107
+ startDay: cursorAt,
108
+ endDay: activeDays,
109
+ defenderBidStardust: cursorBid,
110
+ hasDefender: true,
111
+ });
112
+ }
113
+ // Bonus multiplier — config knob, scales the same-cur knockoff bonus.
114
+ // 100 bps = 1× = no-op (current on-chain formula).
115
+ // TODO(bonus_multiplier_bps): drop the `?? 100` fallback once the
116
+ // on-chain field is guaranteed present.
117
+ const bonusMult = (cfg.bonusMultiplierBps ?? 100) / 100;
118
+ const bonusByIdx = tmp.map((_, i) => {
119
+ const next = tmp[i + 1];
120
+ if (!next)
121
+ return 0;
122
+ const closeness = clamp((next.atDay - tmp[i].atDay) / safeSpan, 0, 1);
123
+ const raw = Math.max(0, (next.bidDisplay - tmp[i].bidDisplay) * closeness * bonusMult);
124
+ // Match on-chain `b.min(bid_atlas)` — bonus capped at challenger's bid.
125
+ return Math.min(next.bidDisplay, raw);
126
+ });
127
+ // Owner-take is realized only by the LAST contester in the chain — every
128
+ // earlier contester gets their bid back as refund when outbid, plus a
129
+ // bonus from the next challenger's bid. Net contract escrow at end of
130
+ // chain = bid_last − Σ bonuses paid across the chain (the deficit on
131
+ // each refund is covered by the next challenger's bid). Intermediate
132
+ // rows therefore contribute 0 to owner take.
133
+ const totalBonusForOwner = bonusByIdx.reduce((acc, b) => acc + b, 0);
134
+ const lastIdx = tmp.length - 1;
135
+ let contestedCount = contestedCountStart;
136
+ let bumpFlagged = false;
137
+ for (let i = 0; i < tmp.length; i++) {
138
+ const t = tmp[i];
139
+ const bonusEarned = bonusByIdx[i];
140
+ const ownerTake = i === lastIdx ? Math.max(0, t.bidDisplay - totalBonusForOwner) : 0;
141
+ contestedCount = contestedCount + 1;
142
+ const isInitial = i === 0;
143
+ const triggersRateBump = !bumpFlagged && contestedThreshold > 0 && contestedCount >= contestedThreshold && !isInitial;
144
+ if (triggersRateBump)
145
+ bumpFlagged = true;
146
+ rows.push({
147
+ id: t.id,
148
+ idx: i + 1,
149
+ atDay: t.atDay,
150
+ floorStardust: t.bidStardust,
151
+ floorDisplay: t.bidDisplay,
152
+ bonusDisplay: bonusEarned,
153
+ ownerTakeDisplay: ownerTake,
154
+ defenderBidStardust: t.defenderBidStardust,
155
+ defenderAtDay: t.defenderAtDay,
156
+ source: t.source,
157
+ isInitial,
158
+ contestedCountAfter: contestedCount,
159
+ triggersRateBump,
160
+ });
161
+ }
162
+ const baselineAtlas = (Number(rateStardust) / stardustPerAtlas) * activeDays;
163
+ const baselineDisplay = displayCur === 'ATLAS'
164
+ ? baselineAtlas
165
+ : Math.max(baselineAtlas / atlasPerPoint, minCaptureThresholdPoints);
166
+ const totalOwnerDisplay = rows.reduce((acc, r) => acc + r.ownerTakeDisplay, 0);
167
+ const totalBonusDisplay = rows.reduce((acc, r) => acc + r.bonusDisplay, 0);
168
+ const multiplier = baselineDisplay > 0 ? totalOwnerDisplay / baselineDisplay : 0;
169
+ return {
170
+ segments,
171
+ rows,
172
+ totalOwnerDisplay,
173
+ totalBonusDisplay,
174
+ baselineDisplay,
175
+ multiplier,
176
+ };
177
+ }
178
+ /** Even spacing across [from, to] excluding endpoints. */
179
+ function distributeEven(count, from, to) {
180
+ if (count <= 0 || to <= from)
181
+ return [];
182
+ const step = (to - from) / (count + 1);
183
+ return Array.from({ length: count }, (_, i) => from + step * (i + 1));
184
+ }
185
+ /** Quadratic bias toward `to` — clusters knobs near the snipe window. */
186
+ function distributeSnipeHeavy(count, from, to) {
187
+ if (count <= 0 || to <= from)
188
+ return [];
189
+ const span = to - from;
190
+ return Array.from({ length: count }, (_, i) => {
191
+ const t = (i + 1) / (count + 1);
192
+ const skewed = 1 - Math.pow(1 - t, 2);
193
+ return from + span * skewed;
194
+ });
195
+ }
196
+ let knobCounter = 0;
197
+ const nextKnobId = () => `k${++knobCounter}`;
198
+ exports.nextKnobId = nextKnobId;
199
+ //# sourceMappingURL=contestChain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contestChain.js","sourceRoot":"","sources":["../../../src/utils/contestChain.ts"],"names":[],"mappings":"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"}