@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.js CHANGED
@@ -1,20 +1,44 @@
1
1
  // src/utils/safe.ts
2
+ import { backOff } from "exponential-backoff";
2
3
  function success(data) {
3
4
  return [null, data];
4
5
  }
5
- function error(error2) {
6
- return [error2, null];
6
+ function error(errorArg) {
7
+ return [errorArg, null];
7
8
  }
8
9
  async function safePromise(promise) {
9
10
  try {
10
11
  return success(await promise);
11
12
  } catch (e) {
13
+ return error({ name: "SafeError", message: "Promise rejected.", data: e });
14
+ }
15
+ }
16
+ var defaultStartingDelay = 15e3;
17
+ var defaultNumOfAttempts = 5;
18
+ async function safeBackOff(promise, options) {
19
+ const [backoffError, data] = await safePromise(
20
+ backOff(
21
+ async () => {
22
+ const [error2, data2] = await promise;
23
+ if (error2) {
24
+ throw error2;
25
+ }
26
+ return data2;
27
+ },
28
+ {
29
+ startingDelay: options?.startingDelay ?? defaultStartingDelay,
30
+ numOfAttempts: options?.numOfAttempts ?? defaultNumOfAttempts
31
+ }
32
+ )
33
+ );
34
+ if (backoffError) {
12
35
  return error({
13
- name: "SafePromiseError",
14
- message: "Safe promise rejected.",
15
- data: e
36
+ name: "BackoffError",
37
+ message: "Retries exceeded.",
38
+ data: backoffError.data
16
39
  });
17
40
  }
41
+ return success(data);
18
42
  }
19
43
  function safeCall(fn) {
20
44
  try {
@@ -27,6 +51,29 @@ function safeCall(fn) {
27
51
  });
28
52
  }
29
53
  }
54
+ function flatResults(results) {
55
+ const errors = results.map((r) => r[0]).filter((maybeError) => maybeError !== null);
56
+ if (errors.length !== 0)
57
+ return error({
58
+ name: "FlatResultsError",
59
+ message: `Found ${errors.length} errors in result array of length ${results.length}.`,
60
+ data: errors.slice(0, 10)
61
+ // Only show first 10 errors to avoid spamming logs
62
+ });
63
+ const values = results.map((r) => r[1]);
64
+ return [null, values];
65
+ }
66
+ async function safeExtractResponseBody(response) {
67
+ try {
68
+ return await response.json();
69
+ } catch {
70
+ try {
71
+ return await response.text();
72
+ } catch {
73
+ return void 0;
74
+ }
75
+ }
76
+ }
30
77
 
31
78
  // src/stacks-api/accounts/balances.ts
32
79
  async function balances(opts) {
@@ -48,7 +95,7 @@ async function balances(opts) {
48
95
  data: {
49
96
  status: res.status,
50
97
  statusText: res.statusText,
51
- bodyText: await safePromise(res.text())
98
+ body: await safeExtractResponseBody(res)
52
99
  }
53
100
  });
54
101
  }
@@ -89,7 +136,7 @@ async function latestNonce(opts) {
89
136
  endpoint,
90
137
  status: res.status,
91
138
  statusText: res.statusText,
92
- bodyText: await safePromise(res.text())
139
+ body: await safeExtractResponseBody(res)
93
140
  }
94
141
  });
95
142
  }
@@ -128,28 +175,6 @@ var baseListResponseSchema = v2.object({
128
175
  });
129
176
 
130
177
  // src/stacks-api/blocks/get-block.ts
131
- import * as v3 from "valibot";
132
- var responseSchema2 = v3.object({
133
- canonical: v3.boolean(),
134
- height: v3.number(),
135
- hash: v3.string(),
136
- block_time: v3.number(),
137
- block_time_iso: v3.string(),
138
- index_block_hash: v3.string(),
139
- parent_block_hash: v3.string(),
140
- parent_index_block_hash: v3.string(),
141
- burn_block_time: v3.number(),
142
- burn_block_time_iso: v3.string(),
143
- burn_block_hash: v3.string(),
144
- burn_block_height: v3.number(),
145
- miner_txid: v3.string(),
146
- tx_count: v3.number(),
147
- execution_cost_read_count: v3.number(),
148
- execution_cost_read_length: v3.number(),
149
- execution_cost_runtime: v3.number(),
150
- execution_cost_write_count: v3.number(),
151
- execution_cost_write_length: v3.number()
152
- });
153
178
  async function getBlock(opts) {
154
179
  const init = {};
155
180
  if (opts.apiKeyConfig) {
@@ -157,10 +182,8 @@ async function getBlock(opts) {
157
182
  [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
158
183
  };
159
184
  }
160
- const res = await fetch(
161
- `${opts.baseUrl}/extended/v2/blocks/${opts.heightOrHash}`,
162
- init
163
- );
185
+ const endpoint = `${opts.baseUrl}/extended/v2/blocks/${opts.heightOrHash}`;
186
+ const res = await fetch(endpoint, init);
164
187
  if (!res.ok) {
165
188
  return error({
166
189
  name: "FetchBlockError",
@@ -168,7 +191,7 @@ async function getBlock(opts) {
168
191
  data: {
169
192
  status: res.status,
170
193
  statusText: res.statusText,
171
- bodyText: await safePromise(res.text())
194
+ body: await safeExtractResponseBody(res)
172
195
  }
173
196
  });
174
197
  }
@@ -180,15 +203,7 @@ async function getBlock(opts) {
180
203
  data: jsonError
181
204
  });
182
205
  }
183
- const validationResult = v3.safeParse(responseSchema2, data);
184
- if (!validationResult.success) {
185
- return error({
186
- name: "ValidateDataError",
187
- message: "Failed to validate data.",
188
- data: validationResult
189
- });
190
- }
191
- return success(validationResult.output);
206
+ return success(data);
192
207
  }
193
208
 
194
209
  // src/stacks-api/blocks/index.ts
@@ -196,6 +211,44 @@ var blocks = {
196
211
  getBlock
197
212
  };
198
213
 
214
+ // src/stacks-api/burn-blocks/get-burn-block.ts
215
+ async function getBurnBlock(args) {
216
+ const init = {};
217
+ if (args.apiKeyConfig) {
218
+ init.headers = {
219
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
220
+ };
221
+ }
222
+ const endpoint = `${args.baseUrl}/extended/v2/burn-blocks/${args.heightOrHash}`;
223
+ const res = await fetch(endpoint, init);
224
+ if (!res.ok) {
225
+ return error({
226
+ name: "BurnBlockGetError",
227
+ message: "Failed to get burn block.",
228
+ data: {
229
+ heightOrHash: args.heightOrHash,
230
+ status: res.status,
231
+ statusText: res.statusText,
232
+ body: await safeExtractResponseBody(res)
233
+ }
234
+ });
235
+ }
236
+ const [jsonParseError, data] = await safePromise(res.json());
237
+ if (jsonParseError) {
238
+ return error({
239
+ name: "ParseBodyError",
240
+ message: "Failed to parse response body as JSON.",
241
+ data: jsonParseError
242
+ });
243
+ }
244
+ return success(data);
245
+ }
246
+
247
+ // src/stacks-api/burn-blocks/index.ts
248
+ var burnBlocks = {
249
+ getBurnBlock
250
+ };
251
+
199
252
  // src/stacks-api/faucets/stx.ts
200
253
  async function stx(opts) {
201
254
  const search = new URLSearchParams();
@@ -217,7 +270,7 @@ async function stx(opts) {
217
270
  data: {
218
271
  status: res.status,
219
272
  statusText: res.statusText,
220
- bodyText: await safePromise(res.text())
273
+ body: await safeExtractResponseBody(res)
221
274
  }
222
275
  });
223
276
  }
@@ -238,22 +291,22 @@ var faucets = {
238
291
  };
239
292
 
240
293
  // src/stacks-api/info/core-api.ts
241
- import * as v4 from "valibot";
242
- var CoreApiResponseSchema = v4.object({
243
- peer_version: v4.number(),
244
- pox_consensus: v4.string(),
245
- burn_block_height: v4.number(),
246
- stable_pox_consensus: v4.string(),
247
- stable_burn_block_height: v4.number(),
248
- server_version: v4.string(),
249
- network_id: v4.number(),
250
- parent_network_id: v4.number(),
251
- stacks_tip_height: v4.number(),
252
- stacks_tip: v4.string(),
253
- stacks_tip_consensus_hash: v4.string(),
254
- unanchored_tip: v4.nullable(v4.string()),
255
- unanchored_seq: v4.nullable(v4.string()),
256
- exit_at_block_height: v4.nullable(v4.number())
294
+ import * as v3 from "valibot";
295
+ var CoreApiResponseSchema = v3.object({
296
+ peer_version: v3.number(),
297
+ pox_consensus: v3.string(),
298
+ burn_block_height: v3.number(),
299
+ stable_pox_consensus: v3.string(),
300
+ stable_burn_block_height: v3.number(),
301
+ server_version: v3.string(),
302
+ network_id: v3.number(),
303
+ parent_network_id: v3.number(),
304
+ stacks_tip_height: v3.number(),
305
+ stacks_tip: v3.string(),
306
+ stacks_tip_consensus_hash: v3.string(),
307
+ unanchored_tip: v3.nullable(v3.string()),
308
+ unanchored_seq: v3.nullable(v3.string()),
309
+ exit_at_block_height: v3.nullable(v3.number())
257
310
  });
258
311
  async function coreApi(apiOpts) {
259
312
  const init = {};
@@ -270,7 +323,7 @@ async function coreApi(apiOpts) {
270
323
  data: {
271
324
  status: res.status,
272
325
  statusText: res.statusText,
273
- bodyText: await safePromise(res.text())
326
+ body: await safeExtractResponseBody(res)
274
327
  }
275
328
  });
276
329
  }
@@ -282,7 +335,7 @@ async function coreApi(apiOpts) {
282
335
  data: parseBodyError
283
336
  });
284
337
  }
285
- const validationResult = v4.safeParse(CoreApiResponseSchema, data);
338
+ const validationResult = v3.safeParse(CoreApiResponseSchema, data);
286
339
  if (!validationResult.success) {
287
340
  return error({
288
341
  name: "ValidateDataError",
@@ -299,14 +352,14 @@ var info = {
299
352
  };
300
353
 
301
354
  // src/stacks-api/proof-of-transfer/cycle.ts
302
- import * as v5 from "valibot";
303
- var responseSchema3 = v5.object({
304
- block_height: v5.number(),
305
- index_block_hash: v5.string(),
306
- cycle_number: v5.number(),
307
- total_weight: v5.number(),
308
- total_stacked_amount: v5.string(),
309
- total_signers: v5.number()
355
+ import * as v4 from "valibot";
356
+ var responseSchema2 = v4.object({
357
+ block_height: v4.number(),
358
+ index_block_hash: v4.string(),
359
+ cycle_number: v4.number(),
360
+ total_weight: v4.number(),
361
+ total_stacked_amount: v4.string(),
362
+ total_signers: v4.number()
310
363
  });
311
364
  async function cycle(opts) {
312
365
  const init = {};
@@ -325,7 +378,7 @@ async function cycle(opts) {
325
378
  endpoint,
326
379
  status: res.status,
327
380
  statusText: res.statusText,
328
- bodyText: await safePromise(res.text())
381
+ body: await safeExtractResponseBody(res)
329
382
  }
330
383
  });
331
384
  }
@@ -337,7 +390,7 @@ async function cycle(opts) {
337
390
  data: jsonError
338
391
  });
339
392
  }
340
- const validationResult = v5.safeParse(responseSchema3, data);
393
+ const validationResult = v4.safeParse(responseSchema2, data);
341
394
  if (!validationResult.success) {
342
395
  return error({
343
396
  name: "ValidateDataError",
@@ -349,17 +402,17 @@ async function cycle(opts) {
349
402
  }
350
403
 
351
404
  // src/stacks-api/proof-of-transfer/cycles.ts
352
- import * as v6 from "valibot";
353
- var cycleInfoSchema = v6.object({
354
- block_height: v6.number(),
355
- index_block_hash: v6.string(),
356
- cycle_number: v6.number(),
357
- total_weight: v6.number(),
358
- total_stacked_amount: v6.string(),
359
- total_signers: v6.number()
405
+ import * as v5 from "valibot";
406
+ var cycleInfoSchema = v5.object({
407
+ block_height: v5.number(),
408
+ index_block_hash: v5.string(),
409
+ cycle_number: v5.number(),
410
+ total_weight: v5.number(),
411
+ total_stacked_amount: v5.string(),
412
+ total_signers: v5.number()
360
413
  });
361
- var resultsSchema = v6.array(cycleInfoSchema);
362
- var cyclesResponseSchema = v6.object({
414
+ var resultsSchema = v5.array(cycleInfoSchema);
415
+ var cyclesResponseSchema = v5.object({
363
416
  ...baseListResponseSchema.entries,
364
417
  results: resultsSchema
365
418
  });
@@ -383,7 +436,7 @@ async function cycles(args) {
383
436
  endpoint,
384
437
  status: res.status,
385
438
  statusText: res.statusText,
386
- bodyText: await safePromise(res.text())
439
+ body: await safeExtractResponseBody(res)
387
440
  }
388
441
  });
389
442
  }
@@ -395,7 +448,7 @@ async function cycles(args) {
395
448
  data: jsonError
396
449
  });
397
450
  }
398
- const validationResult = v6.safeParse(cyclesResponseSchema, data);
451
+ const validationResult = v5.safeParse(cyclesResponseSchema, data);
399
452
  if (!validationResult.success) {
400
453
  return error({
401
454
  name: "ValidateDataError",
@@ -407,16 +460,16 @@ async function cycles(args) {
407
460
  }
408
461
 
409
462
  // src/stacks-api/proof-of-transfer/signer-in-cycle.ts
410
- import * as v7 from "valibot";
411
- var signerInCycleResponseSchema = v7.object({
412
- signing_key: v7.string(),
413
- signer_address: v7.string(),
414
- weight: v7.number(),
415
- stacked_amount: v7.string(),
416
- weight_percent: v7.number(),
417
- stacked_amount_percent: v7.number(),
418
- solo_stacker_count: v7.number(),
419
- pooled_stacker_count: v7.number()
463
+ import * as v6 from "valibot";
464
+ var signerInCycleResponseSchema = v6.object({
465
+ signing_key: v6.string(),
466
+ signer_address: v6.string(),
467
+ weight: v6.number(),
468
+ stacked_amount: v6.string(),
469
+ weight_percent: v6.number(),
470
+ stacked_amount_percent: v6.number(),
471
+ solo_stacker_count: v6.number(),
472
+ pooled_stacker_count: v6.number()
420
473
  });
421
474
  async function signerInCycle(args) {
422
475
  const init = {};
@@ -452,7 +505,7 @@ async function signerInCycle(args) {
452
505
  }
453
506
  });
454
507
  }
455
- const validationResult = v7.safeParse(signerInCycleResponseSchema, data);
508
+ const validationResult = v6.safeParse(signerInCycleResponseSchema, data);
456
509
  if (!validationResult.success) {
457
510
  return error({
458
511
  name: "ValidateDataError",
@@ -464,19 +517,19 @@ async function signerInCycle(args) {
464
517
  }
465
518
 
466
519
  // src/stacks-api/proof-of-transfer/signers-in-cycle.ts
467
- import * as v8 from "valibot";
468
- var signerSchema = v8.object({
469
- signing_key: v8.string(),
470
- signer_address: v8.string(),
471
- weight: v8.number(),
472
- stacked_amount: v8.string(),
473
- weight_percent: v8.number(),
474
- stacked_amount_percent: v8.number(),
475
- pooled_stacker_count: v8.number(),
476
- solo_stacker_count: v8.number()
520
+ import * as v7 from "valibot";
521
+ var signerSchema = v7.object({
522
+ signing_key: v7.string(),
523
+ signer_address: v7.string(),
524
+ weight: v7.number(),
525
+ stacked_amount: v7.string(),
526
+ weight_percent: v7.number(),
527
+ stacked_amount_percent: v7.number(),
528
+ pooled_stacker_count: v7.number(),
529
+ solo_stacker_count: v7.number()
477
530
  });
478
- var resultsSchema2 = v8.array(signerSchema);
479
- var signersResponseSchema = v8.object({
531
+ var resultsSchema2 = v7.array(signerSchema);
532
+ var signersResponseSchema = v7.object({
480
533
  ...baseListResponseSchema.entries,
481
534
  results: resultsSchema2
482
535
  });
@@ -500,7 +553,7 @@ async function signersInCycle(args) {
500
553
  endpoint,
501
554
  status: res.status,
502
555
  statusText: res.statusText,
503
- bodyText: await safePromise(res.text())
556
+ body: await safeExtractResponseBody(res)
504
557
  }
505
558
  });
506
559
  }
@@ -511,11 +564,11 @@ async function signersInCycle(args) {
511
564
  message: "Failed to parse response body as JSON.",
512
565
  data: {
513
566
  endpoint,
514
- bodyParseResult: data
567
+ body: data
515
568
  }
516
569
  });
517
570
  }
518
- const validationResult = v8.safeParse(signersResponseSchema, data);
571
+ const validationResult = v7.safeParse(signersResponseSchema, data);
519
572
  if (!validationResult.success) {
520
573
  return error({
521
574
  name: "ValidateDataError",
@@ -527,18 +580,6 @@ async function signersInCycle(args) {
527
580
  }
528
581
 
529
582
  // src/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.ts
530
- import * as v9 from "valibot";
531
- var stackerInfoSchema = v9.object({
532
- stacker_address: v9.string(),
533
- stacked_amount: v9.string(),
534
- pox_address: v9.string(),
535
- stacker_type: v9.union([v9.literal("pooled"), v9.literal("solo")])
536
- });
537
- var resultsSchema3 = v9.array(stackerInfoSchema);
538
- var stackersForSignerInCycleResponseSchema = v9.object({
539
- ...baseListResponseSchema.entries,
540
- results: resultsSchema3
541
- });
542
583
  async function stackersForSignerInCycle(opts) {
543
584
  const search = new URLSearchParams();
544
585
  if (opts.limit) search.append("limit", opts.limit.toString());
@@ -560,7 +601,7 @@ async function stackersForSignerInCycle(opts) {
560
601
  endpoint,
561
602
  status: res.status,
562
603
  statusText: res.statusText,
563
- bodyText: await safePromise(res.text())
604
+ body: await safeExtractResponseBody(res)
564
605
  }
565
606
  });
566
607
  }
@@ -572,18 +613,7 @@ async function stackersForSignerInCycle(opts) {
572
613
  data: jsonError
573
614
  });
574
615
  }
575
- const validationResult = v9.safeParse(
576
- stackersForSignerInCycleResponseSchema,
577
- data
578
- );
579
- if (!validationResult.success) {
580
- return error({
581
- name: "ValidateDataError",
582
- message: "Failed to validate response data.",
583
- data: validationResult
584
- });
585
- }
586
- return success(validationResult.output);
616
+ return success(data);
587
617
  }
588
618
 
589
619
  // src/stacks-api/proof-of-transfer/index.ts
@@ -596,21 +626,6 @@ var proofOfTransfer = {
596
626
  };
597
627
 
598
628
  // src/stacks-api/stacking-pool/members.ts
599
- import * as v10 from "valibot";
600
- var memberSchema = v10.object({
601
- stacker: v10.string(),
602
- pox_addr: v10.optional(v10.string()),
603
- amount_ustx: v10.string(),
604
- burn_block_unlock_height: v10.optional(v10.number()),
605
- block_height: v10.number(),
606
- tx_id: v10.string()
607
- });
608
- var membersResponseSchema = v10.object({
609
- limit: v10.number(),
610
- offset: v10.number(),
611
- total: v10.number(),
612
- results: v10.array(memberSchema)
613
- });
614
629
  async function members(args) {
615
630
  const search = new URLSearchParams();
616
631
  if (args.afterBlock) search.append("after_block", args.afterBlock.toString());
@@ -632,7 +647,7 @@ async function members(args) {
632
647
  data: {
633
648
  status: res.status,
634
649
  statusText: res.statusText,
635
- bodyText: await safePromise(res.text())
650
+ body: await safeExtractResponseBody(res)
636
651
  }
637
652
  });
638
653
  }
@@ -644,15 +659,7 @@ async function members(args) {
644
659
  data: jsonParseError
645
660
  });
646
661
  }
647
- const validationResult = v10.safeParse(membersResponseSchema, data);
648
- if (!validationResult.success) {
649
- return error({
650
- name: "ValidateDataError",
651
- message: "Failed to validate data.",
652
- data: validationResult
653
- });
654
- }
655
- return success(validationResult.output);
662
+ return success(data);
656
663
  }
657
664
 
658
665
  // src/stacks-api/stacking-pool/index.ts
@@ -660,124 +667,7 @@ var stackingPool = {
660
667
  members
661
668
  };
662
669
 
663
- // src/stacks-api/transactions/schemas.ts
664
- import * as v11 from "valibot";
665
- var baseTransactionSchema = v11.object({
666
- tx_id: v11.string(),
667
- nonce: v11.number(),
668
- fee_rate: v11.string(),
669
- sender_address: v11.string(),
670
- sponsored: v11.boolean(),
671
- post_condition_mode: v11.string(),
672
- post_conditions: v11.array(v11.unknown()),
673
- anchor_mode: v11.string(),
674
- is_unanchored: v11.boolean(),
675
- block_hash: v11.string(),
676
- parent_block_hash: v11.string(),
677
- block_height: v11.number(),
678
- block_time: v11.number(),
679
- block_time_iso: v11.string(),
680
- burn_block_height: v11.number(),
681
- burn_block_time: v11.number(),
682
- burn_block_time_iso: v11.string(),
683
- parent_burn_block_time: v11.number(),
684
- parent_burn_block_time_iso: v11.string(),
685
- canonical: v11.boolean(),
686
- tx_index: v11.number(),
687
- tx_status: v11.union([
688
- v11.literal("success"),
689
- v11.literal("abort_by_response"),
690
- v11.literal("abort_by_post_condition")
691
- ]),
692
- tx_result: v11.object({
693
- hex: v11.string(),
694
- repr: v11.string()
695
- }),
696
- microblock_hash: v11.string(),
697
- microblock_sequence: v11.number(),
698
- microblock_canonical: v11.boolean(),
699
- event_count: v11.number(),
700
- events: v11.array(v11.unknown()),
701
- execution_cost_read_count: v11.number(),
702
- execution_cost_read_length: v11.number(),
703
- execution_cost_runtime: v11.number(),
704
- execution_cost_write_count: v11.number(),
705
- execution_cost_write_length: v11.number()
706
- });
707
- var contractCallTransactionSchema = v11.object({
708
- tx_type: v11.literal("contract_call"),
709
- contract_call: v11.object({
710
- contract_id: v11.string(),
711
- function_name: v11.string(),
712
- function_signature: v11.string(),
713
- function_args: v11.array(
714
- v11.object({
715
- hex: v11.string(),
716
- repr: v11.string(),
717
- name: v11.string(),
718
- type: v11.string()
719
- })
720
- )
721
- }),
722
- ...baseTransactionSchema.entries
723
- });
724
- var smartContractTransactionSchema = v11.object({
725
- tx_type: v11.literal("smart_contract"),
726
- smart_contract: v11.object({
727
- /**
728
- * NOTE: The types may be wrong, not sure what type of value is used when
729
- * the version is not `null`.
730
- */
731
- clarity_version: v11.union([v11.null(), v11.number()]),
732
- contract_id: v11.string(),
733
- source_code: v11.string()
734
- }),
735
- ...baseTransactionSchema.entries
736
- });
737
- var tokenTransferSchema = v11.object({
738
- tx_type: v11.literal("token_transfer"),
739
- token_transfer: v11.object({
740
- recipient_address: v11.string(),
741
- amount: v11.string(),
742
- memo: v11.string()
743
- }),
744
- ...baseTransactionSchema.entries
745
- });
746
- var transactionSchema = v11.variant("tx_type", [
747
- contractCallTransactionSchema,
748
- smartContractTransactionSchema,
749
- tokenTransferSchema
750
- ]);
751
-
752
670
  // src/stacks-api/transactions/address-transactions.ts
753
- import * as v12 from "valibot";
754
- var resultSchema = v12.object({
755
- tx: transactionSchema,
756
- stx_sent: v12.string(),
757
- stx_received: v12.string(),
758
- events: v12.object({
759
- stx: v12.object({
760
- transfer: v12.number(),
761
- mint: v12.number(),
762
- burn: v12.number()
763
- }),
764
- ft: v12.object({
765
- transfer: v12.number(),
766
- mint: v12.number(),
767
- burn: v12.number()
768
- }),
769
- nft: v12.object({
770
- transfer: v12.number(),
771
- mint: v12.number(),
772
- burn: v12.number()
773
- })
774
- })
775
- });
776
- var resultsSchema4 = v12.array(resultSchema);
777
- var addressTransactionsResponseSchema = v12.object({
778
- ...baseListResponseSchema.entries,
779
- results: resultsSchema4
780
- });
781
671
  async function addressTransactions(args) {
782
672
  const search = new URLSearchParams();
783
673
  if (args.limit) search.append("limit", args.limit.toString());
@@ -799,7 +689,7 @@ async function addressTransactions(args) {
799
689
  data: {
800
690
  status: res.status,
801
691
  statusText: res.statusText,
802
- bodyText: await safePromise(res.text())
692
+ body: await safeExtractResponseBody(res)
803
693
  }
804
694
  });
805
695
  }
@@ -811,19 +701,47 @@ async function addressTransactions(args) {
811
701
  data: jsonParseError
812
702
  });
813
703
  }
814
- const validationResult = v12.safeParse(addressTransactionsResponseSchema, data);
815
- if (!validationResult.success) {
704
+ return success(data);
705
+ }
706
+
707
+ // src/stacks-api/transactions/events-for-an-address-transaction.ts
708
+ async function eventsForAnAddressTransaction(args) {
709
+ const search = new URLSearchParams();
710
+ if (args.limit) search.append("limit", args.limit.toString());
711
+ if (args.offset) search.append("offset", args.offset.toString());
712
+ const init = {};
713
+ if (args.apiKeyConfig) {
714
+ init.headers = {
715
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
716
+ };
717
+ }
718
+ const endpoint = `${args.baseUrl}/extended/v2/addresses/${args.address}/transactions/${args.transactionId}/events?${search}`;
719
+ const res = await fetch(endpoint, init);
720
+ if (!res.ok) {
816
721
  return error({
817
- name: "ValidateDataError",
818
- message: "Failed to validate data.",
819
- data: validationResult
722
+ name: "FetchEventsForAnAddressTransactionError",
723
+ message: `Failed to fetch address transaction events.`,
724
+ data: {
725
+ address: args.address,
726
+ transactionId: args.transactionId,
727
+ status: res.status,
728
+ statusText: res.statusText,
729
+ body: await safeExtractResponseBody(res)
730
+ }
820
731
  });
821
732
  }
822
- return success(validationResult.output);
733
+ const [jsonParseError, data] = await safePromise(res.json());
734
+ if (jsonParseError) {
735
+ return error({
736
+ name: "ParseBodyError",
737
+ message: "Failed to parse response body as JSON.",
738
+ error: jsonParseError
739
+ });
740
+ }
741
+ return success(data);
823
742
  }
824
743
 
825
744
  // src/stacks-api/transactions/get-transaction.ts
826
- import * as v13 from "valibot";
827
745
  async function getTransaction(args) {
828
746
  const init = {};
829
747
  if (args.apiKeyConfig) {
@@ -836,11 +754,12 @@ async function getTransaction(args) {
836
754
  if (!res.ok) {
837
755
  return error({
838
756
  name: "FetchTransactionError",
839
- message: `Failed to fetch transaction ${args.transactionId}`,
840
- response: {
757
+ message: `Failed to fetch transaction.`,
758
+ data: {
759
+ transactionId: args.transactionId,
841
760
  status: res.status,
842
761
  statusText: res.statusText,
843
- bodyText: await safePromise(res.text())
762
+ body: await safeExtractResponseBody(res)
844
763
  }
845
764
  });
846
765
  }
@@ -852,15 +771,7 @@ async function getTransaction(args) {
852
771
  error: jsonParseError
853
772
  });
854
773
  }
855
- const validationResult = v13.safeParse(transactionSchema, data);
856
- if (!validationResult.success) {
857
- return error({
858
- name: "ValidateDataError",
859
- message: "Failed to validate data.",
860
- error: validationResult
861
- });
862
- }
863
- return success(validationResult.output);
774
+ return success(data);
864
775
  }
865
776
 
866
777
  // src/stacks-api/transactions/mempool-transactions.ts
@@ -891,7 +802,7 @@ async function mempoolTransactions(args) {
891
802
  data: {
892
803
  status: res.status,
893
804
  statusText: res.statusText,
894
- bodyText: await safePromise(res.text())
805
+ body: await safeExtractResponseBody(res)
895
806
  }
896
807
  });
897
808
  }
@@ -906,11 +817,46 @@ async function mempoolTransactions(args) {
906
817
  return success(data);
907
818
  }
908
819
 
820
+ // src/stacks-api/transactions/get-raw-transaction.ts
821
+ async function getRawTransaction(args) {
822
+ const init = {};
823
+ if (args.apiKeyConfig) {
824
+ init.headers = {
825
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
826
+ };
827
+ }
828
+ const endpoint = `${args.baseUrl}/extended/v1/tx/${args.transactionId}/raw`;
829
+ const res = await fetch(endpoint, init);
830
+ if (!res.ok) {
831
+ return error({
832
+ name: "RawTransactionFetchError",
833
+ message: `Failed to fetch raw transaction.`,
834
+ data: {
835
+ transactionId: args.transactionId,
836
+ status: res.status,
837
+ statusText: res.statusText,
838
+ body: await safeExtractResponseBody(res)
839
+ }
840
+ });
841
+ }
842
+ const [jsonParseError, data] = await safePromise(res.json());
843
+ if (jsonParseError) {
844
+ return error({
845
+ name: "ParseBodyError",
846
+ message: "Failed to parse response body as JSON.",
847
+ error: jsonParseError
848
+ });
849
+ }
850
+ return success(data);
851
+ }
852
+
909
853
  // src/stacks-api/transactions/index.ts
910
854
  var transactions = {
911
855
  addressTransactions,
856
+ eventsForAnAddressTransaction,
912
857
  getTransaction,
913
- mempoolTransactions
858
+ mempoolTransactions,
859
+ getRawTransaction
914
860
  };
915
861
 
916
862
  // src/stacks-api/mempool/transaction-fee-priorities.ts
@@ -930,7 +876,7 @@ async function transactionFeePriorities(opts) {
930
876
  data: {
931
877
  status: res.status,
932
878
  statusText: res.statusText,
933
- bodyParseResult: await safePromise(res.text())
879
+ body: await safeExtractResponseBody(res)
934
880
  }
935
881
  });
936
882
  }
@@ -954,6 +900,7 @@ var mempool = {
954
900
  var stacksApi = {
955
901
  accounts,
956
902
  blocks,
903
+ burnBlocks,
957
904
  faucets,
958
905
  info,
959
906
  mempool,
@@ -963,16 +910,16 @@ var stacksApi = {
963
910
  };
964
911
 
965
912
  // src/stacks-rpc-api/smart-contracts/map-entry.ts
966
- import * as v14 from "valibot";
967
- var mapEntryResponseSchema = v14.object({
913
+ import * as v8 from "valibot";
914
+ var mapEntryResponseSchema = v8.object({
968
915
  /**
969
916
  * Hex-encoded string of clarity value. It is always an optional tuple.
970
917
  */
971
- data: v14.string(),
918
+ data: v8.string(),
972
919
  /**
973
920
  * Hex-encoded string of the MARF proof for the data
974
921
  */
975
- proof: v14.optional(v14.string())
922
+ proof: v8.optional(v8.string())
976
923
  });
977
924
  async function mapEntry(args) {
978
925
  const search = new URLSearchParams();
@@ -1000,7 +947,7 @@ async function mapEntry(args) {
1000
947
  status: res.status,
1001
948
  statusText: res.statusText,
1002
949
  endpoint,
1003
- bodyText: await safePromise(res.text())
950
+ body: await safeExtractResponseBody(res)
1004
951
  }
1005
952
  });
1006
953
  }
@@ -1012,7 +959,7 @@ async function mapEntry(args) {
1012
959
  data: jsonError
1013
960
  });
1014
961
  }
1015
- const validationResult = v14.safeParse(mapEntryResponseSchema, data);
962
+ const validationResult = v8.safeParse(mapEntryResponseSchema, data);
1016
963
  if (!validationResult.success) {
1017
964
  return error({
1018
965
  name: "ValidateDataError",
@@ -1048,7 +995,7 @@ async function readOnly(args) {
1048
995
  data: {
1049
996
  status: res.status,
1050
997
  statusText: res.statusText,
1051
- bodyText: await safePromise(res.text())
998
+ body: await safeExtractResponseBody(res)
1052
999
  }
1053
1000
  });
1054
1001
  }
@@ -1085,7 +1032,7 @@ async function contractInterface(args) {
1085
1032
  status: res.status,
1086
1033
  statusText: res.statusText,
1087
1034
  endpoint,
1088
- bodyText: await safePromise(res.text())
1035
+ body: await safeExtractResponseBody(res)
1089
1036
  }
1090
1037
  });
1091
1038
  }
@@ -1123,7 +1070,7 @@ async function poxDetails(args) {
1123
1070
  data: {
1124
1071
  status: res.status,
1125
1072
  statusText: res.statusText,
1126
- bodyText: await safePromise(res.text())
1073
+ body: await safeExtractResponseBody(res)
1127
1074
  }
1128
1075
  });
1129
1076
  }
@@ -1150,18 +1097,18 @@ var stacksRpcApi = {
1150
1097
  };
1151
1098
 
1152
1099
  // src/utils/call-rate-limited-api.ts
1153
- import { backOff } from "exponential-backoff";
1154
- var defaultStartingDelay = 15e3;
1155
- var defaultNumOfAttempts = 5;
1100
+ import { backOff as backOff2 } from "exponential-backoff";
1101
+ var defaultStartingDelay2 = 15e3;
1102
+ var defaultNumOfAttempts2 = 5;
1156
1103
  function callRateLimitedApi(fn, options) {
1157
- return backOff(fn, {
1158
- startingDelay: options?.startingDelay ?? defaultStartingDelay,
1159
- numOfAttempts: options?.numOfAttempts ?? defaultNumOfAttempts
1104
+ return backOff2(fn, {
1105
+ startingDelay: options?.startingDelay ?? defaultStartingDelay2,
1106
+ numOfAttempts: options?.numOfAttempts ?? defaultNumOfAttempts2
1160
1107
  });
1161
1108
  }
1162
1109
  async function safeCallRateLimitedApi(fn, options) {
1163
1110
  try {
1164
- return await backOff(
1111
+ return await backOff2(
1165
1112
  async () => {
1166
1113
  const [error2, data] = await fn();
1167
1114
  if (error2) {
@@ -1387,10 +1334,13 @@ var pox4Api = { maps, readOnly: readOnly2 };
1387
1334
  export {
1388
1335
  callRateLimitedApi,
1389
1336
  error,
1337
+ flatResults,
1390
1338
  pox4Api,
1391
1339
  queries,
1340
+ safeBackOff,
1392
1341
  safeCall,
1393
1342
  safeCallRateLimitedApi,
1343
+ safeExtractResponseBody,
1394
1344
  safePromise,
1395
1345
  stacksApi,
1396
1346
  stacksRpcApi,