@secretkeylabs/stacks-tools 0.4.0-47d10ad → 0.4.0-53564ef

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
@@ -32,10 +32,12 @@ var src_exports = {};
32
32
  __export(src_exports, {
33
33
  callRateLimitedApi: () => callRateLimitedApi,
34
34
  error: () => error,
35
+ queries: () => queries,
35
36
  safeCall: () => safeCall,
36
37
  safeCallRateLimitedApi: () => safeCallRateLimitedApi,
37
38
  safePromise: () => safePromise,
38
39
  stacksApi: () => stacksApi,
40
+ stacksRpcApi: () => stacksRpcApi,
39
41
  success: () => success
40
42
  });
41
43
  module.exports = __toCommonJS(src_exports);
@@ -144,37 +146,92 @@ async function balances(opts) {
144
146
  return success(validationResult.output);
145
147
  }
146
148
 
147
- // src/stacks-api/types.ts
149
+ // src/stacks-api/accounts/latest-nonce.ts
148
150
  var v2 = __toESM(require("valibot"), 1);
149
- var baseListResponseSchema = v2.object({
150
- limit: v2.number(),
151
- offset: v2.number(),
152
- total: v2.number(),
153
- results: v2.array(v2.unknown())
151
+ var responseSchema2 = v2.object({
152
+ last_mempool_tx_nonce: v2.nullable(v2.number()),
153
+ last_executed_tx_nonce: v2.nullable(v2.number()),
154
+ possible_next_nonce: v2.number(),
155
+ detected_missing_nonces: v2.array(v2.number()),
156
+ detected_mempool_nonces: v2.array(v2.number())
154
157
  });
158
+ async function latestNonce(opts) {
159
+ const init = {};
160
+ if (opts.apiKeyConfig) {
161
+ init.headers = {
162
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
163
+ };
164
+ }
165
+ const endpoint = `${opts.baseUrl}/extended/v1/address/${opts.principal}/nonces`;
166
+ const res = await fetch(endpoint, init);
167
+ if (!res.ok) {
168
+ return error({
169
+ name: "FetchLatestNonceError",
170
+ message: "Failed to fetch latest nonce.",
171
+ data: {
172
+ endpoint,
173
+ status: res.status,
174
+ statusText: res.statusText,
175
+ bodyParseResult: await safePromise(res.json())
176
+ }
177
+ });
178
+ }
179
+ const [jsonError, data] = await safePromise(res.json());
180
+ if (jsonError) {
181
+ return error({
182
+ name: "ParseBodyError",
183
+ message: "Failed to parse response body as JSON.",
184
+ data: jsonError
185
+ });
186
+ }
187
+ const validationResult = v2.safeParse(responseSchema2, data);
188
+ if (!validationResult.success) {
189
+ return error({
190
+ name: "ValidateDataError",
191
+ message: "Failed to validate data.",
192
+ data: validationResult
193
+ });
194
+ }
195
+ return success(validationResult.output);
196
+ }
155
197
 
156
- // src/stacks-api/blocks/get-block.ts
198
+ // src/stacks-api/accounts/index.ts
199
+ var accounts = {
200
+ balances,
201
+ latestNonce
202
+ };
203
+
204
+ // src/stacks-api/types.ts
157
205
  var v3 = __toESM(require("valibot"), 1);
158
- var responseSchema2 = v3.object({
159
- canonical: v3.boolean(),
160
- height: v3.number(),
161
- hash: v3.string(),
162
- block_time: v3.number(),
163
- block_time_iso: v3.string(),
164
- index_block_hash: v3.string(),
165
- parent_block_hash: v3.string(),
166
- parent_index_block_hash: v3.string(),
167
- burn_block_time: v3.number(),
168
- burn_block_time_iso: v3.string(),
169
- burn_block_hash: v3.string(),
170
- burn_block_height: v3.number(),
171
- miner_txid: v3.string(),
172
- tx_count: v3.number(),
173
- execution_cost_read_count: v3.number(),
174
- execution_cost_read_length: v3.number(),
175
- execution_cost_runtime: v3.number(),
176
- execution_cost_write_count: v3.number(),
177
- execution_cost_write_length: v3.number()
206
+ var baseListResponseSchema = v3.object({
207
+ limit: v3.number(),
208
+ offset: v3.number(),
209
+ total: v3.number(),
210
+ results: v3.array(v3.unknown())
211
+ });
212
+
213
+ // src/stacks-api/blocks/get-block.ts
214
+ var v4 = __toESM(require("valibot"), 1);
215
+ var responseSchema3 = v4.object({
216
+ canonical: v4.boolean(),
217
+ height: v4.number(),
218
+ hash: v4.string(),
219
+ block_time: v4.number(),
220
+ block_time_iso: v4.string(),
221
+ index_block_hash: v4.string(),
222
+ parent_block_hash: v4.string(),
223
+ parent_index_block_hash: v4.string(),
224
+ burn_block_time: v4.number(),
225
+ burn_block_time_iso: v4.string(),
226
+ burn_block_hash: v4.string(),
227
+ burn_block_height: v4.number(),
228
+ miner_txid: v4.string(),
229
+ tx_count: v4.number(),
230
+ execution_cost_read_count: v4.number(),
231
+ execution_cost_read_length: v4.number(),
232
+ execution_cost_runtime: v4.number(),
233
+ execution_cost_write_count: v4.number(),
234
+ execution_cost_write_length: v4.number()
178
235
  });
179
236
  async function getBlock(opts) {
180
237
  const init = {};
@@ -206,7 +263,7 @@ async function getBlock(opts) {
206
263
  data: jsonError
207
264
  });
208
265
  }
209
- const validationResult = v3.safeParse(responseSchema2, data);
266
+ const validationResult = v4.safeParse(responseSchema3, data);
210
267
  if (!validationResult.success) {
211
268
  return error({
212
269
  name: "ValidateDataError",
@@ -217,22 +274,69 @@ async function getBlock(opts) {
217
274
  return success(validationResult.output);
218
275
  }
219
276
 
277
+ // src/stacks-api/blocks/index.ts
278
+ var blocks = {
279
+ getBlock
280
+ };
281
+
282
+ // src/stacks-api/faucets/stx.ts
283
+ async function stx(opts) {
284
+ const search = new URLSearchParams();
285
+ search.append("address", opts.address);
286
+ if (opts.stacking) search.append("stacking", "true");
287
+ const init = {};
288
+ if (opts.apiKeyConfig) {
289
+ init.headers = {
290
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
291
+ };
292
+ }
293
+ init.method = "POST";
294
+ const endpoint = `${opts.baseUrl}/extended/v1/faucets/stx?${search}`;
295
+ const res = await fetch(endpoint, init);
296
+ if (!res.ok) {
297
+ return error({
298
+ name: "FetchStxError",
299
+ message: "Failed to fetch STX.",
300
+ data: {
301
+ status: res.status,
302
+ statusText: res.statusText,
303
+ bodyParseResult: await safePromise(res.json())
304
+ }
305
+ });
306
+ }
307
+ const [jsonError, data] = await safePromise(res.json());
308
+ if (jsonError) {
309
+ return error({
310
+ name: "ParseBodyError",
311
+ message: "Failed to parse response body as JSON.",
312
+ data: jsonError
313
+ });
314
+ }
315
+ return success(data);
316
+ }
317
+
318
+ // src/stacks-api/faucets/index.ts
319
+ var faucets = {
320
+ stx
321
+ };
322
+
220
323
  // src/stacks-api/info/core-api.ts
221
- var v4 = __toESM(require("valibot"), 1);
222
- var CoreApiResponseSchema = v4.object({
223
- peer_version: v4.number(),
224
- pox_consensus: v4.string(),
225
- burn_block_height: v4.number(),
226
- stable_pox_consensus: v4.string(),
227
- stable_burn_block_height: v4.number(),
228
- server_version: v4.string(),
229
- network_id: v4.number(),
230
- parent_network_id: v4.number(),
231
- stacks_tip_height: v4.number(),
232
- stacks_tip: v4.string(),
233
- stacks_tip_consensus_hash: v4.string(),
234
- unanchored_tip: v4.string(),
235
- exit_at_block_height: v4.number()
324
+ var v5 = __toESM(require("valibot"), 1);
325
+ var CoreApiResponseSchema = v5.object({
326
+ peer_version: v5.number(),
327
+ pox_consensus: v5.string(),
328
+ burn_block_height: v5.number(),
329
+ stable_pox_consensus: v5.string(),
330
+ stable_burn_block_height: v5.number(),
331
+ server_version: v5.string(),
332
+ network_id: v5.number(),
333
+ parent_network_id: v5.number(),
334
+ stacks_tip_height: v5.number(),
335
+ stacks_tip: v5.string(),
336
+ stacks_tip_consensus_hash: v5.string(),
337
+ unanchored_tip: v5.nullable(v5.string()),
338
+ unanchored_seq: v5.nullable(v5.string()),
339
+ exit_at_block_height: v5.nullable(v5.number())
236
340
  });
237
341
  async function coreApi(apiOpts) {
238
342
  const init = {};
@@ -261,7 +365,7 @@ async function coreApi(apiOpts) {
261
365
  data: parseBodyError
262
366
  });
263
367
  }
264
- const validationResult = v4.safeParse(CoreApiResponseSchema, data);
368
+ const validationResult = v5.safeParse(CoreApiResponseSchema, data);
265
369
  if (!validationResult.success) {
266
370
  return error({
267
371
  name: "ValidateDataError",
@@ -273,60 +377,60 @@ async function coreApi(apiOpts) {
273
377
  }
274
378
 
275
379
  // src/stacks-api/info/pox-details.ts
276
- var v5 = __toESM(require("valibot"), 1);
277
- var poxDetailsResponseSchema = v5.object({
278
- contract_id: v5.string(),
279
- pox_activation_threshold_ustx: v5.number(),
280
- first_burnchain_block_height: v5.number(),
281
- current_burnchain_block_height: v5.number(),
282
- prepare_phase_block_length: v5.number(),
283
- reward_phase_block_length: v5.number(),
284
- reward_slots: v5.number(),
285
- rejection_fraction: v5.null(),
286
- total_liquid_supply_ustx: v5.number(),
287
- current_cycle: v5.object({
288
- id: v5.number(),
289
- min_threshold_ustx: v5.number(),
290
- stacked_ustx: v5.number(),
291
- is_pox_active: v5.boolean()
380
+ var v6 = __toESM(require("valibot"), 1);
381
+ var poxDetailsResponseSchema = v6.object({
382
+ contract_id: v6.string(),
383
+ pox_activation_threshold_ustx: v6.number(),
384
+ first_burnchain_block_height: v6.number(),
385
+ current_burnchain_block_height: v6.number(),
386
+ prepare_phase_block_length: v6.number(),
387
+ reward_phase_block_length: v6.number(),
388
+ reward_slots: v6.number(),
389
+ rejection_fraction: v6.null(),
390
+ total_liquid_supply_ustx: v6.number(),
391
+ current_cycle: v6.object({
392
+ id: v6.number(),
393
+ min_threshold_ustx: v6.number(),
394
+ stacked_ustx: v6.number(),
395
+ is_pox_active: v6.boolean()
292
396
  }),
293
- next_cycle: v5.object({
294
- id: v5.number(),
295
- min_threshold_ustx: v5.number(),
296
- min_increment_ustx: v5.number(),
297
- stacked_ustx: v5.number(),
298
- prepare_phase_start_block_height: v5.number(),
299
- blocks_until_prepare_phase: v5.number(),
300
- reward_phase_start_block_height: v5.number(),
301
- blocks_until_reward_phase: v5.number(),
302
- ustx_until_pox_rejection: v5.null()
397
+ next_cycle: v6.object({
398
+ id: v6.number(),
399
+ min_threshold_ustx: v6.number(),
400
+ min_increment_ustx: v6.number(),
401
+ stacked_ustx: v6.number(),
402
+ prepare_phase_start_block_height: v6.number(),
403
+ blocks_until_prepare_phase: v6.number(),
404
+ reward_phase_start_block_height: v6.number(),
405
+ blocks_until_reward_phase: v6.number(),
406
+ ustx_until_pox_rejection: v6.null()
303
407
  }),
304
- epochs: v5.array(
305
- v5.object({
306
- epoch_id: v5.string(),
307
- start_height: v5.number(),
308
- end_height: v5.number(),
309
- block_limit: v5.object({
310
- write_length: v5.number(),
311
- write_count: v5.number(),
312
- read_length: v5.number(),
313
- read_count: v5.number(),
314
- runtime: v5.number()
408
+ epochs: v6.array(
409
+ v6.object({
410
+ epoch_id: v6.string(),
411
+ start_height: v6.number(),
412
+ end_height: v6.number(),
413
+ block_limit: v6.object({
414
+ write_length: v6.number(),
415
+ write_count: v6.number(),
416
+ read_length: v6.number(),
417
+ read_count: v6.number(),
418
+ runtime: v6.number()
315
419
  }),
316
- network_epoch: v5.number()
420
+ network_epoch: v6.number()
317
421
  })
318
422
  ),
319
- min_amount_ustx: v5.number(),
320
- prepare_cycle_length: v5.number(),
321
- reward_cycle_id: v5.number(),
322
- reward_cycle_length: v5.number(),
323
- rejection_votes_left_required: v5.null(),
324
- next_reward_cycle_in: v5.number(),
325
- contract_versions: v5.array(
326
- v5.object({
327
- contract_id: v5.string(),
328
- activation_burnchain_block_height: v5.number(),
329
- first_reward_cycle_id: v5.number()
423
+ min_amount_ustx: v6.number(),
424
+ prepare_cycle_length: v6.number(),
425
+ reward_cycle_id: v6.number(),
426
+ reward_cycle_length: v6.number(),
427
+ rejection_votes_left_required: v6.null(),
428
+ next_reward_cycle_in: v6.number(),
429
+ contract_versions: v6.array(
430
+ v6.object({
431
+ contract_id: v6.string(),
432
+ activation_burnchain_block_height: v6.number(),
433
+ first_reward_cycle_id: v6.number()
330
434
  })
331
435
  )
332
436
  });
@@ -357,7 +461,7 @@ async function poxDetails(args) {
357
461
  data: jsonParseError
358
462
  });
359
463
  }
360
- const validationResult = v5.safeParse(poxDetailsResponseSchema, data);
464
+ const validationResult = v6.safeParse(poxDetailsResponseSchema, data);
361
465
  if (!validationResult.success) {
362
466
  return error({
363
467
  name: "ValidateDataError",
@@ -368,15 +472,21 @@ async function poxDetails(args) {
368
472
  return success(validationResult.output);
369
473
  }
370
474
 
475
+ // src/stacks-api/info/index.ts
476
+ var info = {
477
+ coreApi,
478
+ poxDetails
479
+ };
480
+
371
481
  // src/stacks-api/proof-of-transfer/cycle.ts
372
- var v6 = __toESM(require("valibot"), 1);
373
- var responseSchema3 = v6.object({
374
- block_height: v6.number(),
375
- index_block_hash: v6.string(),
376
- cycle_number: v6.number(),
377
- total_weight: v6.number(),
378
- total_stacked_amount: v6.string(),
379
- total_signers: v6.number()
482
+ var v7 = __toESM(require("valibot"), 1);
483
+ var responseSchema4 = v7.object({
484
+ block_height: v7.number(),
485
+ index_block_hash: v7.string(),
486
+ cycle_number: v7.number(),
487
+ total_weight: v7.number(),
488
+ total_stacked_amount: v7.string(),
489
+ total_signers: v7.number()
380
490
  });
381
491
  async function cycle(opts) {
382
492
  const init = {};
@@ -407,7 +517,7 @@ async function cycle(opts) {
407
517
  data: jsonError
408
518
  });
409
519
  }
410
- const validationResult = v6.safeParse(responseSchema3, data);
520
+ const validationResult = v7.safeParse(responseSchema4, data);
411
521
  if (!validationResult.success) {
412
522
  return error({
413
523
  name: "ValidateDataError",
@@ -419,17 +529,17 @@ async function cycle(opts) {
419
529
  }
420
530
 
421
531
  // src/stacks-api/proof-of-transfer/cycles.ts
422
- var v7 = __toESM(require("valibot"), 1);
423
- var cycleInfoSchema = v7.object({
424
- block_height: v7.number(),
425
- index_block_hash: v7.string(),
426
- cycle_number: v7.number(),
427
- total_weight: v7.number(),
428
- total_stacked_amount: v7.string(),
429
- total_signers: v7.number()
532
+ var v8 = __toESM(require("valibot"), 1);
533
+ var cycleInfoSchema = v8.object({
534
+ block_height: v8.number(),
535
+ index_block_hash: v8.string(),
536
+ cycle_number: v8.number(),
537
+ total_weight: v8.number(),
538
+ total_stacked_amount: v8.string(),
539
+ total_signers: v8.number()
430
540
  });
431
- var resultsSchema = v7.array(cycleInfoSchema);
432
- var cyclesResponseSchema = v7.object({
541
+ var resultsSchema = v8.array(cycleInfoSchema);
542
+ var cyclesResponseSchema = v8.object({
433
543
  ...baseListResponseSchema.entries,
434
544
  results: resultsSchema
435
545
  });
@@ -465,7 +575,7 @@ async function cycles(args) {
465
575
  data: jsonError
466
576
  });
467
577
  }
468
- const validationResult = v7.safeParse(cyclesResponseSchema, data);
578
+ const validationResult = v8.safeParse(cyclesResponseSchema, data);
469
579
  if (!validationResult.success) {
470
580
  return error({
471
581
  name: "ValidateDataError",
@@ -477,16 +587,16 @@ async function cycles(args) {
477
587
  }
478
588
 
479
589
  // src/stacks-api/proof-of-transfer/signer-in-cycle.ts
480
- var v8 = __toESM(require("valibot"), 1);
481
- var signerInCycleResponseSchema = v8.object({
482
- signing_key: v8.string(),
483
- signer_address: v8.string(),
484
- weight: v8.number(),
485
- stacked_amount: v8.string(),
486
- weight_percent: v8.number(),
487
- stacked_amount_percent: v8.number(),
488
- solo_stacker_count: v8.number(),
489
- pooled_stacker_count: v8.number()
590
+ var v9 = __toESM(require("valibot"), 1);
591
+ var signerInCycleResponseSchema = v9.object({
592
+ signing_key: v9.string(),
593
+ signer_address: v9.string(),
594
+ weight: v9.number(),
595
+ stacked_amount: v9.string(),
596
+ weight_percent: v9.number(),
597
+ stacked_amount_percent: v9.number(),
598
+ solo_stacker_count: v9.number(),
599
+ pooled_stacker_count: v9.number()
490
600
  });
491
601
  async function signerInCycle(args) {
492
602
  const init = {};
@@ -522,7 +632,7 @@ async function signerInCycle(args) {
522
632
  }
523
633
  });
524
634
  }
525
- const validationResult = v8.safeParse(signerInCycleResponseSchema, data);
635
+ const validationResult = v9.safeParse(signerInCycleResponseSchema, data);
526
636
  if (!validationResult.success) {
527
637
  return error({
528
638
  name: "ValidateDataError",
@@ -534,19 +644,19 @@ async function signerInCycle(args) {
534
644
  }
535
645
 
536
646
  // src/stacks-api/proof-of-transfer/signers-in-cycle.ts
537
- var v9 = __toESM(require("valibot"), 1);
538
- var signerSchema = v9.object({
539
- signing_key: v9.string(),
540
- signer_address: v9.string(),
541
- weight: v9.number(),
542
- stacked_amount: v9.string(),
543
- weight_percent: v9.number(),
544
- stacked_amount_percent: v9.number(),
545
- pooled_stacker_count: v9.number(),
546
- solo_stacker_count: v9.number()
647
+ var v10 = __toESM(require("valibot"), 1);
648
+ var signerSchema = v10.object({
649
+ signing_key: v10.string(),
650
+ signer_address: v10.string(),
651
+ weight: v10.number(),
652
+ stacked_amount: v10.string(),
653
+ weight_percent: v10.number(),
654
+ stacked_amount_percent: v10.number(),
655
+ pooled_stacker_count: v10.number(),
656
+ solo_stacker_count: v10.number()
547
657
  });
548
- var resultsSchema2 = v9.array(signerSchema);
549
- var signersResponseSchema = v9.object({
658
+ var resultsSchema2 = v10.array(signerSchema);
659
+ var signersResponseSchema = v10.object({
550
660
  ...baseListResponseSchema.entries,
551
661
  results: resultsSchema2
552
662
  });
@@ -585,7 +695,7 @@ async function signersInCycle(args) {
585
695
  }
586
696
  });
587
697
  }
588
- const validationResult = v9.safeParse(signersResponseSchema, data);
698
+ const validationResult = v10.safeParse(signersResponseSchema, data);
589
699
  if (!validationResult.success) {
590
700
  return error({
591
701
  name: "ValidateDataError",
@@ -597,15 +707,15 @@ async function signersInCycle(args) {
597
707
  }
598
708
 
599
709
  // src/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.ts
600
- var v10 = __toESM(require("valibot"), 1);
601
- var stackerInfoSchema = v10.object({
602
- stacker_address: v10.string(),
603
- stacked_amount: v10.string(),
604
- pox_address: v10.string(),
605
- stacker_type: v10.union([v10.literal("pooled"), v10.literal("solo")])
710
+ var v11 = __toESM(require("valibot"), 1);
711
+ var stackerInfoSchema = v11.object({
712
+ stacker_address: v11.string(),
713
+ stacked_amount: v11.string(),
714
+ pox_address: v11.string(),
715
+ stacker_type: v11.union([v11.literal("pooled"), v11.literal("solo")])
606
716
  });
607
- var resultsSchema3 = v10.array(stackerInfoSchema);
608
- var stackersForSignerInCycleResponseSchema = v10.object({
717
+ var resultsSchema3 = v11.array(stackerInfoSchema);
718
+ var stackersForSignerInCycleResponseSchema = v11.object({
609
719
  ...baseListResponseSchema.entries,
610
720
  results: resultsSchema3
611
721
  });
@@ -619,7 +729,8 @@ async function stackersForSignerInCycle(opts) {
619
729
  [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
620
730
  };
621
731
  }
622
- const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}/signers/${opts.signerPublicKey}/stackers?${search}`;
732
+ const signerPublicKeyPathParam = opts.signerPublicKey.startsWith("0x") ? opts.signerPublicKey : `0x${opts.signerPublicKey}`;
733
+ const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}/signers/${signerPublicKeyPathParam}/stackers?${search}`;
623
734
  const res = await fetch(endpoint, init);
624
735
  if (!res.ok) {
625
736
  return error({
@@ -641,7 +752,7 @@ async function stackersForSignerInCycle(opts) {
641
752
  data: jsonError
642
753
  });
643
754
  }
644
- const validationResult = v10.safeParse(
755
+ const validationResult = v11.safeParse(
645
756
  stackersForSignerInCycleResponseSchema,
646
757
  data
647
758
  );
@@ -655,58 +766,14 @@ async function stackersForSignerInCycle(opts) {
655
766
  return success(validationResult.output);
656
767
  }
657
768
 
658
- // src/stacks-api/smart-contracts/read-only.ts
659
- var v11 = __toESM(require("valibot"), 1);
660
- var readOnlyResponseSchema = v11.variant("okay", [
661
- v11.object({
662
- okay: v11.literal(true),
663
- result: v11.string()
664
- }),
665
- v11.object({
666
- okay: v11.literal(false),
667
- cause: v11.unknown()
668
- })
669
- ]);
670
- async function readOnly(args) {
671
- const init = { method: "POST" };
672
- if (args.apiKeyConfig) {
673
- init.headers = {
674
- [args.apiKeyConfig.header]: args.apiKeyConfig.key
675
- };
676
- }
677
- const res = await fetch(
678
- `${args.baseUrl}/v2/contracts/call-read/${args.contractAddress}/${args.contractName}/${args.functionName}`,
679
- init
680
- );
681
- if (!res.ok) {
682
- return error({
683
- name: "FetchReadOnlyError",
684
- message: "Failed to fetch.",
685
- data: {
686
- status: res.status,
687
- statusText: res.statusText,
688
- bodyParseResult: await safePromise(res.json())
689
- }
690
- });
691
- }
692
- const [jsonError, data] = await safePromise(res.json());
693
- if (jsonError) {
694
- return error({
695
- name: "ParseBodyError",
696
- message: "Failed to parse response body as JSON.",
697
- data: error
698
- });
699
- }
700
- const validationResult = v11.safeParse(readOnlyResponseSchema, data);
701
- if (!validationResult.success) {
702
- return error({
703
- name: "ValidateDataError",
704
- message: "Failed to validate data.",
705
- data: validationResult
706
- });
707
- }
708
- return success(validationResult.output);
709
- }
769
+ // src/stacks-api/proof-of-transfer/index.ts
770
+ var proofOfTransfer = {
771
+ cycle,
772
+ cycles,
773
+ signerInCycle,
774
+ signersInCycle,
775
+ stackersForSignerInCycle
776
+ };
710
777
 
711
778
  // src/stacks-api/stacking-pool/members.ts
712
779
  var v12 = __toESM(require("valibot"), 1);
@@ -724,22 +791,20 @@ var membersResponseSchema = v12.object({
724
791
  total: v12.number(),
725
792
  results: v12.array(memberSchema)
726
793
  });
727
- async function members(opts, apiOpts) {
794
+ async function members(args) {
728
795
  const search = new URLSearchParams();
729
- if (opts.afterBlock) search.append("after_block", opts.afterBlock.toString());
730
- if (opts.unanchored) search.append("unanchored", "true");
731
- if (opts.limit) search.append("limit", opts.limit.toString());
732
- if (opts.offset) search.append("offset", opts.offset.toString());
796
+ if (args.afterBlock) search.append("after_block", args.afterBlock.toString());
797
+ if (args.unanchored) search.append("unanchored", "true");
798
+ if (args.limit) search.append("limit", args.limit.toString());
799
+ if (args.offset) search.append("offset", args.offset.toString());
733
800
  const init = {};
734
- if (apiOpts.apiKeyConfig) {
801
+ if (args.apiKeyConfig) {
735
802
  init.headers = {
736
- [apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
803
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
737
804
  };
738
805
  }
739
- const res = await fetch(
740
- `${apiOpts.baseUrl}/extended/beta/stacking/${opts.poolPrincipal}/delegations?${search}`,
741
- init
742
- );
806
+ const endpoint = `${args.baseUrl}/extended/v1/pox4/${args.poolPrincipal}/delegations?${search}`;
807
+ const res = await fetch(endpoint, init);
743
808
  if (!res.ok) {
744
809
  return error({
745
810
  name: "FetchMembersError",
@@ -770,6 +835,11 @@ async function members(opts, apiOpts) {
770
835
  return success(validationResult.output);
771
836
  }
772
837
 
838
+ // src/stacks-api/stacking-pool/index.ts
839
+ var stackingPool = {
840
+ members
841
+ };
842
+
773
843
  // src/stacks-api/transactions/schemas.ts
774
844
  var v13 = __toESM(require("valibot"), 1);
775
845
  var baseTransactionSchema = v13.object({
@@ -973,20 +1043,156 @@ async function getTransaction(args) {
973
1043
  return success(validationResult.output);
974
1044
  }
975
1045
 
1046
+ // src/stacks-api/transactions/index.ts
1047
+ var transactions = {
1048
+ addressTransactions,
1049
+ getTransaction
1050
+ };
1051
+
976
1052
  // src/stacks-api/index.ts
977
- var accounts = { balances };
978
- var blocks = { getBlock };
979
- var info = { coreApi, poxDetails };
980
- var proofOfTransfer = {
981
- cycle,
982
- cycles,
983
- signerInCycle,
984
- signersInCycle,
985
- stackersForSignerInCycle
1053
+ var stacksApi = {
1054
+ accounts,
1055
+ blocks,
1056
+ faucets,
1057
+ info,
1058
+ proofOfTransfer,
1059
+ stackingPool,
1060
+ transactions
1061
+ };
1062
+
1063
+ // src/stacks-rpc-api/smart-contracts/map-entry.ts
1064
+ var v16 = __toESM(require("valibot"), 1);
1065
+ var mapEntryResponseSchema = v16.object({
1066
+ /**
1067
+ * Hex-encoded string of clarity value. It is always an optional tuple.
1068
+ */
1069
+ data: v16.string(),
1070
+ /**
1071
+ * Hex-encoded string of the MARF proof for the data
1072
+ */
1073
+ proof: v16.optional(v16.string())
1074
+ });
1075
+ async function mapEntry(args) {
1076
+ const search = new URLSearchParams();
1077
+ if (args.proof === 0) search.append("proof", "0");
1078
+ if (args.tip) search.append("tip", args.tip);
1079
+ const init = {};
1080
+ if (args.apiKeyConfig) {
1081
+ init.headers = {
1082
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
1083
+ };
1084
+ }
1085
+ init.method = "POST";
1086
+ init.body = JSON.stringify(
1087
+ args.mapKey.startsWith("0x") ? args.mapKey : `0x${args.mapKey}`
1088
+ );
1089
+ init.headers = { ...init.headers, "Content-Type": "application/json" };
1090
+ const endpoint = `${args.baseUrl}/v2/map_entry/${args.contractAddress}/${args.contractName}/${args.mapName}?${search}`;
1091
+ const res = await fetch(endpoint, init);
1092
+ if (!res.ok) {
1093
+ return error({
1094
+ name: "FetchMapEntryError",
1095
+ message: "Failed to fetch map entry.",
1096
+ data: {
1097
+ init,
1098
+ status: res.status,
1099
+ statusText: res.statusText,
1100
+ endpoint,
1101
+ bodyParseResult: await safePromise(res.text())
1102
+ }
1103
+ });
1104
+ }
1105
+ const [jsonError, data] = await safePromise(res.json());
1106
+ if (jsonError) {
1107
+ return error({
1108
+ name: "ParseBodyError",
1109
+ message: "Failed to parse response body as JSON.",
1110
+ data: jsonError
1111
+ });
1112
+ }
1113
+ const validationResult = v16.safeParse(mapEntryResponseSchema, data);
1114
+ if (!validationResult.success) {
1115
+ return error({
1116
+ name: "ValidateDataError",
1117
+ message: "Failed to validate response data.",
1118
+ data: validationResult
1119
+ });
1120
+ }
1121
+ return success(validationResult.output);
1122
+ }
1123
+
1124
+ // src/stacks-rpc-api/smart-contracts/read-only.ts
1125
+ var v17 = __toESM(require("valibot"), 1);
1126
+ var readOnlyResponseSchema = v17.variant("okay", [
1127
+ v17.object({
1128
+ okay: v17.literal(true),
1129
+ /**
1130
+ * A Clarity value as a hex-encoded string.
1131
+ */
1132
+ result: v17.string()
1133
+ }),
1134
+ v17.object({
1135
+ okay: v17.literal(false),
1136
+ cause: v17.unknown()
1137
+ })
1138
+ ]);
1139
+ async function readOnly(args) {
1140
+ const headers = {
1141
+ "Content-Type": "application/json"
1142
+ };
1143
+ if (args.apiKeyConfig) {
1144
+ headers[args.apiKeyConfig.header] = args.apiKeyConfig.key;
1145
+ }
1146
+ const init = {
1147
+ method: "POST",
1148
+ body: JSON.stringify({
1149
+ sender: args.sender,
1150
+ arguments: args.arguments
1151
+ }),
1152
+ headers
1153
+ };
1154
+ const endpoint = `${args.baseUrl}/v2/contracts/call-read/${args.contractAddress}/${args.contractName}/${args.functionName}`;
1155
+ const res = await fetch(endpoint, init);
1156
+ if (!res.ok) {
1157
+ return error({
1158
+ name: "FetchReadOnlyError",
1159
+ message: "Failed to fetch.",
1160
+ data: {
1161
+ status: res.status,
1162
+ statusText: res.statusText,
1163
+ bodyParseResult: await safePromise(res.json())
1164
+ }
1165
+ });
1166
+ }
1167
+ const [jsonError, data] = await safePromise(res.json());
1168
+ if (jsonError) {
1169
+ return error({
1170
+ name: "ParseBodyError",
1171
+ message: "Failed to parse response body as JSON.",
1172
+ data: error
1173
+ });
1174
+ }
1175
+ const validationResult = v17.safeParse(readOnlyResponseSchema, data);
1176
+ if (!validationResult.success) {
1177
+ return error({
1178
+ name: "ValidateDataError",
1179
+ message: "Failed to validate data.",
1180
+ data: validationResult
1181
+ });
1182
+ }
1183
+ return success(validationResult.output);
1184
+ }
1185
+
1186
+ // src/stacks-rpc-api/smart-contracts/index.ts
1187
+ var smartContracts = {
1188
+ mapEntry,
1189
+ readOnly
1190
+ };
1191
+
1192
+ // src/stacks-rpc-api/index.ts
1193
+ var stacksRpcApi = {
1194
+ smartContracts
986
1195
  };
987
- var smartContracts = { readOnly };
988
- var stackingPool = { members };
989
- var transactions = { addressTransactions, getTransaction };
990
1196
 
991
1197
  // src/utils/call-rate-limited-api.ts
992
1198
  var import_exponential_backoff = require("exponential-backoff");
@@ -1000,10 +1206,19 @@ function callRateLimitedApi(fn, options) {
1000
1206
  }
1001
1207
  async function safeCallRateLimitedApi(fn, options) {
1002
1208
  try {
1003
- return await (0, import_exponential_backoff.backOff)(() => fn(), {
1004
- startingDelay: options?.startingDelay ?? 15e3,
1005
- numOfAttempts: options?.numOfAttempts ?? 5
1006
- });
1209
+ return await (0, import_exponential_backoff.backOff)(
1210
+ async () => {
1211
+ const [error2, data] = await fn();
1212
+ if (error2) {
1213
+ throw error2;
1214
+ }
1215
+ return success(data);
1216
+ },
1217
+ {
1218
+ startingDelay: options?.startingDelay ?? 15e3,
1219
+ numOfAttempts: options?.numOfAttempts ?? 5
1220
+ }
1221
+ );
1007
1222
  } catch (error2) {
1008
1223
  return error({
1009
1224
  name: "MaxRetriesExceeded",
@@ -1015,23 +1230,74 @@ async function safeCallRateLimitedApi(fn, options) {
1015
1230
  }
1016
1231
  }
1017
1232
 
1018
- // src/index.ts
1019
- var stacksApi = {
1020
- accounts,
1021
- blocks,
1022
- info,
1023
- proofOfTransfer,
1024
- smartContracts,
1025
- stackingPool,
1026
- transactions
1233
+ // src/queries/get-signer-stacked-amount.ts
1234
+ async function getSignerStackedAmount(args) {
1235
+ let totalLocked = 0n;
1236
+ const { identifier, ...rest } = args;
1237
+ let hasMore = true;
1238
+ let offset = 0;
1239
+ let found = false;
1240
+ const limit = 200;
1241
+ while (hasMore && !found) {
1242
+ const [error2, data] = await safeCallRateLimitedApi(
1243
+ () => signersInCycle({
1244
+ ...rest,
1245
+ limit
1246
+ })
1247
+ );
1248
+ if (error2) {
1249
+ return error({
1250
+ name: "GetSignerTotalLockedError",
1251
+ message: "Failed to get signer total locked.",
1252
+ data: {
1253
+ error: error2
1254
+ }
1255
+ });
1256
+ }
1257
+ for (const signer of data.results) {
1258
+ if (identifier.type === "address") {
1259
+ if (signer.signer_address === identifier.signerAddress) {
1260
+ totalLocked = BigInt(signer.stacked_amount);
1261
+ found = true;
1262
+ break;
1263
+ }
1264
+ } else {
1265
+ if (signer.signing_key === identifier.signerPublicKey) {
1266
+ totalLocked = BigInt(signer.stacked_amount);
1267
+ found = true;
1268
+ break;
1269
+ }
1270
+ }
1271
+ }
1272
+ offset += data.results.length;
1273
+ hasMore = offset < data.total;
1274
+ }
1275
+ if (!found) {
1276
+ return error({
1277
+ name: "SignerNotFound",
1278
+ message: "Signer not found.",
1279
+ data: {
1280
+ identifier,
1281
+ cycle: args.cycleNumber
1282
+ }
1283
+ });
1284
+ }
1285
+ return success(totalLocked);
1286
+ }
1287
+
1288
+ // src/queries/index.ts
1289
+ var queries = {
1290
+ getSignerStackedAmount
1027
1291
  };
1028
1292
  // Annotate the CommonJS export names for ESM import in node:
1029
1293
  0 && (module.exports = {
1030
1294
  callRateLimitedApi,
1031
1295
  error,
1296
+ queries,
1032
1297
  safeCall,
1033
1298
  safeCallRateLimitedApi,
1034
1299
  safePromise,
1035
1300
  stacksApi,
1301
+ stacksRpcApi,
1036
1302
  success
1037
1303
  });