@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,419 @@
1
+ "use strict";
2
+ /**
3
+ * @purpose Vanilla floor + bonus curve renderer for the SRSLY reservation
4
+ * calculator. Wraps uPlot's imperative API with a class-based lifecycle
5
+ * (constructor / update / destroy) so the component is framework-agnostic.
6
+ * The `@sly-rentals/core/react/MinBidChart` is a thin React wrapper that
7
+ * forwards lifecycle to this class.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.MinBidChart = exports.DEFAULT_MIN_BID_CHART_THEME = void 0;
14
+ const uplot_1 = __importDefault(require("uplot"));
15
+ const utils_1 = require("../utils");
16
+ const dom_1 = require("./dom");
17
+ exports.DEFAULT_MIN_BID_CHART_THEME = {
18
+ floor: '#22d3ee',
19
+ bonus: '#6ee7b7',
20
+ defenderBid: '#f5c451',
21
+ axis: '#9bb0bd',
22
+ grid: 'rgba(120,190,220,0.14)',
23
+ knobDot: '#22d3ee',
24
+ dotStroke: '#0a0f12',
25
+ };
26
+ const SAMPLES = 128;
27
+ const SAMPLES_PER_SEGMENT = 32;
28
+ function clamp(n, lo, hi) {
29
+ return Math.max(lo, Math.min(hi, n));
30
+ }
31
+ function fmt(n) {
32
+ return Math.round(n).toLocaleString();
33
+ }
34
+ class MinBidChart {
35
+ container;
36
+ root;
37
+ canvasWrap;
38
+ canvasHost;
39
+ tooltip;
40
+ legend;
41
+ plot = null;
42
+ resizeObs = null;
43
+ props;
44
+ theme;
45
+ knobMarks = [];
46
+ defenderActive = false;
47
+ defenderVal = 0;
48
+ constructor(container, props) {
49
+ this.container = container;
50
+ this.props = props;
51
+ this.theme = { ...exports.DEFAULT_MIN_BID_CHART_THEME, ...(props.theme ?? {}) };
52
+ this.root = (0, dom_1.el)('div', { className: props.classNames?.root ?? 'calc-chart' });
53
+ this.legend = (0, dom_1.el)('div', { className: props.classNames?.legend ?? 'calc-chart-legend' });
54
+ this.canvasWrap = (0, dom_1.el)('div', {
55
+ className: props.classNames?.canvasWrap ?? 'calc-chart-canvas-wrap',
56
+ });
57
+ this.canvasHost = (0, dom_1.el)('div', { className: props.classNames?.canvas ?? 'calc-chart-canvas' });
58
+ this.tooltip = (0, dom_1.el)('div', { className: props.classNames?.tooltip ?? 'calc-chart-tooltip' });
59
+ this.canvasWrap.append(this.canvasHost, this.tooltip);
60
+ this.root.append(this.legend, this.canvasWrap);
61
+ this.canvasWrap.addEventListener('pointerleave', this.onLeaveCanvas);
62
+ this.container.append(this.root);
63
+ this.renderLegend();
64
+ this.mountPlot();
65
+ this.applyData();
66
+ }
67
+ update(next) {
68
+ const prev = this.props;
69
+ this.props = { ...prev, ...next };
70
+ if (next.theme !== undefined) {
71
+ this.theme = { ...exports.DEFAULT_MIN_BID_CHART_THEME, ...(this.props.theme ?? {}) };
72
+ }
73
+ this.renderLegend();
74
+ this.applyData();
75
+ }
76
+ destroy() {
77
+ this.resizeObs?.disconnect();
78
+ this.resizeObs = null;
79
+ this.plot?.destroy();
80
+ this.plot = null;
81
+ this.canvasWrap.removeEventListener('pointerleave', this.onLeaveCanvas);
82
+ if (this.root.parentNode)
83
+ this.root.parentNode.removeChild(this.root);
84
+ }
85
+ onLeaveCanvas = () => {
86
+ this.tooltip.style.opacity = '0';
87
+ };
88
+ renderLegend() {
89
+ const { classNames, chain, challengeCur } = this.props;
90
+ const items = [
91
+ (0, dom_1.el)('span', { className: classNames?.legendItem ?? 'calc-chart-legend-item' }, [
92
+ (0, dom_1.el)('span', { className: 'calc-chart-swatch calc-chart-swatch-cyan' }),
93
+ ' min bid floor',
94
+ ]),
95
+ (0, dom_1.el)('span', { className: classNames?.legendItem ?? 'calc-chart-legend-item' }, [
96
+ (0, dom_1.el)('span', { className: 'calc-chart-swatch calc-chart-swatch-mint-solid' }),
97
+ ' defender bonus',
98
+ ]),
99
+ ];
100
+ if (chain && chain.rows.length > 0) {
101
+ items.push((0, dom_1.el)('span', { className: classNames?.legendItem ?? 'calc-chart-legend-item' }, [
102
+ (0, dom_1.el)('span', { className: 'calc-chart-swatch calc-chart-swatch-cyan-dashed' }),
103
+ ' your bid / contests',
104
+ ]));
105
+ }
106
+ items.push((0, dom_1.el)('span', {
107
+ className: classNames?.legendUnit ?? 'calc-chart-legend-unit',
108
+ text: challengeCur,
109
+ }));
110
+ while (this.legend.firstChild)
111
+ this.legend.removeChild(this.legend.firstChild);
112
+ for (const it of items)
113
+ this.legend.append(it);
114
+ }
115
+ toDisplay(stardust) {
116
+ const p = this.props;
117
+ return (0, utils_1.stardustToDisplay)(stardust, p.challengeCur, p.stardustPerAtlas, p.atlasPerPoint, p.minCaptureThresholdPoints);
118
+ }
119
+ callMinBid(closeness, defenderBid) {
120
+ const { rateStardust, cfg } = this.props;
121
+ return (0, utils_1.computeMinimumBid)({
122
+ rateStardust,
123
+ defenderBidStardust: defenderBid,
124
+ contestedMultiplierMaxBps: cfg.contestedMultiplierMaxBps,
125
+ captureRateBps: cfg.captureRateBps,
126
+ closenessFraction: closeness,
127
+ });
128
+ }
129
+ computeData() {
130
+ const { cfg, defenderBidStardust, activeDays, hasDefender, defenderReservedAt, chain } = this.props;
131
+ const span = activeDays > 0 ? activeDays : 1;
132
+ const xs = [];
133
+ const floor = [];
134
+ const bonus = [];
135
+ if (chain && (chain.segments.length > 0 || hasDefender)) {
136
+ const reservedAt = hasDefender ? clamp(defenderReservedAt, 0, span) : 0;
137
+ if (reservedAt > 0) {
138
+ xs.push(0);
139
+ floor.push(0);
140
+ bonus.push(null);
141
+ xs.push(reservedAt);
142
+ floor.push(0);
143
+ bonus.push(null);
144
+ }
145
+ else if (!hasDefender && chain.rows.length === 0) {
146
+ xs.push(0);
147
+ floor.push(0);
148
+ bonus.push(null);
149
+ xs.push(span);
150
+ floor.push(0);
151
+ bonus.push(null);
152
+ return [xs, floor, bonus];
153
+ }
154
+ const walkSegment = (seg) => {
155
+ const segSpan = Math.max(0, seg.endDay - seg.startDay);
156
+ const defenderDisplay = this.toDisplay(seg.defenderBidStardust);
157
+ if (!seg.hasDefender) {
158
+ xs.push(seg.startDay);
159
+ floor.push(0);
160
+ bonus.push(null);
161
+ if (segSpan > 0) {
162
+ xs.push(seg.endDay);
163
+ floor.push(0);
164
+ bonus.push(null);
165
+ }
166
+ return;
167
+ }
168
+ const samples = segSpan <= 0 ? 1 : SAMPLES_PER_SEGMENT;
169
+ for (let i = 0; i <= samples; i++) {
170
+ const t = i / samples;
171
+ const day = seg.startDay + segSpan * t;
172
+ const closenessFloor = clamp(day / span, 0, 1);
173
+ const floorStardust = this.callMinBid(closenessFloor, seg.defenderBidStardust);
174
+ const floorDisplay = this.toDisplay(floorStardust);
175
+ const bonusCloseness = clamp((day - seg.startDay) / span, 0, 1);
176
+ // TODO(bonus_multiplier_bps): drop the `?? 100` fallback once
177
+ // the on-chain field is guaranteed present on ConfigState.
178
+ const bonusMult = (cfg.bonusMultiplierBps ?? 100) / 100;
179
+ const bonusRaw = Math.max(0, (floorDisplay - defenderDisplay) * bonusCloseness * bonusMult);
180
+ const bonusDisplay = Math.min(floorDisplay, bonusRaw);
181
+ xs.push(day);
182
+ floor.push(floorDisplay);
183
+ bonus.push(bonusDisplay);
184
+ }
185
+ };
186
+ for (const seg of chain.segments)
187
+ walkSegment(seg);
188
+ return [xs, floor, bonus];
189
+ }
190
+ const reservedAt = hasDefender ? clamp(defenderReservedAt, 0, span) : 0;
191
+ for (let i = 0; i < SAMPLES; i++) {
192
+ const day = (i / (SAMPLES - 1)) * span;
193
+ xs.push(day);
194
+ if (!hasDefender || day < reservedAt) {
195
+ floor.push(0);
196
+ bonus.push(null);
197
+ continue;
198
+ }
199
+ const closenessFloor = clamp(day / span, 0, 1);
200
+ const floorStardust = this.callMinBid(closenessFloor, defenderBidStardust);
201
+ const floorDisplay = this.toDisplay(floorStardust);
202
+ const defenderDisplay = this.toDisplay(defenderBidStardust);
203
+ const bonusCloseness = clamp((day - reservedAt) / span, 0, 1);
204
+ // TODO(bonus_multiplier_bps): drop the `?? 100` fallback once
205
+ // the on-chain field is guaranteed present on ConfigState.
206
+ const bonusMult = (cfg.bonusMultiplierBps ?? 100) / 100;
207
+ const bonusRaw = defenderBidStardust > 0n
208
+ ? Math.max(0, (floorDisplay - defenderDisplay) * bonusCloseness * bonusMult)
209
+ : 0;
210
+ const bonusDisplay = Math.min(floorDisplay, bonusRaw);
211
+ floor.push(floorDisplay);
212
+ bonus.push(bonusDisplay > 0 ? bonusDisplay : null);
213
+ }
214
+ return [xs, floor, bonus];
215
+ }
216
+ syncRefs() {
217
+ const p = this.props;
218
+ this.defenderActive = p.defenderBidStardust > 0n;
219
+ this.defenderVal = this.toDisplay(p.defenderBidStardust);
220
+ this.knobMarks = p.chain
221
+ ? p.chain.rows.map(r => ({
222
+ atDay: r.atDay,
223
+ floorDisplay: r.floorDisplay,
224
+ source: r.source,
225
+ }))
226
+ : [];
227
+ }
228
+ mountPlot() {
229
+ this.syncRefs();
230
+ const drawKnobDots = (u) => {
231
+ const marks = this.knobMarks;
232
+ if (marks.length === 0)
233
+ return;
234
+ const ctx = u.ctx;
235
+ const yMin = u.scales.y.min;
236
+ const yMax = u.scales.y.max;
237
+ const xMin = u.scales.x.min;
238
+ const xMax = u.scales.x.max;
239
+ for (const m of marks) {
240
+ if (xMin != null && xMax != null && (m.atDay < xMin || m.atDay > xMax))
241
+ continue;
242
+ if (yMin != null && yMax != null && (m.floorDisplay < yMin || m.floorDisplay > yMax)) {
243
+ continue;
244
+ }
245
+ const cx = u.valToPos(m.atDay, 'x', true);
246
+ const cy = u.valToPos(m.floorDisplay, 'y', true);
247
+ ctx.save();
248
+ ctx.fillStyle = this.theme.knobDot;
249
+ ctx.strokeStyle = this.theme.dotStroke;
250
+ ctx.lineWidth = 1.5;
251
+ ctx.beginPath();
252
+ ctx.arc(cx, cy, 4, 0, Math.PI * 2);
253
+ ctx.fill();
254
+ ctx.stroke();
255
+ ctx.restore();
256
+ }
257
+ };
258
+ const drawKnobVerticals = (u) => {
259
+ const marks = this.knobMarks;
260
+ if (marks.length === 0)
261
+ return;
262
+ const ctx = u.ctx;
263
+ for (const m of marks) {
264
+ const cx = u.valToPos(m.atDay, 'x', true);
265
+ ctx.save();
266
+ ctx.strokeStyle = this.theme.floor;
267
+ ctx.globalAlpha = 0.35;
268
+ ctx.lineWidth = 1;
269
+ ctx.setLineDash([2, 3]);
270
+ ctx.beginPath();
271
+ ctx.moveTo(cx, u.bbox.top);
272
+ ctx.lineTo(cx, u.bbox.top + u.bbox.height);
273
+ ctx.stroke();
274
+ ctx.restore();
275
+ }
276
+ };
277
+ const drawDefenderLine = (u) => {
278
+ if (!this.defenderActive)
279
+ return;
280
+ if (this.knobMarks.length > 0)
281
+ return;
282
+ const y = this.defenderVal;
283
+ const yMin = u.scales.y.min;
284
+ const yMax = u.scales.y.max;
285
+ if (yMin == null || yMax == null)
286
+ return;
287
+ if (y < yMin || y > yMax)
288
+ return;
289
+ const cy = u.valToPos(y, 'y', true);
290
+ const ctx = u.ctx;
291
+ ctx.save();
292
+ ctx.setLineDash([2, 3]);
293
+ ctx.strokeStyle = this.theme.defenderBid;
294
+ ctx.globalAlpha = 0.7;
295
+ ctx.lineWidth = 1;
296
+ ctx.beginPath();
297
+ ctx.moveTo(u.bbox.left, cy);
298
+ ctx.lineTo(u.bbox.left + u.bbox.width, cy);
299
+ ctx.stroke();
300
+ ctx.restore();
301
+ };
302
+ const opts = {
303
+ width: this.canvasHost.clientWidth || 320,
304
+ height: 180,
305
+ padding: [10, 12, 4, 4],
306
+ legend: { show: false },
307
+ cursor: {
308
+ drag: { x: false, y: false, setScale: false },
309
+ points: { show: true, size: 6, fill: this.theme.floor, stroke: this.theme.floor },
310
+ focus: { prox: 24 },
311
+ },
312
+ scales: {
313
+ x: {
314
+ time: false,
315
+ range: () => {
316
+ const now = this.props.nowDay ?? 0;
317
+ const xStart = now > 0 ? now : 0;
318
+ return [xStart, Math.max(xStart + 0.1, this.props.activeDays)];
319
+ },
320
+ },
321
+ y: { range: (_u, _dmin, dmax) => [0, (dmax || 1) * 1.1] },
322
+ },
323
+ axes: [
324
+ {
325
+ stroke: this.theme.axis,
326
+ grid: { stroke: this.theme.grid, width: 1 },
327
+ ticks: { stroke: this.theme.grid, width: 1 },
328
+ font: '10px "JetBrains Mono", monospace',
329
+ splits: (_u, _ax, scaleMin, scaleMax) => {
330
+ const start = Math.ceil(scaleMin);
331
+ const end = Math.floor(scaleMax);
332
+ const out = [];
333
+ for (let v = start; v <= end; v++)
334
+ out.push(v);
335
+ return out;
336
+ },
337
+ values: (_u, vals) => vals.map(v => `${Math.round(v)}d`),
338
+ size: 26,
339
+ },
340
+ {
341
+ stroke: this.theme.axis,
342
+ grid: { stroke: this.theme.grid, width: 1 },
343
+ ticks: { stroke: this.theme.grid, width: 1 },
344
+ font: '10px "JetBrains Mono", monospace',
345
+ values: (_u, vals) => vals.map(v => fmt(Math.round(v))),
346
+ size: 54,
347
+ },
348
+ ],
349
+ series: [
350
+ { label: 'day' },
351
+ {
352
+ label: 'min bid',
353
+ stroke: this.theme.floor,
354
+ width: 1.5,
355
+ fill: 'rgba(34, 211, 238, 0.08)',
356
+ points: { show: false },
357
+ },
358
+ {
359
+ label: 'bonus',
360
+ stroke: this.theme.bonus,
361
+ width: 1.25,
362
+ fill: 'rgba(110, 231, 183, 0.06)',
363
+ points: { show: false },
364
+ },
365
+ ],
366
+ hooks: {
367
+ draw: [drawDefenderLine, drawKnobVerticals, drawKnobDots],
368
+ setCursor: [
369
+ (u) => {
370
+ const tip = this.tooltip;
371
+ const idx = u.cursor.idx;
372
+ const left = u.cursor.left ?? -1;
373
+ const top = u.cursor.top ?? -1;
374
+ if (idx == null || idx < 0 || left < 0 || top < 0) {
375
+ tip.style.opacity = '0';
376
+ return;
377
+ }
378
+ const xs = u.data[0];
379
+ const floorYs = u.data[1];
380
+ const bonusYs = u.data[2];
381
+ const day = xs[idx];
382
+ const floorVal = floorYs[idx] ?? 0;
383
+ const bonusVal = bonusYs[idx] ?? 0;
384
+ const cur = this.props.challengeCur;
385
+ const dayCls = this.props.classNames?.tooltipDay ?? 'calc-chart-tooltip-day';
386
+ const rowCls = this.props.classNames?.tooltipRow ?? 'calc-chart-tooltip-row';
387
+ tip.innerHTML = `
388
+ <div class="${dayCls}">day ${day.toFixed(2)}</div>
389
+ <div class="${rowCls}"><span class="dot cyan"></span> min bid <strong>${fmt(floorVal)}</strong> <span class="u">${cur}</span></div>
390
+ <div class="${rowCls}"><span class="dot mint"></span> bonus <strong>${fmt(bonusVal)}</strong> <span class="u">${cur}</span></div>
391
+ `;
392
+ const wrapW = u.bbox.left + u.bbox.width;
393
+ const tipW = tip.offsetWidth || 140;
394
+ const flipLeft = left + 12 + tipW > wrapW;
395
+ tip.style.left = flipLeft ? `${left - 12 - tipW}px` : `${left + 12}px`;
396
+ tip.style.top = `${Math.max(0, top - 8)}px`;
397
+ tip.style.opacity = '1';
398
+ },
399
+ ],
400
+ },
401
+ };
402
+ this.plot = new uplot_1.default(opts, this.computeData(), this.canvasHost);
403
+ this.resizeObs = new ResizeObserver(() => {
404
+ const p = this.plot;
405
+ if (!p)
406
+ return;
407
+ p.setSize({ width: this.canvasHost.clientWidth, height: 180 });
408
+ });
409
+ this.resizeObs.observe(this.canvasHost);
410
+ }
411
+ applyData() {
412
+ this.syncRefs();
413
+ if (!this.plot)
414
+ return;
415
+ this.plot.setData(this.computeData());
416
+ }
417
+ }
418
+ exports.MinBidChart = MinBidChart;
419
+ //# sourceMappingURL=MinBidChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MinBidChart.js","sourceRoot":"","sources":["../../../src/calculator/MinBidChart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * @purpose Minimal DOM helper used by the vanilla calculator components
4
+ * to build element trees without JSX. Sets className + text + appends
5
+ * children in one call.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.el = el;
9
+ exports.clearChildren = clearChildren;
10
+ function el(tag, props, children) {
11
+ const node = document.createElement(tag);
12
+ if (props?.className)
13
+ node.className = props.className;
14
+ if (props?.text != null)
15
+ node.textContent = props.text;
16
+ if (props?.title)
17
+ node.title = props.title;
18
+ if (props?.ariaLabel)
19
+ node.setAttribute('aria-label', props.ariaLabel);
20
+ if (props?.attrs) {
21
+ for (const k of Object.keys(props.attrs))
22
+ node.setAttribute(k, props.attrs[k]);
23
+ }
24
+ if (props?.style)
25
+ Object.assign(node.style, props.style);
26
+ if (children) {
27
+ for (const c of children) {
28
+ if (c == null)
29
+ continue;
30
+ node.append(typeof c === 'string' ? document.createTextNode(c) : c);
31
+ }
32
+ }
33
+ return node;
34
+ }
35
+ function clearChildren(node) {
36
+ while (node.firstChild)
37
+ node.removeChild(node.firstChild);
38
+ }
39
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../../src/calculator/dom.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAWH,gBAqBC;AAED,sCAEC;AAzBD,SAAgB,EAAE,CAChB,GAAM,EACN,KAAe,EACf,QAAyD;IAEzD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACvD,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI;QAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;IACvD,IAAI,KAAK,EAAE,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3C,IAAI,KAAK,EAAE,SAAS;QAAE,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACvE,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,KAAK,EAAE,KAAK;QAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,IAAI;gBAAE,SAAS;YACxB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,aAAa,CAAC,IAAa;IACzC,OAAO,IAAI,CAAC,UAAU;QAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * @purpose Typed event emitter — replaces React callback props in the
4
+ * vanilla calculator components. Subscribers register via `.on(event,
5
+ * handler)` and receive an unsubscribe thunk.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.Emitter = void 0;
9
+ class Emitter {
10
+ listeners = {};
11
+ on(event, handler) {
12
+ let set = this.listeners[event];
13
+ if (!set) {
14
+ set = new Set();
15
+ this.listeners[event] = set;
16
+ }
17
+ set.add(handler);
18
+ return () => {
19
+ set.delete(handler);
20
+ };
21
+ }
22
+ emit(event, ...args) {
23
+ const set = this.listeners[event];
24
+ if (!set)
25
+ return;
26
+ for (const h of set)
27
+ h(...args);
28
+ }
29
+ clear() {
30
+ for (const k of Object.keys(this.listeners)) {
31
+ delete this.listeners[k];
32
+ }
33
+ }
34
+ }
35
+ exports.Emitter = Emitter;
36
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../../src/calculator/emitter.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAIH,MAAa,OAAO;IACD,SAAS,GAAmC,EAAE,CAAC;IAEhE,EAAE,CAAoB,KAAQ,EAAE,OAAa;QAC3C,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAQ,CAAC;YACtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;QAC9B,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjB,OAAO,GAAG,EAAE;YACV,GAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAoB,KAAQ,EAAE,GAAG,IAAsB;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,KAAK,MAAM,CAAC,IAAI,GAAG;YAAG,CAA0C,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK;QACH,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAY,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF;AA1BD,0BA0BC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * @purpose Framework-agnostic calculator components for the SRSLY
4
+ * reservation system. Class-based lifecycle (constructor / update /
5
+ * destroy) — works in any environment with a DOM. React consumers
6
+ * should prefer `@sly-rentals/core/react` which wraps these classes.
7
+ *
8
+ * Pair with `@sly-rentals/core/react/styles.css` for the default
9
+ * SRSLY look, or supply your own classNames / theme.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Emitter = 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
+ var emitter_1 = require("./emitter");
19
+ Object.defineProperty(exports, "Emitter", { enumerable: true, get: function () { return emitter_1.Emitter; } });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/calculator/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,6CAMuB;AALrB,0GAAA,WAAW,OAAA;AACX,0HAAA,2BAA2B,OAAA;AAM7B,qDAK2B;AAJzB,kHAAA,eAAe,OAAA;AAMjB,qCAAmD;AAA1C,kGAAA,OAAO,OAAA"}
@@ -6,14 +6,63 @@
6
6
  * Mirrors on-chain constants in `rust/programs/srsly/src/instructions/contract_thread.rs`.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.SPL_ATA_SIZE = exports.SECONDS_PER_DAY = exports.PER_TICK_LAMPORTS = exports.TX_BASE_FEE_LAMPORTS = exports.DEFAULT_EXECUTION_BUDGET = exports.MINIMUM_THREAD_FUNDING = void 0;
9
+ exports.SPL_ATA_SIZE = exports.SECONDS_PER_DAY = exports.PER_TICK_LAMPORTS = exports.TX_BASE_FEE_LAMPORTS = exports.DEFAULT_EXECUTION_BUDGET = exports.SRSLY_THREAD_FIBER_COUNT = exports.FIBER_STATE_RENT_LAMPORTS = exports.MINIMUM_THREAD_FUNDING = void 0;
10
+ exports.computeThreadLamports = computeThreadLamports;
10
11
  /**
11
- * Infrastructure base auto-added by the SDK when creating a contract thread.
12
- * Covers thread rent + 3 fiber rents (~0.034 SOL) plus a ~0.006 SOL buffer.
12
+ * Floor for the `amount` field passed into `antegen::create_thread`.
13
13
  *
14
- * On-chain minimum: `rust/programs/srsly/src/instructions/contract_thread.rs:119`.
14
+ * Matches the on-chain `MINIMUM_THREAD_LAMPORTS` enforcement in
15
+ * `rust/programs/srsly/src/instructions/contract_thread.rs:119`.
16
+ * Callers should NOT use this constant directly — prefer
17
+ * `computeThreadLamports(executionBudget)` which sizes the funding
18
+ * to what the contract's actual fiber set + execution budget needs
19
+ * and only falls back to this floor when the computed value is
20
+ * smaller (e.g. weekly/monthly contracts).
15
21
  */
16
- exports.MINIMUM_THREAD_FUNDING = 40000000n;
22
+ exports.MINIMUM_THREAD_FUNDING = 30000000n;
23
+ /**
24
+ * Rent-exempt minimum for one antegen `FiberState` account (1092
25
+ * bytes — 32 thread + 4+1024 compiled_instruction + 8 last_executed
26
+ * + 8 exec_count + 8 priority_fee + 8 discriminator). The thread
27
+ * pre-funds this for every fiber it'll ever hold so lazy
28
+ * `update_fiber(init_if_needed)` calls can pay rent from the
29
+ * thread's own balance.
30
+ *
31
+ * Hardcoded against antegen-fiber-program v5.0.7. If Antegen
32
+ * changes the struct, update here.
33
+ */
34
+ exports.FIBER_STATE_RENT_LAMPORTS = 8500000n;
35
+ /**
36
+ * Number of fibers the srsly contract thread provisions over its
37
+ * lifetime. Currently 2:
38
+ * • Fiber 0 — controller (`contract_process`), created inline at
39
+ * `thread_create`.
40
+ * • Fiber 1 — close fiber (`rental_close` ix). Created lazily on
41
+ * the first `rental_accept` / `rental_reserve`, with its
42
+ * instruction payload swapped between accept and reserve
43
+ * contexts as needed (same slot, different content).
44
+ *
45
+ * Bump this if a future contract design adds another fiber.
46
+ */
47
+ exports.SRSLY_THREAD_FIBER_COUNT = 2n;
48
+ /**
49
+ * Total lamports to pass into `antegen::create_thread.amount`.
50
+ *
51
+ * Sized to the contract's actual needs:
52
+ * • Rent for every fiber the thread will hold (pre-funded from
53
+ * the thread's balance for lazy creation).
54
+ * • Execution budget — drained per tick at `PER_TICK_LAMPORTS`.
55
+ *
56
+ * Floors at `MINIMUM_THREAD_FUNDING` so the on-chain validation
57
+ * passes. For @daily/@weekly/@monthly contracts the computed
58
+ * value is below the floor so we still pay the 30M; for `@hourly`
59
+ * contracts the execution budget alone exceeds the floor and we
60
+ * pass the actual required amount.
61
+ */
62
+ function computeThreadLamports(executionBudget) {
63
+ const computed = exports.FIBER_STATE_RENT_LAMPORTS * exports.SRSLY_THREAD_FIBER_COUNT + executionBudget;
64
+ return computed > exports.MINIMUM_THREAD_FUNDING ? computed : exports.MINIMUM_THREAD_FUNDING;
65
+ }
17
66
  /**
18
67
  * Default execution budget for contract thread ticks when caller does not
19
68
  * specify one. 0.00219 SOL funds ~365 ticks at 0.000006 SOL each
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cost/constants.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH;;;;;GAKG;AACU,QAAA,sBAAsB,GAAG,SAAW,CAAC;AAElD;;;;GAIG;AACU,QAAA,wBAAwB,GAAG,QAAU,CAAC;AAEnD,qEAAqE;AACxD,QAAA,oBAAoB,GAAG,KAAM,CAAC;AAE3C;;;GAGG;AACU,QAAA,iBAAiB,GAAG,KAAM,CAAC;AAExC,+DAA+D;AAClD,QAAA,eAAe,GAAG,MAAO,CAAC;AAEvC,qDAAqD;AACxC,QAAA,YAAY,GAAG,GAAG,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cost/constants.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAwDH,sDAGC;AAzDD;;;;;;;;;;GAUG;AACU,QAAA,sBAAsB,GAAG,SAAW,CAAC;AAElD;;;;;;;;;;GAUG;AACU,QAAA,yBAAyB,GAAG,QAAU,CAAC;AAEpD;;;;;;;;;;;GAWG;AACU,QAAA,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;;;;;;;;;;;;GAaG;AACH,SAAgB,qBAAqB,CAAC,eAAuB;IAC3D,MAAM,QAAQ,GAAG,iCAAyB,GAAG,gCAAwB,GAAG,eAAe,CAAC;IACxF,OAAO,QAAQ,GAAG,8BAAsB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,8BAAsB,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACU,QAAA,wBAAwB,GAAG,QAAU,CAAC;AAEnD,qEAAqE;AACxD,QAAA,oBAAoB,GAAG,KAAM,CAAC;AAE3C;;;GAGG;AACU,QAAA,iBAAiB,GAAG,KAAM,CAAC;AAExC,+DAA+D;AAClD,QAAA,eAAe,GAAG,MAAO,CAAC;AAEvC,qDAAqD;AACxC,QAAA,YAAY,GAAG,GAAG,CAAC"}