@secretkeylabs/stacks-tools 0.3.0-6f23618 → 0.3.0-9a0fdf3

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 (102) hide show
  1. package/dist/index.cjs +1199 -0
  2. package/dist/index.d.cts +721 -0
  3. package/dist/index.d.ts +721 -2
  4. package/dist/index.js +1160 -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-stacked-amount.d.ts +0 -18
  20. package/dist/queries/get-signer-stacked-amount.js +0 -59
  21. package/dist/queries/get-signer-stacked-amount.js.map +0 -1
  22. package/dist/queries/get-signer-total-locked.d.ts +0 -18
  23. package/dist/queries/get-signer-total-locked.js +0 -59
  24. package/dist/queries/get-signer-total-locked.js.map +0 -1
  25. package/dist/queries/index.d.ts +0 -4
  26. package/dist/queries/index.js +0 -5
  27. package/dist/queries/index.js.map +0 -1
  28. package/dist/stacks-api/accounts/balances.d.ts +0 -34
  29. package/dist/stacks-api/accounts/balances.js +0 -70
  30. package/dist/stacks-api/accounts/balances.js.map +0 -1
  31. package/dist/stacks-api/accounts/index.d.ts +0 -4
  32. package/dist/stacks-api/accounts/index.js +0 -5
  33. package/dist/stacks-api/accounts/index.js.map +0 -1
  34. package/dist/stacks-api/blocks/get-block.d.ts +0 -29
  35. package/dist/stacks-api/blocks/get-block.js +0 -62
  36. package/dist/stacks-api/blocks/get-block.js.map +0 -1
  37. package/dist/stacks-api/blocks/index.d.ts +0 -4
  38. package/dist/stacks-api/blocks/index.js +0 -5
  39. package/dist/stacks-api/blocks/index.js.map +0 -1
  40. package/dist/stacks-api/index.d.ts +0 -29
  41. package/dist/stacks-api/index.js +0 -17
  42. package/dist/stacks-api/index.js.map +0 -1
  43. package/dist/stacks-api/info/core-api.d.ts +0 -21
  44. package/dist/stacks-api/info/core-api.js +0 -55
  45. package/dist/stacks-api/info/core-api.js.map +0 -1
  46. package/dist/stacks-api/info/index.d.ts +0 -6
  47. package/dist/stacks-api/info/index.js +0 -7
  48. package/dist/stacks-api/info/index.js.map +0 -1
  49. package/dist/stacks-api/info/pox-details.d.ts +0 -59
  50. package/dist/stacks-api/info/pox-details.js +0 -92
  51. package/dist/stacks-api/info/pox-details.js.map +0 -1
  52. package/dist/stacks-api/proof-of-transfer/cycle.d.ts +0 -16
  53. package/dist/stacks-api/proof-of-transfer/cycle.js +0 -50
  54. package/dist/stacks-api/proof-of-transfer/cycle.js.map +0 -1
  55. package/dist/stacks-api/proof-of-transfer/cycles.d.ts +0 -37
  56. package/dist/stacks-api/proof-of-transfer/cycles.js +0 -61
  57. package/dist/stacks-api/proof-of-transfer/cycles.js.map +0 -1
  58. package/dist/stacks-api/proof-of-transfer/index.d.ts +0 -12
  59. package/dist/stacks-api/proof-of-transfer/index.js +0 -13
  60. package/dist/stacks-api/proof-of-transfer/index.js.map +0 -1
  61. package/dist/stacks-api/proof-of-transfer/signer-in-cycle.d.ts +0 -22
  62. package/dist/stacks-api/proof-of-transfer/signer-in-cycle.js +0 -57
  63. package/dist/stacks-api/proof-of-transfer/signer-in-cycle.js.map +0 -1
  64. package/dist/stacks-api/proof-of-transfer/signers-in-cycle.d.ts +0 -45
  65. package/dist/stacks-api/proof-of-transfer/signers-in-cycle.js +0 -66
  66. package/dist/stacks-api/proof-of-transfer/signers-in-cycle.js.map +0 -1
  67. package/dist/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.d.ts +0 -34
  68. package/dist/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.js +0 -59
  69. package/dist/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.js.map +0 -1
  70. package/dist/stacks-api/smart-contracts/index.d.ts +0 -4
  71. package/dist/stacks-api/smart-contracts/index.js +0 -5
  72. package/dist/stacks-api/smart-contracts/index.js.map +0 -1
  73. package/dist/stacks-api/smart-contracts/read-only.d.ts +0 -19
  74. package/dist/stacks-api/smart-contracts/read-only.js +0 -50
  75. package/dist/stacks-api/smart-contracts/read-only.js.map +0 -1
  76. package/dist/stacks-api/stacking-pool/index.d.ts +0 -4
  77. package/dist/stacks-api/stacking-pool/index.js +0 -5
  78. package/dist/stacks-api/stacking-pool/index.js.map +0 -1
  79. package/dist/stacks-api/stacking-pool/members.d.ts +0 -34
  80. package/dist/stacks-api/stacking-pool/members.js +0 -64
  81. package/dist/stacks-api/stacking-pool/members.js.map +0 -1
  82. package/dist/stacks-api/transactions/address-transactions.d.ts +0 -487
  83. package/dist/stacks-api/transactions/address-transactions.js +0 -75
  84. package/dist/stacks-api/transactions/address-transactions.js.map +0 -1
  85. package/dist/stacks-api/transactions/get-transaction.d.ts +0 -8
  86. package/dist/stacks-api/transactions/get-transaction.js +0 -42
  87. package/dist/stacks-api/transactions/get-transaction.js.map +0 -1
  88. package/dist/stacks-api/transactions/index.d.ts +0 -6
  89. package/dist/stacks-api/transactions/index.js +0 -7
  90. package/dist/stacks-api/transactions/index.js.map +0 -1
  91. package/dist/stacks-api/transactions/schemas.d.ts +0 -327
  92. package/dist/stacks-api/transactions/schemas.js +0 -85
  93. package/dist/stacks-api/transactions/schemas.js.map +0 -1
  94. package/dist/stacks-api/types.d.ts +0 -26
  95. package/dist/stacks-api/types.js +0 -8
  96. package/dist/stacks-api/types.js.map +0 -1
  97. package/dist/utils/call-rate-limited-api.d.ts +0 -8
  98. package/dist/utils/call-rate-limited-api.js +0 -28
  99. package/dist/utils/call-rate-limited-api.js.map +0 -1
  100. package/dist/utils/safe.d.ts +0 -10
  101. package/dist/utils/safe.js +0 -31
  102. package/dist/utils/safe.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,3 +1,1160 @@
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 signerPublicKey = opts.signerPublicKey.startsWith("0x") ? opts.signerPublicKey : `0x${opts.signerPublicKey}`;
586
+ const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}/signers/${signerPublicKey}/stackers?${search}`;
587
+ const res = await fetch(endpoint, init);
588
+ if (!res.ok) {
589
+ return error({
590
+ name: "FetchStackersForSignerInCycleError",
591
+ message: "Failed to fetch stackers for signer in cycle.",
592
+ data: {
593
+ endpoint,
594
+ status: res.status,
595
+ statusText: res.statusText,
596
+ bodyParseResult: await safePromise(res.json())
597
+ }
598
+ });
599
+ }
600
+ const [jsonError, data] = await safePromise(res.json());
601
+ if (jsonError) {
602
+ return error({
603
+ name: "ParseBodyError",
604
+ message: "Failed to parse response body as JSON.",
605
+ data: jsonError
606
+ });
607
+ }
608
+ const validationResult = v10.safeParse(
609
+ stackersForSignerInCycleResponseSchema,
610
+ data
611
+ );
612
+ if (!validationResult.success) {
613
+ return error({
614
+ name: "ValidateDataError",
615
+ message: "Failed to validate response data.",
616
+ data: validationResult
617
+ });
618
+ }
619
+ return success(validationResult.output);
620
+ }
621
+
622
+ // src/stacks-api/proof-of-transfer/index.ts
623
+ var proofOfTransfer = {
624
+ cycle,
625
+ cycles,
626
+ signerInCycle,
627
+ signersInCycle,
628
+ stackersForSignerInCycle
629
+ };
630
+
631
+ // src/stacks-api/smart-contracts/read-only.ts
632
+ import * as v11 from "valibot";
633
+ var readOnlyResponseSchema = v11.variant("okay", [
634
+ v11.object({
635
+ okay: v11.literal(true),
636
+ result: v11.string()
637
+ }),
638
+ v11.object({
639
+ okay: v11.literal(false),
640
+ cause: v11.unknown()
641
+ })
642
+ ]);
643
+ async function readOnly(args) {
644
+ const init = {};
645
+ if (args.apiKeyConfig) {
646
+ init.headers = {
647
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
648
+ };
649
+ }
650
+ const res = await fetch(
651
+ `${args.baseUrl}/v2/contracts/call-read/${args.contractAddress}/${args.contractName}/${args.functionName}`,
652
+ init
653
+ );
654
+ if (!res.ok) {
655
+ return error({
656
+ name: "FetchReadOnlyError",
657
+ message: "Failed to fetch.",
658
+ data: {
659
+ status: res.status,
660
+ statusText: res.statusText,
661
+ bodyParseResult: await safePromise(res.json())
662
+ }
663
+ });
664
+ }
665
+ const [jsonError, data] = await safePromise(res.json());
666
+ if (jsonError) {
667
+ return error({
668
+ name: "ParseBodyError",
669
+ message: "Failed to parse response body as JSON.",
670
+ data: error
671
+ });
672
+ }
673
+ const validationResult = v11.safeParse(readOnlyResponseSchema, data);
674
+ if (!validationResult.success) {
675
+ return error({
676
+ name: "ValidateDataError",
677
+ message: "Failed to validate data.",
678
+ data: validationResult
679
+ });
680
+ }
681
+ return success(validationResult.output);
682
+ }
683
+
684
+ // src/stacks-api/smart-contracts/index.ts
685
+ var smartContracts = {
686
+ readOnly
687
+ };
688
+
689
+ // src/stacks-api/stacking-pool/members.ts
690
+ import * as v12 from "valibot";
691
+ var memberSchema = v12.object({
692
+ stacker: v12.string(),
693
+ pox_addr: v12.optional(v12.string()),
694
+ amount_ustx: v12.string(),
695
+ burn_block_unlock_height: v12.optional(v12.number()),
696
+ block_height: v12.number(),
697
+ tx_id: v12.string()
698
+ });
699
+ var membersResponseSchema = v12.object({
700
+ limit: v12.number(),
701
+ offset: v12.number(),
702
+ total: v12.number(),
703
+ results: v12.array(memberSchema)
704
+ });
705
+ async function members(args) {
706
+ const search = new URLSearchParams();
707
+ if (args.afterBlock) search.append("after_block", args.afterBlock.toString());
708
+ if (args.unanchored) search.append("unanchored", "true");
709
+ if (args.limit) search.append("limit", args.limit.toString());
710
+ if (args.offset) search.append("offset", args.offset.toString());
711
+ const init = {};
712
+ if (args.apiKeyConfig) {
713
+ init.headers = {
714
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
715
+ };
716
+ }
717
+ const endpoint = `${args.baseUrl}/extended/v1/pox4/${args.poolPrincipal}/delegations?${search}`;
718
+ const res = await fetch(endpoint, init);
719
+ if (!res.ok) {
720
+ return error({
721
+ name: "FetchMembersError",
722
+ message: "Failed to fetch members.",
723
+ data: {
724
+ status: res.status,
725
+ statusText: res.statusText,
726
+ bodyParseResult: await safePromise(res.json())
727
+ }
728
+ });
729
+ }
730
+ const [jsonParseError, data] = await safePromise(res.json());
731
+ if (jsonParseError) {
732
+ return error({
733
+ name: "ParseBodyError",
734
+ message: "Failed to parse response body as JSON.",
735
+ data: jsonParseError
736
+ });
737
+ }
738
+ const validationResult = v12.safeParse(membersResponseSchema, data);
739
+ if (!validationResult.success) {
740
+ return error({
741
+ name: "ValidateDataError",
742
+ message: "Failed to validate data.",
743
+ data: validationResult
744
+ });
745
+ }
746
+ return success(validationResult.output);
747
+ }
748
+
749
+ // src/stacks-api/stacking-pool/index.ts
750
+ var stackingPool = {
751
+ members
752
+ };
753
+
754
+ // src/stacks-api/transactions/schemas.ts
755
+ import * as v13 from "valibot";
756
+ var baseTransactionSchema = v13.object({
757
+ tx_id: v13.string(),
758
+ nonce: v13.number(),
759
+ fee_rate: v13.string(),
760
+ sender_address: v13.string(),
761
+ sponsored: v13.boolean(),
762
+ post_condition_mode: v13.string(),
763
+ post_conditions: v13.array(v13.unknown()),
764
+ anchor_mode: v13.string(),
765
+ is_unanchored: v13.boolean(),
766
+ block_hash: v13.string(),
767
+ parent_block_hash: v13.string(),
768
+ block_height: v13.number(),
769
+ block_time: v13.number(),
770
+ block_time_iso: v13.string(),
771
+ burn_block_height: v13.number(),
772
+ burn_block_time: v13.number(),
773
+ burn_block_time_iso: v13.string(),
774
+ parent_burn_block_time: v13.number(),
775
+ parent_burn_block_time_iso: v13.string(),
776
+ canonical: v13.boolean(),
777
+ tx_index: v13.number(),
778
+ tx_status: v13.string(),
779
+ tx_result: v13.object({
780
+ hex: v13.string(),
781
+ repr: v13.string()
782
+ }),
783
+ microblock_hash: v13.string(),
784
+ microblock_sequence: v13.number(),
785
+ microblock_canonical: v13.boolean(),
786
+ event_count: v13.number(),
787
+ events: v13.array(v13.unknown()),
788
+ execution_cost_read_count: v13.number(),
789
+ execution_cost_read_length: v13.number(),
790
+ execution_cost_runtime: v13.number(),
791
+ execution_cost_write_count: v13.number(),
792
+ execution_cost_write_length: v13.number()
793
+ });
794
+ var contractCallTransactionSchema = v13.object({
795
+ tx_type: v13.literal("contract_call"),
796
+ contract_call: v13.object({
797
+ contract_id: v13.string(),
798
+ function_name: v13.string(),
799
+ function_signature: v13.string(),
800
+ function_args: v13.array(
801
+ v13.object({
802
+ hex: v13.string(),
803
+ repr: v13.string(),
804
+ name: v13.string(),
805
+ type: v13.string()
806
+ })
807
+ )
808
+ }),
809
+ ...baseTransactionSchema.entries
810
+ });
811
+ var smartContractTransactionSchema = v13.object({
812
+ tx_type: v13.literal("smart_contract"),
813
+ smart_contract: v13.object({
814
+ /**
815
+ * NOTE: The types may be wrong, not sure what type of value is used when
816
+ * the version is not `null`.
817
+ */
818
+ clarity_version: v13.union([v13.null(), v13.number()]),
819
+ contract_id: v13.string(),
820
+ source_code: v13.string()
821
+ }),
822
+ ...baseTransactionSchema.entries
823
+ });
824
+ var tokenTransferSchema = v13.object({
825
+ tx_type: v13.literal("token_transfer"),
826
+ token_transfer: v13.object({
827
+ recipient_address: v13.string(),
828
+ amount: v13.string(),
829
+ memo: v13.string()
830
+ }),
831
+ ...baseTransactionSchema.entries
832
+ });
833
+ var transactionSchema = v13.variant("tx_type", [
834
+ contractCallTransactionSchema,
835
+ smartContractTransactionSchema,
836
+ tokenTransferSchema
837
+ ]);
838
+
839
+ // src/stacks-api/transactions/address-transactions.ts
840
+ import * as v14 from "valibot";
841
+ var resultSchema = v14.object({
842
+ tx: transactionSchema,
843
+ stx_sent: v14.string(),
844
+ stx_received: v14.string(),
845
+ events: v14.object({
846
+ stx: v14.object({
847
+ transfer: v14.number(),
848
+ mint: v14.number(),
849
+ burn: v14.number()
850
+ }),
851
+ ft: v14.object({
852
+ transfer: v14.number(),
853
+ mint: v14.number(),
854
+ burn: v14.number()
855
+ }),
856
+ nft: v14.object({
857
+ transfer: v14.number(),
858
+ mint: v14.number(),
859
+ burn: v14.number()
860
+ })
861
+ })
862
+ });
863
+ var resultsSchema4 = v14.array(resultSchema);
864
+ var addressTransactionsResponseSchema = v14.object({
865
+ ...baseListResponseSchema.entries,
866
+ results: resultsSchema4
867
+ });
868
+ async function addressTransactions(args) {
869
+ const search = new URLSearchParams();
870
+ if (args.limit) search.append("limit", args.limit.toString());
871
+ if (args.offset) search.append("offset", args.offset.toString());
872
+ const init = {};
873
+ if (args.apiKeyConfig) {
874
+ init.headers = {
875
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
876
+ };
877
+ }
878
+ const res = await fetch(
879
+ `${args.baseUrl}/extended/v2/addresses/${args.address}/transactions?${search}`,
880
+ init
881
+ );
882
+ if (!res.ok) {
883
+ return error({
884
+ name: "FetchAddressTransactionsError",
885
+ message: "Failed to fetch address transactions.",
886
+ data: {
887
+ status: res.status,
888
+ statusText: res.statusText,
889
+ bodyParseResult: await safePromise(res.json())
890
+ }
891
+ });
892
+ }
893
+ const [jsonParseError, data] = await safePromise(res.json());
894
+ if (jsonParseError) {
895
+ return error({
896
+ name: "ParseBodyError",
897
+ message: "Failed to parse response body as JSON.",
898
+ data: jsonParseError
899
+ });
900
+ }
901
+ const validationResult = v14.safeParse(addressTransactionsResponseSchema, data);
902
+ if (!validationResult.success) {
903
+ return error({
904
+ name: "ValidateDataError",
905
+ message: "Failed to validate data.",
906
+ data: validationResult
907
+ });
908
+ }
909
+ return success(validationResult.output);
910
+ }
911
+
912
+ // src/stacks-api/transactions/get-transaction.ts
913
+ import * as v15 from "valibot";
914
+ async function getTransaction(args) {
915
+ const init = {};
916
+ if (args.apiKeyConfig) {
917
+ init.headers = {
918
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
919
+ };
920
+ }
921
+ const endpoint = `${args.baseUrl}/extended/v1/tx/${args.transactionId}`;
922
+ const res = await fetch(endpoint, init);
923
+ if (!res.ok) {
924
+ return error({
925
+ name: "FetchTransactionError",
926
+ message: `Failed to fetch transaction ${args.transactionId}`,
927
+ response: {
928
+ status: res.status,
929
+ statusText: res.statusText,
930
+ body: await safePromise(res.json())
931
+ }
932
+ });
933
+ }
934
+ const [jsonParseError, data] = await safePromise(res.json());
935
+ if (jsonParseError) {
936
+ return error({
937
+ name: "ParseBodyError",
938
+ message: "Failed to parse response body as JSON.",
939
+ error: jsonParseError
940
+ });
941
+ }
942
+ const validationResult = v15.safeParse(transactionSchema, data);
943
+ if (!validationResult.success) {
944
+ return error({
945
+ name: "ValidateDataError",
946
+ message: "Failed to validate data.",
947
+ error: validationResult
948
+ });
949
+ }
950
+ return success(validationResult.output);
951
+ }
952
+
953
+ // src/stacks-api/transactions/index.ts
954
+ var transactions = {
955
+ addressTransactions,
956
+ getTransaction
957
+ };
958
+
959
+ // src/stacks-api/faucets/stx.ts
960
+ async function stx(opts) {
961
+ const search = new URLSearchParams();
962
+ search.append("address", opts.address);
963
+ if (opts.stacking) search.append("stacking", "true");
964
+ const init = {};
965
+ if (opts.apiKeyConfig) {
966
+ init.headers = {
967
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
968
+ };
969
+ }
970
+ init.method = "POST";
971
+ const endpoint = `${opts.baseUrl}/extended/v1/faucets/stx?${search}`;
972
+ const res = await fetch(endpoint, init);
973
+ if (!res.ok) {
974
+ return error({
975
+ name: "FetchStxError",
976
+ message: "Failed to fetch STX.",
977
+ data: {
978
+ status: res.status,
979
+ statusText: res.statusText,
980
+ bodyParseResult: await safePromise(res.json())
981
+ }
982
+ });
983
+ }
984
+ const [jsonError, data] = await safePromise(res.json());
985
+ if (jsonError) {
986
+ return error({
987
+ name: "ParseBodyError",
988
+ message: "Failed to parse response body as JSON.",
989
+ data: jsonError
990
+ });
991
+ }
992
+ return success(data);
993
+ }
994
+
995
+ // src/stacks-api/faucets/index.ts
996
+ var faucets = {
997
+ stx
998
+ };
999
+
1000
+ // src/stacks-api/index.ts
1001
+ var stacksApi = {
1002
+ accounts,
1003
+ blocks,
1004
+ faucets,
1005
+ info,
1006
+ proofOfTransfer,
1007
+ smartContracts,
1008
+ stackingPool,
1009
+ transactions
1010
+ };
1011
+
1012
+ // src/stacks-rpc-api/smart-contracts/map-entry.ts
1013
+ import * as v16 from "valibot";
1014
+ var mapEntryResponseSchema = v16.object({
1015
+ /**
1016
+ * Hex-encoded string of clarity value. It is always an optional tuple.
1017
+ */
1018
+ data: v16.string(),
1019
+ /**
1020
+ * Hex-encoded string of the MARF proof for the data
1021
+ */
1022
+ proof: v16.optional(v16.string())
1023
+ });
1024
+ async function mapEntry(args) {
1025
+ const search = new URLSearchParams();
1026
+ if (args.proof === 0) search.append("proof", "0");
1027
+ if (args.tip) search.append("tip", args.tip);
1028
+ const init = {};
1029
+ if (args.apiKeyConfig) {
1030
+ init.headers = {
1031
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
1032
+ };
1033
+ }
1034
+ init.method = "POST";
1035
+ init.body = args.mapKey;
1036
+ const endpoint = `${args.baseUrl}/v2/map_entry/${args.contractAddress}/${args.contractName}/${args.mapName}?${search}`;
1037
+ const res = await fetch(endpoint, init);
1038
+ if (!res.ok) {
1039
+ return error({
1040
+ name: "FetchMapEntryError",
1041
+ message: "Failed to fetch map entry.",
1042
+ data: {
1043
+ status: res.status,
1044
+ statusText: res.statusText,
1045
+ bodyParseResult: await safePromise(res.json())
1046
+ }
1047
+ });
1048
+ }
1049
+ const [jsonError, data] = await safePromise(res.json());
1050
+ if (jsonError) {
1051
+ return error({
1052
+ name: "ParseBodyError",
1053
+ message: "Failed to parse response body as JSON.",
1054
+ data: jsonError
1055
+ });
1056
+ }
1057
+ const validationResult = v16.safeParse(mapEntryResponseSchema, data);
1058
+ if (!validationResult.success) {
1059
+ return error({
1060
+ name: "ValidateDataError",
1061
+ message: "Failed to validate response data.",
1062
+ data: validationResult
1063
+ });
1064
+ }
1065
+ return success(validationResult.output);
1066
+ }
1067
+
1068
+ // src/stacks-rpc-api/smart-contracts/index.ts
1069
+ var smartContracts2 = {
1070
+ mapEntry
1071
+ };
1072
+
1073
+ // src/stacks-rpc-api/index.ts
1074
+ var stacksRpcApi = {
1075
+ smartContracts: smartContracts2
1076
+ };
1077
+
1078
+ // src/utils/call-rate-limited-api.ts
1079
+ import { backOff } from "exponential-backoff";
1080
+ async function safeCallRateLimitedApi(fn, options) {
1081
+ try {
1082
+ return await backOff(() => fn(), {
1083
+ startingDelay: options?.startingDelay ?? 15e3,
1084
+ numOfAttempts: options?.numOfAttempts ?? 5
1085
+ });
1086
+ } catch (error2) {
1087
+ return error({
1088
+ name: "MaxRetriesExceeded",
1089
+ message: "Failed to call rate limited API.",
1090
+ data: {
1091
+ error: error2
1092
+ }
1093
+ });
1094
+ }
1095
+ }
1096
+
1097
+ // src/queries/get-signer-stacked-amount.ts
1098
+ async function getSignerStackedAmount(args) {
1099
+ let totalLocked = 0n;
1100
+ const { identifier, ...rest } = args;
1101
+ let hasMore = true;
1102
+ let offset = 0;
1103
+ let found = false;
1104
+ const limit = 200;
1105
+ while (hasMore && !found) {
1106
+ const [error2, data] = await safeCallRateLimitedApi(
1107
+ () => signersInCycle({
1108
+ ...rest,
1109
+ limit
1110
+ })
1111
+ );
1112
+ if (error2) {
1113
+ return error({
1114
+ name: "GetSignerTotalLockedError",
1115
+ message: "Failed to get signer total locked.",
1116
+ data: {
1117
+ error: error2
1118
+ }
1119
+ });
1120
+ }
1121
+ for (const signer of data.results) {
1122
+ if (identifier.type === "address") {
1123
+ if (signer.signer_address === identifier.signerAddress) {
1124
+ totalLocked = BigInt(signer.stacked_amount);
1125
+ found = true;
1126
+ break;
1127
+ }
1128
+ } else {
1129
+ if (signer.signing_key === identifier.signerPublicKey) {
1130
+ totalLocked = BigInt(signer.stacked_amount);
1131
+ found = true;
1132
+ break;
1133
+ }
1134
+ }
1135
+ }
1136
+ offset += limit + data.results.length;
1137
+ hasMore = offset < data.total;
1138
+ }
1139
+ if (!found) {
1140
+ return error({
1141
+ name: "SignerNotFound",
1142
+ message: "Signer not found.",
1143
+ data: {
1144
+ identifier,
1145
+ cycle: args.cycleNumber
1146
+ }
1147
+ });
1148
+ }
1149
+ return success(totalLocked);
1150
+ }
1151
+
1152
+ // src/queries/index.ts
1153
+ var queries = {
1154
+ getSignerStackedAmount
1155
+ };
1156
+ export {
1157
+ queries,
1158
+ stacksApi,
1159
+ stacksRpcApi
1160
+ };