@secretkeylabs/stacks-tools 0.4.0-afcaa14 → 0.4.0-da5eb9d

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
@@ -102,37 +102,92 @@ async function balances(opts) {
102
102
  return success(validationResult.output);
103
103
  }
104
104
 
105
- // src/stacks-api/types.ts
105
+ // src/stacks-api/accounts/latest-nonce.ts
106
106
  import * as v2 from "valibot";
107
- var baseListResponseSchema = v2.object({
108
- limit: v2.number(),
109
- offset: v2.number(),
110
- total: v2.number(),
111
- results: v2.array(v2.unknown())
107
+ var responseSchema2 = v2.object({
108
+ last_mempool_tx_nonce: v2.nullable(v2.number()),
109
+ last_executed_tx_nonce: v2.nullable(v2.number()),
110
+ possible_next_nonce: v2.number(),
111
+ detected_missing_nonces: v2.array(v2.number()),
112
+ detected_mempool_nonces: v2.array(v2.number())
112
113
  });
114
+ async function latestNonce(opts) {
115
+ const init = {};
116
+ if (opts.apiKeyConfig) {
117
+ init.headers = {
118
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
119
+ };
120
+ }
121
+ const endpoint = `${opts.baseUrl}/extended/v1/address/${opts.principal}/nonces`;
122
+ const res = await fetch(endpoint, init);
123
+ if (!res.ok) {
124
+ return error({
125
+ name: "FetchLatestNonceError",
126
+ message: "Failed to fetch latest nonce.",
127
+ data: {
128
+ endpoint,
129
+ status: res.status,
130
+ statusText: res.statusText,
131
+ bodyParseResult: await safePromise(res.json())
132
+ }
133
+ });
134
+ }
135
+ const [jsonError, data] = await safePromise(res.json());
136
+ if (jsonError) {
137
+ return error({
138
+ name: "ParseBodyError",
139
+ message: "Failed to parse response body as JSON.",
140
+ data: jsonError
141
+ });
142
+ }
143
+ const validationResult = v2.safeParse(responseSchema2, data);
144
+ if (!validationResult.success) {
145
+ return error({
146
+ name: "ValidateDataError",
147
+ message: "Failed to validate data.",
148
+ data: validationResult
149
+ });
150
+ }
151
+ return success(validationResult.output);
152
+ }
113
153
 
114
- // src/stacks-api/blocks/get-block.ts
154
+ // src/stacks-api/accounts/index.ts
155
+ var accounts = {
156
+ balances,
157
+ latestNonce
158
+ };
159
+
160
+ // src/stacks-api/types.ts
115
161
  import * as v3 from "valibot";
116
- var responseSchema2 = v3.object({
117
- canonical: v3.boolean(),
118
- height: v3.number(),
119
- hash: v3.string(),
120
- block_time: v3.number(),
121
- block_time_iso: v3.string(),
122
- index_block_hash: v3.string(),
123
- parent_block_hash: v3.string(),
124
- parent_index_block_hash: v3.string(),
125
- burn_block_time: v3.number(),
126
- burn_block_time_iso: v3.string(),
127
- burn_block_hash: v3.string(),
128
- burn_block_height: v3.number(),
129
- miner_txid: v3.string(),
130
- tx_count: v3.number(),
131
- execution_cost_read_count: v3.number(),
132
- execution_cost_read_length: v3.number(),
133
- execution_cost_runtime: v3.number(),
134
- execution_cost_write_count: v3.number(),
135
- execution_cost_write_length: v3.number()
162
+ var baseListResponseSchema = v3.object({
163
+ limit: v3.number(),
164
+ offset: v3.number(),
165
+ total: v3.number(),
166
+ results: v3.array(v3.unknown())
167
+ });
168
+
169
+ // src/stacks-api/blocks/get-block.ts
170
+ import * as v4 from "valibot";
171
+ var responseSchema3 = v4.object({
172
+ canonical: v4.boolean(),
173
+ height: v4.number(),
174
+ hash: v4.string(),
175
+ block_time: v4.number(),
176
+ block_time_iso: v4.string(),
177
+ index_block_hash: v4.string(),
178
+ parent_block_hash: v4.string(),
179
+ parent_index_block_hash: v4.string(),
180
+ burn_block_time: v4.number(),
181
+ burn_block_time_iso: v4.string(),
182
+ burn_block_hash: v4.string(),
183
+ burn_block_height: v4.number(),
184
+ miner_txid: v4.string(),
185
+ tx_count: v4.number(),
186
+ execution_cost_read_count: v4.number(),
187
+ execution_cost_read_length: v4.number(),
188
+ execution_cost_runtime: v4.number(),
189
+ execution_cost_write_count: v4.number(),
190
+ execution_cost_write_length: v4.number()
136
191
  });
137
192
  async function getBlock(opts) {
138
193
  const init = {};
@@ -164,7 +219,7 @@ async function getBlock(opts) {
164
219
  data: jsonError
165
220
  });
166
221
  }
167
- const validationResult = v3.safeParse(responseSchema2, data);
222
+ const validationResult = v4.safeParse(responseSchema3, data);
168
223
  if (!validationResult.success) {
169
224
  return error({
170
225
  name: "ValidateDataError",
@@ -175,22 +230,69 @@ async function getBlock(opts) {
175
230
  return success(validationResult.output);
176
231
  }
177
232
 
233
+ // src/stacks-api/blocks/index.ts
234
+ var blocks = {
235
+ getBlock
236
+ };
237
+
238
+ // src/stacks-api/faucets/stx.ts
239
+ async function stx(opts) {
240
+ const search = new URLSearchParams();
241
+ search.append("address", opts.address);
242
+ if (opts.stacking) search.append("stacking", "true");
243
+ const init = {};
244
+ if (opts.apiKeyConfig) {
245
+ init.headers = {
246
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
247
+ };
248
+ }
249
+ init.method = "POST";
250
+ const endpoint = `${opts.baseUrl}/extended/v1/faucets/stx?${search}`;
251
+ const res = await fetch(endpoint, init);
252
+ if (!res.ok) {
253
+ return error({
254
+ name: "FetchStxError",
255
+ message: "Failed to fetch STX.",
256
+ data: {
257
+ status: res.status,
258
+ statusText: res.statusText,
259
+ bodyParseResult: await safePromise(res.json())
260
+ }
261
+ });
262
+ }
263
+ const [jsonError, data] = await safePromise(res.json());
264
+ if (jsonError) {
265
+ return error({
266
+ name: "ParseBodyError",
267
+ message: "Failed to parse response body as JSON.",
268
+ data: jsonError
269
+ });
270
+ }
271
+ return success(data);
272
+ }
273
+
274
+ // src/stacks-api/faucets/index.ts
275
+ var faucets = {
276
+ stx
277
+ };
278
+
178
279
  // src/stacks-api/info/core-api.ts
179
- import * as v4 from "valibot";
180
- var CoreApiResponseSchema = v4.object({
181
- peer_version: v4.number(),
182
- pox_consensus: v4.string(),
183
- burn_block_height: v4.number(),
184
- stable_pox_consensus: v4.string(),
185
- stable_burn_block_height: v4.number(),
186
- server_version: v4.string(),
187
- network_id: v4.number(),
188
- parent_network_id: v4.number(),
189
- stacks_tip_height: v4.number(),
190
- stacks_tip: v4.string(),
191
- stacks_tip_consensus_hash: v4.string(),
192
- unanchored_tip: v4.string(),
193
- exit_at_block_height: v4.number()
280
+ import * as v5 from "valibot";
281
+ var CoreApiResponseSchema = v5.object({
282
+ peer_version: v5.number(),
283
+ pox_consensus: v5.string(),
284
+ burn_block_height: v5.number(),
285
+ stable_pox_consensus: v5.string(),
286
+ stable_burn_block_height: v5.number(),
287
+ server_version: v5.string(),
288
+ network_id: v5.number(),
289
+ parent_network_id: v5.number(),
290
+ stacks_tip_height: v5.number(),
291
+ stacks_tip: v5.string(),
292
+ stacks_tip_consensus_hash: v5.string(),
293
+ unanchored_tip: v5.nullable(v5.string()),
294
+ unanchored_seq: v5.nullable(v5.string()),
295
+ exit_at_block_height: v5.nullable(v5.number())
194
296
  });
195
297
  async function coreApi(apiOpts) {
196
298
  const init = {};
@@ -219,7 +321,7 @@ async function coreApi(apiOpts) {
219
321
  data: parseBodyError
220
322
  });
221
323
  }
222
- const validationResult = v4.safeParse(CoreApiResponseSchema, data);
324
+ const validationResult = v5.safeParse(CoreApiResponseSchema, data);
223
325
  if (!validationResult.success) {
224
326
  return error({
225
327
  name: "ValidateDataError",
@@ -231,60 +333,60 @@ async function coreApi(apiOpts) {
231
333
  }
232
334
 
233
335
  // src/stacks-api/info/pox-details.ts
234
- import * as v5 from "valibot";
235
- var poxDetailsResponseSchema = v5.object({
236
- contract_id: v5.string(),
237
- pox_activation_threshold_ustx: v5.number(),
238
- first_burnchain_block_height: v5.number(),
239
- current_burnchain_block_height: v5.number(),
240
- prepare_phase_block_length: v5.number(),
241
- reward_phase_block_length: v5.number(),
242
- reward_slots: v5.number(),
243
- rejection_fraction: v5.null(),
244
- total_liquid_supply_ustx: v5.number(),
245
- current_cycle: v5.object({
246
- id: v5.number(),
247
- min_threshold_ustx: v5.number(),
248
- stacked_ustx: v5.number(),
249
- is_pox_active: v5.boolean()
336
+ import * as v6 from "valibot";
337
+ var poxDetailsResponseSchema = v6.object({
338
+ contract_id: v6.string(),
339
+ pox_activation_threshold_ustx: v6.number(),
340
+ first_burnchain_block_height: v6.number(),
341
+ current_burnchain_block_height: v6.number(),
342
+ prepare_phase_block_length: v6.number(),
343
+ reward_phase_block_length: v6.number(),
344
+ reward_slots: v6.number(),
345
+ rejection_fraction: v6.null(),
346
+ total_liquid_supply_ustx: v6.number(),
347
+ current_cycle: v6.object({
348
+ id: v6.number(),
349
+ min_threshold_ustx: v6.number(),
350
+ stacked_ustx: v6.number(),
351
+ is_pox_active: v6.boolean()
250
352
  }),
251
- next_cycle: v5.object({
252
- id: v5.number(),
253
- min_threshold_ustx: v5.number(),
254
- min_increment_ustx: v5.number(),
255
- stacked_ustx: v5.number(),
256
- prepare_phase_start_block_height: v5.number(),
257
- blocks_until_prepare_phase: v5.number(),
258
- reward_phase_start_block_height: v5.number(),
259
- blocks_until_reward_phase: v5.number(),
260
- ustx_until_pox_rejection: v5.null()
353
+ next_cycle: v6.object({
354
+ id: v6.number(),
355
+ min_threshold_ustx: v6.number(),
356
+ min_increment_ustx: v6.number(),
357
+ stacked_ustx: v6.number(),
358
+ prepare_phase_start_block_height: v6.number(),
359
+ blocks_until_prepare_phase: v6.number(),
360
+ reward_phase_start_block_height: v6.number(),
361
+ blocks_until_reward_phase: v6.number(),
362
+ ustx_until_pox_rejection: v6.null()
261
363
  }),
262
- epochs: v5.array(
263
- v5.object({
264
- epoch_id: v5.string(),
265
- start_height: v5.number(),
266
- end_height: v5.number(),
267
- block_limit: v5.object({
268
- write_length: v5.number(),
269
- write_count: v5.number(),
270
- read_length: v5.number(),
271
- read_count: v5.number(),
272
- runtime: v5.number()
364
+ epochs: v6.array(
365
+ v6.object({
366
+ epoch_id: v6.string(),
367
+ start_height: v6.number(),
368
+ end_height: v6.number(),
369
+ block_limit: v6.object({
370
+ write_length: v6.number(),
371
+ write_count: v6.number(),
372
+ read_length: v6.number(),
373
+ read_count: v6.number(),
374
+ runtime: v6.number()
273
375
  }),
274
- network_epoch: v5.number()
376
+ network_epoch: v6.number()
275
377
  })
276
378
  ),
277
- min_amount_ustx: v5.number(),
278
- prepare_cycle_length: v5.number(),
279
- reward_cycle_id: v5.number(),
280
- reward_cycle_length: v5.number(),
281
- rejection_votes_left_required: v5.null(),
282
- next_reward_cycle_in: v5.number(),
283
- contract_versions: v5.array(
284
- v5.object({
285
- contract_id: v5.string(),
286
- activation_burnchain_block_height: v5.number(),
287
- first_reward_cycle_id: v5.number()
379
+ min_amount_ustx: v6.number(),
380
+ prepare_cycle_length: v6.number(),
381
+ reward_cycle_id: v6.number(),
382
+ reward_cycle_length: v6.number(),
383
+ rejection_votes_left_required: v6.null(),
384
+ next_reward_cycle_in: v6.number(),
385
+ contract_versions: v6.array(
386
+ v6.object({
387
+ contract_id: v6.string(),
388
+ activation_burnchain_block_height: v6.number(),
389
+ first_reward_cycle_id: v6.number()
288
390
  })
289
391
  )
290
392
  });
@@ -315,7 +417,7 @@ async function poxDetails(args) {
315
417
  data: jsonParseError
316
418
  });
317
419
  }
318
- const validationResult = v5.safeParse(poxDetailsResponseSchema, data);
420
+ const validationResult = v6.safeParse(poxDetailsResponseSchema, data);
319
421
  if (!validationResult.success) {
320
422
  return error({
321
423
  name: "ValidateDataError",
@@ -326,15 +428,21 @@ async function poxDetails(args) {
326
428
  return success(validationResult.output);
327
429
  }
328
430
 
431
+ // src/stacks-api/info/index.ts
432
+ var info = {
433
+ coreApi,
434
+ poxDetails
435
+ };
436
+
329
437
  // src/stacks-api/proof-of-transfer/cycle.ts
330
- import * as v6 from "valibot";
331
- var responseSchema3 = v6.object({
332
- block_height: v6.number(),
333
- index_block_hash: v6.string(),
334
- cycle_number: v6.number(),
335
- total_weight: v6.number(),
336
- total_stacked_amount: v6.string(),
337
- total_signers: v6.number()
438
+ import * as v7 from "valibot";
439
+ var responseSchema4 = v7.object({
440
+ block_height: v7.number(),
441
+ index_block_hash: v7.string(),
442
+ cycle_number: v7.number(),
443
+ total_weight: v7.number(),
444
+ total_stacked_amount: v7.string(),
445
+ total_signers: v7.number()
338
446
  });
339
447
  async function cycle(opts) {
340
448
  const init = {};
@@ -365,7 +473,7 @@ async function cycle(opts) {
365
473
  data: jsonError
366
474
  });
367
475
  }
368
- const validationResult = v6.safeParse(responseSchema3, data);
476
+ const validationResult = v7.safeParse(responseSchema4, data);
369
477
  if (!validationResult.success) {
370
478
  return error({
371
479
  name: "ValidateDataError",
@@ -377,17 +485,17 @@ async function cycle(opts) {
377
485
  }
378
486
 
379
487
  // src/stacks-api/proof-of-transfer/cycles.ts
380
- import * as v7 from "valibot";
381
- var cycleInfoSchema = v7.object({
382
- block_height: v7.number(),
383
- index_block_hash: v7.string(),
384
- cycle_number: v7.number(),
385
- total_weight: v7.number(),
386
- total_stacked_amount: v7.string(),
387
- total_signers: v7.number()
488
+ import * as v8 from "valibot";
489
+ var cycleInfoSchema = v8.object({
490
+ block_height: v8.number(),
491
+ index_block_hash: v8.string(),
492
+ cycle_number: v8.number(),
493
+ total_weight: v8.number(),
494
+ total_stacked_amount: v8.string(),
495
+ total_signers: v8.number()
388
496
  });
389
- var resultsSchema = v7.array(cycleInfoSchema);
390
- var cyclesResponseSchema = v7.object({
497
+ var resultsSchema = v8.array(cycleInfoSchema);
498
+ var cyclesResponseSchema = v8.object({
391
499
  ...baseListResponseSchema.entries,
392
500
  results: resultsSchema
393
501
  });
@@ -423,7 +531,7 @@ async function cycles(args) {
423
531
  data: jsonError
424
532
  });
425
533
  }
426
- const validationResult = v7.safeParse(cyclesResponseSchema, data);
534
+ const validationResult = v8.safeParse(cyclesResponseSchema, data);
427
535
  if (!validationResult.success) {
428
536
  return error({
429
537
  name: "ValidateDataError",
@@ -435,16 +543,16 @@ async function cycles(args) {
435
543
  }
436
544
 
437
545
  // src/stacks-api/proof-of-transfer/signer-in-cycle.ts
438
- import * as v8 from "valibot";
439
- var signerInCycleResponseSchema = v8.object({
440
- signing_key: v8.string(),
441
- signer_address: v8.string(),
442
- weight: v8.number(),
443
- stacked_amount: v8.string(),
444
- weight_percent: v8.number(),
445
- stacked_amount_percent: v8.number(),
446
- solo_stacker_count: v8.number(),
447
- pooled_stacker_count: v8.number()
546
+ import * as v9 from "valibot";
547
+ var signerInCycleResponseSchema = v9.object({
548
+ signing_key: v9.string(),
549
+ signer_address: v9.string(),
550
+ weight: v9.number(),
551
+ stacked_amount: v9.string(),
552
+ weight_percent: v9.number(),
553
+ stacked_amount_percent: v9.number(),
554
+ solo_stacker_count: v9.number(),
555
+ pooled_stacker_count: v9.number()
448
556
  });
449
557
  async function signerInCycle(args) {
450
558
  const init = {};
@@ -480,7 +588,7 @@ async function signerInCycle(args) {
480
588
  }
481
589
  });
482
590
  }
483
- const validationResult = v8.safeParse(signerInCycleResponseSchema, data);
591
+ const validationResult = v9.safeParse(signerInCycleResponseSchema, data);
484
592
  if (!validationResult.success) {
485
593
  return error({
486
594
  name: "ValidateDataError",
@@ -492,19 +600,19 @@ async function signerInCycle(args) {
492
600
  }
493
601
 
494
602
  // src/stacks-api/proof-of-transfer/signers-in-cycle.ts
495
- import * as v9 from "valibot";
496
- var signerSchema = v9.object({
497
- signing_key: v9.string(),
498
- signer_address: v9.string(),
499
- weight: v9.number(),
500
- stacked_amount: v9.string(),
501
- weight_percent: v9.number(),
502
- stacked_amount_percent: v9.number(),
503
- pooled_stacker_count: v9.number(),
504
- solo_stacker_count: v9.number()
603
+ import * as v10 from "valibot";
604
+ var signerSchema = v10.object({
605
+ signing_key: v10.string(),
606
+ signer_address: v10.string(),
607
+ weight: v10.number(),
608
+ stacked_amount: v10.string(),
609
+ weight_percent: v10.number(),
610
+ stacked_amount_percent: v10.number(),
611
+ pooled_stacker_count: v10.number(),
612
+ solo_stacker_count: v10.number()
505
613
  });
506
- var resultsSchema2 = v9.array(signerSchema);
507
- var signersResponseSchema = v9.object({
614
+ var resultsSchema2 = v10.array(signerSchema);
615
+ var signersResponseSchema = v10.object({
508
616
  ...baseListResponseSchema.entries,
509
617
  results: resultsSchema2
510
618
  });
@@ -543,7 +651,7 @@ async function signersInCycle(args) {
543
651
  }
544
652
  });
545
653
  }
546
- const validationResult = v9.safeParse(signersResponseSchema, data);
654
+ const validationResult = v10.safeParse(signersResponseSchema, data);
547
655
  if (!validationResult.success) {
548
656
  return error({
549
657
  name: "ValidateDataError",
@@ -555,15 +663,15 @@ async function signersInCycle(args) {
555
663
  }
556
664
 
557
665
  // src/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.ts
558
- import * as v10 from "valibot";
559
- var stackerInfoSchema = v10.object({
560
- stacker_address: v10.string(),
561
- stacked_amount: v10.string(),
562
- pox_address: v10.string(),
563
- stacker_type: v10.union([v10.literal("pooled"), v10.literal("solo")])
666
+ import * as v11 from "valibot";
667
+ var stackerInfoSchema = v11.object({
668
+ stacker_address: v11.string(),
669
+ stacked_amount: v11.string(),
670
+ pox_address: v11.string(),
671
+ stacker_type: v11.union([v11.literal("pooled"), v11.literal("solo")])
564
672
  });
565
- var resultsSchema3 = v10.array(stackerInfoSchema);
566
- var stackersForSignerInCycleResponseSchema = v10.object({
673
+ var resultsSchema3 = v11.array(stackerInfoSchema);
674
+ var stackersForSignerInCycleResponseSchema = v11.object({
567
675
  ...baseListResponseSchema.entries,
568
676
  results: resultsSchema3
569
677
  });
@@ -577,7 +685,8 @@ async function stackersForSignerInCycle(opts) {
577
685
  [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
578
686
  };
579
687
  }
580
- const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}/signers/${opts.signerPublicKey}/stackers?${search}`;
688
+ const signerPublicKeyPathParam = opts.signerPublicKey.startsWith("0x") ? opts.signerPublicKey : `0x${opts.signerPublicKey}`;
689
+ const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}/signers/${signerPublicKeyPathParam}/stackers?${search}`;
581
690
  const res = await fetch(endpoint, init);
582
691
  if (!res.ok) {
583
692
  return error({
@@ -599,7 +708,7 @@ async function stackersForSignerInCycle(opts) {
599
708
  data: jsonError
600
709
  });
601
710
  }
602
- const validationResult = v10.safeParse(
711
+ const validationResult = v11.safeParse(
603
712
  stackersForSignerInCycleResponseSchema,
604
713
  data
605
714
  );
@@ -613,29 +722,47 @@ async function stackersForSignerInCycle(opts) {
613
722
  return success(validationResult.output);
614
723
  }
615
724
 
725
+ // src/stacks-api/proof-of-transfer/index.ts
726
+ var proofOfTransfer = {
727
+ cycle,
728
+ cycles,
729
+ signerInCycle,
730
+ signersInCycle,
731
+ stackersForSignerInCycle
732
+ };
733
+
616
734
  // src/stacks-api/smart-contracts/read-only.ts
617
- import * as v11 from "valibot";
618
- var readOnlyResponseSchema = v11.variant("okay", [
619
- v11.object({
620
- okay: v11.literal(true),
621
- result: v11.string()
735
+ import * as v12 from "valibot";
736
+ var readOnlyResponseSchema = v12.variant("okay", [
737
+ v12.object({
738
+ okay: v12.literal(true),
739
+ /**
740
+ * A Clarity value as a hex-encoded string.
741
+ */
742
+ result: v12.string()
622
743
  }),
623
- v11.object({
624
- okay: v11.literal(false),
625
- cause: v11.unknown()
744
+ v12.object({
745
+ okay: v12.literal(false),
746
+ cause: v12.unknown()
626
747
  })
627
748
  ]);
628
- async function readOnly(opts, apiOpts) {
629
- const init = {};
630
- if (apiOpts.apiKeyConfig) {
631
- init.headers = {
632
- [apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
633
- };
749
+ async function readOnly(args) {
750
+ const headers = {
751
+ "Content-Type": "application/json"
752
+ };
753
+ if (args.apiKeyConfig) {
754
+ headers[args.apiKeyConfig.header] = args.apiKeyConfig.key;
634
755
  }
635
- const res = await fetch(
636
- `${apiOpts.baseUrl}/v2/contracts/call-read/${opts.contractAddress}/${opts.contractName}/${opts.functionName}`,
637
- init
638
- );
756
+ const init = {
757
+ method: "POST",
758
+ body: JSON.stringify({
759
+ sender: args.sender,
760
+ arguments: args.arguments
761
+ }),
762
+ headers
763
+ };
764
+ const endpoint = `${args.baseUrl}/v2/contracts/call-read/${args.contractAddress}/${args.contractName}/${args.functionName}`;
765
+ const res = await fetch(endpoint, init);
639
766
  if (!res.ok) {
640
767
  return error({
641
768
  name: "FetchReadOnlyError",
@@ -655,7 +782,7 @@ async function readOnly(opts, apiOpts) {
655
782
  data: error
656
783
  });
657
784
  }
658
- const validationResult = v11.safeParse(readOnlyResponseSchema, data);
785
+ const validationResult = v12.safeParse(readOnlyResponseSchema, data);
659
786
  if (!validationResult.success) {
660
787
  return error({
661
788
  name: "ValidateDataError",
@@ -666,38 +793,41 @@ async function readOnly(opts, apiOpts) {
666
793
  return success(validationResult.output);
667
794
  }
668
795
 
796
+ // src/stacks-api/smart-contracts/index.ts
797
+ var smartContracts = {
798
+ readOnly
799
+ };
800
+
669
801
  // src/stacks-api/stacking-pool/members.ts
670
- import * as v12 from "valibot";
671
- var memberSchema = v12.object({
672
- stacker: v12.string(),
673
- pox_addr: v12.optional(v12.string()),
674
- amount_ustx: v12.string(),
675
- burn_block_unlock_height: v12.optional(v12.number()),
676
- block_height: v12.number(),
677
- tx_id: v12.string()
802
+ import * as v13 from "valibot";
803
+ var memberSchema = v13.object({
804
+ stacker: v13.string(),
805
+ pox_addr: v13.optional(v13.string()),
806
+ amount_ustx: v13.string(),
807
+ burn_block_unlock_height: v13.optional(v13.number()),
808
+ block_height: v13.number(),
809
+ tx_id: v13.string()
678
810
  });
679
- var membersResponseSchema = v12.object({
680
- limit: v12.number(),
681
- offset: v12.number(),
682
- total: v12.number(),
683
- results: v12.array(memberSchema)
811
+ var membersResponseSchema = v13.object({
812
+ limit: v13.number(),
813
+ offset: v13.number(),
814
+ total: v13.number(),
815
+ results: v13.array(memberSchema)
684
816
  });
685
- async function members(opts, apiOpts) {
817
+ async function members(args) {
686
818
  const search = new URLSearchParams();
687
- if (opts.afterBlock) search.append("after_block", opts.afterBlock.toString());
688
- if (opts.unanchored) search.append("unanchored", "true");
689
- if (opts.limit) search.append("limit", opts.limit.toString());
690
- if (opts.offset) search.append("offset", opts.offset.toString());
819
+ if (args.afterBlock) search.append("after_block", args.afterBlock.toString());
820
+ if (args.unanchored) search.append("unanchored", "true");
821
+ if (args.limit) search.append("limit", args.limit.toString());
822
+ if (args.offset) search.append("offset", args.offset.toString());
691
823
  const init = {};
692
- if (apiOpts.apiKeyConfig) {
824
+ if (args.apiKeyConfig) {
693
825
  init.headers = {
694
- [apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
826
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
695
827
  };
696
828
  }
697
- const res = await fetch(
698
- `${apiOpts.baseUrl}/extended/beta/stacking/${opts.poolPrincipal}/delegations?${search}`,
699
- init
700
- );
829
+ const endpoint = `${args.baseUrl}/extended/v1/pox4/${args.poolPrincipal}/delegations?${search}`;
830
+ const res = await fetch(endpoint, init);
701
831
  if (!res.ok) {
702
832
  return error({
703
833
  name: "FetchMembersError",
@@ -717,7 +847,7 @@ async function members(opts, apiOpts) {
717
847
  data: jsonParseError
718
848
  });
719
849
  }
720
- const validationResult = v12.safeParse(membersResponseSchema, data);
850
+ const validationResult = v13.safeParse(membersResponseSchema, data);
721
851
  if (!validationResult.success) {
722
852
  return error({
723
853
  name: "ValidateDataError",
@@ -728,117 +858,126 @@ async function members(opts, apiOpts) {
728
858
  return success(validationResult.output);
729
859
  }
730
860
 
861
+ // src/stacks-api/stacking-pool/index.ts
862
+ var stackingPool = {
863
+ members
864
+ };
865
+
731
866
  // src/stacks-api/transactions/schemas.ts
732
- import * as v13 from "valibot";
733
- var baseTransactionSchema = v13.object({
734
- tx_id: v13.string(),
735
- nonce: v13.number(),
736
- fee_rate: v13.string(),
737
- sender_address: v13.string(),
738
- sponsored: v13.boolean(),
739
- post_condition_mode: v13.string(),
740
- post_conditions: v13.array(v13.unknown()),
741
- anchor_mode: v13.string(),
742
- is_unanchored: v13.boolean(),
743
- block_hash: v13.string(),
744
- parent_block_hash: v13.string(),
745
- block_height: v13.number(),
746
- block_time: v13.number(),
747
- block_time_iso: v13.string(),
748
- burn_block_height: v13.number(),
749
- burn_block_time: v13.number(),
750
- burn_block_time_iso: v13.string(),
751
- parent_burn_block_time: v13.number(),
752
- parent_burn_block_time_iso: v13.string(),
753
- canonical: v13.boolean(),
754
- tx_index: v13.number(),
755
- tx_status: v13.string(),
756
- tx_result: v13.object({
757
- hex: v13.string(),
758
- repr: v13.string()
867
+ import * as v14 from "valibot";
868
+ var baseTransactionSchema = v14.object({
869
+ tx_id: v14.string(),
870
+ nonce: v14.number(),
871
+ fee_rate: v14.string(),
872
+ sender_address: v14.string(),
873
+ sponsored: v14.boolean(),
874
+ post_condition_mode: v14.string(),
875
+ post_conditions: v14.array(v14.unknown()),
876
+ anchor_mode: v14.string(),
877
+ is_unanchored: v14.boolean(),
878
+ block_hash: v14.string(),
879
+ parent_block_hash: v14.string(),
880
+ block_height: v14.number(),
881
+ block_time: v14.number(),
882
+ block_time_iso: v14.string(),
883
+ burn_block_height: v14.number(),
884
+ burn_block_time: v14.number(),
885
+ burn_block_time_iso: v14.string(),
886
+ parent_burn_block_time: v14.number(),
887
+ parent_burn_block_time_iso: v14.string(),
888
+ canonical: v14.boolean(),
889
+ tx_index: v14.number(),
890
+ tx_status: v14.union([
891
+ v14.literal("success"),
892
+ v14.literal("abort_by_response"),
893
+ v14.literal("abort_by_post_condition")
894
+ ]),
895
+ tx_result: v14.object({
896
+ hex: v14.string(),
897
+ repr: v14.string()
759
898
  }),
760
- microblock_hash: v13.string(),
761
- microblock_sequence: v13.number(),
762
- microblock_canonical: v13.boolean(),
763
- event_count: v13.number(),
764
- events: v13.array(v13.unknown()),
765
- execution_cost_read_count: v13.number(),
766
- execution_cost_read_length: v13.number(),
767
- execution_cost_runtime: v13.number(),
768
- execution_cost_write_count: v13.number(),
769
- execution_cost_write_length: v13.number()
899
+ microblock_hash: v14.string(),
900
+ microblock_sequence: v14.number(),
901
+ microblock_canonical: v14.boolean(),
902
+ event_count: v14.number(),
903
+ events: v14.array(v14.unknown()),
904
+ execution_cost_read_count: v14.number(),
905
+ execution_cost_read_length: v14.number(),
906
+ execution_cost_runtime: v14.number(),
907
+ execution_cost_write_count: v14.number(),
908
+ execution_cost_write_length: v14.number()
770
909
  });
771
- var contractCallTransactionSchema = v13.object({
772
- tx_type: v13.literal("contract_call"),
773
- contract_call: v13.object({
774
- contract_id: v13.string(),
775
- function_name: v13.string(),
776
- function_signature: v13.string(),
777
- function_args: v13.array(
778
- v13.object({
779
- hex: v13.string(),
780
- repr: v13.string(),
781
- name: v13.string(),
782
- type: v13.string()
910
+ var contractCallTransactionSchema = v14.object({
911
+ tx_type: v14.literal("contract_call"),
912
+ contract_call: v14.object({
913
+ contract_id: v14.string(),
914
+ function_name: v14.string(),
915
+ function_signature: v14.string(),
916
+ function_args: v14.array(
917
+ v14.object({
918
+ hex: v14.string(),
919
+ repr: v14.string(),
920
+ name: v14.string(),
921
+ type: v14.string()
783
922
  })
784
923
  )
785
924
  }),
786
925
  ...baseTransactionSchema.entries
787
926
  });
788
- var smartContractTransactionSchema = v13.object({
789
- tx_type: v13.literal("smart_contract"),
790
- smart_contract: v13.object({
927
+ var smartContractTransactionSchema = v14.object({
928
+ tx_type: v14.literal("smart_contract"),
929
+ smart_contract: v14.object({
791
930
  /**
792
931
  * NOTE: The types may be wrong, not sure what type of value is used when
793
932
  * the version is not `null`.
794
933
  */
795
- clarity_version: v13.union([v13.null(), v13.number()]),
796
- contract_id: v13.string(),
797
- source_code: v13.string()
934
+ clarity_version: v14.union([v14.null(), v14.number()]),
935
+ contract_id: v14.string(),
936
+ source_code: v14.string()
798
937
  }),
799
938
  ...baseTransactionSchema.entries
800
939
  });
801
- var tokenTransferSchema = v13.object({
802
- tx_type: v13.literal("token_transfer"),
803
- token_transfer: v13.object({
804
- recipient_address: v13.string(),
805
- amount: v13.string(),
806
- memo: v13.string()
940
+ var tokenTransferSchema = v14.object({
941
+ tx_type: v14.literal("token_transfer"),
942
+ token_transfer: v14.object({
943
+ recipient_address: v14.string(),
944
+ amount: v14.string(),
945
+ memo: v14.string()
807
946
  }),
808
947
  ...baseTransactionSchema.entries
809
948
  });
810
- var transactionSchema = v13.variant("tx_type", [
949
+ var transactionSchema = v14.variant("tx_type", [
811
950
  contractCallTransactionSchema,
812
951
  smartContractTransactionSchema,
813
952
  tokenTransferSchema
814
953
  ]);
815
954
 
816
955
  // src/stacks-api/transactions/address-transactions.ts
817
- import * as v14 from "valibot";
818
- var resultSchema = v14.object({
956
+ import * as v15 from "valibot";
957
+ var resultSchema = v15.object({
819
958
  tx: transactionSchema,
820
- stx_sent: v14.string(),
821
- stx_received: v14.string(),
822
- events: v14.object({
823
- stx: v14.object({
824
- transfer: v14.number(),
825
- mint: v14.number(),
826
- burn: v14.number()
959
+ stx_sent: v15.string(),
960
+ stx_received: v15.string(),
961
+ events: v15.object({
962
+ stx: v15.object({
963
+ transfer: v15.number(),
964
+ mint: v15.number(),
965
+ burn: v15.number()
827
966
  }),
828
- ft: v14.object({
829
- transfer: v14.number(),
830
- mint: v14.number(),
831
- burn: v14.number()
967
+ ft: v15.object({
968
+ transfer: v15.number(),
969
+ mint: v15.number(),
970
+ burn: v15.number()
832
971
  }),
833
- nft: v14.object({
834
- transfer: v14.number(),
835
- mint: v14.number(),
836
- burn: v14.number()
972
+ nft: v15.object({
973
+ transfer: v15.number(),
974
+ mint: v15.number(),
975
+ burn: v15.number()
837
976
  })
838
977
  })
839
978
  });
840
- var resultsSchema4 = v14.array(resultSchema);
841
- var addressTransactionsResponseSchema = v14.object({
979
+ var resultsSchema4 = v15.array(resultSchema);
980
+ var addressTransactionsResponseSchema = v15.object({
842
981
  ...baseListResponseSchema.entries,
843
982
  results: resultsSchema4
844
983
  });
@@ -875,7 +1014,7 @@ async function addressTransactions(args) {
875
1014
  data: jsonParseError
876
1015
  });
877
1016
  }
878
- const validationResult = v14.safeParse(addressTransactionsResponseSchema, data);
1017
+ const validationResult = v15.safeParse(addressTransactionsResponseSchema, data);
879
1018
  if (!validationResult.success) {
880
1019
  return error({
881
1020
  name: "ValidateDataError",
@@ -887,7 +1026,7 @@ async function addressTransactions(args) {
887
1026
  }
888
1027
 
889
1028
  // src/stacks-api/transactions/get-transaction.ts
890
- import * as v15 from "valibot";
1029
+ import * as v16 from "valibot";
891
1030
  async function getTransaction(args) {
892
1031
  const init = {};
893
1032
  if (args.apiKeyConfig) {
@@ -916,7 +1055,7 @@ async function getTransaction(args) {
916
1055
  error: jsonParseError
917
1056
  });
918
1057
  }
919
- const validationResult = v15.safeParse(transactionSchema, data);
1058
+ const validationResult = v16.safeParse(transactionSchema, data);
920
1059
  if (!validationResult.success) {
921
1060
  return error({
922
1061
  name: "ValidateDataError",
@@ -927,20 +1066,89 @@ async function getTransaction(args) {
927
1066
  return success(validationResult.output);
928
1067
  }
929
1068
 
1069
+ // src/stacks-api/transactions/index.ts
1070
+ var transactions = {
1071
+ addressTransactions,
1072
+ getTransaction
1073
+ };
1074
+
930
1075
  // src/stacks-api/index.ts
931
- var accounts = { balances };
932
- var blocks = { getBlock };
933
- var info = { coreApi, poxDetails };
934
- var proofOfTransfer = {
935
- cycle,
936
- cycles,
937
- signerInCycle,
938
- signersInCycle,
939
- stackersForSignerInCycle
1076
+ var stacksApi = {
1077
+ accounts,
1078
+ blocks,
1079
+ faucets,
1080
+ info,
1081
+ proofOfTransfer,
1082
+ smartContracts,
1083
+ stackingPool,
1084
+ transactions
1085
+ };
1086
+
1087
+ // src/stacks-rpc-api/smart-contracts/map-entry.ts
1088
+ import * as v17 from "valibot";
1089
+ var mapEntryResponseSchema = v17.object({
1090
+ /**
1091
+ * Hex-encoded string of clarity value. It is always an optional tuple.
1092
+ */
1093
+ data: v17.string(),
1094
+ /**
1095
+ * Hex-encoded string of the MARF proof for the data
1096
+ */
1097
+ proof: v17.optional(v17.string())
1098
+ });
1099
+ async function mapEntry(args) {
1100
+ const search = new URLSearchParams();
1101
+ if (args.proof === 0) search.append("proof", "0");
1102
+ if (args.tip) search.append("tip", args.tip);
1103
+ const init = {};
1104
+ if (args.apiKeyConfig) {
1105
+ init.headers = {
1106
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
1107
+ };
1108
+ }
1109
+ init.method = "POST";
1110
+ init.body = args.mapKey;
1111
+ const endpoint = `${args.baseUrl}/v2/map_entry/${args.contractAddress}/${args.contractName}/${args.mapName}?${search}`;
1112
+ const res = await fetch(endpoint, init);
1113
+ if (!res.ok) {
1114
+ return error({
1115
+ name: "FetchMapEntryError",
1116
+ message: "Failed to fetch map entry.",
1117
+ data: {
1118
+ status: res.status,
1119
+ statusText: res.statusText,
1120
+ bodyParseResult: await safePromise(res.json())
1121
+ }
1122
+ });
1123
+ }
1124
+ const [jsonError, data] = await safePromise(res.json());
1125
+ if (jsonError) {
1126
+ return error({
1127
+ name: "ParseBodyError",
1128
+ message: "Failed to parse response body as JSON.",
1129
+ data: jsonError
1130
+ });
1131
+ }
1132
+ const validationResult = v17.safeParse(mapEntryResponseSchema, data);
1133
+ if (!validationResult.success) {
1134
+ return error({
1135
+ name: "ValidateDataError",
1136
+ message: "Failed to validate response data.",
1137
+ data: validationResult
1138
+ });
1139
+ }
1140
+ return success(validationResult.output);
1141
+ }
1142
+
1143
+ // src/stacks-rpc-api/smart-contracts/index.ts
1144
+ var smartContracts2 = {
1145
+ mapEntry
1146
+ };
1147
+
1148
+ // src/stacks-rpc-api/index.ts
1149
+ var stacksRpcApi = {
1150
+ smartContracts: smartContracts2
940
1151
  };
941
- var smartContracts = { readOnly };
942
- var stackingPool = { members };
943
- var transactions = { addressTransactions, getTransaction };
944
1152
 
945
1153
  // src/utils/call-rate-limited-api.ts
946
1154
  import { backOff } from "exponential-backoff";
@@ -954,10 +1162,19 @@ function callRateLimitedApi(fn, options) {
954
1162
  }
955
1163
  async function safeCallRateLimitedApi(fn, options) {
956
1164
  try {
957
- return await backOff(() => fn(), {
958
- startingDelay: options?.startingDelay ?? 15e3,
959
- numOfAttempts: options?.numOfAttempts ?? 5
960
- });
1165
+ return await backOff(
1166
+ async () => {
1167
+ const [error2, data] = await fn();
1168
+ if (error2) {
1169
+ throw error2;
1170
+ }
1171
+ return success(data);
1172
+ },
1173
+ {
1174
+ startingDelay: options?.startingDelay ?? 15e3,
1175
+ numOfAttempts: options?.numOfAttempts ?? 5
1176
+ }
1177
+ );
961
1178
  } catch (error2) {
962
1179
  return error({
963
1180
  name: "MaxRetriesExceeded",
@@ -969,22 +1186,73 @@ async function safeCallRateLimitedApi(fn, options) {
969
1186
  }
970
1187
  }
971
1188
 
972
- // src/index.ts
973
- var stacksApi = {
974
- accounts,
975
- blocks,
976
- info,
977
- proofOfTransfer,
978
- smartContracts,
979
- stackingPool,
980
- transactions
1189
+ // src/queries/get-signer-stacked-amount.ts
1190
+ async function getSignerStackedAmount(args) {
1191
+ let totalLocked = 0n;
1192
+ const { identifier, ...rest } = args;
1193
+ let hasMore = true;
1194
+ let offset = 0;
1195
+ let found = false;
1196
+ const limit = 200;
1197
+ while (hasMore && !found) {
1198
+ const [error2, data] = await safeCallRateLimitedApi(
1199
+ () => signersInCycle({
1200
+ ...rest,
1201
+ limit
1202
+ })
1203
+ );
1204
+ if (error2) {
1205
+ return error({
1206
+ name: "GetSignerTotalLockedError",
1207
+ message: "Failed to get signer total locked.",
1208
+ data: {
1209
+ error: error2
1210
+ }
1211
+ });
1212
+ }
1213
+ for (const signer of data.results) {
1214
+ if (identifier.type === "address") {
1215
+ if (signer.signer_address === identifier.signerAddress) {
1216
+ totalLocked = BigInt(signer.stacked_amount);
1217
+ found = true;
1218
+ break;
1219
+ }
1220
+ } else {
1221
+ if (signer.signing_key === identifier.signerPublicKey) {
1222
+ totalLocked = BigInt(signer.stacked_amount);
1223
+ found = true;
1224
+ break;
1225
+ }
1226
+ }
1227
+ }
1228
+ offset += data.results.length;
1229
+ hasMore = offset < data.total;
1230
+ }
1231
+ if (!found) {
1232
+ return error({
1233
+ name: "SignerNotFound",
1234
+ message: "Signer not found.",
1235
+ data: {
1236
+ identifier,
1237
+ cycle: args.cycleNumber
1238
+ }
1239
+ });
1240
+ }
1241
+ return success(totalLocked);
1242
+ }
1243
+
1244
+ // src/queries/index.ts
1245
+ var queries = {
1246
+ getSignerStackedAmount
981
1247
  };
982
1248
  export {
983
1249
  callRateLimitedApi,
984
1250
  error,
1251
+ queries,
985
1252
  safeCall,
986
1253
  safeCallRateLimitedApi,
987
1254
  safePromise,
988
1255
  stacksApi,
1256
+ stacksRpcApi,
989
1257
  success
990
1258
  };