@secretkeylabs/stacks-tools 0.3.0-9b21b7a → 0.4.0-0fe567d

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