@secretkeylabs/stacks-tools 0.4.0 → 0.5.0-5d800c5
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 +679 -428
- package/dist/index.d.cts +523 -221
- package/dist/index.d.ts +523 -221
- package/dist/index.js +687 -428
- package/package.json +5 -3
package/dist/index.js
CHANGED
|
@@ -29,37 +29,6 @@ function safeCall(fn) {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
// src/stacks-api/accounts/balances.ts
|
|
32
|
-
import * as v from "valibot";
|
|
33
|
-
var responseSchema = v.object({
|
|
34
|
-
stx: v.object({
|
|
35
|
-
balance: v.string(),
|
|
36
|
-
total_sent: v.string(),
|
|
37
|
-
total_received: v.string(),
|
|
38
|
-
total_fees_sent: v.string(),
|
|
39
|
-
total_miner_rewards_received: v.string(),
|
|
40
|
-
lock_tx_id: v.string(),
|
|
41
|
-
locked: v.string(),
|
|
42
|
-
lock_height: v.number(),
|
|
43
|
-
burnchain_lock_height: v.number(),
|
|
44
|
-
burnchain_unlock_height: v.number()
|
|
45
|
-
}),
|
|
46
|
-
fungible_tokens: v.record(
|
|
47
|
-
v.string(),
|
|
48
|
-
v.object({
|
|
49
|
-
balance: v.string(),
|
|
50
|
-
total_sent: v.string(),
|
|
51
|
-
total_received: v.string()
|
|
52
|
-
})
|
|
53
|
-
),
|
|
54
|
-
non_fungible_tokens: v.record(
|
|
55
|
-
v.string(),
|
|
56
|
-
v.object({
|
|
57
|
-
count: v.string(),
|
|
58
|
-
total_sent: v.string(),
|
|
59
|
-
total_received: v.string()
|
|
60
|
-
})
|
|
61
|
-
)
|
|
62
|
-
});
|
|
63
32
|
async function balances(opts) {
|
|
64
33
|
const search = new URLSearchParams();
|
|
65
34
|
if (opts.unanchored) search.append("unanchored", "true");
|
|
@@ -91,25 +60,17 @@ async function balances(opts) {
|
|
|
91
60
|
data: jsonError
|
|
92
61
|
});
|
|
93
62
|
}
|
|
94
|
-
|
|
95
|
-
if (!validationResult.success) {
|
|
96
|
-
return error({
|
|
97
|
-
name: "ValidateDataError",
|
|
98
|
-
message: "Failed to validate data.",
|
|
99
|
-
data: validationResult
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return success(validationResult.output);
|
|
63
|
+
return success(data);
|
|
103
64
|
}
|
|
104
65
|
|
|
105
66
|
// src/stacks-api/accounts/latest-nonce.ts
|
|
106
|
-
import * as
|
|
107
|
-
var
|
|
108
|
-
last_mempool_tx_nonce:
|
|
109
|
-
last_executed_tx_nonce:
|
|
110
|
-
possible_next_nonce:
|
|
111
|
-
detected_missing_nonces:
|
|
112
|
-
detected_mempool_nonces:
|
|
67
|
+
import * as v from "valibot";
|
|
68
|
+
var responseSchema = v.object({
|
|
69
|
+
last_mempool_tx_nonce: v.nullable(v.number()),
|
|
70
|
+
last_executed_tx_nonce: v.nullable(v.number()),
|
|
71
|
+
possible_next_nonce: v.number(),
|
|
72
|
+
detected_missing_nonces: v.array(v.number()),
|
|
73
|
+
detected_mempool_nonces: v.array(v.number())
|
|
113
74
|
});
|
|
114
75
|
async function latestNonce(opts) {
|
|
115
76
|
const init = {};
|
|
@@ -140,7 +101,7 @@ async function latestNonce(opts) {
|
|
|
140
101
|
data: jsonError
|
|
141
102
|
});
|
|
142
103
|
}
|
|
143
|
-
const validationResult =
|
|
104
|
+
const validationResult = v.safeParse(responseSchema, data);
|
|
144
105
|
if (!validationResult.success) {
|
|
145
106
|
return error({
|
|
146
107
|
name: "ValidateDataError",
|
|
@@ -151,37 +112,43 @@ async function latestNonce(opts) {
|
|
|
151
112
|
return success(validationResult.output);
|
|
152
113
|
}
|
|
153
114
|
|
|
115
|
+
// src/stacks-api/accounts/index.ts
|
|
116
|
+
var accounts = {
|
|
117
|
+
balances,
|
|
118
|
+
latestNonce
|
|
119
|
+
};
|
|
120
|
+
|
|
154
121
|
// src/stacks-api/types.ts
|
|
155
|
-
import * as
|
|
156
|
-
var baseListResponseSchema =
|
|
157
|
-
limit:
|
|
158
|
-
offset:
|
|
159
|
-
total:
|
|
160
|
-
results:
|
|
122
|
+
import * as v2 from "valibot";
|
|
123
|
+
var baseListResponseSchema = v2.object({
|
|
124
|
+
limit: v2.number(),
|
|
125
|
+
offset: v2.number(),
|
|
126
|
+
total: v2.number(),
|
|
127
|
+
results: v2.array(v2.unknown())
|
|
161
128
|
});
|
|
162
129
|
|
|
163
130
|
// src/stacks-api/blocks/get-block.ts
|
|
164
|
-
import * as
|
|
165
|
-
var
|
|
166
|
-
canonical:
|
|
167
|
-
height:
|
|
168
|
-
hash:
|
|
169
|
-
block_time:
|
|
170
|
-
block_time_iso:
|
|
171
|
-
index_block_hash:
|
|
172
|
-
parent_block_hash:
|
|
173
|
-
parent_index_block_hash:
|
|
174
|
-
burn_block_time:
|
|
175
|
-
burn_block_time_iso:
|
|
176
|
-
burn_block_hash:
|
|
177
|
-
burn_block_height:
|
|
178
|
-
miner_txid:
|
|
179
|
-
tx_count:
|
|
180
|
-
execution_cost_read_count:
|
|
181
|
-
execution_cost_read_length:
|
|
182
|
-
execution_cost_runtime:
|
|
183
|
-
execution_cost_write_count:
|
|
184
|
-
execution_cost_write_length:
|
|
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()
|
|
185
152
|
});
|
|
186
153
|
async function getBlock(opts) {
|
|
187
154
|
const init = {};
|
|
@@ -213,7 +180,7 @@ async function getBlock(opts) {
|
|
|
213
180
|
data: jsonError
|
|
214
181
|
});
|
|
215
182
|
}
|
|
216
|
-
const validationResult =
|
|
183
|
+
const validationResult = v3.safeParse(responseSchema2, data);
|
|
217
184
|
if (!validationResult.success) {
|
|
218
185
|
return error({
|
|
219
186
|
name: "ValidateDataError",
|
|
@@ -224,36 +191,29 @@ async function getBlock(opts) {
|
|
|
224
191
|
return success(validationResult.output);
|
|
225
192
|
}
|
|
226
193
|
|
|
227
|
-
// src/stacks-api/
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
parent_network_id: v5.number(),
|
|
238
|
-
stacks_tip_height: v5.number(),
|
|
239
|
-
stacks_tip: v5.string(),
|
|
240
|
-
stacks_tip_consensus_hash: v5.string(),
|
|
241
|
-
unanchored_tip: v5.nullable(v5.string()),
|
|
242
|
-
unanchored_seq: v5.nullable(v5.string()),
|
|
243
|
-
exit_at_block_height: v5.nullable(v5.number())
|
|
244
|
-
});
|
|
245
|
-
async function coreApi(apiOpts) {
|
|
194
|
+
// src/stacks-api/blocks/index.ts
|
|
195
|
+
var blocks = {
|
|
196
|
+
getBlock
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// src/stacks-api/faucets/stx.ts
|
|
200
|
+
async function stx(opts) {
|
|
201
|
+
const search = new URLSearchParams();
|
|
202
|
+
search.append("address", opts.address);
|
|
203
|
+
if (opts.stacking) search.append("stacking", "true");
|
|
246
204
|
const init = {};
|
|
247
|
-
if (
|
|
205
|
+
if (opts.apiKeyConfig) {
|
|
248
206
|
init.headers = {
|
|
249
|
-
[
|
|
207
|
+
[opts.apiKeyConfig.header]: opts.apiKeyConfig.key
|
|
250
208
|
};
|
|
251
209
|
}
|
|
252
|
-
|
|
210
|
+
init.method = "POST";
|
|
211
|
+
const endpoint = `${opts.baseUrl}/extended/v1/faucets/stx?${search}`;
|
|
212
|
+
const res = await fetch(endpoint, init);
|
|
253
213
|
if (!res.ok) {
|
|
254
214
|
return error({
|
|
255
|
-
name: "
|
|
256
|
-
message: "Failed to fetch.",
|
|
215
|
+
name: "FetchStxError",
|
|
216
|
+
message: "Failed to fetch STX.",
|
|
257
217
|
data: {
|
|
258
218
|
status: res.status,
|
|
259
219
|
statusText: res.statusText,
|
|
@@ -261,95 +221,52 @@ async function coreApi(apiOpts) {
|
|
|
261
221
|
}
|
|
262
222
|
});
|
|
263
223
|
}
|
|
264
|
-
const [
|
|
265
|
-
if (
|
|
224
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
225
|
+
if (jsonError) {
|
|
266
226
|
return error({
|
|
267
227
|
name: "ParseBodyError",
|
|
268
228
|
message: "Failed to parse response body as JSON.",
|
|
269
|
-
data:
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
const validationResult = v5.safeParse(CoreApiResponseSchema, data);
|
|
273
|
-
if (!validationResult.success) {
|
|
274
|
-
return error({
|
|
275
|
-
name: "ValidateDataError",
|
|
276
|
-
message: "Failed to validate data.",
|
|
277
|
-
data: validationResult
|
|
229
|
+
data: jsonError
|
|
278
230
|
});
|
|
279
231
|
}
|
|
280
|
-
return success(
|
|
232
|
+
return success(data);
|
|
281
233
|
}
|
|
282
234
|
|
|
283
|
-
// src/stacks-api/
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
stacked_ustx: v6.number(),
|
|
306
|
-
prepare_phase_start_block_height: v6.number(),
|
|
307
|
-
blocks_until_prepare_phase: v6.number(),
|
|
308
|
-
reward_phase_start_block_height: v6.number(),
|
|
309
|
-
blocks_until_reward_phase: v6.number(),
|
|
310
|
-
ustx_until_pox_rejection: v6.null()
|
|
311
|
-
}),
|
|
312
|
-
epochs: v6.array(
|
|
313
|
-
v6.object({
|
|
314
|
-
epoch_id: v6.string(),
|
|
315
|
-
start_height: v6.number(),
|
|
316
|
-
end_height: v6.number(),
|
|
317
|
-
block_limit: v6.object({
|
|
318
|
-
write_length: v6.number(),
|
|
319
|
-
write_count: v6.number(),
|
|
320
|
-
read_length: v6.number(),
|
|
321
|
-
read_count: v6.number(),
|
|
322
|
-
runtime: v6.number()
|
|
323
|
-
}),
|
|
324
|
-
network_epoch: v6.number()
|
|
325
|
-
})
|
|
326
|
-
),
|
|
327
|
-
min_amount_ustx: v6.number(),
|
|
328
|
-
prepare_cycle_length: v6.number(),
|
|
329
|
-
reward_cycle_id: v6.number(),
|
|
330
|
-
reward_cycle_length: v6.number(),
|
|
331
|
-
rejection_votes_left_required: v6.null(),
|
|
332
|
-
next_reward_cycle_in: v6.number(),
|
|
333
|
-
contract_versions: v6.array(
|
|
334
|
-
v6.object({
|
|
335
|
-
contract_id: v6.string(),
|
|
336
|
-
activation_burnchain_block_height: v6.number(),
|
|
337
|
-
first_reward_cycle_id: v6.number()
|
|
338
|
-
})
|
|
339
|
-
)
|
|
235
|
+
// src/stacks-api/faucets/index.ts
|
|
236
|
+
var faucets = {
|
|
237
|
+
stx
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
// src/stacks-api/info/core-api.ts
|
|
241
|
+
import * as v4 from "valibot";
|
|
242
|
+
var CoreApiResponseSchema = v4.object({
|
|
243
|
+
peer_version: v4.number(),
|
|
244
|
+
pox_consensus: v4.string(),
|
|
245
|
+
burn_block_height: v4.number(),
|
|
246
|
+
stable_pox_consensus: v4.string(),
|
|
247
|
+
stable_burn_block_height: v4.number(),
|
|
248
|
+
server_version: v4.string(),
|
|
249
|
+
network_id: v4.number(),
|
|
250
|
+
parent_network_id: v4.number(),
|
|
251
|
+
stacks_tip_height: v4.number(),
|
|
252
|
+
stacks_tip: v4.string(),
|
|
253
|
+
stacks_tip_consensus_hash: v4.string(),
|
|
254
|
+
unanchored_tip: v4.nullable(v4.string()),
|
|
255
|
+
unanchored_seq: v4.nullable(v4.string()),
|
|
256
|
+
exit_at_block_height: v4.nullable(v4.number())
|
|
340
257
|
});
|
|
341
|
-
async function
|
|
258
|
+
async function coreApi(apiOpts) {
|
|
342
259
|
const init = {};
|
|
343
|
-
if (
|
|
260
|
+
if (apiOpts.apiKeyConfig) {
|
|
344
261
|
init.headers = {
|
|
345
|
-
[
|
|
262
|
+
[apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
|
|
346
263
|
};
|
|
347
264
|
}
|
|
348
|
-
const res = await fetch(`${
|
|
265
|
+
const res = await fetch(`${apiOpts.baseUrl}/v2/info`, init);
|
|
349
266
|
if (!res.ok) {
|
|
350
267
|
return error({
|
|
351
|
-
name: "
|
|
352
|
-
message: "Failed to fetch
|
|
268
|
+
name: "FetchCoreApiError",
|
|
269
|
+
message: "Failed to fetch.",
|
|
353
270
|
data: {
|
|
354
271
|
status: res.status,
|
|
355
272
|
statusText: res.statusText,
|
|
@@ -357,34 +274,39 @@ async function poxDetails(args) {
|
|
|
357
274
|
}
|
|
358
275
|
});
|
|
359
276
|
}
|
|
360
|
-
const [
|
|
361
|
-
if (
|
|
277
|
+
const [parseBodyError, data] = await safePromise(res.json());
|
|
278
|
+
if (parseBodyError) {
|
|
362
279
|
return error({
|
|
363
280
|
name: "ParseBodyError",
|
|
364
|
-
message: "Failed to parse
|
|
365
|
-
data:
|
|
281
|
+
message: "Failed to parse response body as JSON.",
|
|
282
|
+
data: parseBodyError
|
|
366
283
|
});
|
|
367
284
|
}
|
|
368
|
-
const validationResult =
|
|
285
|
+
const validationResult = v4.safeParse(CoreApiResponseSchema, data);
|
|
369
286
|
if (!validationResult.success) {
|
|
370
287
|
return error({
|
|
371
288
|
name: "ValidateDataError",
|
|
372
|
-
message: "Failed to
|
|
289
|
+
message: "Failed to validate data.",
|
|
373
290
|
data: validationResult
|
|
374
291
|
});
|
|
375
292
|
}
|
|
376
293
|
return success(validationResult.output);
|
|
377
294
|
}
|
|
378
295
|
|
|
296
|
+
// src/stacks-api/info/index.ts
|
|
297
|
+
var info = {
|
|
298
|
+
coreApi
|
|
299
|
+
};
|
|
300
|
+
|
|
379
301
|
// src/stacks-api/proof-of-transfer/cycle.ts
|
|
380
|
-
import * as
|
|
381
|
-
var
|
|
382
|
-
block_height:
|
|
383
|
-
index_block_hash:
|
|
384
|
-
cycle_number:
|
|
385
|
-
total_weight:
|
|
386
|
-
total_stacked_amount:
|
|
387
|
-
total_signers:
|
|
302
|
+
import * as v5 from "valibot";
|
|
303
|
+
var responseSchema3 = v5.object({
|
|
304
|
+
block_height: v5.number(),
|
|
305
|
+
index_block_hash: v5.string(),
|
|
306
|
+
cycle_number: v5.number(),
|
|
307
|
+
total_weight: v5.number(),
|
|
308
|
+
total_stacked_amount: v5.string(),
|
|
309
|
+
total_signers: v5.number()
|
|
388
310
|
});
|
|
389
311
|
async function cycle(opts) {
|
|
390
312
|
const init = {};
|
|
@@ -415,7 +337,7 @@ async function cycle(opts) {
|
|
|
415
337
|
data: jsonError
|
|
416
338
|
});
|
|
417
339
|
}
|
|
418
|
-
const validationResult =
|
|
340
|
+
const validationResult = v5.safeParse(responseSchema3, data);
|
|
419
341
|
if (!validationResult.success) {
|
|
420
342
|
return error({
|
|
421
343
|
name: "ValidateDataError",
|
|
@@ -427,17 +349,17 @@ async function cycle(opts) {
|
|
|
427
349
|
}
|
|
428
350
|
|
|
429
351
|
// src/stacks-api/proof-of-transfer/cycles.ts
|
|
430
|
-
import * as
|
|
431
|
-
var cycleInfoSchema =
|
|
432
|
-
block_height:
|
|
433
|
-
index_block_hash:
|
|
434
|
-
cycle_number:
|
|
435
|
-
total_weight:
|
|
436
|
-
total_stacked_amount:
|
|
437
|
-
total_signers:
|
|
352
|
+
import * as v6 from "valibot";
|
|
353
|
+
var cycleInfoSchema = v6.object({
|
|
354
|
+
block_height: v6.number(),
|
|
355
|
+
index_block_hash: v6.string(),
|
|
356
|
+
cycle_number: v6.number(),
|
|
357
|
+
total_weight: v6.number(),
|
|
358
|
+
total_stacked_amount: v6.string(),
|
|
359
|
+
total_signers: v6.number()
|
|
438
360
|
});
|
|
439
|
-
var resultsSchema =
|
|
440
|
-
var cyclesResponseSchema =
|
|
361
|
+
var resultsSchema = v6.array(cycleInfoSchema);
|
|
362
|
+
var cyclesResponseSchema = v6.object({
|
|
441
363
|
...baseListResponseSchema.entries,
|
|
442
364
|
results: resultsSchema
|
|
443
365
|
});
|
|
@@ -473,7 +395,7 @@ async function cycles(args) {
|
|
|
473
395
|
data: jsonError
|
|
474
396
|
});
|
|
475
397
|
}
|
|
476
|
-
const validationResult =
|
|
398
|
+
const validationResult = v6.safeParse(cyclesResponseSchema, data);
|
|
477
399
|
if (!validationResult.success) {
|
|
478
400
|
return error({
|
|
479
401
|
name: "ValidateDataError",
|
|
@@ -485,16 +407,16 @@ async function cycles(args) {
|
|
|
485
407
|
}
|
|
486
408
|
|
|
487
409
|
// src/stacks-api/proof-of-transfer/signer-in-cycle.ts
|
|
488
|
-
import * as
|
|
489
|
-
var signerInCycleResponseSchema =
|
|
490
|
-
signing_key:
|
|
491
|
-
signer_address:
|
|
492
|
-
weight:
|
|
493
|
-
stacked_amount:
|
|
494
|
-
weight_percent:
|
|
495
|
-
stacked_amount_percent:
|
|
496
|
-
solo_stacker_count:
|
|
497
|
-
pooled_stacker_count:
|
|
410
|
+
import * as v7 from "valibot";
|
|
411
|
+
var signerInCycleResponseSchema = v7.object({
|
|
412
|
+
signing_key: v7.string(),
|
|
413
|
+
signer_address: v7.string(),
|
|
414
|
+
weight: v7.number(),
|
|
415
|
+
stacked_amount: v7.string(),
|
|
416
|
+
weight_percent: v7.number(),
|
|
417
|
+
stacked_amount_percent: v7.number(),
|
|
418
|
+
solo_stacker_count: v7.number(),
|
|
419
|
+
pooled_stacker_count: v7.number()
|
|
498
420
|
});
|
|
499
421
|
async function signerInCycle(args) {
|
|
500
422
|
const init = {};
|
|
@@ -530,7 +452,7 @@ async function signerInCycle(args) {
|
|
|
530
452
|
}
|
|
531
453
|
});
|
|
532
454
|
}
|
|
533
|
-
const validationResult =
|
|
455
|
+
const validationResult = v7.safeParse(signerInCycleResponseSchema, data);
|
|
534
456
|
if (!validationResult.success) {
|
|
535
457
|
return error({
|
|
536
458
|
name: "ValidateDataError",
|
|
@@ -542,19 +464,19 @@ async function signerInCycle(args) {
|
|
|
542
464
|
}
|
|
543
465
|
|
|
544
466
|
// src/stacks-api/proof-of-transfer/signers-in-cycle.ts
|
|
545
|
-
import * as
|
|
546
|
-
var signerSchema =
|
|
547
|
-
signing_key:
|
|
548
|
-
signer_address:
|
|
549
|
-
weight:
|
|
550
|
-
stacked_amount:
|
|
551
|
-
weight_percent:
|
|
552
|
-
stacked_amount_percent:
|
|
553
|
-
pooled_stacker_count:
|
|
554
|
-
solo_stacker_count:
|
|
467
|
+
import * as v8 from "valibot";
|
|
468
|
+
var signerSchema = v8.object({
|
|
469
|
+
signing_key: v8.string(),
|
|
470
|
+
signer_address: v8.string(),
|
|
471
|
+
weight: v8.number(),
|
|
472
|
+
stacked_amount: v8.string(),
|
|
473
|
+
weight_percent: v8.number(),
|
|
474
|
+
stacked_amount_percent: v8.number(),
|
|
475
|
+
pooled_stacker_count: v8.number(),
|
|
476
|
+
solo_stacker_count: v8.number()
|
|
555
477
|
});
|
|
556
|
-
var resultsSchema2 =
|
|
557
|
-
var signersResponseSchema =
|
|
478
|
+
var resultsSchema2 = v8.array(signerSchema);
|
|
479
|
+
var signersResponseSchema = v8.object({
|
|
558
480
|
...baseListResponseSchema.entries,
|
|
559
481
|
results: resultsSchema2
|
|
560
482
|
});
|
|
@@ -593,7 +515,7 @@ async function signersInCycle(args) {
|
|
|
593
515
|
}
|
|
594
516
|
});
|
|
595
517
|
}
|
|
596
|
-
const validationResult =
|
|
518
|
+
const validationResult = v8.safeParse(signersResponseSchema, data);
|
|
597
519
|
if (!validationResult.success) {
|
|
598
520
|
return error({
|
|
599
521
|
name: "ValidateDataError",
|
|
@@ -605,15 +527,15 @@ async function signersInCycle(args) {
|
|
|
605
527
|
}
|
|
606
528
|
|
|
607
529
|
// src/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.ts
|
|
608
|
-
import * as
|
|
609
|
-
var stackerInfoSchema =
|
|
610
|
-
stacker_address:
|
|
611
|
-
stacked_amount:
|
|
612
|
-
pox_address:
|
|
613
|
-
stacker_type:
|
|
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")])
|
|
614
536
|
});
|
|
615
|
-
var resultsSchema3 =
|
|
616
|
-
var stackersForSignerInCycleResponseSchema =
|
|
537
|
+
var resultsSchema3 = v9.array(stackerInfoSchema);
|
|
538
|
+
var stackersForSignerInCycleResponseSchema = v9.object({
|
|
617
539
|
...baseListResponseSchema.entries,
|
|
618
540
|
results: resultsSchema3
|
|
619
541
|
});
|
|
@@ -650,7 +572,7 @@ async function stackersForSignerInCycle(opts) {
|
|
|
650
572
|
data: jsonError
|
|
651
573
|
});
|
|
652
574
|
}
|
|
653
|
-
const validationResult =
|
|
575
|
+
const validationResult = v9.safeParse(
|
|
654
576
|
stackersForSignerInCycleResponseSchema,
|
|
655
577
|
data
|
|
656
578
|
);
|
|
@@ -664,100 +586,45 @@ async function stackersForSignerInCycle(opts) {
|
|
|
664
586
|
return success(validationResult.output);
|
|
665
587
|
}
|
|
666
588
|
|
|
667
|
-
// src/stacks-api/
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
result: v12.string()
|
|
676
|
-
}),
|
|
677
|
-
v12.object({
|
|
678
|
-
okay: v12.literal(false),
|
|
679
|
-
cause: v12.unknown()
|
|
680
|
-
})
|
|
681
|
-
]);
|
|
682
|
-
async function readOnly(args) {
|
|
683
|
-
const headers = {
|
|
684
|
-
"Content-Type": "application/json"
|
|
685
|
-
};
|
|
686
|
-
if (args.apiKeyConfig) {
|
|
687
|
-
headers[args.apiKeyConfig.header] = args.apiKeyConfig.key;
|
|
688
|
-
}
|
|
689
|
-
const init = {
|
|
690
|
-
method: "POST",
|
|
691
|
-
body: JSON.stringify({
|
|
692
|
-
sender: args.sender,
|
|
693
|
-
arguments: args.arguments
|
|
694
|
-
}),
|
|
695
|
-
headers
|
|
696
|
-
};
|
|
697
|
-
const endpoint = `${args.baseUrl}/v2/contracts/call-read/${args.contractAddress}/${args.contractName}/${args.functionName}`;
|
|
698
|
-
const res = await fetch(endpoint, init);
|
|
699
|
-
if (!res.ok) {
|
|
700
|
-
return error({
|
|
701
|
-
name: "FetchReadOnlyError",
|
|
702
|
-
message: "Failed to fetch.",
|
|
703
|
-
data: {
|
|
704
|
-
status: res.status,
|
|
705
|
-
statusText: res.statusText,
|
|
706
|
-
bodyParseResult: await safePromise(res.json())
|
|
707
|
-
}
|
|
708
|
-
});
|
|
709
|
-
}
|
|
710
|
-
const [jsonError, data] = await safePromise(res.json());
|
|
711
|
-
if (jsonError) {
|
|
712
|
-
return error({
|
|
713
|
-
name: "ParseBodyError",
|
|
714
|
-
message: "Failed to parse response body as JSON.",
|
|
715
|
-
data: error
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
|
-
const validationResult = v12.safeParse(readOnlyResponseSchema, data);
|
|
719
|
-
if (!validationResult.success) {
|
|
720
|
-
return error({
|
|
721
|
-
name: "ValidateDataError",
|
|
722
|
-
message: "Failed to validate data.",
|
|
723
|
-
data: validationResult
|
|
724
|
-
});
|
|
725
|
-
}
|
|
726
|
-
return success(validationResult.output);
|
|
727
|
-
}
|
|
589
|
+
// src/stacks-api/proof-of-transfer/index.ts
|
|
590
|
+
var proofOfTransfer = {
|
|
591
|
+
cycle,
|
|
592
|
+
cycles,
|
|
593
|
+
signerInCycle,
|
|
594
|
+
signersInCycle,
|
|
595
|
+
stackersForSignerInCycle
|
|
596
|
+
};
|
|
728
597
|
|
|
729
598
|
// src/stacks-api/stacking-pool/members.ts
|
|
730
|
-
import * as
|
|
731
|
-
var memberSchema =
|
|
732
|
-
stacker:
|
|
733
|
-
pox_addr:
|
|
734
|
-
amount_ustx:
|
|
735
|
-
burn_block_unlock_height:
|
|
736
|
-
block_height:
|
|
737
|
-
tx_id:
|
|
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()
|
|
738
607
|
});
|
|
739
|
-
var membersResponseSchema =
|
|
740
|
-
limit:
|
|
741
|
-
offset:
|
|
742
|
-
total:
|
|
743
|
-
results:
|
|
608
|
+
var membersResponseSchema = v10.object({
|
|
609
|
+
limit: v10.number(),
|
|
610
|
+
offset: v10.number(),
|
|
611
|
+
total: v10.number(),
|
|
612
|
+
results: v10.array(memberSchema)
|
|
744
613
|
});
|
|
745
|
-
async function members(
|
|
614
|
+
async function members(args) {
|
|
746
615
|
const search = new URLSearchParams();
|
|
747
|
-
if (
|
|
748
|
-
if (
|
|
749
|
-
if (
|
|
750
|
-
if (
|
|
616
|
+
if (args.afterBlock) search.append("after_block", args.afterBlock.toString());
|
|
617
|
+
if (args.unanchored) search.append("unanchored", "true");
|
|
618
|
+
if (args.limit) search.append("limit", args.limit.toString());
|
|
619
|
+
if (args.offset) search.append("offset", args.offset.toString());
|
|
751
620
|
const init = {};
|
|
752
|
-
if (
|
|
621
|
+
if (args.apiKeyConfig) {
|
|
753
622
|
init.headers = {
|
|
754
|
-
[
|
|
623
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
755
624
|
};
|
|
756
625
|
}
|
|
757
|
-
const
|
|
758
|
-
|
|
759
|
-
init
|
|
760
|
-
);
|
|
626
|
+
const endpoint = `${args.baseUrl}/extended/v1/pox4/${args.poolPrincipal}/delegations?${search}`;
|
|
627
|
+
const res = await fetch(endpoint, init);
|
|
761
628
|
if (!res.ok) {
|
|
762
629
|
return error({
|
|
763
630
|
name: "FetchMembersError",
|
|
@@ -777,7 +644,7 @@ async function members(opts, apiOpts) {
|
|
|
777
644
|
data: jsonParseError
|
|
778
645
|
});
|
|
779
646
|
}
|
|
780
|
-
const validationResult =
|
|
647
|
+
const validationResult = v10.safeParse(membersResponseSchema, data);
|
|
781
648
|
if (!validationResult.success) {
|
|
782
649
|
return error({
|
|
783
650
|
name: "ValidateDataError",
|
|
@@ -788,121 +655,126 @@ async function members(opts, apiOpts) {
|
|
|
788
655
|
return success(validationResult.output);
|
|
789
656
|
}
|
|
790
657
|
|
|
658
|
+
// src/stacks-api/stacking-pool/index.ts
|
|
659
|
+
var stackingPool = {
|
|
660
|
+
members
|
|
661
|
+
};
|
|
662
|
+
|
|
791
663
|
// src/stacks-api/transactions/schemas.ts
|
|
792
|
-
import * as
|
|
793
|
-
var baseTransactionSchema =
|
|
794
|
-
tx_id:
|
|
795
|
-
nonce:
|
|
796
|
-
fee_rate:
|
|
797
|
-
sender_address:
|
|
798
|
-
sponsored:
|
|
799
|
-
post_condition_mode:
|
|
800
|
-
post_conditions:
|
|
801
|
-
anchor_mode:
|
|
802
|
-
is_unanchored:
|
|
803
|
-
block_hash:
|
|
804
|
-
parent_block_hash:
|
|
805
|
-
block_height:
|
|
806
|
-
block_time:
|
|
807
|
-
block_time_iso:
|
|
808
|
-
burn_block_height:
|
|
809
|
-
burn_block_time:
|
|
810
|
-
burn_block_time_iso:
|
|
811
|
-
parent_burn_block_time:
|
|
812
|
-
parent_burn_block_time_iso:
|
|
813
|
-
canonical:
|
|
814
|
-
tx_index:
|
|
815
|
-
tx_status:
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
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")
|
|
819
691
|
]),
|
|
820
|
-
tx_result:
|
|
821
|
-
hex:
|
|
822
|
-
repr:
|
|
692
|
+
tx_result: v11.object({
|
|
693
|
+
hex: v11.string(),
|
|
694
|
+
repr: v11.string()
|
|
823
695
|
}),
|
|
824
|
-
microblock_hash:
|
|
825
|
-
microblock_sequence:
|
|
826
|
-
microblock_canonical:
|
|
827
|
-
event_count:
|
|
828
|
-
events:
|
|
829
|
-
execution_cost_read_count:
|
|
830
|
-
execution_cost_read_length:
|
|
831
|
-
execution_cost_runtime:
|
|
832
|
-
execution_cost_write_count:
|
|
833
|
-
execution_cost_write_length:
|
|
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()
|
|
834
706
|
});
|
|
835
|
-
var contractCallTransactionSchema =
|
|
836
|
-
tx_type:
|
|
837
|
-
contract_call:
|
|
838
|
-
contract_id:
|
|
839
|
-
function_name:
|
|
840
|
-
function_signature:
|
|
841
|
-
function_args:
|
|
842
|
-
|
|
843
|
-
hex:
|
|
844
|
-
repr:
|
|
845
|
-
name:
|
|
846
|
-
type:
|
|
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()
|
|
847
719
|
})
|
|
848
720
|
)
|
|
849
721
|
}),
|
|
850
722
|
...baseTransactionSchema.entries
|
|
851
723
|
});
|
|
852
|
-
var smartContractTransactionSchema =
|
|
853
|
-
tx_type:
|
|
854
|
-
smart_contract:
|
|
724
|
+
var smartContractTransactionSchema = v11.object({
|
|
725
|
+
tx_type: v11.literal("smart_contract"),
|
|
726
|
+
smart_contract: v11.object({
|
|
855
727
|
/**
|
|
856
728
|
* NOTE: The types may be wrong, not sure what type of value is used when
|
|
857
729
|
* the version is not `null`.
|
|
858
730
|
*/
|
|
859
|
-
clarity_version:
|
|
860
|
-
contract_id:
|
|
861
|
-
source_code:
|
|
731
|
+
clarity_version: v11.union([v11.null(), v11.number()]),
|
|
732
|
+
contract_id: v11.string(),
|
|
733
|
+
source_code: v11.string()
|
|
862
734
|
}),
|
|
863
735
|
...baseTransactionSchema.entries
|
|
864
736
|
});
|
|
865
|
-
var tokenTransferSchema =
|
|
866
|
-
tx_type:
|
|
867
|
-
token_transfer:
|
|
868
|
-
recipient_address:
|
|
869
|
-
amount:
|
|
870
|
-
memo:
|
|
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()
|
|
871
743
|
}),
|
|
872
744
|
...baseTransactionSchema.entries
|
|
873
745
|
});
|
|
874
|
-
var transactionSchema =
|
|
746
|
+
var transactionSchema = v11.variant("tx_type", [
|
|
875
747
|
contractCallTransactionSchema,
|
|
876
748
|
smartContractTransactionSchema,
|
|
877
749
|
tokenTransferSchema
|
|
878
750
|
]);
|
|
879
751
|
|
|
880
752
|
// src/stacks-api/transactions/address-transactions.ts
|
|
881
|
-
import * as
|
|
882
|
-
var resultSchema =
|
|
753
|
+
import * as v12 from "valibot";
|
|
754
|
+
var resultSchema = v12.object({
|
|
883
755
|
tx: transactionSchema,
|
|
884
|
-
stx_sent:
|
|
885
|
-
stx_received:
|
|
886
|
-
events:
|
|
887
|
-
stx:
|
|
888
|
-
transfer:
|
|
889
|
-
mint:
|
|
890
|
-
burn:
|
|
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()
|
|
891
763
|
}),
|
|
892
|
-
ft:
|
|
893
|
-
transfer:
|
|
894
|
-
mint:
|
|
895
|
-
burn:
|
|
764
|
+
ft: v12.object({
|
|
765
|
+
transfer: v12.number(),
|
|
766
|
+
mint: v12.number(),
|
|
767
|
+
burn: v12.number()
|
|
896
768
|
}),
|
|
897
|
-
nft:
|
|
898
|
-
transfer:
|
|
899
|
-
mint:
|
|
900
|
-
burn:
|
|
769
|
+
nft: v12.object({
|
|
770
|
+
transfer: v12.number(),
|
|
771
|
+
mint: v12.number(),
|
|
772
|
+
burn: v12.number()
|
|
901
773
|
})
|
|
902
774
|
})
|
|
903
775
|
});
|
|
904
|
-
var resultsSchema4 =
|
|
905
|
-
var addressTransactionsResponseSchema =
|
|
776
|
+
var resultsSchema4 = v12.array(resultSchema);
|
|
777
|
+
var addressTransactionsResponseSchema = v12.object({
|
|
906
778
|
...baseListResponseSchema.entries,
|
|
907
779
|
results: resultsSchema4
|
|
908
780
|
});
|
|
@@ -939,7 +811,7 @@ async function addressTransactions(args) {
|
|
|
939
811
|
data: jsonParseError
|
|
940
812
|
});
|
|
941
813
|
}
|
|
942
|
-
const validationResult =
|
|
814
|
+
const validationResult = v12.safeParse(addressTransactionsResponseSchema, data);
|
|
943
815
|
if (!validationResult.success) {
|
|
944
816
|
return error({
|
|
945
817
|
name: "ValidateDataError",
|
|
@@ -951,7 +823,7 @@ async function addressTransactions(args) {
|
|
|
951
823
|
}
|
|
952
824
|
|
|
953
825
|
// src/stacks-api/transactions/get-transaction.ts
|
|
954
|
-
import * as
|
|
826
|
+
import * as v13 from "valibot";
|
|
955
827
|
async function getTransaction(args) {
|
|
956
828
|
const init = {};
|
|
957
829
|
if (args.apiKeyConfig) {
|
|
@@ -980,7 +852,7 @@ async function getTransaction(args) {
|
|
|
980
852
|
error: jsonParseError
|
|
981
853
|
});
|
|
982
854
|
}
|
|
983
|
-
const validationResult =
|
|
855
|
+
const validationResult = v13.safeParse(transactionSchema, data);
|
|
984
856
|
if (!validationResult.success) {
|
|
985
857
|
return error({
|
|
986
858
|
name: "ValidateDataError",
|
|
@@ -991,20 +863,215 @@ async function getTransaction(args) {
|
|
|
991
863
|
return success(validationResult.output);
|
|
992
864
|
}
|
|
993
865
|
|
|
866
|
+
// src/stacks-api/transactions/mempool-transactions.ts
|
|
867
|
+
async function mempoolTransactions(args) {
|
|
868
|
+
const search = new URLSearchParams();
|
|
869
|
+
if (args.limit) search.append("limit", args.limit.toString());
|
|
870
|
+
if (args.offset) search.append("offset", args.offset.toString());
|
|
871
|
+
if (args.senderAddress) search.append("sender_address", args.senderAddress);
|
|
872
|
+
if (args.recipientAddress)
|
|
873
|
+
search.append("recipient_address", args.recipientAddress);
|
|
874
|
+
if (args.address) search.append("address", args.address);
|
|
875
|
+
if (args.orderBy) search.append("order_by", args.orderBy);
|
|
876
|
+
if (args.order) search.append("order", args.order);
|
|
877
|
+
const init = {};
|
|
878
|
+
if (args.apiKeyConfig) {
|
|
879
|
+
init.headers = {
|
|
880
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
881
|
+
};
|
|
882
|
+
}
|
|
883
|
+
const res = await fetch(
|
|
884
|
+
`${args.baseUrl}/extended/v1/tx/mempool?${search}`,
|
|
885
|
+
init
|
|
886
|
+
);
|
|
887
|
+
if (!res.ok) {
|
|
888
|
+
return error({
|
|
889
|
+
name: "FetchMempoolTransactionsError",
|
|
890
|
+
message: "Failed to fetch mempool transactions.",
|
|
891
|
+
data: {
|
|
892
|
+
status: res.status,
|
|
893
|
+
statusText: res.statusText,
|
|
894
|
+
bodyParseResult: await safePromise(res.json())
|
|
895
|
+
}
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
const [jsonParseError, data] = await safePromise(res.json());
|
|
899
|
+
if (jsonParseError) {
|
|
900
|
+
return error({
|
|
901
|
+
name: "ParseBodyError",
|
|
902
|
+
message: "Failed to parse response body.",
|
|
903
|
+
data: jsonParseError
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
return success(data);
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
// src/stacks-api/transactions/index.ts
|
|
910
|
+
var transactions = {
|
|
911
|
+
addressTransactions,
|
|
912
|
+
getTransaction,
|
|
913
|
+
mempoolTransactions
|
|
914
|
+
};
|
|
915
|
+
|
|
994
916
|
// src/stacks-api/index.ts
|
|
995
|
-
var
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
917
|
+
var stacksApi = {
|
|
918
|
+
accounts,
|
|
919
|
+
blocks,
|
|
920
|
+
faucets,
|
|
921
|
+
info,
|
|
922
|
+
proofOfTransfer,
|
|
923
|
+
stackingPool,
|
|
924
|
+
transactions
|
|
925
|
+
};
|
|
926
|
+
|
|
927
|
+
// src/stacks-rpc-api/smart-contracts/map-entry.ts
|
|
928
|
+
import * as v14 from "valibot";
|
|
929
|
+
var mapEntryResponseSchema = v14.object({
|
|
930
|
+
/**
|
|
931
|
+
* Hex-encoded string of clarity value. It is always an optional tuple.
|
|
932
|
+
*/
|
|
933
|
+
data: v14.string(),
|
|
934
|
+
/**
|
|
935
|
+
* Hex-encoded string of the MARF proof for the data
|
|
936
|
+
*/
|
|
937
|
+
proof: v14.optional(v14.string())
|
|
938
|
+
});
|
|
939
|
+
async function mapEntry(args) {
|
|
940
|
+
const search = new URLSearchParams();
|
|
941
|
+
if (args.proof === 0) search.append("proof", "0");
|
|
942
|
+
if (args.tip) search.append("tip", args.tip);
|
|
943
|
+
const init = {};
|
|
944
|
+
if (args.apiKeyConfig) {
|
|
945
|
+
init.headers = {
|
|
946
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
947
|
+
};
|
|
948
|
+
}
|
|
949
|
+
init.method = "POST";
|
|
950
|
+
init.body = JSON.stringify(
|
|
951
|
+
args.mapKey.startsWith("0x") ? args.mapKey : `0x${args.mapKey}`
|
|
952
|
+
);
|
|
953
|
+
init.headers = { ...init.headers, "Content-Type": "application/json" };
|
|
954
|
+
const endpoint = `${args.baseUrl}/v2/map_entry/${args.contractAddress}/${args.contractName}/${args.mapName}?${search}`;
|
|
955
|
+
const res = await fetch(endpoint, init);
|
|
956
|
+
if (!res.ok) {
|
|
957
|
+
return error({
|
|
958
|
+
name: "FetchMapEntryError",
|
|
959
|
+
message: "Failed to fetch map entry.",
|
|
960
|
+
data: {
|
|
961
|
+
init,
|
|
962
|
+
status: res.status,
|
|
963
|
+
statusText: res.statusText,
|
|
964
|
+
endpoint,
|
|
965
|
+
bodyParseResult: await safePromise(res.text())
|
|
966
|
+
}
|
|
967
|
+
});
|
|
968
|
+
}
|
|
969
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
970
|
+
if (jsonError) {
|
|
971
|
+
return error({
|
|
972
|
+
name: "ParseBodyError",
|
|
973
|
+
message: "Failed to parse response body as JSON.",
|
|
974
|
+
data: jsonError
|
|
975
|
+
});
|
|
976
|
+
}
|
|
977
|
+
const validationResult = v14.safeParse(mapEntryResponseSchema, data);
|
|
978
|
+
if (!validationResult.success) {
|
|
979
|
+
return error({
|
|
980
|
+
name: "ValidateDataError",
|
|
981
|
+
message: "Failed to validate response data.",
|
|
982
|
+
data: validationResult
|
|
983
|
+
});
|
|
984
|
+
}
|
|
985
|
+
return success(validationResult.output);
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
// src/stacks-rpc-api/smart-contracts/read-only.ts
|
|
989
|
+
async function readOnly(args) {
|
|
990
|
+
const headers = {
|
|
991
|
+
"Content-Type": "application/json"
|
|
992
|
+
};
|
|
993
|
+
if (args.apiKeyConfig) {
|
|
994
|
+
headers[args.apiKeyConfig.header] = args.apiKeyConfig.key;
|
|
995
|
+
}
|
|
996
|
+
const init = {
|
|
997
|
+
method: "POST",
|
|
998
|
+
body: JSON.stringify({
|
|
999
|
+
sender: args.sender,
|
|
1000
|
+
arguments: args.arguments
|
|
1001
|
+
}),
|
|
1002
|
+
headers
|
|
1003
|
+
};
|
|
1004
|
+
const endpoint = `${args.baseUrl}/v2/contracts/call-read/${args.contractAddress}/${args.contractName}/${args.functionName}`;
|
|
1005
|
+
const res = await fetch(endpoint, init);
|
|
1006
|
+
if (!res.ok) {
|
|
1007
|
+
return error({
|
|
1008
|
+
name: "FetchReadOnlyError",
|
|
1009
|
+
message: "Failed to fetch.",
|
|
1010
|
+
data: {
|
|
1011
|
+
status: res.status,
|
|
1012
|
+
statusText: res.statusText,
|
|
1013
|
+
bodyParseResult: await safePromise(res.json())
|
|
1014
|
+
}
|
|
1015
|
+
});
|
|
1016
|
+
}
|
|
1017
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
1018
|
+
if (jsonError) {
|
|
1019
|
+
return error({
|
|
1020
|
+
name: "ParseBodyError",
|
|
1021
|
+
message: "Failed to parse response body as JSON.",
|
|
1022
|
+
data: error
|
|
1023
|
+
});
|
|
1024
|
+
}
|
|
1025
|
+
return success(data);
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// src/stacks-rpc-api/smart-contracts/index.ts
|
|
1029
|
+
var smartContracts = {
|
|
1030
|
+
mapEntry,
|
|
1031
|
+
readOnly
|
|
1032
|
+
};
|
|
1033
|
+
|
|
1034
|
+
// src/stacks-rpc-api/pox/pox-details.ts
|
|
1035
|
+
async function poxDetails(args) {
|
|
1036
|
+
const init = {};
|
|
1037
|
+
if (args.apiKeyConfig) {
|
|
1038
|
+
init.headers = {
|
|
1039
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
1040
|
+
};
|
|
1041
|
+
}
|
|
1042
|
+
const res = await fetch(`${args.baseUrl}/v2/pox`, init);
|
|
1043
|
+
if (!res.ok) {
|
|
1044
|
+
return error({
|
|
1045
|
+
name: "FetchPoxDetailsError",
|
|
1046
|
+
message: "Failed to fetch pox details.",
|
|
1047
|
+
data: {
|
|
1048
|
+
status: res.status,
|
|
1049
|
+
statusText: res.statusText,
|
|
1050
|
+
bodyParseResult: await safePromise(res.json())
|
|
1051
|
+
}
|
|
1052
|
+
});
|
|
1053
|
+
}
|
|
1054
|
+
const [jsonParseError, data] = await safePromise(res.json());
|
|
1055
|
+
if (jsonParseError) {
|
|
1056
|
+
return error({
|
|
1057
|
+
name: "ParseBodyError",
|
|
1058
|
+
message: "Failed to parse pox details response.",
|
|
1059
|
+
data: jsonParseError
|
|
1060
|
+
});
|
|
1061
|
+
}
|
|
1062
|
+
return success(data);
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
// src/stacks-rpc-api/pox/index.ts
|
|
1066
|
+
var pox = {
|
|
1067
|
+
poxDetails
|
|
1068
|
+
};
|
|
1069
|
+
|
|
1070
|
+
// src/stacks-rpc-api/index.ts
|
|
1071
|
+
var stacksRpcApi = {
|
|
1072
|
+
pox,
|
|
1073
|
+
smartContracts
|
|
1004
1074
|
};
|
|
1005
|
-
var smartContracts = { readOnly };
|
|
1006
|
-
var stackingPool = { members };
|
|
1007
|
-
var transactions = { addressTransactions, getTransaction };
|
|
1008
1075
|
|
|
1009
1076
|
// src/utils/call-rate-limited-api.ts
|
|
1010
1077
|
import { backOff } from "exponential-backoff";
|
|
@@ -1042,22 +1109,214 @@ async function safeCallRateLimitedApi(fn, options) {
|
|
|
1042
1109
|
}
|
|
1043
1110
|
}
|
|
1044
1111
|
|
|
1045
|
-
// src/
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1112
|
+
// src/queries/get-signer-stacked-amount.ts
|
|
1113
|
+
async function getSignerStackedAmount(args) {
|
|
1114
|
+
let totalLocked = 0n;
|
|
1115
|
+
const { identifier, ...rest } = args;
|
|
1116
|
+
let hasMore = true;
|
|
1117
|
+
let offset = 0;
|
|
1118
|
+
let found = false;
|
|
1119
|
+
const limit = 200;
|
|
1120
|
+
while (hasMore && !found) {
|
|
1121
|
+
const [error2, data] = await safeCallRateLimitedApi(
|
|
1122
|
+
() => signersInCycle({
|
|
1123
|
+
...rest,
|
|
1124
|
+
limit
|
|
1125
|
+
})
|
|
1126
|
+
);
|
|
1127
|
+
if (error2) {
|
|
1128
|
+
return error({
|
|
1129
|
+
name: "GetSignerTotalLockedError",
|
|
1130
|
+
message: "Failed to get signer total locked.",
|
|
1131
|
+
data: {
|
|
1132
|
+
error: error2
|
|
1133
|
+
}
|
|
1134
|
+
});
|
|
1135
|
+
}
|
|
1136
|
+
for (const signer of data.results) {
|
|
1137
|
+
if (identifier.type === "address") {
|
|
1138
|
+
if (signer.signer_address === identifier.signerAddress) {
|
|
1139
|
+
totalLocked = BigInt(signer.stacked_amount);
|
|
1140
|
+
found = true;
|
|
1141
|
+
break;
|
|
1142
|
+
}
|
|
1143
|
+
} else {
|
|
1144
|
+
if (signer.signing_key === identifier.signerPublicKey) {
|
|
1145
|
+
totalLocked = BigInt(signer.stacked_amount);
|
|
1146
|
+
found = true;
|
|
1147
|
+
break;
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
offset += data.results.length;
|
|
1152
|
+
hasMore = offset < data.total;
|
|
1153
|
+
}
|
|
1154
|
+
if (!found) {
|
|
1155
|
+
return error({
|
|
1156
|
+
name: "SignerNotFound",
|
|
1157
|
+
message: "Signer not found.",
|
|
1158
|
+
data: {
|
|
1159
|
+
identifier,
|
|
1160
|
+
cycle: args.cycleNumber
|
|
1161
|
+
}
|
|
1162
|
+
});
|
|
1163
|
+
}
|
|
1164
|
+
return success(totalLocked);
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
// src/queries/index.ts
|
|
1168
|
+
var queries = {
|
|
1169
|
+
getSignerStackedAmount
|
|
1170
|
+
};
|
|
1171
|
+
|
|
1172
|
+
// src/pox4-api/maps/stacking-state.ts
|
|
1173
|
+
import {
|
|
1174
|
+
cvToHex,
|
|
1175
|
+
hexToCV
|
|
1176
|
+
} from "@stacks/transactions";
|
|
1177
|
+
|
|
1178
|
+
// src/pox4-api/constants.ts
|
|
1179
|
+
var netValueMap = {
|
|
1180
|
+
mainnet: {
|
|
1181
|
+
pox4ContractAddress: "SP000000000000000000002Q6VF78",
|
|
1182
|
+
pox4ContractName: "pox-4"
|
|
1183
|
+
},
|
|
1184
|
+
testnet: {
|
|
1185
|
+
pox4ContractAddress: "ST000000000000000000002AMW42H",
|
|
1186
|
+
pox4ContractName: "pox-4"
|
|
1187
|
+
}
|
|
1188
|
+
};
|
|
1189
|
+
function networkDependentValues(network) {
|
|
1190
|
+
return netValueMap[network];
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
// src/pox4-api/maps/stacking-state.ts
|
|
1194
|
+
async function stackingState({
|
|
1195
|
+
key,
|
|
1196
|
+
network,
|
|
1197
|
+
baseUrl,
|
|
1198
|
+
apiKeyConfig,
|
|
1199
|
+
proof,
|
|
1200
|
+
tip
|
|
1201
|
+
}) {
|
|
1202
|
+
const [mapEntryError, mapEntryData] = await mapEntry({
|
|
1203
|
+
contractAddress: networkDependentValues(network).pox4ContractAddress,
|
|
1204
|
+
contractName: networkDependentValues(network).pox4ContractName,
|
|
1205
|
+
mapKey: cvToHex(key),
|
|
1206
|
+
mapName: "stacking-state",
|
|
1207
|
+
apiKeyConfig,
|
|
1208
|
+
proof,
|
|
1209
|
+
tip,
|
|
1210
|
+
baseUrl
|
|
1211
|
+
});
|
|
1212
|
+
if (mapEntryError)
|
|
1213
|
+
return error({
|
|
1214
|
+
name: "FetchStackingStateError",
|
|
1215
|
+
message: "Failed to fetch stacking state.",
|
|
1216
|
+
data: mapEntryError
|
|
1217
|
+
});
|
|
1218
|
+
return success({
|
|
1219
|
+
data: hexToCV(mapEntryData.data),
|
|
1220
|
+
proof: mapEntryData.proof
|
|
1221
|
+
});
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
// src/pox4-api/maps/index.ts
|
|
1225
|
+
var maps = { stackingState };
|
|
1226
|
+
|
|
1227
|
+
// src/pox4-api/read-only/get-stacker-info.ts
|
|
1228
|
+
import {
|
|
1229
|
+
cvToHex as cvToHex2,
|
|
1230
|
+
hexToCV as hexToCV2,
|
|
1231
|
+
principalCV
|
|
1232
|
+
} from "@stacks/transactions";
|
|
1233
|
+
async function getStackerInfo({
|
|
1234
|
+
principal,
|
|
1235
|
+
network,
|
|
1236
|
+
baseUrl,
|
|
1237
|
+
apiKeyConfig
|
|
1238
|
+
}) {
|
|
1239
|
+
const [readOnlyError, readOnlyData] = await stacksRpcApi.smartContracts.readOnly({
|
|
1240
|
+
contractAddress: networkDependentValues(network).pox4ContractAddress,
|
|
1241
|
+
contractName: networkDependentValues(network).pox4ContractName,
|
|
1242
|
+
functionName: "get-stacker-info",
|
|
1243
|
+
arguments: [cvToHex2(principalCV(principal))],
|
|
1244
|
+
baseUrl,
|
|
1245
|
+
apiKeyConfig,
|
|
1246
|
+
sender: principal
|
|
1247
|
+
});
|
|
1248
|
+
if (readOnlyError) {
|
|
1249
|
+
return error({
|
|
1250
|
+
name: "GetStackerInfoError",
|
|
1251
|
+
message: "Failed to get stacker info.",
|
|
1252
|
+
data: readOnlyError
|
|
1253
|
+
});
|
|
1254
|
+
}
|
|
1255
|
+
if (!readOnlyData.okay) {
|
|
1256
|
+
return error({
|
|
1257
|
+
name: "GetStackerInfoFunctionCallError",
|
|
1258
|
+
message: "Call to `get-stacker-info` failed.",
|
|
1259
|
+
data: readOnlyData
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
return success(hexToCV2(readOnlyData.result));
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
// src/pox4-api/read-only/get-check-delegation.ts
|
|
1266
|
+
import {
|
|
1267
|
+
cvToHex as cvToHex3,
|
|
1268
|
+
hexToCV as hexToCV3,
|
|
1269
|
+
principalCV as principalCV2
|
|
1270
|
+
} from "@stacks/transactions";
|
|
1271
|
+
async function getCheckDelegation({
|
|
1272
|
+
principal,
|
|
1273
|
+
network,
|
|
1274
|
+
baseUrl,
|
|
1275
|
+
apiKeyConfig
|
|
1276
|
+
}) {
|
|
1277
|
+
const [readOnlyError, readOnlyData] = await stacksRpcApi.smartContracts.readOnly({
|
|
1278
|
+
contractAddress: networkDependentValues(network).pox4ContractAddress,
|
|
1279
|
+
contractName: networkDependentValues(network).pox4ContractName,
|
|
1280
|
+
functionName: "get-check-delegation",
|
|
1281
|
+
arguments: [cvToHex3(principalCV2(principal))],
|
|
1282
|
+
baseUrl,
|
|
1283
|
+
apiKeyConfig,
|
|
1284
|
+
sender: principal
|
|
1285
|
+
});
|
|
1286
|
+
if (readOnlyError) {
|
|
1287
|
+
return error({
|
|
1288
|
+
name: "GetCheckDelegationError",
|
|
1289
|
+
message: "Failed to get check delegation.",
|
|
1290
|
+
data: readOnlyError
|
|
1291
|
+
});
|
|
1292
|
+
}
|
|
1293
|
+
if (!readOnlyData.okay) {
|
|
1294
|
+
return error({
|
|
1295
|
+
name: "GetCheckDelegationFunctionCallError",
|
|
1296
|
+
message: "Call to `get-check-delegation` failed.",
|
|
1297
|
+
data: readOnlyData
|
|
1298
|
+
});
|
|
1299
|
+
}
|
|
1300
|
+
return success(hexToCV3(readOnlyData.result));
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
// src/pox4-api/read-only/index.ts
|
|
1304
|
+
var readOnly2 = {
|
|
1305
|
+
getStackerInfo,
|
|
1306
|
+
getCheckDelegation
|
|
1054
1307
|
};
|
|
1308
|
+
|
|
1309
|
+
// src/pox4-api/index.ts
|
|
1310
|
+
var pox4Api = { maps, readOnly: readOnly2 };
|
|
1055
1311
|
export {
|
|
1056
1312
|
callRateLimitedApi,
|
|
1057
1313
|
error,
|
|
1314
|
+
pox4Api,
|
|
1315
|
+
queries,
|
|
1058
1316
|
safeCall,
|
|
1059
1317
|
safeCallRateLimitedApi,
|
|
1060
1318
|
safePromise,
|
|
1061
1319
|
stacksApi,
|
|
1320
|
+
stacksRpcApi,
|
|
1062
1321
|
success
|
|
1063
1322
|
};
|