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