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