@secretkeylabs/stacks-tools 0.2.0 → 0.3.0-6dd40b1

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 (96) hide show
  1. package/dist/index.cjs +1088 -0
  2. package/dist/index.d.cts +661 -0
  3. package/dist/index.d.ts +661 -2
  4. package/dist/index.js +1050 -3
  5. package/package.json +13 -5
  6. package/dist/index.js.map +0 -1
  7. package/dist/pox4-api/burn-height-to-reward-cycle.d.ts +0 -7
  8. package/dist/pox4-api/burn-height-to-reward-cycle.js +0 -6
  9. package/dist/pox4-api/burn-height-to-reward-cycle.js.map +0 -1
  10. package/dist/pox4-api/current-pox-reward-cycle.d.ts +0 -1
  11. package/dist/pox4-api/current-pox-reward-cycle.js +0 -3
  12. package/dist/pox4-api/current-pox-reward-cycle.js.map +0 -1
  13. package/dist/pox4-api/get-stacker-info.d.ts +0 -1
  14. package/dist/pox4-api/get-stacker-info.js +0 -3
  15. package/dist/pox4-api/get-stacker-info.js.map +0 -1
  16. package/dist/pox4-api/reward-cycle-to-burn-height.d.ts +0 -1
  17. package/dist/pox4-api/reward-cycle-to-burn-height.js +0 -3
  18. package/dist/pox4-api/reward-cycle-to-burn-height.js.map +0 -1
  19. package/dist/queries/get-signer-total-locked.d.ts +0 -18
  20. package/dist/queries/get-signer-total-locked.js +0 -59
  21. package/dist/queries/get-signer-total-locked.js.map +0 -1
  22. package/dist/queries/index.d.ts +0 -4
  23. package/dist/queries/index.js +0 -5
  24. package/dist/queries/index.js.map +0 -1
  25. package/dist/stacks-api/accounts/balances.d.ts +0 -34
  26. package/dist/stacks-api/accounts/balances.js +0 -70
  27. package/dist/stacks-api/accounts/balances.js.map +0 -1
  28. package/dist/stacks-api/accounts/index.d.ts +0 -4
  29. package/dist/stacks-api/accounts/index.js +0 -5
  30. package/dist/stacks-api/accounts/index.js.map +0 -1
  31. package/dist/stacks-api/blocks/get-block.d.ts +0 -29
  32. package/dist/stacks-api/blocks/get-block.js +0 -62
  33. package/dist/stacks-api/blocks/get-block.js.map +0 -1
  34. package/dist/stacks-api/blocks/index.d.ts +0 -4
  35. package/dist/stacks-api/blocks/index.js +0 -5
  36. package/dist/stacks-api/blocks/index.js.map +0 -1
  37. package/dist/stacks-api/index.d.ts +0 -28
  38. package/dist/stacks-api/index.js +0 -17
  39. package/dist/stacks-api/index.js.map +0 -1
  40. package/dist/stacks-api/info/core-api.d.ts +0 -21
  41. package/dist/stacks-api/info/core-api.js +0 -55
  42. package/dist/stacks-api/info/core-api.js.map +0 -1
  43. package/dist/stacks-api/info/index.d.ts +0 -6
  44. package/dist/stacks-api/info/index.js +0 -7
  45. package/dist/stacks-api/info/index.js.map +0 -1
  46. package/dist/stacks-api/info/pox-details.d.ts +0 -59
  47. package/dist/stacks-api/info/pox-details.js +0 -92
  48. package/dist/stacks-api/info/pox-details.js.map +0 -1
  49. package/dist/stacks-api/proof-of-transfer/cycle.d.ts +0 -16
  50. package/dist/stacks-api/proof-of-transfer/cycle.js +0 -50
  51. package/dist/stacks-api/proof-of-transfer/cycle.js.map +0 -1
  52. package/dist/stacks-api/proof-of-transfer/cycles.d.ts +0 -37
  53. package/dist/stacks-api/proof-of-transfer/cycles.js +0 -61
  54. package/dist/stacks-api/proof-of-transfer/cycles.js.map +0 -1
  55. package/dist/stacks-api/proof-of-transfer/index.d.ts +0 -10
  56. package/dist/stacks-api/proof-of-transfer/index.js +0 -11
  57. package/dist/stacks-api/proof-of-transfer/index.js.map +0 -1
  58. package/dist/stacks-api/proof-of-transfer/signers-in-cycle.d.ts +0 -45
  59. package/dist/stacks-api/proof-of-transfer/signers-in-cycle.js +0 -66
  60. package/dist/stacks-api/proof-of-transfer/signers-in-cycle.js.map +0 -1
  61. package/dist/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.d.ts +0 -34
  62. package/dist/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.js +0 -59
  63. package/dist/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.js.map +0 -1
  64. package/dist/stacks-api/smart-contracts/index.d.ts +0 -4
  65. package/dist/stacks-api/smart-contracts/index.js +0 -5
  66. package/dist/stacks-api/smart-contracts/index.js.map +0 -1
  67. package/dist/stacks-api/smart-contracts/read-only.d.ts +0 -19
  68. package/dist/stacks-api/smart-contracts/read-only.js +0 -50
  69. package/dist/stacks-api/smart-contracts/read-only.js.map +0 -1
  70. package/dist/stacks-api/stacking-pool/index.d.ts +0 -4
  71. package/dist/stacks-api/stacking-pool/index.js +0 -5
  72. package/dist/stacks-api/stacking-pool/index.js.map +0 -1
  73. package/dist/stacks-api/stacking-pool/members.d.ts +0 -34
  74. package/dist/stacks-api/stacking-pool/members.js +0 -64
  75. package/dist/stacks-api/stacking-pool/members.js.map +0 -1
  76. package/dist/stacks-api/transactions/address-transactions.d.ts +0 -487
  77. package/dist/stacks-api/transactions/address-transactions.js +0 -75
  78. package/dist/stacks-api/transactions/address-transactions.js.map +0 -1
  79. package/dist/stacks-api/transactions/get-transaction.d.ts +0 -8
  80. package/dist/stacks-api/transactions/get-transaction.js +0 -42
  81. package/dist/stacks-api/transactions/get-transaction.js.map +0 -1
  82. package/dist/stacks-api/transactions/index.d.ts +0 -6
  83. package/dist/stacks-api/transactions/index.js +0 -7
  84. package/dist/stacks-api/transactions/index.js.map +0 -1
  85. package/dist/stacks-api/transactions/schemas.d.ts +0 -327
  86. package/dist/stacks-api/transactions/schemas.js +0 -85
  87. package/dist/stacks-api/transactions/schemas.js.map +0 -1
  88. package/dist/stacks-api/types.d.ts +0 -26
  89. package/dist/stacks-api/types.js +0 -8
  90. package/dist/stacks-api/types.js.map +0 -1
  91. package/dist/utils/call-rate-limited-api.d.ts +0 -8
  92. package/dist/utils/call-rate-limited-api.js +0 -28
  93. package/dist/utils/call-rate-limited-api.js.map +0 -1
  94. package/dist/utils/safe.d.ts +0 -10
  95. package/dist/utils/safe.js +0 -31
  96. package/dist/utils/safe.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,3 +1,1050 @@
1
- export { stacksApi } from "./stacks-api/index.js";
2
- export { queries } from "./queries/index.js";
3
- //# sourceMappingURL=index.js.map
1
+ // src/utils/safe.ts
2
+ function success(data) {
3
+ return [null, data];
4
+ }
5
+ function error(error2) {
6
+ return [error2, null];
7
+ }
8
+ async function safePromise(promise) {
9
+ try {
10
+ return success(await promise);
11
+ } catch (e) {
12
+ return error({
13
+ name: "SafePromiseError",
14
+ message: "Safe promise rejected.",
15
+ data: e
16
+ });
17
+ }
18
+ }
19
+
20
+ // src/stacks-api/accounts/balances.ts
21
+ import * as v from "valibot";
22
+ var responseSchema = v.object({
23
+ stx: v.object({
24
+ balance: v.string(),
25
+ total_sent: v.string(),
26
+ total_received: v.string(),
27
+ total_fees_sent: v.string(),
28
+ total_miner_rewards_received: v.string(),
29
+ lock_tx_id: v.string(),
30
+ locked: v.string(),
31
+ lock_height: v.number(),
32
+ burnchain_lock_height: v.number(),
33
+ burnchain_unlock_height: v.number()
34
+ }),
35
+ fungible_tokens: v.record(
36
+ v.string(),
37
+ v.object({
38
+ balance: v.string(),
39
+ total_sent: v.string(),
40
+ total_received: v.string()
41
+ })
42
+ ),
43
+ non_fungible_tokens: v.record(
44
+ v.string(),
45
+ v.object({
46
+ count: v.string(),
47
+ total_sent: v.string(),
48
+ total_received: v.string()
49
+ })
50
+ )
51
+ });
52
+ async function balances(opts) {
53
+ const search = new URLSearchParams();
54
+ if (opts.unanchored) search.append("unanchored", "true");
55
+ if (opts.untilBlock) search.append("until_block", opts.untilBlock.toString());
56
+ const init = {};
57
+ if (opts.apiKeyConfig) {
58
+ init.headers = {
59
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
60
+ };
61
+ }
62
+ const endpoint = `${opts.baseUrl}/extended/v1/address/${opts.principal}/balances?${search}`;
63
+ const res = await fetch(endpoint, init);
64
+ if (!res.ok) {
65
+ return error({
66
+ name: "FetchBalancesError",
67
+ message: "Failed to fetch balances.",
68
+ data: {
69
+ status: res.status,
70
+ statusText: res.statusText,
71
+ bodyParseResult: await safePromise(res.json())
72
+ }
73
+ });
74
+ }
75
+ const [jsonError, data] = await safePromise(res.json());
76
+ if (jsonError) {
77
+ return error({
78
+ name: "ParseBodyError",
79
+ message: "Failed to parse response body as JSON.",
80
+ data: jsonError
81
+ });
82
+ }
83
+ const validationResult = v.safeParse(responseSchema, data);
84
+ if (!validationResult.success) {
85
+ return error({
86
+ name: "ValidateDataError",
87
+ message: "Failed to validate data.",
88
+ data: validationResult
89
+ });
90
+ }
91
+ return success(validationResult.output);
92
+ }
93
+
94
+ // src/stacks-api/accounts/index.ts
95
+ var accounts = {
96
+ balances
97
+ };
98
+
99
+ // src/stacks-api/types.ts
100
+ import * as v2 from "valibot";
101
+ var baseListResponseSchema = v2.object({
102
+ limit: v2.number(),
103
+ offset: v2.number(),
104
+ total: v2.number(),
105
+ results: v2.array(v2.unknown())
106
+ });
107
+
108
+ // src/stacks-api/blocks/get-block.ts
109
+ import * as v3 from "valibot";
110
+ var responseSchema2 = v3.object({
111
+ canonical: v3.boolean(),
112
+ height: v3.number(),
113
+ hash: v3.string(),
114
+ block_time: v3.number(),
115
+ block_time_iso: v3.string(),
116
+ index_block_hash: v3.string(),
117
+ parent_block_hash: v3.string(),
118
+ parent_index_block_hash: v3.string(),
119
+ burn_block_time: v3.number(),
120
+ burn_block_time_iso: v3.string(),
121
+ burn_block_hash: v3.string(),
122
+ burn_block_height: v3.number(),
123
+ miner_txid: v3.string(),
124
+ tx_count: v3.number(),
125
+ execution_cost_read_count: v3.number(),
126
+ execution_cost_read_length: v3.number(),
127
+ execution_cost_runtime: v3.number(),
128
+ execution_cost_write_count: v3.number(),
129
+ execution_cost_write_length: v3.number()
130
+ });
131
+ async function getBlock(opts) {
132
+ const init = {};
133
+ if (opts.apiKeyConfig) {
134
+ init.headers = {
135
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
136
+ };
137
+ }
138
+ const res = await fetch(
139
+ `${opts.baseUrl}/extended/v2/blocks/${opts.heightOrHash}`,
140
+ init
141
+ );
142
+ if (!res.ok) {
143
+ return error({
144
+ name: "FetchBlockError",
145
+ message: "Failed to fetch block.",
146
+ data: {
147
+ status: res.status,
148
+ statusText: res.statusText,
149
+ bodyParseResult: await safePromise(res.json())
150
+ }
151
+ });
152
+ }
153
+ const [jsonError, data] = await safePromise(res.json());
154
+ if (jsonError) {
155
+ return error({
156
+ name: "ParseBodyError",
157
+ message: "Failed to parse body.",
158
+ data: jsonError
159
+ });
160
+ }
161
+ const validationResult = v3.safeParse(responseSchema2, data);
162
+ if (!validationResult.success) {
163
+ return error({
164
+ name: "ValidateDataError",
165
+ message: "Failed to validate data.",
166
+ data: validationResult
167
+ });
168
+ }
169
+ return success(validationResult.output);
170
+ }
171
+
172
+ // src/stacks-api/blocks/index.ts
173
+ var blocks = {
174
+ getBlock
175
+ };
176
+
177
+ // src/stacks-api/info/core-api.ts
178
+ import * as v4 from "valibot";
179
+ var CoreApiResponseSchema = v4.object({
180
+ peer_version: v4.number(),
181
+ pox_consensus: v4.string(),
182
+ burn_block_height: v4.number(),
183
+ stable_pox_consensus: v4.string(),
184
+ stable_burn_block_height: v4.number(),
185
+ server_version: v4.string(),
186
+ network_id: v4.number(),
187
+ parent_network_id: v4.number(),
188
+ stacks_tip_height: v4.number(),
189
+ stacks_tip: v4.string(),
190
+ stacks_tip_consensus_hash: v4.string(),
191
+ unanchored_tip: v4.string(),
192
+ exit_at_block_height: v4.number()
193
+ });
194
+ async function coreApi(apiOpts) {
195
+ const init = {};
196
+ if (apiOpts.apiKeyConfig) {
197
+ init.headers = {
198
+ [apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
199
+ };
200
+ }
201
+ const res = await fetch(`${apiOpts.baseUrl}/v2/info`, init);
202
+ if (!res.ok) {
203
+ return error({
204
+ name: "FetchCoreApiError",
205
+ message: "Failed to fetch.",
206
+ data: {
207
+ status: res.status,
208
+ statusText: res.statusText,
209
+ bodyParseResult: await safePromise(res.json())
210
+ }
211
+ });
212
+ }
213
+ const [parseBodyError, data] = await safePromise(res.json());
214
+ if (parseBodyError) {
215
+ return error({
216
+ name: "ParseBodyError",
217
+ message: "Failed to parse response body as JSON.",
218
+ data: parseBodyError
219
+ });
220
+ }
221
+ const validationResult = v4.safeParse(CoreApiResponseSchema, data);
222
+ if (!validationResult.success) {
223
+ return error({
224
+ name: "ValidateDataError",
225
+ message: "Failed to validate data.",
226
+ data: validationResult
227
+ });
228
+ }
229
+ return success(validationResult.output);
230
+ }
231
+
232
+ // src/stacks-api/info/pox-details.ts
233
+ import * as v5 from "valibot";
234
+ var poxDetailsResponseSchema = v5.object({
235
+ contract_id: v5.string(),
236
+ pox_activation_threshold_ustx: v5.number(),
237
+ first_burnchain_block_height: v5.number(),
238
+ current_burnchain_block_height: v5.number(),
239
+ prepare_phase_block_length: v5.number(),
240
+ reward_phase_block_length: v5.number(),
241
+ reward_slots: v5.number(),
242
+ rejection_fraction: v5.null(),
243
+ total_liquid_supply_ustx: v5.number(),
244
+ current_cycle: v5.object({
245
+ id: v5.number(),
246
+ min_threshold_ustx: v5.number(),
247
+ stacked_ustx: v5.number(),
248
+ is_pox_active: v5.boolean()
249
+ }),
250
+ next_cycle: v5.object({
251
+ id: v5.number(),
252
+ min_threshold_ustx: v5.number(),
253
+ min_increment_ustx: v5.number(),
254
+ stacked_ustx: v5.number(),
255
+ prepare_phase_start_block_height: v5.number(),
256
+ blocks_until_prepare_phase: v5.number(),
257
+ reward_phase_start_block_height: v5.number(),
258
+ blocks_until_reward_phase: v5.number(),
259
+ ustx_until_pox_rejection: v5.null()
260
+ }),
261
+ epochs: v5.array(
262
+ v5.object({
263
+ epoch_id: v5.string(),
264
+ start_height: v5.number(),
265
+ end_height: v5.number(),
266
+ block_limit: v5.object({
267
+ write_length: v5.number(),
268
+ write_count: v5.number(),
269
+ read_length: v5.number(),
270
+ read_count: v5.number(),
271
+ runtime: v5.number()
272
+ }),
273
+ network_epoch: v5.number()
274
+ })
275
+ ),
276
+ min_amount_ustx: v5.number(),
277
+ prepare_cycle_length: v5.number(),
278
+ reward_cycle_id: v5.number(),
279
+ reward_cycle_length: v5.number(),
280
+ rejection_votes_left_required: v5.null(),
281
+ next_reward_cycle_in: v5.number(),
282
+ contract_versions: v5.array(
283
+ v5.object({
284
+ contract_id: v5.string(),
285
+ activation_burnchain_block_height: v5.number(),
286
+ first_reward_cycle_id: v5.number()
287
+ })
288
+ )
289
+ });
290
+ async function poxDetails(args) {
291
+ const init = {};
292
+ if (args.apiKeyConfig) {
293
+ init.headers = {
294
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
295
+ };
296
+ }
297
+ const res = await fetch(`${args.baseUrl}/v2/pox`, init);
298
+ if (!res.ok) {
299
+ return error({
300
+ name: "FetchPoxDetailsError",
301
+ message: "Failed to fetch pox details.",
302
+ data: {
303
+ status: res.status,
304
+ statusText: res.statusText,
305
+ bodyParseResult: await safePromise(res.json())
306
+ }
307
+ });
308
+ }
309
+ const [jsonParseError, data] = await safePromise(res.json());
310
+ if (jsonParseError) {
311
+ return error({
312
+ name: "ParseBodyError",
313
+ message: "Failed to parse pox details response.",
314
+ data: jsonParseError
315
+ });
316
+ }
317
+ const validationResult = v5.safeParse(poxDetailsResponseSchema, data);
318
+ if (!validationResult.success) {
319
+ return error({
320
+ name: "ValidateDataError",
321
+ message: "Failed to parse pox details response.",
322
+ data: validationResult
323
+ });
324
+ }
325
+ return success(validationResult.output);
326
+ }
327
+
328
+ // src/stacks-api/info/index.ts
329
+ var info = {
330
+ coreApi,
331
+ poxDetails
332
+ };
333
+
334
+ // src/stacks-api/proof-of-transfer/cycle.ts
335
+ import * as v6 from "valibot";
336
+ var responseSchema3 = v6.object({
337
+ block_height: v6.number(),
338
+ index_block_hash: v6.string(),
339
+ cycle_number: v6.number(),
340
+ total_weight: v6.number(),
341
+ total_stacked_amount: v6.string(),
342
+ total_signers: v6.number()
343
+ });
344
+ async function cycle(opts) {
345
+ const init = {};
346
+ if (opts.apiKeyConfig) {
347
+ init.headers = {
348
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
349
+ };
350
+ }
351
+ const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}`;
352
+ const res = await fetch(endpoint, init);
353
+ if (!res.ok) {
354
+ return error({
355
+ name: "FetchCycleError",
356
+ message: "Failed to fetch cycle.",
357
+ data: {
358
+ endpoint,
359
+ status: res.status,
360
+ statusText: res.statusText,
361
+ bodyParseResult: await safePromise(res.json())
362
+ }
363
+ });
364
+ }
365
+ const [jsonError, data] = await safePromise(res.json());
366
+ if (jsonError) {
367
+ return error({
368
+ name: "ParseBodyError",
369
+ message: "Failed to parse response body as JSON.",
370
+ data: jsonError
371
+ });
372
+ }
373
+ const validationResult = v6.safeParse(responseSchema3, data);
374
+ if (!validationResult.success) {
375
+ return error({
376
+ name: "ValidateDataError",
377
+ message: "Failed to validate data.",
378
+ data: validationResult
379
+ });
380
+ }
381
+ return success(validationResult.output);
382
+ }
383
+
384
+ // src/stacks-api/proof-of-transfer/cycles.ts
385
+ import * as v7 from "valibot";
386
+ var cycleInfoSchema = v7.object({
387
+ block_height: v7.number(),
388
+ index_block_hash: v7.string(),
389
+ cycle_number: v7.number(),
390
+ total_weight: v7.number(),
391
+ total_stacked_amount: v7.string(),
392
+ total_signers: v7.number()
393
+ });
394
+ var resultsSchema = v7.array(cycleInfoSchema);
395
+ var cyclesResponseSchema = v7.object({
396
+ ...baseListResponseSchema.entries,
397
+ results: resultsSchema
398
+ });
399
+ async function cycles(args) {
400
+ const search = new URLSearchParams();
401
+ if (args.limit) search.append("limit", args.limit.toString());
402
+ if (args.offset) search.append("offset", args.offset.toString());
403
+ const init = {};
404
+ if (args.apiKeyConfig) {
405
+ init.headers = {
406
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
407
+ };
408
+ }
409
+ const endpoint = `${args.baseUrl}/extended/v2/pox/cycles`;
410
+ const res = await fetch(endpoint, init);
411
+ if (!res.ok) {
412
+ return error({
413
+ name: "FetchCyclesError",
414
+ message: "Failed to fetch cycles.",
415
+ data: {
416
+ endpoint,
417
+ status: res.status,
418
+ statusText: res.statusText,
419
+ bodyParseResult: await safePromise(res.json())
420
+ }
421
+ });
422
+ }
423
+ const [jsonError, data] = await safePromise(res.json());
424
+ if (jsonError) {
425
+ return error({
426
+ name: "ParseBodyError",
427
+ message: "Failed to parse response body as JSON.",
428
+ data: jsonError
429
+ });
430
+ }
431
+ const validationResult = v7.safeParse(cyclesResponseSchema, data);
432
+ if (!validationResult.success) {
433
+ return error({
434
+ name: "ValidateDataError",
435
+ message: "Failed to validate response data.",
436
+ data: validationResult
437
+ });
438
+ }
439
+ return success(validationResult.output);
440
+ }
441
+
442
+ // src/stacks-api/proof-of-transfer/signer-in-cycle.ts
443
+ import * as v8 from "valibot";
444
+ var signerInCycleResponseSchema = v8.object({
445
+ signing_key: v8.string(),
446
+ signer_address: v8.string(),
447
+ weight: v8.number(),
448
+ stacked_amount: v8.string(),
449
+ weight_percent: v8.number(),
450
+ stacked_amount_percent: v8.number(),
451
+ solo_stacker_count: v8.number(),
452
+ pooled_stacker_count: v8.number()
453
+ });
454
+ async function signerInCycle(args) {
455
+ const init = {};
456
+ if (args.apiKeyConfig) {
457
+ init.headers = {
458
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
459
+ };
460
+ }
461
+ const signerPublicKey = args.signerPublicKey.startsWith("0x") ? args.signerPublicKey : `0x${args.signerPublicKey}`;
462
+ const endpoint = `${args.baseUrl}/extended/v2/pox/cycles/${args.cycleId}/signers/${signerPublicKey}`;
463
+ const res = await fetch(endpoint, init);
464
+ if (!res.ok) {
465
+ return error({
466
+ name: "FetchSignerInCycleError",
467
+ message: "Failed to fetch signer in cycle.",
468
+ data: {
469
+ status: res.status,
470
+ statusText: res.statusText
471
+ }
472
+ });
473
+ }
474
+ const [jsonError, data] = await safePromise(res.json());
475
+ if (jsonError) {
476
+ return error({
477
+ name: "ParseBodyError",
478
+ message: "Failed to parse response body.",
479
+ data: {
480
+ signerPublicKey: args.signerPublicKey,
481
+ cycleId: args.cycleId,
482
+ jsonError
483
+ }
484
+ });
485
+ }
486
+ const validationResult = v8.safeParse(signerInCycleResponseSchema, data);
487
+ if (!validationResult.success) {
488
+ return error({
489
+ name: "ValidateDataError",
490
+ message: "Failed to validate response data.",
491
+ data: validationResult.issues
492
+ });
493
+ }
494
+ return success(validationResult.output);
495
+ }
496
+
497
+ // src/stacks-api/proof-of-transfer/signers-in-cycle.ts
498
+ import * as v9 from "valibot";
499
+ var signerSchema = v9.object({
500
+ signing_key: v9.string(),
501
+ signer_address: v9.string(),
502
+ weight: v9.number(),
503
+ stacked_amount: v9.string(),
504
+ weight_percent: v9.number(),
505
+ stacked_amount_percent: v9.number(),
506
+ pooled_stacker_count: v9.number(),
507
+ solo_stacker_count: v9.number()
508
+ });
509
+ var resultsSchema2 = v9.array(signerSchema);
510
+ var signersResponseSchema = v9.object({
511
+ ...baseListResponseSchema.entries,
512
+ results: resultsSchema2
513
+ });
514
+ async function signersInCycle(args) {
515
+ const search = new URLSearchParams();
516
+ if (args.limit) search.append("limit", args.limit.toString());
517
+ if (args.offset) search.append("offset", args.offset.toString());
518
+ const init = {};
519
+ if (args.apiKeyConfig) {
520
+ init.headers = {
521
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
522
+ };
523
+ }
524
+ const endpoint = `${args.baseUrl}/extended/v2/pox/cycles/${args.cycleNumber}/signers`;
525
+ const res = await fetch(endpoint, init);
526
+ if (!res.ok) {
527
+ return error({
528
+ name: "FetchSignersError",
529
+ message: "Failed to fetch signers.",
530
+ data: {
531
+ endpoint,
532
+ status: res.status,
533
+ statusText: res.statusText,
534
+ bodyParseResult: await safePromise(res.json())
535
+ }
536
+ });
537
+ }
538
+ const [jsonError, data] = await safePromise(res.json());
539
+ if (jsonError) {
540
+ return error({
541
+ name: "ParseBodyError",
542
+ message: "Failed to parse response body as JSON.",
543
+ data: {
544
+ endpoint,
545
+ bodyParseResult: data
546
+ }
547
+ });
548
+ }
549
+ const validationResult = v9.safeParse(signersResponseSchema, data);
550
+ if (!validationResult.success) {
551
+ return error({
552
+ name: "ValidateDataError",
553
+ message: "Failed to validate response data.",
554
+ data: validationResult
555
+ });
556
+ }
557
+ return success(validationResult.output);
558
+ }
559
+
560
+ // src/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.ts
561
+ import * as v10 from "valibot";
562
+ var stackerInfoSchema = v10.object({
563
+ stacker_address: v10.string(),
564
+ stacked_amount: v10.string(),
565
+ pox_address: v10.string(),
566
+ stacker_type: v10.union([v10.literal("pooled"), v10.literal("solo")])
567
+ });
568
+ var resultsSchema3 = v10.array(stackerInfoSchema);
569
+ var stackersForSignerInCycleResponseSchema = v10.object({
570
+ ...baseListResponseSchema.entries,
571
+ results: resultsSchema3
572
+ });
573
+ async function stackersForSignerInCycle(opts) {
574
+ const search = new URLSearchParams();
575
+ if (opts.limit) search.append("limit", opts.limit.toString());
576
+ if (opts.offset) search.append("offset", opts.offset.toString());
577
+ const init = {};
578
+ if (opts.apiKeyConfig) {
579
+ init.headers = {
580
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
581
+ };
582
+ }
583
+ const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}/signers/${opts.signerPublicKey}/stackers?${search}`;
584
+ const res = await fetch(endpoint, init);
585
+ if (!res.ok) {
586
+ return error({
587
+ name: "FetchStackersForSignerInCycleError",
588
+ message: "Failed to fetch stackers for signer in cycle.",
589
+ data: {
590
+ endpoint,
591
+ status: res.status,
592
+ statusText: res.statusText,
593
+ bodyParseResult: await safePromise(res.json())
594
+ }
595
+ });
596
+ }
597
+ const [jsonError, data] = await safePromise(res.json());
598
+ if (jsonError) {
599
+ return error({
600
+ name: "ParseBodyError",
601
+ message: "Failed to parse response body as JSON.",
602
+ data: jsonError
603
+ });
604
+ }
605
+ const validationResult = v10.safeParse(
606
+ stackersForSignerInCycleResponseSchema,
607
+ data
608
+ );
609
+ if (!validationResult.success) {
610
+ return error({
611
+ name: "ValidateDataError",
612
+ message: "Failed to validate response data.",
613
+ data: validationResult
614
+ });
615
+ }
616
+ return success(validationResult.output);
617
+ }
618
+
619
+ // src/stacks-api/proof-of-transfer/index.ts
620
+ var proofOfTransfer = {
621
+ cycle,
622
+ cycles,
623
+ signerInCycle,
624
+ signersInCycle,
625
+ stackersForSignerInCycle
626
+ };
627
+
628
+ // src/stacks-api/smart-contracts/read-only.ts
629
+ import * as v11 from "valibot";
630
+ var readOnlyResponseSchema = v11.variant("okay", [
631
+ v11.object({
632
+ okay: v11.literal(true),
633
+ result: v11.string()
634
+ }),
635
+ v11.object({
636
+ okay: v11.literal(false),
637
+ cause: v11.unknown()
638
+ })
639
+ ]);
640
+ async function readOnly(opts, apiOpts) {
641
+ const init = {};
642
+ if (apiOpts.apiKeyConfig) {
643
+ init.headers = {
644
+ [apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
645
+ };
646
+ }
647
+ const res = await fetch(
648
+ `${apiOpts.baseUrl}/v2/contracts/call-read/${opts.contractAddress}/${opts.contractName}/${opts.functionName}`,
649
+ init
650
+ );
651
+ if (!res.ok) {
652
+ return error({
653
+ name: "FetchReadOnlyError",
654
+ message: "Failed to fetch.",
655
+ data: {
656
+ status: res.status,
657
+ statusText: res.statusText,
658
+ bodyParseResult: await safePromise(res.json())
659
+ }
660
+ });
661
+ }
662
+ const [jsonError, data] = await safePromise(res.json());
663
+ if (jsonError) {
664
+ return error({
665
+ name: "ParseBodyError",
666
+ message: "Failed to parse response body as JSON.",
667
+ data: error
668
+ });
669
+ }
670
+ const validationResult = v11.safeParse(readOnlyResponseSchema, data);
671
+ if (!validationResult.success) {
672
+ return error({
673
+ name: "ValidateDataError",
674
+ message: "Failed to validate data.",
675
+ data: validationResult
676
+ });
677
+ }
678
+ return success(validationResult.output);
679
+ }
680
+
681
+ // src/stacks-api/smart-contracts/index.ts
682
+ var smartContracts = {
683
+ readOnly
684
+ };
685
+
686
+ // src/stacks-api/stacking-pool/members.ts
687
+ import * as v12 from "valibot";
688
+ var memberSchema = v12.object({
689
+ stacker: v12.string(),
690
+ pox_addr: v12.optional(v12.string()),
691
+ amount_ustx: v12.string(),
692
+ burn_block_unlock_height: v12.optional(v12.number()),
693
+ block_height: v12.number(),
694
+ tx_id: v12.string()
695
+ });
696
+ var membersResponseSchema = v12.object({
697
+ limit: v12.number(),
698
+ offset: v12.number(),
699
+ total: v12.number(),
700
+ results: v12.array(memberSchema)
701
+ });
702
+ async function members(opts, apiOpts) {
703
+ const search = new URLSearchParams();
704
+ if (opts.afterBlock) search.append("after_block", opts.afterBlock.toString());
705
+ if (opts.unanchored) search.append("unanchored", "true");
706
+ if (opts.limit) search.append("limit", opts.limit.toString());
707
+ if (opts.offset) search.append("offset", opts.offset.toString());
708
+ const init = {};
709
+ if (apiOpts.apiKeyConfig) {
710
+ init.headers = {
711
+ [apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
712
+ };
713
+ }
714
+ const res = await fetch(
715
+ `${apiOpts.baseUrl}/extended/beta/stacking/${opts.poolPrincipal}/delegations?${search}`,
716
+ init
717
+ );
718
+ if (!res.ok) {
719
+ return error({
720
+ name: "FetchMembersError",
721
+ message: "Failed to fetch members.",
722
+ data: {
723
+ status: res.status,
724
+ statusText: res.statusText,
725
+ bodyParseResult: await safePromise(res.json())
726
+ }
727
+ });
728
+ }
729
+ const [jsonParseError, data] = await safePromise(res.json());
730
+ if (jsonParseError) {
731
+ return error({
732
+ name: "ParseBodyError",
733
+ message: "Failed to parse response body as JSON.",
734
+ data: jsonParseError
735
+ });
736
+ }
737
+ const validationResult = v12.safeParse(membersResponseSchema, data);
738
+ if (!validationResult.success) {
739
+ return error({
740
+ name: "ValidateDataError",
741
+ message: "Failed to validate data.",
742
+ data: validationResult
743
+ });
744
+ }
745
+ return success(validationResult.output);
746
+ }
747
+
748
+ // src/stacks-api/stacking-pool/index.ts
749
+ var stackingPool = {
750
+ members
751
+ };
752
+
753
+ // src/stacks-api/transactions/schemas.ts
754
+ import * as v13 from "valibot";
755
+ var baseTransactionSchema = v13.object({
756
+ tx_id: v13.string(),
757
+ nonce: v13.number(),
758
+ fee_rate: v13.string(),
759
+ sender_address: v13.string(),
760
+ sponsored: v13.boolean(),
761
+ post_condition_mode: v13.string(),
762
+ post_conditions: v13.array(v13.unknown()),
763
+ anchor_mode: v13.string(),
764
+ is_unanchored: v13.boolean(),
765
+ block_hash: v13.string(),
766
+ parent_block_hash: v13.string(),
767
+ block_height: v13.number(),
768
+ block_time: v13.number(),
769
+ block_time_iso: v13.string(),
770
+ burn_block_height: v13.number(),
771
+ burn_block_time: v13.number(),
772
+ burn_block_time_iso: v13.string(),
773
+ parent_burn_block_time: v13.number(),
774
+ parent_burn_block_time_iso: v13.string(),
775
+ canonical: v13.boolean(),
776
+ tx_index: v13.number(),
777
+ tx_status: v13.string(),
778
+ tx_result: v13.object({
779
+ hex: v13.string(),
780
+ repr: v13.string()
781
+ }),
782
+ microblock_hash: v13.string(),
783
+ microblock_sequence: v13.number(),
784
+ microblock_canonical: v13.boolean(),
785
+ event_count: v13.number(),
786
+ events: v13.array(v13.unknown()),
787
+ execution_cost_read_count: v13.number(),
788
+ execution_cost_read_length: v13.number(),
789
+ execution_cost_runtime: v13.number(),
790
+ execution_cost_write_count: v13.number(),
791
+ execution_cost_write_length: v13.number()
792
+ });
793
+ var contractCallTransactionSchema = v13.object({
794
+ tx_type: v13.literal("contract_call"),
795
+ contract_call: v13.object({
796
+ contract_id: v13.string(),
797
+ function_name: v13.string(),
798
+ function_signature: v13.string(),
799
+ function_args: v13.array(
800
+ v13.object({
801
+ hex: v13.string(),
802
+ repr: v13.string(),
803
+ name: v13.string(),
804
+ type: v13.string()
805
+ })
806
+ )
807
+ }),
808
+ ...baseTransactionSchema.entries
809
+ });
810
+ var smartContractTransactionSchema = v13.object({
811
+ tx_type: v13.literal("smart_contract"),
812
+ smart_contract: v13.object({
813
+ /**
814
+ * NOTE: The types may be wrong, not sure what type of value is used when
815
+ * the version is not `null`.
816
+ */
817
+ clarity_version: v13.union([v13.null(), v13.number()]),
818
+ contract_id: v13.string(),
819
+ source_code: v13.string()
820
+ }),
821
+ ...baseTransactionSchema.entries
822
+ });
823
+ var tokenTransferSchema = v13.object({
824
+ tx_type: v13.literal("token_transfer"),
825
+ token_transfer: v13.object({
826
+ recipient_address: v13.string(),
827
+ amount: v13.string(),
828
+ memo: v13.string()
829
+ }),
830
+ ...baseTransactionSchema.entries
831
+ });
832
+ var transactionSchema = v13.variant("tx_type", [
833
+ contractCallTransactionSchema,
834
+ smartContractTransactionSchema,
835
+ tokenTransferSchema
836
+ ]);
837
+
838
+ // src/stacks-api/transactions/address-transactions.ts
839
+ import * as v14 from "valibot";
840
+ var resultSchema = v14.object({
841
+ tx: transactionSchema,
842
+ stx_sent: v14.string(),
843
+ stx_received: v14.string(),
844
+ events: v14.object({
845
+ stx: v14.object({
846
+ transfer: v14.number(),
847
+ mint: v14.number(),
848
+ burn: v14.number()
849
+ }),
850
+ ft: v14.object({
851
+ transfer: v14.number(),
852
+ mint: v14.number(),
853
+ burn: v14.number()
854
+ }),
855
+ nft: v14.object({
856
+ transfer: v14.number(),
857
+ mint: v14.number(),
858
+ burn: v14.number()
859
+ })
860
+ })
861
+ });
862
+ var resultsSchema4 = v14.array(resultSchema);
863
+ var addressTransactionsResponseSchema = v14.object({
864
+ ...baseListResponseSchema.entries,
865
+ results: resultsSchema4
866
+ });
867
+ async function addressTransactions(args) {
868
+ const search = new URLSearchParams();
869
+ if (args.limit) search.append("limit", args.limit.toString());
870
+ if (args.offset) search.append("offset", args.offset.toString());
871
+ const init = {};
872
+ if (args.apiKeyConfig) {
873
+ init.headers = {
874
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
875
+ };
876
+ }
877
+ const res = await fetch(
878
+ `${args.baseUrl}/extended/v2/addresses/${args.address}/transactions?${search}`,
879
+ init
880
+ );
881
+ if (!res.ok) {
882
+ return error({
883
+ name: "FetchAddressTransactionsError",
884
+ message: "Failed to fetch address transactions.",
885
+ data: {
886
+ status: res.status,
887
+ statusText: res.statusText,
888
+ bodyParseResult: await safePromise(res.json())
889
+ }
890
+ });
891
+ }
892
+ const [jsonParseError, data] = await safePromise(res.json());
893
+ if (jsonParseError) {
894
+ return error({
895
+ name: "ParseBodyError",
896
+ message: "Failed to parse response body as JSON.",
897
+ data: jsonParseError
898
+ });
899
+ }
900
+ const validationResult = v14.safeParse(addressTransactionsResponseSchema, data);
901
+ if (!validationResult.success) {
902
+ return error({
903
+ name: "ValidateDataError",
904
+ message: "Failed to validate data.",
905
+ data: validationResult
906
+ });
907
+ }
908
+ return success(validationResult.output);
909
+ }
910
+
911
+ // src/stacks-api/transactions/get-transaction.ts
912
+ import * as v15 from "valibot";
913
+ async function getTransaction(args) {
914
+ const init = {};
915
+ if (args.apiKeyConfig) {
916
+ init.headers = {
917
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
918
+ };
919
+ }
920
+ const endpoint = `${args.baseUrl}/extended/v1/tx/${args.transactionId}`;
921
+ const res = await fetch(endpoint, init);
922
+ if (!res.ok) {
923
+ return error({
924
+ name: "FetchTransactionError",
925
+ message: `Failed to fetch transaction ${args.transactionId}`,
926
+ response: {
927
+ status: res.status,
928
+ statusText: res.statusText,
929
+ body: await safePromise(res.json())
930
+ }
931
+ });
932
+ }
933
+ const [jsonParseError, data] = await safePromise(res.json());
934
+ if (jsonParseError) {
935
+ return error({
936
+ name: "ParseBodyError",
937
+ message: "Failed to parse response body as JSON.",
938
+ error: jsonParseError
939
+ });
940
+ }
941
+ const validationResult = v15.safeParse(transactionSchema, data);
942
+ if (!validationResult.success) {
943
+ return error({
944
+ name: "ValidateDataError",
945
+ message: "Failed to validate data.",
946
+ error: validationResult
947
+ });
948
+ }
949
+ return success(validationResult.output);
950
+ }
951
+
952
+ // src/stacks-api/transactions/index.ts
953
+ var transactions = {
954
+ addressTransactions,
955
+ getTransaction
956
+ };
957
+
958
+ // src/stacks-api/index.ts
959
+ var stacksApi = {
960
+ accounts,
961
+ blocks,
962
+ info,
963
+ proofOfTransfer,
964
+ smartContracts,
965
+ stackingPool,
966
+ transactions
967
+ };
968
+
969
+ // src/utils/call-rate-limited-api.ts
970
+ import { backOff } from "exponential-backoff";
971
+ async function safeCallRateLimitedApi(fn, options) {
972
+ try {
973
+ return await backOff(() => fn(), {
974
+ startingDelay: options?.startingDelay ?? 15e3,
975
+ numOfAttempts: options?.numOfAttempts ?? 5
976
+ });
977
+ } catch (error2) {
978
+ return error({
979
+ name: "MaxRetriesExceeded",
980
+ message: "Failed to call rate limited API.",
981
+ data: {
982
+ error: error2
983
+ }
984
+ });
985
+ }
986
+ }
987
+
988
+ // src/queries/get-signer-stacked-amount.ts
989
+ async function getSignerStackedAmount(args) {
990
+ let totalLocked = 0n;
991
+ const { identifier, ...rest } = args;
992
+ let hasMore = true;
993
+ let offset = 0;
994
+ let found = false;
995
+ const limit = 200;
996
+ while (hasMore && !found) {
997
+ const [error2, data] = await safeCallRateLimitedApi(
998
+ () => signersInCycle({
999
+ ...rest,
1000
+ limit
1001
+ })
1002
+ );
1003
+ if (error2) {
1004
+ return error({
1005
+ name: "GetSignerTotalLockedError",
1006
+ message: "Failed to get signer total locked.",
1007
+ data: {
1008
+ error: error2
1009
+ }
1010
+ });
1011
+ }
1012
+ for (const signer of data.results) {
1013
+ if (identifier.type === "address") {
1014
+ if (signer.signer_address === identifier.signerAddress) {
1015
+ totalLocked = BigInt(signer.stacked_amount);
1016
+ found = true;
1017
+ break;
1018
+ }
1019
+ } else {
1020
+ if (signer.signing_key === identifier.signerPublicKey) {
1021
+ totalLocked = BigInt(signer.stacked_amount);
1022
+ found = true;
1023
+ break;
1024
+ }
1025
+ }
1026
+ }
1027
+ offset += limit + data.results.length;
1028
+ hasMore = offset < data.total;
1029
+ }
1030
+ if (!found) {
1031
+ return error({
1032
+ name: "SignerNotFound",
1033
+ message: "Signer not found.",
1034
+ data: {
1035
+ identifier,
1036
+ cycle: args.cycleNumber
1037
+ }
1038
+ });
1039
+ }
1040
+ return success(totalLocked);
1041
+ }
1042
+
1043
+ // src/queries/index.ts
1044
+ var queries = {
1045
+ getSignerStackedAmount
1046
+ };
1047
+ export {
1048
+ queries,
1049
+ stacksApi
1050
+ };