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