@secretkeylabs/stacks-tools 0.2.0 → 0.3.0-6a691d3
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 +681 -0
- package/dist/index.d.cts +400 -0
- package/dist/index.d.ts +400 -2
- package/dist/index.js +650 -3
- package/package.json +13 -5
- package/dist/index.js.map +0 -1
- package/dist/pox4-api/burn-height-to-reward-cycle.d.ts +0 -7
- package/dist/pox4-api/burn-height-to-reward-cycle.js +0 -6
- package/dist/pox4-api/burn-height-to-reward-cycle.js.map +0 -1
- package/dist/pox4-api/current-pox-reward-cycle.d.ts +0 -1
- package/dist/pox4-api/current-pox-reward-cycle.js +0 -3
- package/dist/pox4-api/current-pox-reward-cycle.js.map +0 -1
- package/dist/pox4-api/get-stacker-info.d.ts +0 -1
- package/dist/pox4-api/get-stacker-info.js +0 -3
- package/dist/pox4-api/get-stacker-info.js.map +0 -1
- package/dist/pox4-api/reward-cycle-to-burn-height.d.ts +0 -1
- package/dist/pox4-api/reward-cycle-to-burn-height.js +0 -3
- package/dist/pox4-api/reward-cycle-to-burn-height.js.map +0 -1
- package/dist/queries/get-signer-total-locked.d.ts +0 -18
- package/dist/queries/get-signer-total-locked.js +0 -59
- package/dist/queries/get-signer-total-locked.js.map +0 -1
- package/dist/queries/index.d.ts +0 -4
- package/dist/queries/index.js +0 -5
- package/dist/queries/index.js.map +0 -1
- package/dist/stacks-api/accounts/balances.d.ts +0 -34
- package/dist/stacks-api/accounts/balances.js +0 -70
- package/dist/stacks-api/accounts/balances.js.map +0 -1
- package/dist/stacks-api/accounts/index.d.ts +0 -4
- package/dist/stacks-api/accounts/index.js +0 -5
- package/dist/stacks-api/accounts/index.js.map +0 -1
- package/dist/stacks-api/blocks/get-block.d.ts +0 -29
- package/dist/stacks-api/blocks/get-block.js +0 -62
- package/dist/stacks-api/blocks/get-block.js.map +0 -1
- package/dist/stacks-api/blocks/index.d.ts +0 -4
- package/dist/stacks-api/blocks/index.js +0 -5
- package/dist/stacks-api/blocks/index.js.map +0 -1
- package/dist/stacks-api/index.d.ts +0 -28
- package/dist/stacks-api/index.js +0 -17
- package/dist/stacks-api/index.js.map +0 -1
- package/dist/stacks-api/info/core-api.d.ts +0 -21
- package/dist/stacks-api/info/core-api.js +0 -55
- package/dist/stacks-api/info/core-api.js.map +0 -1
- package/dist/stacks-api/info/index.d.ts +0 -6
- package/dist/stacks-api/info/index.js +0 -7
- package/dist/stacks-api/info/index.js.map +0 -1
- package/dist/stacks-api/info/pox-details.d.ts +0 -59
- package/dist/stacks-api/info/pox-details.js +0 -92
- package/dist/stacks-api/info/pox-details.js.map +0 -1
- package/dist/stacks-api/proof-of-transfer/cycle.d.ts +0 -16
- package/dist/stacks-api/proof-of-transfer/cycle.js +0 -50
- package/dist/stacks-api/proof-of-transfer/cycle.js.map +0 -1
- package/dist/stacks-api/proof-of-transfer/cycles.d.ts +0 -37
- package/dist/stacks-api/proof-of-transfer/cycles.js +0 -61
- package/dist/stacks-api/proof-of-transfer/cycles.js.map +0 -1
- package/dist/stacks-api/proof-of-transfer/index.d.ts +0 -10
- package/dist/stacks-api/proof-of-transfer/index.js +0 -11
- package/dist/stacks-api/proof-of-transfer/index.js.map +0 -1
- package/dist/stacks-api/proof-of-transfer/signers-in-cycle.d.ts +0 -45
- package/dist/stacks-api/proof-of-transfer/signers-in-cycle.js +0 -66
- package/dist/stacks-api/proof-of-transfer/signers-in-cycle.js.map +0 -1
- package/dist/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.d.ts +0 -34
- package/dist/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.js +0 -59
- package/dist/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.js.map +0 -1
- package/dist/stacks-api/smart-contracts/index.d.ts +0 -4
- package/dist/stacks-api/smart-contracts/index.js +0 -5
- package/dist/stacks-api/smart-contracts/index.js.map +0 -1
- package/dist/stacks-api/smart-contracts/read-only.d.ts +0 -19
- package/dist/stacks-api/smart-contracts/read-only.js +0 -50
- package/dist/stacks-api/smart-contracts/read-only.js.map +0 -1
- package/dist/stacks-api/stacking-pool/index.d.ts +0 -4
- package/dist/stacks-api/stacking-pool/index.js +0 -5
- package/dist/stacks-api/stacking-pool/index.js.map +0 -1
- package/dist/stacks-api/stacking-pool/members.d.ts +0 -34
- package/dist/stacks-api/stacking-pool/members.js +0 -64
- package/dist/stacks-api/stacking-pool/members.js.map +0 -1
- package/dist/stacks-api/transactions/address-transactions.d.ts +0 -487
- package/dist/stacks-api/transactions/address-transactions.js +0 -75
- package/dist/stacks-api/transactions/address-transactions.js.map +0 -1
- package/dist/stacks-api/transactions/get-transaction.d.ts +0 -8
- package/dist/stacks-api/transactions/get-transaction.js +0 -42
- package/dist/stacks-api/transactions/get-transaction.js.map +0 -1
- package/dist/stacks-api/transactions/index.d.ts +0 -6
- package/dist/stacks-api/transactions/index.js +0 -7
- package/dist/stacks-api/transactions/index.js.map +0 -1
- package/dist/stacks-api/transactions/schemas.d.ts +0 -327
- package/dist/stacks-api/transactions/schemas.js +0 -85
- package/dist/stacks-api/transactions/schemas.js.map +0 -1
- package/dist/stacks-api/types.d.ts +0 -26
- package/dist/stacks-api/types.js +0 -8
- package/dist/stacks-api/types.js.map +0 -1
- package/dist/utils/call-rate-limited-api.d.ts +0 -8
- package/dist/utils/call-rate-limited-api.js +0 -28
- package/dist/utils/call-rate-limited-api.js.map +0 -1
- package/dist/utils/safe.d.ts +0 -10
- package/dist/utils/safe.js +0 -31
- package/dist/utils/safe.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,3 +1,650 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// src/stacks-api/index.ts
|
|
8
|
+
var stacks_api_exports = {};
|
|
9
|
+
__export(stacks_api_exports, {
|
|
10
|
+
accounts: () => accounts_exports,
|
|
11
|
+
blocks: () => blocks_exports,
|
|
12
|
+
info: () => info_exports,
|
|
13
|
+
proofOfTransfer: () => proof_of_transfer_exports
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// src/stacks-api/accounts/index.ts
|
|
17
|
+
var accounts_exports = {};
|
|
18
|
+
__export(accounts_exports, {
|
|
19
|
+
balances: () => balances
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// src/utils/safe.ts
|
|
23
|
+
function success(data) {
|
|
24
|
+
return [null, data];
|
|
25
|
+
}
|
|
26
|
+
function error(error2) {
|
|
27
|
+
return [error2, null];
|
|
28
|
+
}
|
|
29
|
+
async function safePromise(promise) {
|
|
30
|
+
try {
|
|
31
|
+
return success(await promise);
|
|
32
|
+
} catch (e) {
|
|
33
|
+
return error({
|
|
34
|
+
name: "SafePromiseError",
|
|
35
|
+
message: "Safe promise rejected.",
|
|
36
|
+
data: e
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/stacks-api/accounts/balances.ts
|
|
42
|
+
import * as v from "valibot";
|
|
43
|
+
var responseSchema = v.object({
|
|
44
|
+
stx: v.object({
|
|
45
|
+
balance: v.string(),
|
|
46
|
+
total_sent: v.string(),
|
|
47
|
+
total_received: v.string(),
|
|
48
|
+
total_fees_sent: v.string(),
|
|
49
|
+
total_miner_rewards_received: v.string(),
|
|
50
|
+
lock_tx_id: v.string(),
|
|
51
|
+
locked: v.string(),
|
|
52
|
+
lock_height: v.number(),
|
|
53
|
+
burnchain_lock_height: v.number(),
|
|
54
|
+
burnchain_unlock_height: v.number()
|
|
55
|
+
}),
|
|
56
|
+
fungible_tokens: v.record(
|
|
57
|
+
v.string(),
|
|
58
|
+
v.object({
|
|
59
|
+
balance: v.string(),
|
|
60
|
+
total_sent: v.string(),
|
|
61
|
+
total_received: v.string()
|
|
62
|
+
})
|
|
63
|
+
),
|
|
64
|
+
non_fungible_tokens: v.record(
|
|
65
|
+
v.string(),
|
|
66
|
+
v.object({
|
|
67
|
+
count: v.string(),
|
|
68
|
+
total_sent: v.string(),
|
|
69
|
+
total_received: v.string()
|
|
70
|
+
})
|
|
71
|
+
)
|
|
72
|
+
});
|
|
73
|
+
async function balances(opts) {
|
|
74
|
+
const search = new URLSearchParams();
|
|
75
|
+
if (opts.unanchored) search.append("unanchored", "true");
|
|
76
|
+
if (opts.untilBlock) search.append("until_block", opts.untilBlock.toString());
|
|
77
|
+
const init = {};
|
|
78
|
+
if (opts.apiKeyConfig) {
|
|
79
|
+
init.headers = {
|
|
80
|
+
[opts.apiKeyConfig.header]: opts.apiKeyConfig.key
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const endpoint = `${opts.baseUrl}/extended/v1/address/${opts.principal}/balances?${search}`;
|
|
84
|
+
const res = await fetch(endpoint, init);
|
|
85
|
+
if (!res.ok) {
|
|
86
|
+
return error({
|
|
87
|
+
name: "FetchBalancesError",
|
|
88
|
+
message: "Failed to fetch balances.",
|
|
89
|
+
data: {
|
|
90
|
+
status: res.status,
|
|
91
|
+
statusText: res.statusText,
|
|
92
|
+
bodyParseResult: await safePromise(res.json())
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
97
|
+
if (jsonError) {
|
|
98
|
+
return error({
|
|
99
|
+
name: "ParseBodyError",
|
|
100
|
+
message: "Failed to parse response body as JSON.",
|
|
101
|
+
data: jsonError
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const validationResult = v.safeParse(responseSchema, data);
|
|
105
|
+
if (!validationResult.success) {
|
|
106
|
+
return error({
|
|
107
|
+
name: "ValidateDataError",
|
|
108
|
+
message: "Failed to validate data.",
|
|
109
|
+
data: validationResult
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return success(validationResult.output);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// src/stacks-api/blocks/index.ts
|
|
116
|
+
var blocks_exports = {};
|
|
117
|
+
__export(blocks_exports, {
|
|
118
|
+
getBlock: () => getBlock
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// src/stacks-api/types.ts
|
|
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())
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// 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
|
+
async function getBlock(opts) {
|
|
154
|
+
const init = {};
|
|
155
|
+
if (opts.apiKeyConfig) {
|
|
156
|
+
init.headers = {
|
|
157
|
+
[opts.apiKeyConfig.header]: opts.apiKeyConfig.key
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
const res = await fetch(
|
|
161
|
+
`${opts.baseUrl}/extended/v2/blocks/${opts.heightOrHash}`,
|
|
162
|
+
init
|
|
163
|
+
);
|
|
164
|
+
if (!res.ok) {
|
|
165
|
+
return error({
|
|
166
|
+
name: "FetchBlockError",
|
|
167
|
+
message: "Failed to fetch block.",
|
|
168
|
+
data: {
|
|
169
|
+
status: res.status,
|
|
170
|
+
statusText: res.statusText,
|
|
171
|
+
bodyParseResult: await safePromise(res.json())
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
176
|
+
if (jsonError) {
|
|
177
|
+
return error({
|
|
178
|
+
name: "ParseBodyError",
|
|
179
|
+
message: "Failed to parse body.",
|
|
180
|
+
data: jsonError
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
const validationResult = v3.safeParse(responseSchema2, data);
|
|
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);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// src/stacks-api/info/index.ts
|
|
195
|
+
var info_exports = {};
|
|
196
|
+
__export(info_exports, {
|
|
197
|
+
coreApi: () => coreApi,
|
|
198
|
+
poxDetails: () => poxDetails
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// src/stacks-api/info/core-api.ts
|
|
202
|
+
import * as v4 from "valibot";
|
|
203
|
+
var CoreApiResponseSchema = v4.object({
|
|
204
|
+
peer_version: v4.number(),
|
|
205
|
+
pox_consensus: v4.string(),
|
|
206
|
+
burn_block_height: v4.number(),
|
|
207
|
+
stable_pox_consensus: v4.string(),
|
|
208
|
+
stable_burn_block_height: v4.number(),
|
|
209
|
+
server_version: v4.string(),
|
|
210
|
+
network_id: v4.number(),
|
|
211
|
+
parent_network_id: v4.number(),
|
|
212
|
+
stacks_tip_height: v4.number(),
|
|
213
|
+
stacks_tip: v4.string(),
|
|
214
|
+
stacks_tip_consensus_hash: v4.string(),
|
|
215
|
+
unanchored_tip: v4.string(),
|
|
216
|
+
exit_at_block_height: v4.number()
|
|
217
|
+
});
|
|
218
|
+
async function coreApi(apiOpts) {
|
|
219
|
+
const init = {};
|
|
220
|
+
if (apiOpts.apiKeyConfig) {
|
|
221
|
+
init.headers = {
|
|
222
|
+
[apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
const res = await fetch(`${apiOpts.baseUrl}/v2/info`, init);
|
|
226
|
+
if (!res.ok) {
|
|
227
|
+
return error({
|
|
228
|
+
name: "FetchCoreApiError",
|
|
229
|
+
message: "Failed to fetch.",
|
|
230
|
+
data: {
|
|
231
|
+
status: res.status,
|
|
232
|
+
statusText: res.statusText,
|
|
233
|
+
bodyParseResult: await safePromise(res.json())
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
const [parseBodyError, data] = await safePromise(res.json());
|
|
238
|
+
if (parseBodyError) {
|
|
239
|
+
return error({
|
|
240
|
+
name: "ParseBodyError",
|
|
241
|
+
message: "Failed to parse response body as JSON.",
|
|
242
|
+
data: parseBodyError
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
const validationResult = v4.safeParse(CoreApiResponseSchema, data);
|
|
246
|
+
if (!validationResult.success) {
|
|
247
|
+
return error({
|
|
248
|
+
name: "ValidateDataError",
|
|
249
|
+
message: "Failed to validate data.",
|
|
250
|
+
data: validationResult
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
return success(validationResult.output);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// src/stacks-api/info/pox-details.ts
|
|
257
|
+
import * as v5 from "valibot";
|
|
258
|
+
var poxDetailsResponseSchema = v5.object({
|
|
259
|
+
contract_id: v5.string(),
|
|
260
|
+
pox_activation_threshold_ustx: v5.number(),
|
|
261
|
+
first_burnchain_block_height: v5.number(),
|
|
262
|
+
current_burnchain_block_height: v5.number(),
|
|
263
|
+
prepare_phase_block_length: v5.number(),
|
|
264
|
+
reward_phase_block_length: v5.number(),
|
|
265
|
+
reward_slots: v5.number(),
|
|
266
|
+
rejection_fraction: v5.null(),
|
|
267
|
+
total_liquid_supply_ustx: v5.number(),
|
|
268
|
+
current_cycle: v5.object({
|
|
269
|
+
id: v5.number(),
|
|
270
|
+
min_threshold_ustx: v5.number(),
|
|
271
|
+
stacked_ustx: v5.number(),
|
|
272
|
+
is_pox_active: v5.boolean()
|
|
273
|
+
}),
|
|
274
|
+
next_cycle: v5.object({
|
|
275
|
+
id: v5.number(),
|
|
276
|
+
min_threshold_ustx: v5.number(),
|
|
277
|
+
min_increment_ustx: v5.number(),
|
|
278
|
+
stacked_ustx: v5.number(),
|
|
279
|
+
prepare_phase_start_block_height: v5.number(),
|
|
280
|
+
blocks_until_prepare_phase: v5.number(),
|
|
281
|
+
reward_phase_start_block_height: v5.number(),
|
|
282
|
+
blocks_until_reward_phase: v5.number(),
|
|
283
|
+
ustx_until_pox_rejection: v5.null()
|
|
284
|
+
}),
|
|
285
|
+
epochs: v5.array(
|
|
286
|
+
v5.object({
|
|
287
|
+
epoch_id: v5.string(),
|
|
288
|
+
start_height: v5.number(),
|
|
289
|
+
end_height: v5.number(),
|
|
290
|
+
block_limit: v5.object({
|
|
291
|
+
write_length: v5.number(),
|
|
292
|
+
write_count: v5.number(),
|
|
293
|
+
read_length: v5.number(),
|
|
294
|
+
read_count: v5.number(),
|
|
295
|
+
runtime: v5.number()
|
|
296
|
+
}),
|
|
297
|
+
network_epoch: v5.number()
|
|
298
|
+
})
|
|
299
|
+
),
|
|
300
|
+
min_amount_ustx: v5.number(),
|
|
301
|
+
prepare_cycle_length: v5.number(),
|
|
302
|
+
reward_cycle_id: v5.number(),
|
|
303
|
+
reward_cycle_length: v5.number(),
|
|
304
|
+
rejection_votes_left_required: v5.null(),
|
|
305
|
+
next_reward_cycle_in: v5.number(),
|
|
306
|
+
contract_versions: v5.array(
|
|
307
|
+
v5.object({
|
|
308
|
+
contract_id: v5.string(),
|
|
309
|
+
activation_burnchain_block_height: v5.number(),
|
|
310
|
+
first_reward_cycle_id: v5.number()
|
|
311
|
+
})
|
|
312
|
+
)
|
|
313
|
+
});
|
|
314
|
+
async function poxDetails(args) {
|
|
315
|
+
const init = {};
|
|
316
|
+
if (args.apiKeyConfig) {
|
|
317
|
+
init.headers = {
|
|
318
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
const res = await fetch(`${args.baseUrl}/v2/pox`, init);
|
|
322
|
+
if (!res.ok) {
|
|
323
|
+
return error({
|
|
324
|
+
name: "FetchPoxDetailsError",
|
|
325
|
+
message: "Failed to fetch pox details.",
|
|
326
|
+
data: {
|
|
327
|
+
status: res.status,
|
|
328
|
+
statusText: res.statusText,
|
|
329
|
+
bodyParseResult: await safePromise(res.json())
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
const [jsonParseError, data] = await safePromise(res.json());
|
|
334
|
+
if (jsonParseError) {
|
|
335
|
+
return error({
|
|
336
|
+
name: "ParseBodyError",
|
|
337
|
+
message: "Failed to parse pox details response.",
|
|
338
|
+
data: jsonParseError
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
const validationResult = v5.safeParse(poxDetailsResponseSchema, data);
|
|
342
|
+
if (!validationResult.success) {
|
|
343
|
+
return error({
|
|
344
|
+
name: "ValidateDataError",
|
|
345
|
+
message: "Failed to parse pox details response.",
|
|
346
|
+
data: validationResult
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
return success(validationResult.output);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// src/stacks-api/proof-of-transfer/index.ts
|
|
353
|
+
var proof_of_transfer_exports = {};
|
|
354
|
+
__export(proof_of_transfer_exports, {
|
|
355
|
+
cycle: () => cycle,
|
|
356
|
+
cycles: () => cycles,
|
|
357
|
+
signerInCycle: () => signerInCycle,
|
|
358
|
+
signersInCycle: () => signersInCycle,
|
|
359
|
+
stackersForSignerInCycle: () => stackersForSignerInCycle
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// src/stacks-api/proof-of-transfer/cycle.ts
|
|
363
|
+
import * as v6 from "valibot";
|
|
364
|
+
var responseSchema3 = v6.object({
|
|
365
|
+
block_height: v6.number(),
|
|
366
|
+
index_block_hash: v6.string(),
|
|
367
|
+
cycle_number: v6.number(),
|
|
368
|
+
total_weight: v6.number(),
|
|
369
|
+
total_stacked_amount: v6.string(),
|
|
370
|
+
total_signers: v6.number()
|
|
371
|
+
});
|
|
372
|
+
async function cycle(opts) {
|
|
373
|
+
const init = {};
|
|
374
|
+
if (opts.apiKeyConfig) {
|
|
375
|
+
init.headers = {
|
|
376
|
+
[opts.apiKeyConfig.header]: opts.apiKeyConfig.key
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}`;
|
|
380
|
+
const res = await fetch(endpoint, init);
|
|
381
|
+
if (!res.ok) {
|
|
382
|
+
return error({
|
|
383
|
+
name: "FetchCycleError",
|
|
384
|
+
message: "Failed to fetch cycle.",
|
|
385
|
+
data: {
|
|
386
|
+
endpoint,
|
|
387
|
+
status: res.status,
|
|
388
|
+
statusText: res.statusText,
|
|
389
|
+
bodyParseResult: await safePromise(res.json())
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
394
|
+
if (jsonError) {
|
|
395
|
+
return error({
|
|
396
|
+
name: "ParseBodyError",
|
|
397
|
+
message: "Failed to parse response body as JSON.",
|
|
398
|
+
data: jsonError
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
const validationResult = v6.safeParse(responseSchema3, data);
|
|
402
|
+
if (!validationResult.success) {
|
|
403
|
+
return error({
|
|
404
|
+
name: "ValidateDataError",
|
|
405
|
+
message: "Failed to validate data.",
|
|
406
|
+
data: validationResult
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
return success(validationResult.output);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// src/stacks-api/proof-of-transfer/cycles.ts
|
|
413
|
+
import * as v7 from "valibot";
|
|
414
|
+
var cycleInfoSchema = v7.object({
|
|
415
|
+
block_height: v7.number(),
|
|
416
|
+
index_block_hash: v7.string(),
|
|
417
|
+
cycle_number: v7.number(),
|
|
418
|
+
total_weight: v7.number(),
|
|
419
|
+
total_stacked_amount: v7.string(),
|
|
420
|
+
total_signers: v7.number()
|
|
421
|
+
});
|
|
422
|
+
var resultsSchema = v7.array(cycleInfoSchema);
|
|
423
|
+
var cyclesResponseSchema = v7.object({
|
|
424
|
+
...baseListResponseSchema.entries,
|
|
425
|
+
results: resultsSchema
|
|
426
|
+
});
|
|
427
|
+
async function cycles(args) {
|
|
428
|
+
const search = new URLSearchParams();
|
|
429
|
+
if (args.limit) search.append("limit", args.limit.toString());
|
|
430
|
+
if (args.offset) search.append("offset", args.offset.toString());
|
|
431
|
+
const init = {};
|
|
432
|
+
if (args.apiKeyConfig) {
|
|
433
|
+
init.headers = {
|
|
434
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
const endpoint = `${args.baseUrl}/extended/v2/pox/cycles`;
|
|
438
|
+
const res = await fetch(endpoint, init);
|
|
439
|
+
if (!res.ok) {
|
|
440
|
+
return error({
|
|
441
|
+
name: "FetchCyclesError",
|
|
442
|
+
message: "Failed to fetch cycles.",
|
|
443
|
+
data: {
|
|
444
|
+
endpoint,
|
|
445
|
+
status: res.status,
|
|
446
|
+
statusText: res.statusText,
|
|
447
|
+
bodyParseResult: await safePromise(res.json())
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
452
|
+
if (jsonError) {
|
|
453
|
+
return error({
|
|
454
|
+
name: "ParseBodyError",
|
|
455
|
+
message: "Failed to parse response body as JSON.",
|
|
456
|
+
data: jsonError
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
const validationResult = v7.safeParse(cyclesResponseSchema, data);
|
|
460
|
+
if (!validationResult.success) {
|
|
461
|
+
return error({
|
|
462
|
+
name: "ValidateDataError",
|
|
463
|
+
message: "Failed to validate response data.",
|
|
464
|
+
data: validationResult
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
return success(validationResult.output);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// src/stacks-api/proof-of-transfer/signer-in-cycle.ts
|
|
471
|
+
import * as v8 from "valibot";
|
|
472
|
+
var signerInCycleResponseSchema = v8.object({
|
|
473
|
+
signing_key: v8.string(),
|
|
474
|
+
signer_address: v8.string(),
|
|
475
|
+
weight: v8.number(),
|
|
476
|
+
stacked_amount: v8.string(),
|
|
477
|
+
weight_percent: v8.number(),
|
|
478
|
+
stacked_amount_percent: v8.number(),
|
|
479
|
+
solo_stacker_count: v8.number(),
|
|
480
|
+
pooled_stacker_count: v8.number()
|
|
481
|
+
});
|
|
482
|
+
async function signerInCycle(args) {
|
|
483
|
+
const init = {};
|
|
484
|
+
if (args.apiKeyConfig) {
|
|
485
|
+
init.headers = {
|
|
486
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
const signerPublicKey = args.signerPublicKey.startsWith("0x") ? args.signerPublicKey : `0x${args.signerPublicKey}`;
|
|
490
|
+
const endpoint = `${args.baseUrl}/extended/v2/pox/cycles/${args.cycleId}/signers/${signerPublicKey}`;
|
|
491
|
+
const res = await fetch(endpoint, init);
|
|
492
|
+
if (!res.ok) {
|
|
493
|
+
return error({
|
|
494
|
+
name: "FetchSignerInCycleError",
|
|
495
|
+
message: "Failed to fetch signer in cycle.",
|
|
496
|
+
data: {
|
|
497
|
+
...args,
|
|
498
|
+
endpoint,
|
|
499
|
+
status: res.status,
|
|
500
|
+
statusText: res.statusText
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
505
|
+
if (jsonError) {
|
|
506
|
+
return error({
|
|
507
|
+
name: "ParseBodyError",
|
|
508
|
+
message: "Failed to parse response body.",
|
|
509
|
+
data: {
|
|
510
|
+
signerPublicKey: args.signerPublicKey,
|
|
511
|
+
cycleId: args.cycleId,
|
|
512
|
+
jsonError
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
const validationResult = v8.safeParse(signerInCycleResponseSchema, data);
|
|
517
|
+
if (!validationResult.success) {
|
|
518
|
+
return error({
|
|
519
|
+
name: "ValidateDataError",
|
|
520
|
+
message: "Failed to validate response data.",
|
|
521
|
+
data: validationResult.issues
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
return success(validationResult.output);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// src/stacks-api/proof-of-transfer/signers-in-cycle.ts
|
|
528
|
+
import * as v9 from "valibot";
|
|
529
|
+
var signerSchema = v9.object({
|
|
530
|
+
signing_key: v9.string(),
|
|
531
|
+
signer_address: v9.string(),
|
|
532
|
+
weight: v9.number(),
|
|
533
|
+
stacked_amount: v9.string(),
|
|
534
|
+
weight_percent: v9.number(),
|
|
535
|
+
stacked_amount_percent: v9.number(),
|
|
536
|
+
pooled_stacker_count: v9.number(),
|
|
537
|
+
solo_stacker_count: v9.number()
|
|
538
|
+
});
|
|
539
|
+
var resultsSchema2 = v9.array(signerSchema);
|
|
540
|
+
var signersResponseSchema = v9.object({
|
|
541
|
+
...baseListResponseSchema.entries,
|
|
542
|
+
results: resultsSchema2
|
|
543
|
+
});
|
|
544
|
+
async function signersInCycle(args) {
|
|
545
|
+
const search = new URLSearchParams();
|
|
546
|
+
if (args.limit) search.append("limit", args.limit.toString());
|
|
547
|
+
if (args.offset) search.append("offset", args.offset.toString());
|
|
548
|
+
const init = {};
|
|
549
|
+
if (args.apiKeyConfig) {
|
|
550
|
+
init.headers = {
|
|
551
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
const endpoint = `${args.baseUrl}/extended/v2/pox/cycles/${args.cycleNumber}/signers`;
|
|
555
|
+
const res = await fetch(endpoint, init);
|
|
556
|
+
if (!res.ok) {
|
|
557
|
+
return error({
|
|
558
|
+
name: "FetchSignersError",
|
|
559
|
+
message: "Failed to fetch signers.",
|
|
560
|
+
data: {
|
|
561
|
+
endpoint,
|
|
562
|
+
status: res.status,
|
|
563
|
+
statusText: res.statusText,
|
|
564
|
+
bodyParseResult: await safePromise(res.json())
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
569
|
+
if (jsonError) {
|
|
570
|
+
return error({
|
|
571
|
+
name: "ParseBodyError",
|
|
572
|
+
message: "Failed to parse response body as JSON.",
|
|
573
|
+
data: {
|
|
574
|
+
endpoint,
|
|
575
|
+
bodyParseResult: data
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
const validationResult = v9.safeParse(signersResponseSchema, data);
|
|
580
|
+
if (!validationResult.success) {
|
|
581
|
+
return error({
|
|
582
|
+
name: "ValidateDataError",
|
|
583
|
+
message: "Failed to validate response data.",
|
|
584
|
+
data: validationResult
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
return success(validationResult.output);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// src/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.ts
|
|
591
|
+
import * as v10 from "valibot";
|
|
592
|
+
var stackerInfoSchema = v10.object({
|
|
593
|
+
stacker_address: v10.string(),
|
|
594
|
+
stacked_amount: v10.string(),
|
|
595
|
+
pox_address: v10.string(),
|
|
596
|
+
stacker_type: v10.union([v10.literal("pooled"), v10.literal("solo")])
|
|
597
|
+
});
|
|
598
|
+
var resultsSchema3 = v10.array(stackerInfoSchema);
|
|
599
|
+
var stackersForSignerInCycleResponseSchema = v10.object({
|
|
600
|
+
...baseListResponseSchema.entries,
|
|
601
|
+
results: resultsSchema3
|
|
602
|
+
});
|
|
603
|
+
async function stackersForSignerInCycle(opts) {
|
|
604
|
+
const search = new URLSearchParams();
|
|
605
|
+
if (opts.limit) search.append("limit", opts.limit.toString());
|
|
606
|
+
if (opts.offset) search.append("offset", opts.offset.toString());
|
|
607
|
+
const init = {};
|
|
608
|
+
if (opts.apiKeyConfig) {
|
|
609
|
+
init.headers = {
|
|
610
|
+
[opts.apiKeyConfig.header]: opts.apiKeyConfig.key
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}/signers/${opts.signerPublicKey}/stackers?${search}`;
|
|
614
|
+
const res = await fetch(endpoint, init);
|
|
615
|
+
if (!res.ok) {
|
|
616
|
+
return error({
|
|
617
|
+
name: "FetchStackersForSignerInCycleError",
|
|
618
|
+
message: "Failed to fetch stackers for signer in cycle.",
|
|
619
|
+
data: {
|
|
620
|
+
endpoint,
|
|
621
|
+
status: res.status,
|
|
622
|
+
statusText: res.statusText,
|
|
623
|
+
bodyParseResult: await safePromise(res.json())
|
|
624
|
+
}
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
628
|
+
if (jsonError) {
|
|
629
|
+
return error({
|
|
630
|
+
name: "ParseBodyError",
|
|
631
|
+
message: "Failed to parse response body as JSON.",
|
|
632
|
+
data: jsonError
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
const validationResult = v10.safeParse(
|
|
636
|
+
stackersForSignerInCycleResponseSchema,
|
|
637
|
+
data
|
|
638
|
+
);
|
|
639
|
+
if (!validationResult.success) {
|
|
640
|
+
return error({
|
|
641
|
+
name: "ValidateDataError",
|
|
642
|
+
message: "Failed to validate response data.",
|
|
643
|
+
data: validationResult
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
return success(validationResult.output);
|
|
647
|
+
}
|
|
648
|
+
export {
|
|
649
|
+
stacks_api_exports as stacksApi
|
|
650
|
+
};
|
package/package.json
CHANGED
|
@@ -1,23 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@secretkeylabs/stacks-tools",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0-6a691d3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
7
7
|
],
|
|
8
8
|
"main": "dist/index.js",
|
|
9
|
+
"exports": {
|
|
10
|
+
"./package.json": "./package.json",
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
9
16
|
"scripts": {
|
|
10
|
-
"build": "
|
|
17
|
+
"build": "tsup",
|
|
11
18
|
"check-format": "prettier --check .",
|
|
12
19
|
"format": "prettier --write .",
|
|
13
20
|
"check-types": "tsc --noEmit",
|
|
14
|
-
"check-exports": "attw --pack .
|
|
15
|
-
"ci": "bun run
|
|
21
|
+
"check-exports": "attw --pack .",
|
|
22
|
+
"ci": "bun run check-types && bun run check-format && bun run build && bun run check-exports"
|
|
16
23
|
},
|
|
17
24
|
"devDependencies": {
|
|
18
25
|
"@arethetypeswrong/cli": "0.15.4",
|
|
19
26
|
"@types/bun": "latest",
|
|
20
|
-
"prettier": "^3.3.3"
|
|
27
|
+
"prettier": "^3.3.3",
|
|
28
|
+
"tsup": "^8.2.4"
|
|
21
29
|
},
|
|
22
30
|
"peerDependencies": {
|
|
23
31
|
"typescript": "^5.0.0",
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { ApiRequestOptions } from "../stacks-api/types.js";
|
|
2
|
-
import { type Result } from "../utils/safe.js";
|
|
3
|
-
type Args = {
|
|
4
|
-
burnHeight: number;
|
|
5
|
-
} & ApiRequestOptions;
|
|
6
|
-
export declare function burnHeightToRewardCycle(_args: Args): Promise<Result<number>>;
|
|
7
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"burn-height-to-reward-cycle.js","sourceRoot":"","sources":["../../src/pox4-api/burn-height-to-reward-cycle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAe,MAAM,kBAAkB,CAAC;AAMxD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAW;IAEX,OAAO;IACP,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|