@secretkeylabs/stacks-tools 0.6.0 → 0.7.0-6184ecb

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.
package/dist/index.cjs CHANGED
@@ -28,38 +28,65 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
 
30
30
  // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
33
  callRateLimitedApi: () => callRateLimitedApi,
34
34
  error: () => error,
35
+ flatResults: () => flatResults,
35
36
  pox4Api: () => pox4Api,
36
37
  queries: () => queries,
38
+ safeBackOff: () => safeBackOff,
37
39
  safeCall: () => safeCall,
38
40
  safeCallRateLimitedApi: () => safeCallRateLimitedApi,
41
+ safeExtractResponseBody: () => safeExtractResponseBody,
39
42
  safePromise: () => safePromise,
40
43
  stacksApi: () => stacksApi,
41
44
  stacksRpcApi: () => stacksRpcApi,
42
45
  success: () => success
43
46
  });
44
- module.exports = __toCommonJS(src_exports);
47
+ module.exports = __toCommonJS(index_exports);
45
48
 
46
49
  // src/utils/safe.ts
50
+ var import_exponential_backoff = require("exponential-backoff");
47
51
  function success(data) {
48
52
  return [null, data];
49
53
  }
50
- function error(error2) {
51
- return [error2, null];
54
+ function error(errorArg) {
55
+ return [errorArg, null];
52
56
  }
53
57
  async function safePromise(promise) {
54
58
  try {
55
59
  return success(await promise);
56
60
  } catch (e) {
61
+ return error({ name: "SafeError", message: "Promise rejected.", data: e });
62
+ }
63
+ }
64
+ var defaultStartingDelay = 15e3;
65
+ var defaultNumOfAttempts = 5;
66
+ async function safeBackOff(promise, options) {
67
+ const [backoffError, data] = await safePromise(
68
+ (0, import_exponential_backoff.backOff)(
69
+ async () => {
70
+ const [error2, data2] = await promise;
71
+ if (error2) {
72
+ throw error2;
73
+ }
74
+ return data2;
75
+ },
76
+ {
77
+ startingDelay: options?.startingDelay ?? defaultStartingDelay,
78
+ numOfAttempts: options?.numOfAttempts ?? defaultNumOfAttempts
79
+ }
80
+ )
81
+ );
82
+ if (backoffError) {
57
83
  return error({
58
- name: "SafePromiseError",
59
- message: "Safe promise rejected.",
60
- data: e
84
+ name: "BackoffError",
85
+ message: "Retries exceeded.",
86
+ data: backoffError.data
61
87
  });
62
88
  }
89
+ return success(data);
63
90
  }
64
91
  function safeCall(fn) {
65
92
  try {
@@ -72,6 +99,29 @@ function safeCall(fn) {
72
99
  });
73
100
  }
74
101
  }
102
+ function flatResults(results) {
103
+ const errors = results.map((r) => r[0]).filter((maybeError) => maybeError !== null);
104
+ if (errors.length !== 0)
105
+ return error({
106
+ name: "FlatResultsError",
107
+ message: `Found ${errors.length} errors in result array of length ${results.length}.`,
108
+ data: errors.slice(0, 10)
109
+ // Only show first 10 errors to avoid spamming logs
110
+ });
111
+ const values = results.map((r) => r[1]);
112
+ return [null, values];
113
+ }
114
+ async function safeExtractResponseBody(response) {
115
+ try {
116
+ return await response.json();
117
+ } catch {
118
+ try {
119
+ return await response.text();
120
+ } catch {
121
+ return void 0;
122
+ }
123
+ }
124
+ }
75
125
 
76
126
  // src/stacks-api/accounts/balances.ts
77
127
  async function balances(opts) {
@@ -93,7 +143,7 @@ async function balances(opts) {
93
143
  data: {
94
144
  status: res.status,
95
145
  statusText: res.statusText,
96
- bodyText: await safePromise(res.text())
146
+ body: await safeExtractResponseBody(res)
97
147
  }
98
148
  });
99
149
  }
@@ -134,7 +184,7 @@ async function latestNonce(opts) {
134
184
  endpoint,
135
185
  status: res.status,
136
186
  statusText: res.statusText,
137
- bodyText: await safePromise(res.text())
187
+ body: await safeExtractResponseBody(res)
138
188
  }
139
189
  });
140
190
  }
@@ -173,28 +223,6 @@ var baseListResponseSchema = v2.object({
173
223
  });
174
224
 
175
225
  // src/stacks-api/blocks/get-block.ts
176
- var v3 = __toESM(require("valibot"), 1);
177
- var responseSchema2 = v3.object({
178
- canonical: v3.boolean(),
179
- height: v3.number(),
180
- hash: v3.string(),
181
- block_time: v3.number(),
182
- block_time_iso: v3.string(),
183
- index_block_hash: v3.string(),
184
- parent_block_hash: v3.string(),
185
- parent_index_block_hash: v3.string(),
186
- burn_block_time: v3.number(),
187
- burn_block_time_iso: v3.string(),
188
- burn_block_hash: v3.string(),
189
- burn_block_height: v3.number(),
190
- miner_txid: v3.string(),
191
- tx_count: v3.number(),
192
- execution_cost_read_count: v3.number(),
193
- execution_cost_read_length: v3.number(),
194
- execution_cost_runtime: v3.number(),
195
- execution_cost_write_count: v3.number(),
196
- execution_cost_write_length: v3.number()
197
- });
198
226
  async function getBlock(opts) {
199
227
  const init = {};
200
228
  if (opts.apiKeyConfig) {
@@ -202,10 +230,8 @@ async function getBlock(opts) {
202
230
  [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
203
231
  };
204
232
  }
205
- const res = await fetch(
206
- `${opts.baseUrl}/extended/v2/blocks/${opts.heightOrHash}`,
207
- init
208
- );
233
+ const endpoint = `${opts.baseUrl}/extended/v2/blocks/${opts.heightOrHash}`;
234
+ const res = await fetch(endpoint, init);
209
235
  if (!res.ok) {
210
236
  return error({
211
237
  name: "FetchBlockError",
@@ -213,7 +239,7 @@ async function getBlock(opts) {
213
239
  data: {
214
240
  status: res.status,
215
241
  statusText: res.statusText,
216
- bodyText: await safePromise(res.text())
242
+ body: await safeExtractResponseBody(res)
217
243
  }
218
244
  });
219
245
  }
@@ -225,15 +251,7 @@ async function getBlock(opts) {
225
251
  data: jsonError
226
252
  });
227
253
  }
228
- const validationResult = v3.safeParse(responseSchema2, data);
229
- if (!validationResult.success) {
230
- return error({
231
- name: "ValidateDataError",
232
- message: "Failed to validate data.",
233
- data: validationResult
234
- });
235
- }
236
- return success(validationResult.output);
254
+ return success(data);
237
255
  }
238
256
 
239
257
  // src/stacks-api/blocks/index.ts
@@ -241,6 +259,44 @@ var blocks = {
241
259
  getBlock
242
260
  };
243
261
 
262
+ // src/stacks-api/burn-blocks/get-burn-block.ts
263
+ async function getBurnBlock(args) {
264
+ const init = {};
265
+ if (args.apiKeyConfig) {
266
+ init.headers = {
267
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
268
+ };
269
+ }
270
+ const endpoint = `${args.baseUrl}/extended/v2/burn-blocks/${args.heightOrHash}`;
271
+ const res = await fetch(endpoint, init);
272
+ if (!res.ok) {
273
+ return error({
274
+ name: "BurnBlockGetError",
275
+ message: "Failed to get burn block.",
276
+ data: {
277
+ heightOrHash: args.heightOrHash,
278
+ status: res.status,
279
+ statusText: res.statusText,
280
+ body: await safeExtractResponseBody(res)
281
+ }
282
+ });
283
+ }
284
+ const [jsonParseError, data] = await safePromise(res.json());
285
+ if (jsonParseError) {
286
+ return error({
287
+ name: "ParseBodyError",
288
+ message: "Failed to parse response body as JSON.",
289
+ data: jsonParseError
290
+ });
291
+ }
292
+ return success(data);
293
+ }
294
+
295
+ // src/stacks-api/burn-blocks/index.ts
296
+ var burnBlocks = {
297
+ getBurnBlock
298
+ };
299
+
244
300
  // src/stacks-api/faucets/stx.ts
245
301
  async function stx(opts) {
246
302
  const search = new URLSearchParams();
@@ -262,7 +318,7 @@ async function stx(opts) {
262
318
  data: {
263
319
  status: res.status,
264
320
  statusText: res.statusText,
265
- bodyText: await safePromise(res.text())
321
+ body: await safeExtractResponseBody(res)
266
322
  }
267
323
  });
268
324
  }
@@ -283,22 +339,22 @@ var faucets = {
283
339
  };
284
340
 
285
341
  // src/stacks-api/info/core-api.ts
286
- var v4 = __toESM(require("valibot"), 1);
287
- var CoreApiResponseSchema = v4.object({
288
- peer_version: v4.number(),
289
- pox_consensus: v4.string(),
290
- burn_block_height: v4.number(),
291
- stable_pox_consensus: v4.string(),
292
- stable_burn_block_height: v4.number(),
293
- server_version: v4.string(),
294
- network_id: v4.number(),
295
- parent_network_id: v4.number(),
296
- stacks_tip_height: v4.number(),
297
- stacks_tip: v4.string(),
298
- stacks_tip_consensus_hash: v4.string(),
299
- unanchored_tip: v4.nullable(v4.string()),
300
- unanchored_seq: v4.nullable(v4.string()),
301
- exit_at_block_height: v4.nullable(v4.number())
342
+ var v3 = __toESM(require("valibot"), 1);
343
+ var CoreApiResponseSchema = v3.object({
344
+ peer_version: v3.number(),
345
+ pox_consensus: v3.string(),
346
+ burn_block_height: v3.number(),
347
+ stable_pox_consensus: v3.string(),
348
+ stable_burn_block_height: v3.number(),
349
+ server_version: v3.string(),
350
+ network_id: v3.number(),
351
+ parent_network_id: v3.number(),
352
+ stacks_tip_height: v3.number(),
353
+ stacks_tip: v3.string(),
354
+ stacks_tip_consensus_hash: v3.string(),
355
+ unanchored_tip: v3.nullable(v3.string()),
356
+ unanchored_seq: v3.nullable(v3.string()),
357
+ exit_at_block_height: v3.nullable(v3.number())
302
358
  });
303
359
  async function coreApi(apiOpts) {
304
360
  const init = {};
@@ -315,7 +371,7 @@ async function coreApi(apiOpts) {
315
371
  data: {
316
372
  status: res.status,
317
373
  statusText: res.statusText,
318
- bodyText: await safePromise(res.text())
374
+ body: await safeExtractResponseBody(res)
319
375
  }
320
376
  });
321
377
  }
@@ -327,7 +383,7 @@ async function coreApi(apiOpts) {
327
383
  data: parseBodyError
328
384
  });
329
385
  }
330
- const validationResult = v4.safeParse(CoreApiResponseSchema, data);
386
+ const validationResult = v3.safeParse(CoreApiResponseSchema, data);
331
387
  if (!validationResult.success) {
332
388
  return error({
333
389
  name: "ValidateDataError",
@@ -344,14 +400,14 @@ var info = {
344
400
  };
345
401
 
346
402
  // src/stacks-api/proof-of-transfer/cycle.ts
347
- var v5 = __toESM(require("valibot"), 1);
348
- var responseSchema3 = v5.object({
349
- block_height: v5.number(),
350
- index_block_hash: v5.string(),
351
- cycle_number: v5.number(),
352
- total_weight: v5.number(),
353
- total_stacked_amount: v5.string(),
354
- total_signers: v5.number()
403
+ var v4 = __toESM(require("valibot"), 1);
404
+ var responseSchema2 = v4.object({
405
+ block_height: v4.number(),
406
+ index_block_hash: v4.string(),
407
+ cycle_number: v4.number(),
408
+ total_weight: v4.number(),
409
+ total_stacked_amount: v4.string(),
410
+ total_signers: v4.number()
355
411
  });
356
412
  async function cycle(opts) {
357
413
  const init = {};
@@ -370,7 +426,7 @@ async function cycle(opts) {
370
426
  endpoint,
371
427
  status: res.status,
372
428
  statusText: res.statusText,
373
- bodyText: await safePromise(res.text())
429
+ body: await safeExtractResponseBody(res)
374
430
  }
375
431
  });
376
432
  }
@@ -382,7 +438,7 @@ async function cycle(opts) {
382
438
  data: jsonError
383
439
  });
384
440
  }
385
- const validationResult = v5.safeParse(responseSchema3, data);
441
+ const validationResult = v4.safeParse(responseSchema2, data);
386
442
  if (!validationResult.success) {
387
443
  return error({
388
444
  name: "ValidateDataError",
@@ -394,17 +450,17 @@ async function cycle(opts) {
394
450
  }
395
451
 
396
452
  // src/stacks-api/proof-of-transfer/cycles.ts
397
- var v6 = __toESM(require("valibot"), 1);
398
- var cycleInfoSchema = v6.object({
399
- block_height: v6.number(),
400
- index_block_hash: v6.string(),
401
- cycle_number: v6.number(),
402
- total_weight: v6.number(),
403
- total_stacked_amount: v6.string(),
404
- total_signers: v6.number()
453
+ var v5 = __toESM(require("valibot"), 1);
454
+ var cycleInfoSchema = v5.object({
455
+ block_height: v5.number(),
456
+ index_block_hash: v5.string(),
457
+ cycle_number: v5.number(),
458
+ total_weight: v5.number(),
459
+ total_stacked_amount: v5.string(),
460
+ total_signers: v5.number()
405
461
  });
406
- var resultsSchema = v6.array(cycleInfoSchema);
407
- var cyclesResponseSchema = v6.object({
462
+ var resultsSchema = v5.array(cycleInfoSchema);
463
+ var cyclesResponseSchema = v5.object({
408
464
  ...baseListResponseSchema.entries,
409
465
  results: resultsSchema
410
466
  });
@@ -428,7 +484,7 @@ async function cycles(args) {
428
484
  endpoint,
429
485
  status: res.status,
430
486
  statusText: res.statusText,
431
- bodyText: await safePromise(res.text())
487
+ body: await safeExtractResponseBody(res)
432
488
  }
433
489
  });
434
490
  }
@@ -440,7 +496,7 @@ async function cycles(args) {
440
496
  data: jsonError
441
497
  });
442
498
  }
443
- const validationResult = v6.safeParse(cyclesResponseSchema, data);
499
+ const validationResult = v5.safeParse(cyclesResponseSchema, data);
444
500
  if (!validationResult.success) {
445
501
  return error({
446
502
  name: "ValidateDataError",
@@ -452,16 +508,16 @@ async function cycles(args) {
452
508
  }
453
509
 
454
510
  // src/stacks-api/proof-of-transfer/signer-in-cycle.ts
455
- var v7 = __toESM(require("valibot"), 1);
456
- var signerInCycleResponseSchema = v7.object({
457
- signing_key: v7.string(),
458
- signer_address: v7.string(),
459
- weight: v7.number(),
460
- stacked_amount: v7.string(),
461
- weight_percent: v7.number(),
462
- stacked_amount_percent: v7.number(),
463
- solo_stacker_count: v7.number(),
464
- pooled_stacker_count: v7.number()
511
+ var v6 = __toESM(require("valibot"), 1);
512
+ var signerInCycleResponseSchema = v6.object({
513
+ signing_key: v6.string(),
514
+ signer_address: v6.string(),
515
+ weight: v6.number(),
516
+ stacked_amount: v6.string(),
517
+ weight_percent: v6.number(),
518
+ stacked_amount_percent: v6.number(),
519
+ solo_stacker_count: v6.number(),
520
+ pooled_stacker_count: v6.number()
465
521
  });
466
522
  async function signerInCycle(args) {
467
523
  const init = {};
@@ -497,7 +553,7 @@ async function signerInCycle(args) {
497
553
  }
498
554
  });
499
555
  }
500
- const validationResult = v7.safeParse(signerInCycleResponseSchema, data);
556
+ const validationResult = v6.safeParse(signerInCycleResponseSchema, data);
501
557
  if (!validationResult.success) {
502
558
  return error({
503
559
  name: "ValidateDataError",
@@ -509,19 +565,19 @@ async function signerInCycle(args) {
509
565
  }
510
566
 
511
567
  // src/stacks-api/proof-of-transfer/signers-in-cycle.ts
512
- var v8 = __toESM(require("valibot"), 1);
513
- var signerSchema = v8.object({
514
- signing_key: v8.string(),
515
- signer_address: v8.string(),
516
- weight: v8.number(),
517
- stacked_amount: v8.string(),
518
- weight_percent: v8.number(),
519
- stacked_amount_percent: v8.number(),
520
- pooled_stacker_count: v8.number(),
521
- solo_stacker_count: v8.number()
568
+ var v7 = __toESM(require("valibot"), 1);
569
+ var signerSchema = v7.object({
570
+ signing_key: v7.string(),
571
+ signer_address: v7.string(),
572
+ weight: v7.number(),
573
+ stacked_amount: v7.string(),
574
+ weight_percent: v7.number(),
575
+ stacked_amount_percent: v7.number(),
576
+ pooled_stacker_count: v7.number(),
577
+ solo_stacker_count: v7.number()
522
578
  });
523
- var resultsSchema2 = v8.array(signerSchema);
524
- var signersResponseSchema = v8.object({
579
+ var resultsSchema2 = v7.array(signerSchema);
580
+ var signersResponseSchema = v7.object({
525
581
  ...baseListResponseSchema.entries,
526
582
  results: resultsSchema2
527
583
  });
@@ -545,7 +601,7 @@ async function signersInCycle(args) {
545
601
  endpoint,
546
602
  status: res.status,
547
603
  statusText: res.statusText,
548
- bodyText: await safePromise(res.text())
604
+ body: await safeExtractResponseBody(res)
549
605
  }
550
606
  });
551
607
  }
@@ -556,11 +612,11 @@ async function signersInCycle(args) {
556
612
  message: "Failed to parse response body as JSON.",
557
613
  data: {
558
614
  endpoint,
559
- bodyParseResult: data
615
+ body: data
560
616
  }
561
617
  });
562
618
  }
563
- const validationResult = v8.safeParse(signersResponseSchema, data);
619
+ const validationResult = v7.safeParse(signersResponseSchema, data);
564
620
  if (!validationResult.success) {
565
621
  return error({
566
622
  name: "ValidateDataError",
@@ -572,18 +628,6 @@ async function signersInCycle(args) {
572
628
  }
573
629
 
574
630
  // src/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.ts
575
- var v9 = __toESM(require("valibot"), 1);
576
- var stackerInfoSchema = v9.object({
577
- stacker_address: v9.string(),
578
- stacked_amount: v9.string(),
579
- pox_address: v9.string(),
580
- stacker_type: v9.union([v9.literal("pooled"), v9.literal("solo")])
581
- });
582
- var resultsSchema3 = v9.array(stackerInfoSchema);
583
- var stackersForSignerInCycleResponseSchema = v9.object({
584
- ...baseListResponseSchema.entries,
585
- results: resultsSchema3
586
- });
587
631
  async function stackersForSignerInCycle(opts) {
588
632
  const search = new URLSearchParams();
589
633
  if (opts.limit) search.append("limit", opts.limit.toString());
@@ -605,7 +649,7 @@ async function stackersForSignerInCycle(opts) {
605
649
  endpoint,
606
650
  status: res.status,
607
651
  statusText: res.statusText,
608
- bodyText: await safePromise(res.text())
652
+ body: await safeExtractResponseBody(res)
609
653
  }
610
654
  });
611
655
  }
@@ -617,18 +661,7 @@ async function stackersForSignerInCycle(opts) {
617
661
  data: jsonError
618
662
  });
619
663
  }
620
- const validationResult = v9.safeParse(
621
- stackersForSignerInCycleResponseSchema,
622
- data
623
- );
624
- if (!validationResult.success) {
625
- return error({
626
- name: "ValidateDataError",
627
- message: "Failed to validate response data.",
628
- data: validationResult
629
- });
630
- }
631
- return success(validationResult.output);
664
+ return success(data);
632
665
  }
633
666
 
634
667
  // src/stacks-api/proof-of-transfer/index.ts
@@ -641,21 +674,6 @@ var proofOfTransfer = {
641
674
  };
642
675
 
643
676
  // src/stacks-api/stacking-pool/members.ts
644
- var v10 = __toESM(require("valibot"), 1);
645
- var memberSchema = v10.object({
646
- stacker: v10.string(),
647
- pox_addr: v10.optional(v10.string()),
648
- amount_ustx: v10.string(),
649
- burn_block_unlock_height: v10.optional(v10.number()),
650
- block_height: v10.number(),
651
- tx_id: v10.string()
652
- });
653
- var membersResponseSchema = v10.object({
654
- limit: v10.number(),
655
- offset: v10.number(),
656
- total: v10.number(),
657
- results: v10.array(memberSchema)
658
- });
659
677
  async function members(args) {
660
678
  const search = new URLSearchParams();
661
679
  if (args.afterBlock) search.append("after_block", args.afterBlock.toString());
@@ -677,7 +695,7 @@ async function members(args) {
677
695
  data: {
678
696
  status: res.status,
679
697
  statusText: res.statusText,
680
- bodyText: await safePromise(res.text())
698
+ body: await safeExtractResponseBody(res)
681
699
  }
682
700
  });
683
701
  }
@@ -689,15 +707,7 @@ async function members(args) {
689
707
  data: jsonParseError
690
708
  });
691
709
  }
692
- const validationResult = v10.safeParse(membersResponseSchema, data);
693
- if (!validationResult.success) {
694
- return error({
695
- name: "ValidateDataError",
696
- message: "Failed to validate data.",
697
- data: validationResult
698
- });
699
- }
700
- return success(validationResult.output);
710
+ return success(data);
701
711
  }
702
712
 
703
713
  // src/stacks-api/stacking-pool/index.ts
@@ -705,124 +715,7 @@ var stackingPool = {
705
715
  members
706
716
  };
707
717
 
708
- // src/stacks-api/transactions/schemas.ts
709
- var v11 = __toESM(require("valibot"), 1);
710
- var baseTransactionSchema = v11.object({
711
- tx_id: v11.string(),
712
- nonce: v11.number(),
713
- fee_rate: v11.string(),
714
- sender_address: v11.string(),
715
- sponsored: v11.boolean(),
716
- post_condition_mode: v11.string(),
717
- post_conditions: v11.array(v11.unknown()),
718
- anchor_mode: v11.string(),
719
- is_unanchored: v11.boolean(),
720
- block_hash: v11.string(),
721
- parent_block_hash: v11.string(),
722
- block_height: v11.number(),
723
- block_time: v11.number(),
724
- block_time_iso: v11.string(),
725
- burn_block_height: v11.number(),
726
- burn_block_time: v11.number(),
727
- burn_block_time_iso: v11.string(),
728
- parent_burn_block_time: v11.number(),
729
- parent_burn_block_time_iso: v11.string(),
730
- canonical: v11.boolean(),
731
- tx_index: v11.number(),
732
- tx_status: v11.union([
733
- v11.literal("success"),
734
- v11.literal("abort_by_response"),
735
- v11.literal("abort_by_post_condition")
736
- ]),
737
- tx_result: v11.object({
738
- hex: v11.string(),
739
- repr: v11.string()
740
- }),
741
- microblock_hash: v11.string(),
742
- microblock_sequence: v11.number(),
743
- microblock_canonical: v11.boolean(),
744
- event_count: v11.number(),
745
- events: v11.array(v11.unknown()),
746
- execution_cost_read_count: v11.number(),
747
- execution_cost_read_length: v11.number(),
748
- execution_cost_runtime: v11.number(),
749
- execution_cost_write_count: v11.number(),
750
- execution_cost_write_length: v11.number()
751
- });
752
- var contractCallTransactionSchema = v11.object({
753
- tx_type: v11.literal("contract_call"),
754
- contract_call: v11.object({
755
- contract_id: v11.string(),
756
- function_name: v11.string(),
757
- function_signature: v11.string(),
758
- function_args: v11.array(
759
- v11.object({
760
- hex: v11.string(),
761
- repr: v11.string(),
762
- name: v11.string(),
763
- type: v11.string()
764
- })
765
- )
766
- }),
767
- ...baseTransactionSchema.entries
768
- });
769
- var smartContractTransactionSchema = v11.object({
770
- tx_type: v11.literal("smart_contract"),
771
- smart_contract: v11.object({
772
- /**
773
- * NOTE: The types may be wrong, not sure what type of value is used when
774
- * the version is not `null`.
775
- */
776
- clarity_version: v11.union([v11.null(), v11.number()]),
777
- contract_id: v11.string(),
778
- source_code: v11.string()
779
- }),
780
- ...baseTransactionSchema.entries
781
- });
782
- var tokenTransferSchema = v11.object({
783
- tx_type: v11.literal("token_transfer"),
784
- token_transfer: v11.object({
785
- recipient_address: v11.string(),
786
- amount: v11.string(),
787
- memo: v11.string()
788
- }),
789
- ...baseTransactionSchema.entries
790
- });
791
- var transactionSchema = v11.variant("tx_type", [
792
- contractCallTransactionSchema,
793
- smartContractTransactionSchema,
794
- tokenTransferSchema
795
- ]);
796
-
797
718
  // src/stacks-api/transactions/address-transactions.ts
798
- var v12 = __toESM(require("valibot"), 1);
799
- var resultSchema = v12.object({
800
- tx: transactionSchema,
801
- stx_sent: v12.string(),
802
- stx_received: v12.string(),
803
- events: v12.object({
804
- stx: v12.object({
805
- transfer: v12.number(),
806
- mint: v12.number(),
807
- burn: v12.number()
808
- }),
809
- ft: v12.object({
810
- transfer: v12.number(),
811
- mint: v12.number(),
812
- burn: v12.number()
813
- }),
814
- nft: v12.object({
815
- transfer: v12.number(),
816
- mint: v12.number(),
817
- burn: v12.number()
818
- })
819
- })
820
- });
821
- var resultsSchema4 = v12.array(resultSchema);
822
- var addressTransactionsResponseSchema = v12.object({
823
- ...baseListResponseSchema.entries,
824
- results: resultsSchema4
825
- });
826
719
  async function addressTransactions(args) {
827
720
  const search = new URLSearchParams();
828
721
  if (args.limit) search.append("limit", args.limit.toString());
@@ -844,7 +737,7 @@ async function addressTransactions(args) {
844
737
  data: {
845
738
  status: res.status,
846
739
  statusText: res.statusText,
847
- bodyText: await safePromise(res.text())
740
+ body: await safeExtractResponseBody(res)
848
741
  }
849
742
  });
850
743
  }
@@ -856,19 +749,47 @@ async function addressTransactions(args) {
856
749
  data: jsonParseError
857
750
  });
858
751
  }
859
- const validationResult = v12.safeParse(addressTransactionsResponseSchema, data);
860
- if (!validationResult.success) {
752
+ return success(data);
753
+ }
754
+
755
+ // src/stacks-api/transactions/events-for-an-address-transaction.ts
756
+ async function eventsForAnAddressTransaction(args) {
757
+ const search = new URLSearchParams();
758
+ if (args.limit) search.append("limit", args.limit.toString());
759
+ if (args.offset) search.append("offset", args.offset.toString());
760
+ const init = {};
761
+ if (args.apiKeyConfig) {
762
+ init.headers = {
763
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
764
+ };
765
+ }
766
+ const endpoint = `${args.baseUrl}/extended/v2/addresses/${args.address}/transactions/${args.transactionId}/events?${search}`;
767
+ const res = await fetch(endpoint, init);
768
+ if (!res.ok) {
861
769
  return error({
862
- name: "ValidateDataError",
863
- message: "Failed to validate data.",
864
- data: validationResult
770
+ name: "FetchEventsForAnAddressTransactionError",
771
+ message: `Failed to fetch address transaction events.`,
772
+ data: {
773
+ address: args.address,
774
+ transactionId: args.transactionId,
775
+ status: res.status,
776
+ statusText: res.statusText,
777
+ body: await safeExtractResponseBody(res)
778
+ }
865
779
  });
866
780
  }
867
- return success(validationResult.output);
781
+ const [jsonParseError, data] = await safePromise(res.json());
782
+ if (jsonParseError) {
783
+ return error({
784
+ name: "ParseBodyError",
785
+ message: "Failed to parse response body as JSON.",
786
+ error: jsonParseError
787
+ });
788
+ }
789
+ return success(data);
868
790
  }
869
791
 
870
792
  // src/stacks-api/transactions/get-transaction.ts
871
- var v13 = __toESM(require("valibot"), 1);
872
793
  async function getTransaction(args) {
873
794
  const init = {};
874
795
  if (args.apiKeyConfig) {
@@ -881,11 +802,12 @@ async function getTransaction(args) {
881
802
  if (!res.ok) {
882
803
  return error({
883
804
  name: "FetchTransactionError",
884
- message: `Failed to fetch transaction ${args.transactionId}`,
885
- response: {
805
+ message: `Failed to fetch transaction.`,
806
+ data: {
807
+ transactionId: args.transactionId,
886
808
  status: res.status,
887
809
  statusText: res.statusText,
888
- bodyText: await safePromise(res.text())
810
+ body: await safeExtractResponseBody(res)
889
811
  }
890
812
  });
891
813
  }
@@ -897,15 +819,7 @@ async function getTransaction(args) {
897
819
  error: jsonParseError
898
820
  });
899
821
  }
900
- const validationResult = v13.safeParse(transactionSchema, data);
901
- if (!validationResult.success) {
902
- return error({
903
- name: "ValidateDataError",
904
- message: "Failed to validate data.",
905
- error: validationResult
906
- });
907
- }
908
- return success(validationResult.output);
822
+ return success(data);
909
823
  }
910
824
 
911
825
  // src/stacks-api/transactions/mempool-transactions.ts
@@ -936,7 +850,7 @@ async function mempoolTransactions(args) {
936
850
  data: {
937
851
  status: res.status,
938
852
  statusText: res.statusText,
939
- bodyText: await safePromise(res.text())
853
+ body: await safeExtractResponseBody(res)
940
854
  }
941
855
  });
942
856
  }
@@ -951,11 +865,46 @@ async function mempoolTransactions(args) {
951
865
  return success(data);
952
866
  }
953
867
 
868
+ // src/stacks-api/transactions/get-raw-transaction.ts
869
+ async function getRawTransaction(args) {
870
+ const init = {};
871
+ if (args.apiKeyConfig) {
872
+ init.headers = {
873
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
874
+ };
875
+ }
876
+ const endpoint = `${args.baseUrl}/extended/v1/tx/${args.transactionId}/raw`;
877
+ const res = await fetch(endpoint, init);
878
+ if (!res.ok) {
879
+ return error({
880
+ name: "RawTransactionFetchError",
881
+ message: `Failed to fetch raw transaction.`,
882
+ data: {
883
+ transactionId: args.transactionId,
884
+ status: res.status,
885
+ statusText: res.statusText,
886
+ body: await safeExtractResponseBody(res)
887
+ }
888
+ });
889
+ }
890
+ const [jsonParseError, data] = await safePromise(res.json());
891
+ if (jsonParseError) {
892
+ return error({
893
+ name: "ParseBodyError",
894
+ message: "Failed to parse response body as JSON.",
895
+ error: jsonParseError
896
+ });
897
+ }
898
+ return success(data);
899
+ }
900
+
954
901
  // src/stacks-api/transactions/index.ts
955
902
  var transactions = {
956
903
  addressTransactions,
904
+ eventsForAnAddressTransaction,
957
905
  getTransaction,
958
- mempoolTransactions
906
+ mempoolTransactions,
907
+ getRawTransaction
959
908
  };
960
909
 
961
910
  // src/stacks-api/mempool/transaction-fee-priorities.ts
@@ -975,7 +924,7 @@ async function transactionFeePriorities(opts) {
975
924
  data: {
976
925
  status: res.status,
977
926
  statusText: res.statusText,
978
- bodyParseResult: await safePromise(res.text())
927
+ body: await safeExtractResponseBody(res)
979
928
  }
980
929
  });
981
930
  }
@@ -999,6 +948,7 @@ var mempool = {
999
948
  var stacksApi = {
1000
949
  accounts,
1001
950
  blocks,
951
+ burnBlocks,
1002
952
  faucets,
1003
953
  info,
1004
954
  mempool,
@@ -1008,16 +958,16 @@ var stacksApi = {
1008
958
  };
1009
959
 
1010
960
  // src/stacks-rpc-api/smart-contracts/map-entry.ts
1011
- var v14 = __toESM(require("valibot"), 1);
1012
- var mapEntryResponseSchema = v14.object({
961
+ var v8 = __toESM(require("valibot"), 1);
962
+ var mapEntryResponseSchema = v8.object({
1013
963
  /**
1014
964
  * Hex-encoded string of clarity value. It is always an optional tuple.
1015
965
  */
1016
- data: v14.string(),
966
+ data: v8.string(),
1017
967
  /**
1018
968
  * Hex-encoded string of the MARF proof for the data
1019
969
  */
1020
- proof: v14.optional(v14.string())
970
+ proof: v8.optional(v8.string())
1021
971
  });
1022
972
  async function mapEntry(args) {
1023
973
  const search = new URLSearchParams();
@@ -1045,7 +995,7 @@ async function mapEntry(args) {
1045
995
  status: res.status,
1046
996
  statusText: res.statusText,
1047
997
  endpoint,
1048
- bodyText: await safePromise(res.text())
998
+ body: await safeExtractResponseBody(res)
1049
999
  }
1050
1000
  });
1051
1001
  }
@@ -1057,7 +1007,7 @@ async function mapEntry(args) {
1057
1007
  data: jsonError
1058
1008
  });
1059
1009
  }
1060
- const validationResult = v14.safeParse(mapEntryResponseSchema, data);
1010
+ const validationResult = v8.safeParse(mapEntryResponseSchema, data);
1061
1011
  if (!validationResult.success) {
1062
1012
  return error({
1063
1013
  name: "ValidateDataError",
@@ -1093,7 +1043,7 @@ async function readOnly(args) {
1093
1043
  data: {
1094
1044
  status: res.status,
1095
1045
  statusText: res.statusText,
1096
- bodyText: await safePromise(res.text())
1046
+ body: await safeExtractResponseBody(res)
1097
1047
  }
1098
1048
  });
1099
1049
  }
@@ -1130,7 +1080,7 @@ async function contractInterface(args) {
1130
1080
  status: res.status,
1131
1081
  statusText: res.statusText,
1132
1082
  endpoint,
1133
- bodyText: await safePromise(res.text())
1083
+ body: await safeExtractResponseBody(res)
1134
1084
  }
1135
1085
  });
1136
1086
  }
@@ -1168,7 +1118,7 @@ async function poxDetails(args) {
1168
1118
  data: {
1169
1119
  status: res.status,
1170
1120
  statusText: res.statusText,
1171
- bodyText: await safePromise(res.text())
1121
+ body: await safeExtractResponseBody(res)
1172
1122
  }
1173
1123
  });
1174
1124
  }
@@ -1195,18 +1145,18 @@ var stacksRpcApi = {
1195
1145
  };
1196
1146
 
1197
1147
  // src/utils/call-rate-limited-api.ts
1198
- var import_exponential_backoff = require("exponential-backoff");
1199
- var defaultStartingDelay = 15e3;
1200
- var defaultNumOfAttempts = 5;
1148
+ var import_exponential_backoff2 = require("exponential-backoff");
1149
+ var defaultStartingDelay2 = 15e3;
1150
+ var defaultNumOfAttempts2 = 5;
1201
1151
  function callRateLimitedApi(fn, options) {
1202
- return (0, import_exponential_backoff.backOff)(fn, {
1203
- startingDelay: options?.startingDelay ?? defaultStartingDelay,
1204
- numOfAttempts: options?.numOfAttempts ?? defaultNumOfAttempts
1152
+ return (0, import_exponential_backoff2.backOff)(fn, {
1153
+ startingDelay: options?.startingDelay ?? defaultStartingDelay2,
1154
+ numOfAttempts: options?.numOfAttempts ?? defaultNumOfAttempts2
1205
1155
  });
1206
1156
  }
1207
1157
  async function safeCallRateLimitedApi(fn, options) {
1208
1158
  try {
1209
- return await (0, import_exponential_backoff.backOff)(
1159
+ return await (0, import_exponential_backoff2.backOff)(
1210
1160
  async () => {
1211
1161
  const [error2, data] = await fn();
1212
1162
  if (error2) {
@@ -1422,10 +1372,13 @@ var pox4Api = { maps, readOnly: readOnly2 };
1422
1372
  0 && (module.exports = {
1423
1373
  callRateLimitedApi,
1424
1374
  error,
1375
+ flatResults,
1425
1376
  pox4Api,
1426
1377
  queries,
1378
+ safeBackOff,
1427
1379
  safeCall,
1428
1380
  safeCallRateLimitedApi,
1381
+ safeExtractResponseBody,
1429
1382
  safePromise,
1430
1383
  stacksApi,
1431
1384
  stacksRpcApi,