@secretkeylabs/stacks-tools 0.2.0 → 0.3.0-05c5288

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 +1090 -0
  2. package/dist/index.d.cts +661 -0
  3. package/dist/index.d.ts +661 -2
  4. package/dist/index.js +1052 -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,1052 @@
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
+ ...args,
470
+ endpoint,
471
+ status: res.status,
472
+ statusText: res.statusText
473
+ }
474
+ });
475
+ }
476
+ const [jsonError, data] = await safePromise(res.json());
477
+ if (jsonError) {
478
+ return error({
479
+ name: "ParseBodyError",
480
+ message: "Failed to parse response body.",
481
+ data: {
482
+ signerPublicKey: args.signerPublicKey,
483
+ cycleId: args.cycleId,
484
+ jsonError
485
+ }
486
+ });
487
+ }
488
+ const validationResult = v8.safeParse(signerInCycleResponseSchema, data);
489
+ if (!validationResult.success) {
490
+ return error({
491
+ name: "ValidateDataError",
492
+ message: "Failed to validate response data.",
493
+ data: validationResult.issues
494
+ });
495
+ }
496
+ return success(validationResult.output);
497
+ }
498
+
499
+ // src/stacks-api/proof-of-transfer/signers-in-cycle.ts
500
+ import * as v9 from "valibot";
501
+ var signerSchema = v9.object({
502
+ signing_key: v9.string(),
503
+ signer_address: v9.string(),
504
+ weight: v9.number(),
505
+ stacked_amount: v9.string(),
506
+ weight_percent: v9.number(),
507
+ stacked_amount_percent: v9.number(),
508
+ pooled_stacker_count: v9.number(),
509
+ solo_stacker_count: v9.number()
510
+ });
511
+ var resultsSchema2 = v9.array(signerSchema);
512
+ var signersResponseSchema = v9.object({
513
+ ...baseListResponseSchema.entries,
514
+ results: resultsSchema2
515
+ });
516
+ async function signersInCycle(args) {
517
+ const search = new URLSearchParams();
518
+ if (args.limit) search.append("limit", args.limit.toString());
519
+ if (args.offset) search.append("offset", args.offset.toString());
520
+ const init = {};
521
+ if (args.apiKeyConfig) {
522
+ init.headers = {
523
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
524
+ };
525
+ }
526
+ const endpoint = `${args.baseUrl}/extended/v2/pox/cycles/${args.cycleNumber}/signers`;
527
+ const res = await fetch(endpoint, init);
528
+ if (!res.ok) {
529
+ return error({
530
+ name: "FetchSignersError",
531
+ message: "Failed to fetch signers.",
532
+ data: {
533
+ endpoint,
534
+ status: res.status,
535
+ statusText: res.statusText,
536
+ bodyParseResult: await safePromise(res.json())
537
+ }
538
+ });
539
+ }
540
+ const [jsonError, data] = await safePromise(res.json());
541
+ if (jsonError) {
542
+ return error({
543
+ name: "ParseBodyError",
544
+ message: "Failed to parse response body as JSON.",
545
+ data: {
546
+ endpoint,
547
+ bodyParseResult: data
548
+ }
549
+ });
550
+ }
551
+ const validationResult = v9.safeParse(signersResponseSchema, data);
552
+ if (!validationResult.success) {
553
+ return error({
554
+ name: "ValidateDataError",
555
+ message: "Failed to validate response data.",
556
+ data: validationResult
557
+ });
558
+ }
559
+ return success(validationResult.output);
560
+ }
561
+
562
+ // src/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.ts
563
+ import * as v10 from "valibot";
564
+ var stackerInfoSchema = v10.object({
565
+ stacker_address: v10.string(),
566
+ stacked_amount: v10.string(),
567
+ pox_address: v10.string(),
568
+ stacker_type: v10.union([v10.literal("pooled"), v10.literal("solo")])
569
+ });
570
+ var resultsSchema3 = v10.array(stackerInfoSchema);
571
+ var stackersForSignerInCycleResponseSchema = v10.object({
572
+ ...baseListResponseSchema.entries,
573
+ results: resultsSchema3
574
+ });
575
+ async function stackersForSignerInCycle(opts) {
576
+ const search = new URLSearchParams();
577
+ if (opts.limit) search.append("limit", opts.limit.toString());
578
+ if (opts.offset) search.append("offset", opts.offset.toString());
579
+ const init = {};
580
+ if (opts.apiKeyConfig) {
581
+ init.headers = {
582
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
583
+ };
584
+ }
585
+ const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}/signers/${opts.signerPublicKey}/stackers?${search}`;
586
+ const res = await fetch(endpoint, init);
587
+ if (!res.ok) {
588
+ return error({
589
+ name: "FetchStackersForSignerInCycleError",
590
+ message: "Failed to fetch stackers for signer in cycle.",
591
+ data: {
592
+ endpoint,
593
+ status: res.status,
594
+ statusText: res.statusText,
595
+ bodyParseResult: await safePromise(res.json())
596
+ }
597
+ });
598
+ }
599
+ const [jsonError, data] = await safePromise(res.json());
600
+ if (jsonError) {
601
+ return error({
602
+ name: "ParseBodyError",
603
+ message: "Failed to parse response body as JSON.",
604
+ data: jsonError
605
+ });
606
+ }
607
+ const validationResult = v10.safeParse(
608
+ stackersForSignerInCycleResponseSchema,
609
+ data
610
+ );
611
+ if (!validationResult.success) {
612
+ return error({
613
+ name: "ValidateDataError",
614
+ message: "Failed to validate response data.",
615
+ data: validationResult
616
+ });
617
+ }
618
+ return success(validationResult.output);
619
+ }
620
+
621
+ // src/stacks-api/proof-of-transfer/index.ts
622
+ var proofOfTransfer = {
623
+ cycle,
624
+ cycles,
625
+ signerInCycle,
626
+ signersInCycle,
627
+ stackersForSignerInCycle
628
+ };
629
+
630
+ // src/stacks-api/smart-contracts/read-only.ts
631
+ import * as v11 from "valibot";
632
+ var readOnlyResponseSchema = v11.variant("okay", [
633
+ v11.object({
634
+ okay: v11.literal(true),
635
+ result: v11.string()
636
+ }),
637
+ v11.object({
638
+ okay: v11.literal(false),
639
+ cause: v11.unknown()
640
+ })
641
+ ]);
642
+ async function readOnly(opts, apiOpts) {
643
+ const init = {};
644
+ if (apiOpts.apiKeyConfig) {
645
+ init.headers = {
646
+ [apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
647
+ };
648
+ }
649
+ const res = await fetch(
650
+ `${apiOpts.baseUrl}/v2/contracts/call-read/${opts.contractAddress}/${opts.contractName}/${opts.functionName}`,
651
+ init
652
+ );
653
+ if (!res.ok) {
654
+ return error({
655
+ name: "FetchReadOnlyError",
656
+ message: "Failed to fetch.",
657
+ data: {
658
+ status: res.status,
659
+ statusText: res.statusText,
660
+ bodyParseResult: await safePromise(res.json())
661
+ }
662
+ });
663
+ }
664
+ const [jsonError, data] = await safePromise(res.json());
665
+ if (jsonError) {
666
+ return error({
667
+ name: "ParseBodyError",
668
+ message: "Failed to parse response body as JSON.",
669
+ data: error
670
+ });
671
+ }
672
+ const validationResult = v11.safeParse(readOnlyResponseSchema, data);
673
+ if (!validationResult.success) {
674
+ return error({
675
+ name: "ValidateDataError",
676
+ message: "Failed to validate data.",
677
+ data: validationResult
678
+ });
679
+ }
680
+ return success(validationResult.output);
681
+ }
682
+
683
+ // src/stacks-api/smart-contracts/index.ts
684
+ var smartContracts = {
685
+ readOnly
686
+ };
687
+
688
+ // src/stacks-api/stacking-pool/members.ts
689
+ import * as v12 from "valibot";
690
+ var memberSchema = v12.object({
691
+ stacker: v12.string(),
692
+ pox_addr: v12.optional(v12.string()),
693
+ amount_ustx: v12.string(),
694
+ burn_block_unlock_height: v12.optional(v12.number()),
695
+ block_height: v12.number(),
696
+ tx_id: v12.string()
697
+ });
698
+ var membersResponseSchema = v12.object({
699
+ limit: v12.number(),
700
+ offset: v12.number(),
701
+ total: v12.number(),
702
+ results: v12.array(memberSchema)
703
+ });
704
+ async function members(opts, apiOpts) {
705
+ const search = new URLSearchParams();
706
+ if (opts.afterBlock) search.append("after_block", opts.afterBlock.toString());
707
+ if (opts.unanchored) search.append("unanchored", "true");
708
+ if (opts.limit) search.append("limit", opts.limit.toString());
709
+ if (opts.offset) search.append("offset", opts.offset.toString());
710
+ const init = {};
711
+ if (apiOpts.apiKeyConfig) {
712
+ init.headers = {
713
+ [apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
714
+ };
715
+ }
716
+ const res = await fetch(
717
+ `${apiOpts.baseUrl}/extended/beta/stacking/${opts.poolPrincipal}/delegations?${search}`,
718
+ init
719
+ );
720
+ if (!res.ok) {
721
+ return error({
722
+ name: "FetchMembersError",
723
+ message: "Failed to fetch members.",
724
+ data: {
725
+ status: res.status,
726
+ statusText: res.statusText,
727
+ bodyParseResult: await safePromise(res.json())
728
+ }
729
+ });
730
+ }
731
+ const [jsonParseError, data] = await safePromise(res.json());
732
+ if (jsonParseError) {
733
+ return error({
734
+ name: "ParseBodyError",
735
+ message: "Failed to parse response body as JSON.",
736
+ data: jsonParseError
737
+ });
738
+ }
739
+ const validationResult = v12.safeParse(membersResponseSchema, data);
740
+ if (!validationResult.success) {
741
+ return error({
742
+ name: "ValidateDataError",
743
+ message: "Failed to validate data.",
744
+ data: validationResult
745
+ });
746
+ }
747
+ return success(validationResult.output);
748
+ }
749
+
750
+ // src/stacks-api/stacking-pool/index.ts
751
+ var stackingPool = {
752
+ members
753
+ };
754
+
755
+ // src/stacks-api/transactions/schemas.ts
756
+ import * as v13 from "valibot";
757
+ var baseTransactionSchema = v13.object({
758
+ tx_id: v13.string(),
759
+ nonce: v13.number(),
760
+ fee_rate: v13.string(),
761
+ sender_address: v13.string(),
762
+ sponsored: v13.boolean(),
763
+ post_condition_mode: v13.string(),
764
+ post_conditions: v13.array(v13.unknown()),
765
+ anchor_mode: v13.string(),
766
+ is_unanchored: v13.boolean(),
767
+ block_hash: v13.string(),
768
+ parent_block_hash: v13.string(),
769
+ block_height: v13.number(),
770
+ block_time: v13.number(),
771
+ block_time_iso: v13.string(),
772
+ burn_block_height: v13.number(),
773
+ burn_block_time: v13.number(),
774
+ burn_block_time_iso: v13.string(),
775
+ parent_burn_block_time: v13.number(),
776
+ parent_burn_block_time_iso: v13.string(),
777
+ canonical: v13.boolean(),
778
+ tx_index: v13.number(),
779
+ tx_status: v13.string(),
780
+ tx_result: v13.object({
781
+ hex: v13.string(),
782
+ repr: v13.string()
783
+ }),
784
+ microblock_hash: v13.string(),
785
+ microblock_sequence: v13.number(),
786
+ microblock_canonical: v13.boolean(),
787
+ event_count: v13.number(),
788
+ events: v13.array(v13.unknown()),
789
+ execution_cost_read_count: v13.number(),
790
+ execution_cost_read_length: v13.number(),
791
+ execution_cost_runtime: v13.number(),
792
+ execution_cost_write_count: v13.number(),
793
+ execution_cost_write_length: v13.number()
794
+ });
795
+ var contractCallTransactionSchema = v13.object({
796
+ tx_type: v13.literal("contract_call"),
797
+ contract_call: v13.object({
798
+ contract_id: v13.string(),
799
+ function_name: v13.string(),
800
+ function_signature: v13.string(),
801
+ function_args: v13.array(
802
+ v13.object({
803
+ hex: v13.string(),
804
+ repr: v13.string(),
805
+ name: v13.string(),
806
+ type: v13.string()
807
+ })
808
+ )
809
+ }),
810
+ ...baseTransactionSchema.entries
811
+ });
812
+ var smartContractTransactionSchema = v13.object({
813
+ tx_type: v13.literal("smart_contract"),
814
+ smart_contract: v13.object({
815
+ /**
816
+ * NOTE: The types may be wrong, not sure what type of value is used when
817
+ * the version is not `null`.
818
+ */
819
+ clarity_version: v13.union([v13.null(), v13.number()]),
820
+ contract_id: v13.string(),
821
+ source_code: v13.string()
822
+ }),
823
+ ...baseTransactionSchema.entries
824
+ });
825
+ var tokenTransferSchema = v13.object({
826
+ tx_type: v13.literal("token_transfer"),
827
+ token_transfer: v13.object({
828
+ recipient_address: v13.string(),
829
+ amount: v13.string(),
830
+ memo: v13.string()
831
+ }),
832
+ ...baseTransactionSchema.entries
833
+ });
834
+ var transactionSchema = v13.variant("tx_type", [
835
+ contractCallTransactionSchema,
836
+ smartContractTransactionSchema,
837
+ tokenTransferSchema
838
+ ]);
839
+
840
+ // src/stacks-api/transactions/address-transactions.ts
841
+ import * as v14 from "valibot";
842
+ var resultSchema = v14.object({
843
+ tx: transactionSchema,
844
+ stx_sent: v14.string(),
845
+ stx_received: v14.string(),
846
+ events: v14.object({
847
+ stx: v14.object({
848
+ transfer: v14.number(),
849
+ mint: v14.number(),
850
+ burn: v14.number()
851
+ }),
852
+ ft: v14.object({
853
+ transfer: v14.number(),
854
+ mint: v14.number(),
855
+ burn: v14.number()
856
+ }),
857
+ nft: v14.object({
858
+ transfer: v14.number(),
859
+ mint: v14.number(),
860
+ burn: v14.number()
861
+ })
862
+ })
863
+ });
864
+ var resultsSchema4 = v14.array(resultSchema);
865
+ var addressTransactionsResponseSchema = v14.object({
866
+ ...baseListResponseSchema.entries,
867
+ results: resultsSchema4
868
+ });
869
+ async function addressTransactions(args) {
870
+ const search = new URLSearchParams();
871
+ if (args.limit) search.append("limit", args.limit.toString());
872
+ if (args.offset) search.append("offset", args.offset.toString());
873
+ const init = {};
874
+ if (args.apiKeyConfig) {
875
+ init.headers = {
876
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
877
+ };
878
+ }
879
+ const res = await fetch(
880
+ `${args.baseUrl}/extended/v2/addresses/${args.address}/transactions?${search}`,
881
+ init
882
+ );
883
+ if (!res.ok) {
884
+ return error({
885
+ name: "FetchAddressTransactionsError",
886
+ message: "Failed to fetch address transactions.",
887
+ data: {
888
+ status: res.status,
889
+ statusText: res.statusText,
890
+ bodyParseResult: await safePromise(res.json())
891
+ }
892
+ });
893
+ }
894
+ const [jsonParseError, data] = await safePromise(res.json());
895
+ if (jsonParseError) {
896
+ return error({
897
+ name: "ParseBodyError",
898
+ message: "Failed to parse response body as JSON.",
899
+ data: jsonParseError
900
+ });
901
+ }
902
+ const validationResult = v14.safeParse(addressTransactionsResponseSchema, data);
903
+ if (!validationResult.success) {
904
+ return error({
905
+ name: "ValidateDataError",
906
+ message: "Failed to validate data.",
907
+ data: validationResult
908
+ });
909
+ }
910
+ return success(validationResult.output);
911
+ }
912
+
913
+ // src/stacks-api/transactions/get-transaction.ts
914
+ import * as v15 from "valibot";
915
+ async function getTransaction(args) {
916
+ const init = {};
917
+ if (args.apiKeyConfig) {
918
+ init.headers = {
919
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
920
+ };
921
+ }
922
+ const endpoint = `${args.baseUrl}/extended/v1/tx/${args.transactionId}`;
923
+ const res = await fetch(endpoint, init);
924
+ if (!res.ok) {
925
+ return error({
926
+ name: "FetchTransactionError",
927
+ message: `Failed to fetch transaction ${args.transactionId}`,
928
+ response: {
929
+ status: res.status,
930
+ statusText: res.statusText,
931
+ body: await safePromise(res.json())
932
+ }
933
+ });
934
+ }
935
+ const [jsonParseError, data] = await safePromise(res.json());
936
+ if (jsonParseError) {
937
+ return error({
938
+ name: "ParseBodyError",
939
+ message: "Failed to parse response body as JSON.",
940
+ error: jsonParseError
941
+ });
942
+ }
943
+ const validationResult = v15.safeParse(transactionSchema, data);
944
+ if (!validationResult.success) {
945
+ return error({
946
+ name: "ValidateDataError",
947
+ message: "Failed to validate data.",
948
+ error: validationResult
949
+ });
950
+ }
951
+ return success(validationResult.output);
952
+ }
953
+
954
+ // src/stacks-api/transactions/index.ts
955
+ var transactions = {
956
+ addressTransactions,
957
+ getTransaction
958
+ };
959
+
960
+ // src/stacks-api/index.ts
961
+ var stacksApi = {
962
+ accounts,
963
+ blocks,
964
+ info,
965
+ proofOfTransfer,
966
+ smartContracts,
967
+ stackingPool,
968
+ transactions
969
+ };
970
+
971
+ // src/utils/call-rate-limited-api.ts
972
+ import { backOff } from "exponential-backoff";
973
+ async function safeCallRateLimitedApi(fn, options) {
974
+ try {
975
+ return await backOff(() => fn(), {
976
+ startingDelay: options?.startingDelay ?? 15e3,
977
+ numOfAttempts: options?.numOfAttempts ?? 5
978
+ });
979
+ } catch (error2) {
980
+ return error({
981
+ name: "MaxRetriesExceeded",
982
+ message: "Failed to call rate limited API.",
983
+ data: {
984
+ error: error2
985
+ }
986
+ });
987
+ }
988
+ }
989
+
990
+ // src/queries/get-signer-stacked-amount.ts
991
+ async function getSignerStackedAmount(args) {
992
+ let totalLocked = 0n;
993
+ const { identifier, ...rest } = args;
994
+ let hasMore = true;
995
+ let offset = 0;
996
+ let found = false;
997
+ const limit = 200;
998
+ while (hasMore && !found) {
999
+ const [error2, data] = await safeCallRateLimitedApi(
1000
+ () => signersInCycle({
1001
+ ...rest,
1002
+ limit
1003
+ })
1004
+ );
1005
+ if (error2) {
1006
+ return error({
1007
+ name: "GetSignerTotalLockedError",
1008
+ message: "Failed to get signer total locked.",
1009
+ data: {
1010
+ error: error2
1011
+ }
1012
+ });
1013
+ }
1014
+ for (const signer of data.results) {
1015
+ if (identifier.type === "address") {
1016
+ if (signer.signer_address === identifier.signerAddress) {
1017
+ totalLocked = BigInt(signer.stacked_amount);
1018
+ found = true;
1019
+ break;
1020
+ }
1021
+ } else {
1022
+ if (signer.signing_key === identifier.signerPublicKey) {
1023
+ totalLocked = BigInt(signer.stacked_amount);
1024
+ found = true;
1025
+ break;
1026
+ }
1027
+ }
1028
+ }
1029
+ offset += limit + data.results.length;
1030
+ hasMore = offset < data.total;
1031
+ }
1032
+ if (!found) {
1033
+ return error({
1034
+ name: "SignerNotFound",
1035
+ message: "Signer not found.",
1036
+ data: {
1037
+ identifier,
1038
+ cycle: args.cycleNumber
1039
+ }
1040
+ });
1041
+ }
1042
+ return success(totalLocked);
1043
+ }
1044
+
1045
+ // src/queries/index.ts
1046
+ var queries = {
1047
+ getSignerStackedAmount
1048
+ };
1049
+ export {
1050
+ queries,
1051
+ stacksApi
1052
+ };