@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 +502 -236
- package/dist/index.d.cts +225 -125
- package/dist/index.d.ts +225 -125
- package/dist/index.js +500 -236
- package/package.json +1 -1
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/
|
|
149
|
+
// src/stacks-api/accounts/latest-nonce.ts
|
|
148
150
|
var v2 = __toESM(require("valibot"), 1);
|
|
149
|
-
var
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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/
|
|
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
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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 =
|
|
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
|
|
222
|
-
var CoreApiResponseSchema =
|
|
223
|
-
peer_version:
|
|
224
|
-
pox_consensus:
|
|
225
|
-
burn_block_height:
|
|
226
|
-
stable_pox_consensus:
|
|
227
|
-
stable_burn_block_height:
|
|
228
|
-
server_version:
|
|
229
|
-
network_id:
|
|
230
|
-
parent_network_id:
|
|
231
|
-
stacks_tip_height:
|
|
232
|
-
stacks_tip:
|
|
233
|
-
stacks_tip_consensus_hash:
|
|
234
|
-
unanchored_tip:
|
|
235
|
-
|
|
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 =
|
|
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
|
|
277
|
-
var poxDetailsResponseSchema =
|
|
278
|
-
contract_id:
|
|
279
|
-
pox_activation_threshold_ustx:
|
|
280
|
-
first_burnchain_block_height:
|
|
281
|
-
current_burnchain_block_height:
|
|
282
|
-
prepare_phase_block_length:
|
|
283
|
-
reward_phase_block_length:
|
|
284
|
-
reward_slots:
|
|
285
|
-
rejection_fraction:
|
|
286
|
-
total_liquid_supply_ustx:
|
|
287
|
-
current_cycle:
|
|
288
|
-
id:
|
|
289
|
-
min_threshold_ustx:
|
|
290
|
-
stacked_ustx:
|
|
291
|
-
is_pox_active:
|
|
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:
|
|
294
|
-
id:
|
|
295
|
-
min_threshold_ustx:
|
|
296
|
-
min_increment_ustx:
|
|
297
|
-
stacked_ustx:
|
|
298
|
-
prepare_phase_start_block_height:
|
|
299
|
-
blocks_until_prepare_phase:
|
|
300
|
-
reward_phase_start_block_height:
|
|
301
|
-
blocks_until_reward_phase:
|
|
302
|
-
ustx_until_pox_rejection:
|
|
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:
|
|
305
|
-
|
|
306
|
-
epoch_id:
|
|
307
|
-
start_height:
|
|
308
|
-
end_height:
|
|
309
|
-
block_limit:
|
|
310
|
-
write_length:
|
|
311
|
-
write_count:
|
|
312
|
-
read_length:
|
|
313
|
-
read_count:
|
|
314
|
-
runtime:
|
|
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:
|
|
420
|
+
network_epoch: v6.number()
|
|
317
421
|
})
|
|
318
422
|
),
|
|
319
|
-
min_amount_ustx:
|
|
320
|
-
prepare_cycle_length:
|
|
321
|
-
reward_cycle_id:
|
|
322
|
-
reward_cycle_length:
|
|
323
|
-
rejection_votes_left_required:
|
|
324
|
-
next_reward_cycle_in:
|
|
325
|
-
contract_versions:
|
|
326
|
-
|
|
327
|
-
contract_id:
|
|
328
|
-
activation_burnchain_block_height:
|
|
329
|
-
first_reward_cycle_id:
|
|
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 =
|
|
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
|
|
373
|
-
var
|
|
374
|
-
block_height:
|
|
375
|
-
index_block_hash:
|
|
376
|
-
cycle_number:
|
|
377
|
-
total_weight:
|
|
378
|
-
total_stacked_amount:
|
|
379
|
-
total_signers:
|
|
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 =
|
|
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
|
|
423
|
-
var cycleInfoSchema =
|
|
424
|
-
block_height:
|
|
425
|
-
index_block_hash:
|
|
426
|
-
cycle_number:
|
|
427
|
-
total_weight:
|
|
428
|
-
total_stacked_amount:
|
|
429
|
-
total_signers:
|
|
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 =
|
|
432
|
-
var cyclesResponseSchema =
|
|
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 =
|
|
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
|
|
481
|
-
var signerInCycleResponseSchema =
|
|
482
|
-
signing_key:
|
|
483
|
-
signer_address:
|
|
484
|
-
weight:
|
|
485
|
-
stacked_amount:
|
|
486
|
-
weight_percent:
|
|
487
|
-
stacked_amount_percent:
|
|
488
|
-
solo_stacker_count:
|
|
489
|
-
pooled_stacker_count:
|
|
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 =
|
|
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
|
|
538
|
-
var signerSchema =
|
|
539
|
-
signing_key:
|
|
540
|
-
signer_address:
|
|
541
|
-
weight:
|
|
542
|
-
stacked_amount:
|
|
543
|
-
weight_percent:
|
|
544
|
-
stacked_amount_percent:
|
|
545
|
-
pooled_stacker_count:
|
|
546
|
-
solo_stacker_count:
|
|
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 =
|
|
549
|
-
var signersResponseSchema =
|
|
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 =
|
|
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
|
|
601
|
-
var stackerInfoSchema =
|
|
602
|
-
stacker_address:
|
|
603
|
-
stacked_amount:
|
|
604
|
-
pox_address:
|
|
605
|
-
stacker_type:
|
|
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 =
|
|
608
|
-
var stackersForSignerInCycleResponseSchema =
|
|
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
|
|
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 =
|
|
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/
|
|
659
|
-
var
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
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(
|
|
794
|
+
async function members(args) {
|
|
728
795
|
const search = new URLSearchParams();
|
|
729
|
-
if (
|
|
730
|
-
if (
|
|
731
|
-
if (
|
|
732
|
-
if (
|
|
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 (
|
|
801
|
+
if (args.apiKeyConfig) {
|
|
735
802
|
init.headers = {
|
|
736
|
-
[
|
|
803
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
737
804
|
};
|
|
738
805
|
}
|
|
739
|
-
const
|
|
740
|
-
|
|
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
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
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)(
|
|
1004
|
-
|
|
1005
|
-
|
|
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/
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
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
|
});
|