@secretkeylabs/stacks-tools 0.2.0 → 0.3.0-6dd40b1
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 +1088 -0
- package/dist/index.d.cts +661 -0
- package/dist/index.d.ts +661 -2
- package/dist/index.js +1050 -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.cjs
ADDED
|
@@ -0,0 +1,1088 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/index.ts
|
|
31
|
+
var src_exports = {};
|
|
32
|
+
__export(src_exports, {
|
|
33
|
+
queries: () => queries,
|
|
34
|
+
stacksApi: () => stacksApi
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(src_exports);
|
|
37
|
+
|
|
38
|
+
// src/utils/safe.ts
|
|
39
|
+
function success(data) {
|
|
40
|
+
return [null, data];
|
|
41
|
+
}
|
|
42
|
+
function error(error2) {
|
|
43
|
+
return [error2, null];
|
|
44
|
+
}
|
|
45
|
+
async function safePromise(promise) {
|
|
46
|
+
try {
|
|
47
|
+
return success(await promise);
|
|
48
|
+
} catch (e) {
|
|
49
|
+
return error({
|
|
50
|
+
name: "SafePromiseError",
|
|
51
|
+
message: "Safe promise rejected.",
|
|
52
|
+
data: e
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// src/stacks-api/accounts/balances.ts
|
|
58
|
+
var v = __toESM(require("valibot"), 1);
|
|
59
|
+
var responseSchema = v.object({
|
|
60
|
+
stx: v.object({
|
|
61
|
+
balance: v.string(),
|
|
62
|
+
total_sent: v.string(),
|
|
63
|
+
total_received: v.string(),
|
|
64
|
+
total_fees_sent: v.string(),
|
|
65
|
+
total_miner_rewards_received: v.string(),
|
|
66
|
+
lock_tx_id: v.string(),
|
|
67
|
+
locked: v.string(),
|
|
68
|
+
lock_height: v.number(),
|
|
69
|
+
burnchain_lock_height: v.number(),
|
|
70
|
+
burnchain_unlock_height: v.number()
|
|
71
|
+
}),
|
|
72
|
+
fungible_tokens: v.record(
|
|
73
|
+
v.string(),
|
|
74
|
+
v.object({
|
|
75
|
+
balance: v.string(),
|
|
76
|
+
total_sent: v.string(),
|
|
77
|
+
total_received: v.string()
|
|
78
|
+
})
|
|
79
|
+
),
|
|
80
|
+
non_fungible_tokens: v.record(
|
|
81
|
+
v.string(),
|
|
82
|
+
v.object({
|
|
83
|
+
count: v.string(),
|
|
84
|
+
total_sent: v.string(),
|
|
85
|
+
total_received: v.string()
|
|
86
|
+
})
|
|
87
|
+
)
|
|
88
|
+
});
|
|
89
|
+
async function balances(opts) {
|
|
90
|
+
const search = new URLSearchParams();
|
|
91
|
+
if (opts.unanchored) search.append("unanchored", "true");
|
|
92
|
+
if (opts.untilBlock) search.append("until_block", opts.untilBlock.toString());
|
|
93
|
+
const init = {};
|
|
94
|
+
if (opts.apiKeyConfig) {
|
|
95
|
+
init.headers = {
|
|
96
|
+
[opts.apiKeyConfig.header]: opts.apiKeyConfig.key
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const endpoint = `${opts.baseUrl}/extended/v1/address/${opts.principal}/balances?${search}`;
|
|
100
|
+
const res = await fetch(endpoint, init);
|
|
101
|
+
if (!res.ok) {
|
|
102
|
+
return error({
|
|
103
|
+
name: "FetchBalancesError",
|
|
104
|
+
message: "Failed to fetch balances.",
|
|
105
|
+
data: {
|
|
106
|
+
status: res.status,
|
|
107
|
+
statusText: res.statusText,
|
|
108
|
+
bodyParseResult: await safePromise(res.json())
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
113
|
+
if (jsonError) {
|
|
114
|
+
return error({
|
|
115
|
+
name: "ParseBodyError",
|
|
116
|
+
message: "Failed to parse response body as JSON.",
|
|
117
|
+
data: jsonError
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const validationResult = v.safeParse(responseSchema, data);
|
|
121
|
+
if (!validationResult.success) {
|
|
122
|
+
return error({
|
|
123
|
+
name: "ValidateDataError",
|
|
124
|
+
message: "Failed to validate data.",
|
|
125
|
+
data: validationResult
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return success(validationResult.output);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// src/stacks-api/accounts/index.ts
|
|
132
|
+
var accounts = {
|
|
133
|
+
balances
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// src/stacks-api/types.ts
|
|
137
|
+
var v2 = __toESM(require("valibot"), 1);
|
|
138
|
+
var baseListResponseSchema = v2.object({
|
|
139
|
+
limit: v2.number(),
|
|
140
|
+
offset: v2.number(),
|
|
141
|
+
total: v2.number(),
|
|
142
|
+
results: v2.array(v2.unknown())
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// src/stacks-api/blocks/get-block.ts
|
|
146
|
+
var v3 = __toESM(require("valibot"), 1);
|
|
147
|
+
var responseSchema2 = v3.object({
|
|
148
|
+
canonical: v3.boolean(),
|
|
149
|
+
height: v3.number(),
|
|
150
|
+
hash: v3.string(),
|
|
151
|
+
block_time: v3.number(),
|
|
152
|
+
block_time_iso: v3.string(),
|
|
153
|
+
index_block_hash: v3.string(),
|
|
154
|
+
parent_block_hash: v3.string(),
|
|
155
|
+
parent_index_block_hash: v3.string(),
|
|
156
|
+
burn_block_time: v3.number(),
|
|
157
|
+
burn_block_time_iso: v3.string(),
|
|
158
|
+
burn_block_hash: v3.string(),
|
|
159
|
+
burn_block_height: v3.number(),
|
|
160
|
+
miner_txid: v3.string(),
|
|
161
|
+
tx_count: v3.number(),
|
|
162
|
+
execution_cost_read_count: v3.number(),
|
|
163
|
+
execution_cost_read_length: v3.number(),
|
|
164
|
+
execution_cost_runtime: v3.number(),
|
|
165
|
+
execution_cost_write_count: v3.number(),
|
|
166
|
+
execution_cost_write_length: v3.number()
|
|
167
|
+
});
|
|
168
|
+
async function getBlock(opts) {
|
|
169
|
+
const init = {};
|
|
170
|
+
if (opts.apiKeyConfig) {
|
|
171
|
+
init.headers = {
|
|
172
|
+
[opts.apiKeyConfig.header]: opts.apiKeyConfig.key
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const res = await fetch(
|
|
176
|
+
`${opts.baseUrl}/extended/v2/blocks/${opts.heightOrHash}`,
|
|
177
|
+
init
|
|
178
|
+
);
|
|
179
|
+
if (!res.ok) {
|
|
180
|
+
return error({
|
|
181
|
+
name: "FetchBlockError",
|
|
182
|
+
message: "Failed to fetch block.",
|
|
183
|
+
data: {
|
|
184
|
+
status: res.status,
|
|
185
|
+
statusText: res.statusText,
|
|
186
|
+
bodyParseResult: await safePromise(res.json())
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
191
|
+
if (jsonError) {
|
|
192
|
+
return error({
|
|
193
|
+
name: "ParseBodyError",
|
|
194
|
+
message: "Failed to parse body.",
|
|
195
|
+
data: jsonError
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
const validationResult = v3.safeParse(responseSchema2, data);
|
|
199
|
+
if (!validationResult.success) {
|
|
200
|
+
return error({
|
|
201
|
+
name: "ValidateDataError",
|
|
202
|
+
message: "Failed to validate data.",
|
|
203
|
+
data: validationResult
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
return success(validationResult.output);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// src/stacks-api/blocks/index.ts
|
|
210
|
+
var blocks = {
|
|
211
|
+
getBlock
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
// src/stacks-api/info/core-api.ts
|
|
215
|
+
var v4 = __toESM(require("valibot"), 1);
|
|
216
|
+
var CoreApiResponseSchema = v4.object({
|
|
217
|
+
peer_version: v4.number(),
|
|
218
|
+
pox_consensus: v4.string(),
|
|
219
|
+
burn_block_height: v4.number(),
|
|
220
|
+
stable_pox_consensus: v4.string(),
|
|
221
|
+
stable_burn_block_height: v4.number(),
|
|
222
|
+
server_version: v4.string(),
|
|
223
|
+
network_id: v4.number(),
|
|
224
|
+
parent_network_id: v4.number(),
|
|
225
|
+
stacks_tip_height: v4.number(),
|
|
226
|
+
stacks_tip: v4.string(),
|
|
227
|
+
stacks_tip_consensus_hash: v4.string(),
|
|
228
|
+
unanchored_tip: v4.string(),
|
|
229
|
+
exit_at_block_height: v4.number()
|
|
230
|
+
});
|
|
231
|
+
async function coreApi(apiOpts) {
|
|
232
|
+
const init = {};
|
|
233
|
+
if (apiOpts.apiKeyConfig) {
|
|
234
|
+
init.headers = {
|
|
235
|
+
[apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
const res = await fetch(`${apiOpts.baseUrl}/v2/info`, init);
|
|
239
|
+
if (!res.ok) {
|
|
240
|
+
return error({
|
|
241
|
+
name: "FetchCoreApiError",
|
|
242
|
+
message: "Failed to fetch.",
|
|
243
|
+
data: {
|
|
244
|
+
status: res.status,
|
|
245
|
+
statusText: res.statusText,
|
|
246
|
+
bodyParseResult: await safePromise(res.json())
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
const [parseBodyError, data] = await safePromise(res.json());
|
|
251
|
+
if (parseBodyError) {
|
|
252
|
+
return error({
|
|
253
|
+
name: "ParseBodyError",
|
|
254
|
+
message: "Failed to parse response body as JSON.",
|
|
255
|
+
data: parseBodyError
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
const validationResult = v4.safeParse(CoreApiResponseSchema, data);
|
|
259
|
+
if (!validationResult.success) {
|
|
260
|
+
return error({
|
|
261
|
+
name: "ValidateDataError",
|
|
262
|
+
message: "Failed to validate data.",
|
|
263
|
+
data: validationResult
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
return success(validationResult.output);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// src/stacks-api/info/pox-details.ts
|
|
270
|
+
var v5 = __toESM(require("valibot"), 1);
|
|
271
|
+
var poxDetailsResponseSchema = v5.object({
|
|
272
|
+
contract_id: v5.string(),
|
|
273
|
+
pox_activation_threshold_ustx: v5.number(),
|
|
274
|
+
first_burnchain_block_height: v5.number(),
|
|
275
|
+
current_burnchain_block_height: v5.number(),
|
|
276
|
+
prepare_phase_block_length: v5.number(),
|
|
277
|
+
reward_phase_block_length: v5.number(),
|
|
278
|
+
reward_slots: v5.number(),
|
|
279
|
+
rejection_fraction: v5.null(),
|
|
280
|
+
total_liquid_supply_ustx: v5.number(),
|
|
281
|
+
current_cycle: v5.object({
|
|
282
|
+
id: v5.number(),
|
|
283
|
+
min_threshold_ustx: v5.number(),
|
|
284
|
+
stacked_ustx: v5.number(),
|
|
285
|
+
is_pox_active: v5.boolean()
|
|
286
|
+
}),
|
|
287
|
+
next_cycle: v5.object({
|
|
288
|
+
id: v5.number(),
|
|
289
|
+
min_threshold_ustx: v5.number(),
|
|
290
|
+
min_increment_ustx: v5.number(),
|
|
291
|
+
stacked_ustx: v5.number(),
|
|
292
|
+
prepare_phase_start_block_height: v5.number(),
|
|
293
|
+
blocks_until_prepare_phase: v5.number(),
|
|
294
|
+
reward_phase_start_block_height: v5.number(),
|
|
295
|
+
blocks_until_reward_phase: v5.number(),
|
|
296
|
+
ustx_until_pox_rejection: v5.null()
|
|
297
|
+
}),
|
|
298
|
+
epochs: v5.array(
|
|
299
|
+
v5.object({
|
|
300
|
+
epoch_id: v5.string(),
|
|
301
|
+
start_height: v5.number(),
|
|
302
|
+
end_height: v5.number(),
|
|
303
|
+
block_limit: v5.object({
|
|
304
|
+
write_length: v5.number(),
|
|
305
|
+
write_count: v5.number(),
|
|
306
|
+
read_length: v5.number(),
|
|
307
|
+
read_count: v5.number(),
|
|
308
|
+
runtime: v5.number()
|
|
309
|
+
}),
|
|
310
|
+
network_epoch: v5.number()
|
|
311
|
+
})
|
|
312
|
+
),
|
|
313
|
+
min_amount_ustx: v5.number(),
|
|
314
|
+
prepare_cycle_length: v5.number(),
|
|
315
|
+
reward_cycle_id: v5.number(),
|
|
316
|
+
reward_cycle_length: v5.number(),
|
|
317
|
+
rejection_votes_left_required: v5.null(),
|
|
318
|
+
next_reward_cycle_in: v5.number(),
|
|
319
|
+
contract_versions: v5.array(
|
|
320
|
+
v5.object({
|
|
321
|
+
contract_id: v5.string(),
|
|
322
|
+
activation_burnchain_block_height: v5.number(),
|
|
323
|
+
first_reward_cycle_id: v5.number()
|
|
324
|
+
})
|
|
325
|
+
)
|
|
326
|
+
});
|
|
327
|
+
async function poxDetails(args) {
|
|
328
|
+
const init = {};
|
|
329
|
+
if (args.apiKeyConfig) {
|
|
330
|
+
init.headers = {
|
|
331
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
const res = await fetch(`${args.baseUrl}/v2/pox`, init);
|
|
335
|
+
if (!res.ok) {
|
|
336
|
+
return error({
|
|
337
|
+
name: "FetchPoxDetailsError",
|
|
338
|
+
message: "Failed to fetch pox details.",
|
|
339
|
+
data: {
|
|
340
|
+
status: res.status,
|
|
341
|
+
statusText: res.statusText,
|
|
342
|
+
bodyParseResult: await safePromise(res.json())
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
const [jsonParseError, data] = await safePromise(res.json());
|
|
347
|
+
if (jsonParseError) {
|
|
348
|
+
return error({
|
|
349
|
+
name: "ParseBodyError",
|
|
350
|
+
message: "Failed to parse pox details response.",
|
|
351
|
+
data: jsonParseError
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
const validationResult = v5.safeParse(poxDetailsResponseSchema, data);
|
|
355
|
+
if (!validationResult.success) {
|
|
356
|
+
return error({
|
|
357
|
+
name: "ValidateDataError",
|
|
358
|
+
message: "Failed to parse pox details response.",
|
|
359
|
+
data: validationResult
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
return success(validationResult.output);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// src/stacks-api/info/index.ts
|
|
366
|
+
var info = {
|
|
367
|
+
coreApi,
|
|
368
|
+
poxDetails
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
// src/stacks-api/proof-of-transfer/cycle.ts
|
|
372
|
+
var v6 = __toESM(require("valibot"), 1);
|
|
373
|
+
var responseSchema3 = v6.object({
|
|
374
|
+
block_height: v6.number(),
|
|
375
|
+
index_block_hash: v6.string(),
|
|
376
|
+
cycle_number: v6.number(),
|
|
377
|
+
total_weight: v6.number(),
|
|
378
|
+
total_stacked_amount: v6.string(),
|
|
379
|
+
total_signers: v6.number()
|
|
380
|
+
});
|
|
381
|
+
async function cycle(opts) {
|
|
382
|
+
const init = {};
|
|
383
|
+
if (opts.apiKeyConfig) {
|
|
384
|
+
init.headers = {
|
|
385
|
+
[opts.apiKeyConfig.header]: opts.apiKeyConfig.key
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}`;
|
|
389
|
+
const res = await fetch(endpoint, init);
|
|
390
|
+
if (!res.ok) {
|
|
391
|
+
return error({
|
|
392
|
+
name: "FetchCycleError",
|
|
393
|
+
message: "Failed to fetch cycle.",
|
|
394
|
+
data: {
|
|
395
|
+
endpoint,
|
|
396
|
+
status: res.status,
|
|
397
|
+
statusText: res.statusText,
|
|
398
|
+
bodyParseResult: await safePromise(res.json())
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
403
|
+
if (jsonError) {
|
|
404
|
+
return error({
|
|
405
|
+
name: "ParseBodyError",
|
|
406
|
+
message: "Failed to parse response body as JSON.",
|
|
407
|
+
data: jsonError
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
const validationResult = v6.safeParse(responseSchema3, data);
|
|
411
|
+
if (!validationResult.success) {
|
|
412
|
+
return error({
|
|
413
|
+
name: "ValidateDataError",
|
|
414
|
+
message: "Failed to validate data.",
|
|
415
|
+
data: validationResult
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
return success(validationResult.output);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// src/stacks-api/proof-of-transfer/cycles.ts
|
|
422
|
+
var v7 = __toESM(require("valibot"), 1);
|
|
423
|
+
var cycleInfoSchema = v7.object({
|
|
424
|
+
block_height: v7.number(),
|
|
425
|
+
index_block_hash: v7.string(),
|
|
426
|
+
cycle_number: v7.number(),
|
|
427
|
+
total_weight: v7.number(),
|
|
428
|
+
total_stacked_amount: v7.string(),
|
|
429
|
+
total_signers: v7.number()
|
|
430
|
+
});
|
|
431
|
+
var resultsSchema = v7.array(cycleInfoSchema);
|
|
432
|
+
var cyclesResponseSchema = v7.object({
|
|
433
|
+
...baseListResponseSchema.entries,
|
|
434
|
+
results: resultsSchema
|
|
435
|
+
});
|
|
436
|
+
async function cycles(args) {
|
|
437
|
+
const search = new URLSearchParams();
|
|
438
|
+
if (args.limit) search.append("limit", args.limit.toString());
|
|
439
|
+
if (args.offset) search.append("offset", args.offset.toString());
|
|
440
|
+
const init = {};
|
|
441
|
+
if (args.apiKeyConfig) {
|
|
442
|
+
init.headers = {
|
|
443
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
const endpoint = `${args.baseUrl}/extended/v2/pox/cycles`;
|
|
447
|
+
const res = await fetch(endpoint, init);
|
|
448
|
+
if (!res.ok) {
|
|
449
|
+
return error({
|
|
450
|
+
name: "FetchCyclesError",
|
|
451
|
+
message: "Failed to fetch cycles.",
|
|
452
|
+
data: {
|
|
453
|
+
endpoint,
|
|
454
|
+
status: res.status,
|
|
455
|
+
statusText: res.statusText,
|
|
456
|
+
bodyParseResult: await safePromise(res.json())
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
461
|
+
if (jsonError) {
|
|
462
|
+
return error({
|
|
463
|
+
name: "ParseBodyError",
|
|
464
|
+
message: "Failed to parse response body as JSON.",
|
|
465
|
+
data: jsonError
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
const validationResult = v7.safeParse(cyclesResponseSchema, data);
|
|
469
|
+
if (!validationResult.success) {
|
|
470
|
+
return error({
|
|
471
|
+
name: "ValidateDataError",
|
|
472
|
+
message: "Failed to validate response data.",
|
|
473
|
+
data: validationResult
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
return success(validationResult.output);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// src/stacks-api/proof-of-transfer/signer-in-cycle.ts
|
|
480
|
+
var v8 = __toESM(require("valibot"), 1);
|
|
481
|
+
var signerInCycleResponseSchema = v8.object({
|
|
482
|
+
signing_key: v8.string(),
|
|
483
|
+
signer_address: v8.string(),
|
|
484
|
+
weight: v8.number(),
|
|
485
|
+
stacked_amount: v8.string(),
|
|
486
|
+
weight_percent: v8.number(),
|
|
487
|
+
stacked_amount_percent: v8.number(),
|
|
488
|
+
solo_stacker_count: v8.number(),
|
|
489
|
+
pooled_stacker_count: v8.number()
|
|
490
|
+
});
|
|
491
|
+
async function signerInCycle(args) {
|
|
492
|
+
const init = {};
|
|
493
|
+
if (args.apiKeyConfig) {
|
|
494
|
+
init.headers = {
|
|
495
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
const signerPublicKey = args.signerPublicKey.startsWith("0x") ? args.signerPublicKey : `0x${args.signerPublicKey}`;
|
|
499
|
+
const endpoint = `${args.baseUrl}/extended/v2/pox/cycles/${args.cycleId}/signers/${signerPublicKey}`;
|
|
500
|
+
const res = await fetch(endpoint, init);
|
|
501
|
+
if (!res.ok) {
|
|
502
|
+
return error({
|
|
503
|
+
name: "FetchSignerInCycleError",
|
|
504
|
+
message: "Failed to fetch signer in cycle.",
|
|
505
|
+
data: {
|
|
506
|
+
status: res.status,
|
|
507
|
+
statusText: res.statusText
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
512
|
+
if (jsonError) {
|
|
513
|
+
return error({
|
|
514
|
+
name: "ParseBodyError",
|
|
515
|
+
message: "Failed to parse response body.",
|
|
516
|
+
data: {
|
|
517
|
+
signerPublicKey: args.signerPublicKey,
|
|
518
|
+
cycleId: args.cycleId,
|
|
519
|
+
jsonError
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
const validationResult = v8.safeParse(signerInCycleResponseSchema, data);
|
|
524
|
+
if (!validationResult.success) {
|
|
525
|
+
return error({
|
|
526
|
+
name: "ValidateDataError",
|
|
527
|
+
message: "Failed to validate response data.",
|
|
528
|
+
data: validationResult.issues
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
return success(validationResult.output);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// src/stacks-api/proof-of-transfer/signers-in-cycle.ts
|
|
535
|
+
var v9 = __toESM(require("valibot"), 1);
|
|
536
|
+
var signerSchema = v9.object({
|
|
537
|
+
signing_key: v9.string(),
|
|
538
|
+
signer_address: v9.string(),
|
|
539
|
+
weight: v9.number(),
|
|
540
|
+
stacked_amount: v9.string(),
|
|
541
|
+
weight_percent: v9.number(),
|
|
542
|
+
stacked_amount_percent: v9.number(),
|
|
543
|
+
pooled_stacker_count: v9.number(),
|
|
544
|
+
solo_stacker_count: v9.number()
|
|
545
|
+
});
|
|
546
|
+
var resultsSchema2 = v9.array(signerSchema);
|
|
547
|
+
var signersResponseSchema = v9.object({
|
|
548
|
+
...baseListResponseSchema.entries,
|
|
549
|
+
results: resultsSchema2
|
|
550
|
+
});
|
|
551
|
+
async function signersInCycle(args) {
|
|
552
|
+
const search = new URLSearchParams();
|
|
553
|
+
if (args.limit) search.append("limit", args.limit.toString());
|
|
554
|
+
if (args.offset) search.append("offset", args.offset.toString());
|
|
555
|
+
const init = {};
|
|
556
|
+
if (args.apiKeyConfig) {
|
|
557
|
+
init.headers = {
|
|
558
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
const endpoint = `${args.baseUrl}/extended/v2/pox/cycles/${args.cycleNumber}/signers`;
|
|
562
|
+
const res = await fetch(endpoint, init);
|
|
563
|
+
if (!res.ok) {
|
|
564
|
+
return error({
|
|
565
|
+
name: "FetchSignersError",
|
|
566
|
+
message: "Failed to fetch signers.",
|
|
567
|
+
data: {
|
|
568
|
+
endpoint,
|
|
569
|
+
status: res.status,
|
|
570
|
+
statusText: res.statusText,
|
|
571
|
+
bodyParseResult: await safePromise(res.json())
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
576
|
+
if (jsonError) {
|
|
577
|
+
return error({
|
|
578
|
+
name: "ParseBodyError",
|
|
579
|
+
message: "Failed to parse response body as JSON.",
|
|
580
|
+
data: {
|
|
581
|
+
endpoint,
|
|
582
|
+
bodyParseResult: data
|
|
583
|
+
}
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
const validationResult = v9.safeParse(signersResponseSchema, data);
|
|
587
|
+
if (!validationResult.success) {
|
|
588
|
+
return error({
|
|
589
|
+
name: "ValidateDataError",
|
|
590
|
+
message: "Failed to validate response data.",
|
|
591
|
+
data: validationResult
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
return success(validationResult.output);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
// src/stacks-api/proof-of-transfer/stackers-for-signer-in-cycle.ts
|
|
598
|
+
var v10 = __toESM(require("valibot"), 1);
|
|
599
|
+
var stackerInfoSchema = v10.object({
|
|
600
|
+
stacker_address: v10.string(),
|
|
601
|
+
stacked_amount: v10.string(),
|
|
602
|
+
pox_address: v10.string(),
|
|
603
|
+
stacker_type: v10.union([v10.literal("pooled"), v10.literal("solo")])
|
|
604
|
+
});
|
|
605
|
+
var resultsSchema3 = v10.array(stackerInfoSchema);
|
|
606
|
+
var stackersForSignerInCycleResponseSchema = v10.object({
|
|
607
|
+
...baseListResponseSchema.entries,
|
|
608
|
+
results: resultsSchema3
|
|
609
|
+
});
|
|
610
|
+
async function stackersForSignerInCycle(opts) {
|
|
611
|
+
const search = new URLSearchParams();
|
|
612
|
+
if (opts.limit) search.append("limit", opts.limit.toString());
|
|
613
|
+
if (opts.offset) search.append("offset", opts.offset.toString());
|
|
614
|
+
const init = {};
|
|
615
|
+
if (opts.apiKeyConfig) {
|
|
616
|
+
init.headers = {
|
|
617
|
+
[opts.apiKeyConfig.header]: opts.apiKeyConfig.key
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
const endpoint = `${opts.baseUrl}/extended/v2/pox/cycles/${opts.cycleNumber}/signers/${opts.signerPublicKey}/stackers?${search}`;
|
|
621
|
+
const res = await fetch(endpoint, init);
|
|
622
|
+
if (!res.ok) {
|
|
623
|
+
return error({
|
|
624
|
+
name: "FetchStackersForSignerInCycleError",
|
|
625
|
+
message: "Failed to fetch stackers for signer in cycle.",
|
|
626
|
+
data: {
|
|
627
|
+
endpoint,
|
|
628
|
+
status: res.status,
|
|
629
|
+
statusText: res.statusText,
|
|
630
|
+
bodyParseResult: await safePromise(res.json())
|
|
631
|
+
}
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
635
|
+
if (jsonError) {
|
|
636
|
+
return error({
|
|
637
|
+
name: "ParseBodyError",
|
|
638
|
+
message: "Failed to parse response body as JSON.",
|
|
639
|
+
data: jsonError
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
const validationResult = v10.safeParse(
|
|
643
|
+
stackersForSignerInCycleResponseSchema,
|
|
644
|
+
data
|
|
645
|
+
);
|
|
646
|
+
if (!validationResult.success) {
|
|
647
|
+
return error({
|
|
648
|
+
name: "ValidateDataError",
|
|
649
|
+
message: "Failed to validate response data.",
|
|
650
|
+
data: validationResult
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
return success(validationResult.output);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// src/stacks-api/proof-of-transfer/index.ts
|
|
657
|
+
var proofOfTransfer = {
|
|
658
|
+
cycle,
|
|
659
|
+
cycles,
|
|
660
|
+
signerInCycle,
|
|
661
|
+
signersInCycle,
|
|
662
|
+
stackersForSignerInCycle
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
// src/stacks-api/smart-contracts/read-only.ts
|
|
666
|
+
var v11 = __toESM(require("valibot"), 1);
|
|
667
|
+
var readOnlyResponseSchema = v11.variant("okay", [
|
|
668
|
+
v11.object({
|
|
669
|
+
okay: v11.literal(true),
|
|
670
|
+
result: v11.string()
|
|
671
|
+
}),
|
|
672
|
+
v11.object({
|
|
673
|
+
okay: v11.literal(false),
|
|
674
|
+
cause: v11.unknown()
|
|
675
|
+
})
|
|
676
|
+
]);
|
|
677
|
+
async function readOnly(opts, apiOpts) {
|
|
678
|
+
const init = {};
|
|
679
|
+
if (apiOpts.apiKeyConfig) {
|
|
680
|
+
init.headers = {
|
|
681
|
+
[apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
|
|
682
|
+
};
|
|
683
|
+
}
|
|
684
|
+
const res = await fetch(
|
|
685
|
+
`${apiOpts.baseUrl}/v2/contracts/call-read/${opts.contractAddress}/${opts.contractName}/${opts.functionName}`,
|
|
686
|
+
init
|
|
687
|
+
);
|
|
688
|
+
if (!res.ok) {
|
|
689
|
+
return error({
|
|
690
|
+
name: "FetchReadOnlyError",
|
|
691
|
+
message: "Failed to fetch.",
|
|
692
|
+
data: {
|
|
693
|
+
status: res.status,
|
|
694
|
+
statusText: res.statusText,
|
|
695
|
+
bodyParseResult: await safePromise(res.json())
|
|
696
|
+
}
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
const [jsonError, data] = await safePromise(res.json());
|
|
700
|
+
if (jsonError) {
|
|
701
|
+
return error({
|
|
702
|
+
name: "ParseBodyError",
|
|
703
|
+
message: "Failed to parse response body as JSON.",
|
|
704
|
+
data: error
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
const validationResult = v11.safeParse(readOnlyResponseSchema, data);
|
|
708
|
+
if (!validationResult.success) {
|
|
709
|
+
return error({
|
|
710
|
+
name: "ValidateDataError",
|
|
711
|
+
message: "Failed to validate data.",
|
|
712
|
+
data: validationResult
|
|
713
|
+
});
|
|
714
|
+
}
|
|
715
|
+
return success(validationResult.output);
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// src/stacks-api/smart-contracts/index.ts
|
|
719
|
+
var smartContracts = {
|
|
720
|
+
readOnly
|
|
721
|
+
};
|
|
722
|
+
|
|
723
|
+
// src/stacks-api/stacking-pool/members.ts
|
|
724
|
+
var v12 = __toESM(require("valibot"), 1);
|
|
725
|
+
var memberSchema = v12.object({
|
|
726
|
+
stacker: v12.string(),
|
|
727
|
+
pox_addr: v12.optional(v12.string()),
|
|
728
|
+
amount_ustx: v12.string(),
|
|
729
|
+
burn_block_unlock_height: v12.optional(v12.number()),
|
|
730
|
+
block_height: v12.number(),
|
|
731
|
+
tx_id: v12.string()
|
|
732
|
+
});
|
|
733
|
+
var membersResponseSchema = v12.object({
|
|
734
|
+
limit: v12.number(),
|
|
735
|
+
offset: v12.number(),
|
|
736
|
+
total: v12.number(),
|
|
737
|
+
results: v12.array(memberSchema)
|
|
738
|
+
});
|
|
739
|
+
async function members(opts, apiOpts) {
|
|
740
|
+
const search = new URLSearchParams();
|
|
741
|
+
if (opts.afterBlock) search.append("after_block", opts.afterBlock.toString());
|
|
742
|
+
if (opts.unanchored) search.append("unanchored", "true");
|
|
743
|
+
if (opts.limit) search.append("limit", opts.limit.toString());
|
|
744
|
+
if (opts.offset) search.append("offset", opts.offset.toString());
|
|
745
|
+
const init = {};
|
|
746
|
+
if (apiOpts.apiKeyConfig) {
|
|
747
|
+
init.headers = {
|
|
748
|
+
[apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
|
|
749
|
+
};
|
|
750
|
+
}
|
|
751
|
+
const res = await fetch(
|
|
752
|
+
`${apiOpts.baseUrl}/extended/beta/stacking/${opts.poolPrincipal}/delegations?${search}`,
|
|
753
|
+
init
|
|
754
|
+
);
|
|
755
|
+
if (!res.ok) {
|
|
756
|
+
return error({
|
|
757
|
+
name: "FetchMembersError",
|
|
758
|
+
message: "Failed to fetch members.",
|
|
759
|
+
data: {
|
|
760
|
+
status: res.status,
|
|
761
|
+
statusText: res.statusText,
|
|
762
|
+
bodyParseResult: await safePromise(res.json())
|
|
763
|
+
}
|
|
764
|
+
});
|
|
765
|
+
}
|
|
766
|
+
const [jsonParseError, data] = await safePromise(res.json());
|
|
767
|
+
if (jsonParseError) {
|
|
768
|
+
return error({
|
|
769
|
+
name: "ParseBodyError",
|
|
770
|
+
message: "Failed to parse response body as JSON.",
|
|
771
|
+
data: jsonParseError
|
|
772
|
+
});
|
|
773
|
+
}
|
|
774
|
+
const validationResult = v12.safeParse(membersResponseSchema, data);
|
|
775
|
+
if (!validationResult.success) {
|
|
776
|
+
return error({
|
|
777
|
+
name: "ValidateDataError",
|
|
778
|
+
message: "Failed to validate data.",
|
|
779
|
+
data: validationResult
|
|
780
|
+
});
|
|
781
|
+
}
|
|
782
|
+
return success(validationResult.output);
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
// src/stacks-api/stacking-pool/index.ts
|
|
786
|
+
var stackingPool = {
|
|
787
|
+
members
|
|
788
|
+
};
|
|
789
|
+
|
|
790
|
+
// src/stacks-api/transactions/schemas.ts
|
|
791
|
+
var v13 = __toESM(require("valibot"), 1);
|
|
792
|
+
var baseTransactionSchema = v13.object({
|
|
793
|
+
tx_id: v13.string(),
|
|
794
|
+
nonce: v13.number(),
|
|
795
|
+
fee_rate: v13.string(),
|
|
796
|
+
sender_address: v13.string(),
|
|
797
|
+
sponsored: v13.boolean(),
|
|
798
|
+
post_condition_mode: v13.string(),
|
|
799
|
+
post_conditions: v13.array(v13.unknown()),
|
|
800
|
+
anchor_mode: v13.string(),
|
|
801
|
+
is_unanchored: v13.boolean(),
|
|
802
|
+
block_hash: v13.string(),
|
|
803
|
+
parent_block_hash: v13.string(),
|
|
804
|
+
block_height: v13.number(),
|
|
805
|
+
block_time: v13.number(),
|
|
806
|
+
block_time_iso: v13.string(),
|
|
807
|
+
burn_block_height: v13.number(),
|
|
808
|
+
burn_block_time: v13.number(),
|
|
809
|
+
burn_block_time_iso: v13.string(),
|
|
810
|
+
parent_burn_block_time: v13.number(),
|
|
811
|
+
parent_burn_block_time_iso: v13.string(),
|
|
812
|
+
canonical: v13.boolean(),
|
|
813
|
+
tx_index: v13.number(),
|
|
814
|
+
tx_status: v13.string(),
|
|
815
|
+
tx_result: v13.object({
|
|
816
|
+
hex: v13.string(),
|
|
817
|
+
repr: v13.string()
|
|
818
|
+
}),
|
|
819
|
+
microblock_hash: v13.string(),
|
|
820
|
+
microblock_sequence: v13.number(),
|
|
821
|
+
microblock_canonical: v13.boolean(),
|
|
822
|
+
event_count: v13.number(),
|
|
823
|
+
events: v13.array(v13.unknown()),
|
|
824
|
+
execution_cost_read_count: v13.number(),
|
|
825
|
+
execution_cost_read_length: v13.number(),
|
|
826
|
+
execution_cost_runtime: v13.number(),
|
|
827
|
+
execution_cost_write_count: v13.number(),
|
|
828
|
+
execution_cost_write_length: v13.number()
|
|
829
|
+
});
|
|
830
|
+
var contractCallTransactionSchema = v13.object({
|
|
831
|
+
tx_type: v13.literal("contract_call"),
|
|
832
|
+
contract_call: v13.object({
|
|
833
|
+
contract_id: v13.string(),
|
|
834
|
+
function_name: v13.string(),
|
|
835
|
+
function_signature: v13.string(),
|
|
836
|
+
function_args: v13.array(
|
|
837
|
+
v13.object({
|
|
838
|
+
hex: v13.string(),
|
|
839
|
+
repr: v13.string(),
|
|
840
|
+
name: v13.string(),
|
|
841
|
+
type: v13.string()
|
|
842
|
+
})
|
|
843
|
+
)
|
|
844
|
+
}),
|
|
845
|
+
...baseTransactionSchema.entries
|
|
846
|
+
});
|
|
847
|
+
var smartContractTransactionSchema = v13.object({
|
|
848
|
+
tx_type: v13.literal("smart_contract"),
|
|
849
|
+
smart_contract: v13.object({
|
|
850
|
+
/**
|
|
851
|
+
* NOTE: The types may be wrong, not sure what type of value is used when
|
|
852
|
+
* the version is not `null`.
|
|
853
|
+
*/
|
|
854
|
+
clarity_version: v13.union([v13.null(), v13.number()]),
|
|
855
|
+
contract_id: v13.string(),
|
|
856
|
+
source_code: v13.string()
|
|
857
|
+
}),
|
|
858
|
+
...baseTransactionSchema.entries
|
|
859
|
+
});
|
|
860
|
+
var tokenTransferSchema = v13.object({
|
|
861
|
+
tx_type: v13.literal("token_transfer"),
|
|
862
|
+
token_transfer: v13.object({
|
|
863
|
+
recipient_address: v13.string(),
|
|
864
|
+
amount: v13.string(),
|
|
865
|
+
memo: v13.string()
|
|
866
|
+
}),
|
|
867
|
+
...baseTransactionSchema.entries
|
|
868
|
+
});
|
|
869
|
+
var transactionSchema = v13.variant("tx_type", [
|
|
870
|
+
contractCallTransactionSchema,
|
|
871
|
+
smartContractTransactionSchema,
|
|
872
|
+
tokenTransferSchema
|
|
873
|
+
]);
|
|
874
|
+
|
|
875
|
+
// src/stacks-api/transactions/address-transactions.ts
|
|
876
|
+
var v14 = __toESM(require("valibot"), 1);
|
|
877
|
+
var resultSchema = v14.object({
|
|
878
|
+
tx: transactionSchema,
|
|
879
|
+
stx_sent: v14.string(),
|
|
880
|
+
stx_received: v14.string(),
|
|
881
|
+
events: v14.object({
|
|
882
|
+
stx: v14.object({
|
|
883
|
+
transfer: v14.number(),
|
|
884
|
+
mint: v14.number(),
|
|
885
|
+
burn: v14.number()
|
|
886
|
+
}),
|
|
887
|
+
ft: v14.object({
|
|
888
|
+
transfer: v14.number(),
|
|
889
|
+
mint: v14.number(),
|
|
890
|
+
burn: v14.number()
|
|
891
|
+
}),
|
|
892
|
+
nft: v14.object({
|
|
893
|
+
transfer: v14.number(),
|
|
894
|
+
mint: v14.number(),
|
|
895
|
+
burn: v14.number()
|
|
896
|
+
})
|
|
897
|
+
})
|
|
898
|
+
});
|
|
899
|
+
var resultsSchema4 = v14.array(resultSchema);
|
|
900
|
+
var addressTransactionsResponseSchema = v14.object({
|
|
901
|
+
...baseListResponseSchema.entries,
|
|
902
|
+
results: resultsSchema4
|
|
903
|
+
});
|
|
904
|
+
async function addressTransactions(args) {
|
|
905
|
+
const search = new URLSearchParams();
|
|
906
|
+
if (args.limit) search.append("limit", args.limit.toString());
|
|
907
|
+
if (args.offset) search.append("offset", args.offset.toString());
|
|
908
|
+
const init = {};
|
|
909
|
+
if (args.apiKeyConfig) {
|
|
910
|
+
init.headers = {
|
|
911
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
912
|
+
};
|
|
913
|
+
}
|
|
914
|
+
const res = await fetch(
|
|
915
|
+
`${args.baseUrl}/extended/v2/addresses/${args.address}/transactions?${search}`,
|
|
916
|
+
init
|
|
917
|
+
);
|
|
918
|
+
if (!res.ok) {
|
|
919
|
+
return error({
|
|
920
|
+
name: "FetchAddressTransactionsError",
|
|
921
|
+
message: "Failed to fetch address transactions.",
|
|
922
|
+
data: {
|
|
923
|
+
status: res.status,
|
|
924
|
+
statusText: res.statusText,
|
|
925
|
+
bodyParseResult: await safePromise(res.json())
|
|
926
|
+
}
|
|
927
|
+
});
|
|
928
|
+
}
|
|
929
|
+
const [jsonParseError, data] = await safePromise(res.json());
|
|
930
|
+
if (jsonParseError) {
|
|
931
|
+
return error({
|
|
932
|
+
name: "ParseBodyError",
|
|
933
|
+
message: "Failed to parse response body as JSON.",
|
|
934
|
+
data: jsonParseError
|
|
935
|
+
});
|
|
936
|
+
}
|
|
937
|
+
const validationResult = v14.safeParse(addressTransactionsResponseSchema, data);
|
|
938
|
+
if (!validationResult.success) {
|
|
939
|
+
return error({
|
|
940
|
+
name: "ValidateDataError",
|
|
941
|
+
message: "Failed to validate data.",
|
|
942
|
+
data: validationResult
|
|
943
|
+
});
|
|
944
|
+
}
|
|
945
|
+
return success(validationResult.output);
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
// src/stacks-api/transactions/get-transaction.ts
|
|
949
|
+
var v15 = __toESM(require("valibot"), 1);
|
|
950
|
+
async function getTransaction(args) {
|
|
951
|
+
const init = {};
|
|
952
|
+
if (args.apiKeyConfig) {
|
|
953
|
+
init.headers = {
|
|
954
|
+
[args.apiKeyConfig.header]: args.apiKeyConfig.key
|
|
955
|
+
};
|
|
956
|
+
}
|
|
957
|
+
const endpoint = `${args.baseUrl}/extended/v1/tx/${args.transactionId}`;
|
|
958
|
+
const res = await fetch(endpoint, init);
|
|
959
|
+
if (!res.ok) {
|
|
960
|
+
return error({
|
|
961
|
+
name: "FetchTransactionError",
|
|
962
|
+
message: `Failed to fetch transaction ${args.transactionId}`,
|
|
963
|
+
response: {
|
|
964
|
+
status: res.status,
|
|
965
|
+
statusText: res.statusText,
|
|
966
|
+
body: await safePromise(res.json())
|
|
967
|
+
}
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
const [jsonParseError, data] = await safePromise(res.json());
|
|
971
|
+
if (jsonParseError) {
|
|
972
|
+
return error({
|
|
973
|
+
name: "ParseBodyError",
|
|
974
|
+
message: "Failed to parse response body as JSON.",
|
|
975
|
+
error: jsonParseError
|
|
976
|
+
});
|
|
977
|
+
}
|
|
978
|
+
const validationResult = v15.safeParse(transactionSchema, data);
|
|
979
|
+
if (!validationResult.success) {
|
|
980
|
+
return error({
|
|
981
|
+
name: "ValidateDataError",
|
|
982
|
+
message: "Failed to validate data.",
|
|
983
|
+
error: validationResult
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
return success(validationResult.output);
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
// src/stacks-api/transactions/index.ts
|
|
990
|
+
var transactions = {
|
|
991
|
+
addressTransactions,
|
|
992
|
+
getTransaction
|
|
993
|
+
};
|
|
994
|
+
|
|
995
|
+
// src/stacks-api/index.ts
|
|
996
|
+
var stacksApi = {
|
|
997
|
+
accounts,
|
|
998
|
+
blocks,
|
|
999
|
+
info,
|
|
1000
|
+
proofOfTransfer,
|
|
1001
|
+
smartContracts,
|
|
1002
|
+
stackingPool,
|
|
1003
|
+
transactions
|
|
1004
|
+
};
|
|
1005
|
+
|
|
1006
|
+
// src/utils/call-rate-limited-api.ts
|
|
1007
|
+
var import_exponential_backoff = require("exponential-backoff");
|
|
1008
|
+
async function safeCallRateLimitedApi(fn, options) {
|
|
1009
|
+
try {
|
|
1010
|
+
return await (0, import_exponential_backoff.backOff)(() => fn(), {
|
|
1011
|
+
startingDelay: options?.startingDelay ?? 15e3,
|
|
1012
|
+
numOfAttempts: options?.numOfAttempts ?? 5
|
|
1013
|
+
});
|
|
1014
|
+
} catch (error2) {
|
|
1015
|
+
return error({
|
|
1016
|
+
name: "MaxRetriesExceeded",
|
|
1017
|
+
message: "Failed to call rate limited API.",
|
|
1018
|
+
data: {
|
|
1019
|
+
error: error2
|
|
1020
|
+
}
|
|
1021
|
+
});
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
// src/queries/get-signer-stacked-amount.ts
|
|
1026
|
+
async function getSignerStackedAmount(args) {
|
|
1027
|
+
let totalLocked = 0n;
|
|
1028
|
+
const { identifier, ...rest } = args;
|
|
1029
|
+
let hasMore = true;
|
|
1030
|
+
let offset = 0;
|
|
1031
|
+
let found = false;
|
|
1032
|
+
const limit = 200;
|
|
1033
|
+
while (hasMore && !found) {
|
|
1034
|
+
const [error2, data] = await safeCallRateLimitedApi(
|
|
1035
|
+
() => signersInCycle({
|
|
1036
|
+
...rest,
|
|
1037
|
+
limit
|
|
1038
|
+
})
|
|
1039
|
+
);
|
|
1040
|
+
if (error2) {
|
|
1041
|
+
return error({
|
|
1042
|
+
name: "GetSignerTotalLockedError",
|
|
1043
|
+
message: "Failed to get signer total locked.",
|
|
1044
|
+
data: {
|
|
1045
|
+
error: error2
|
|
1046
|
+
}
|
|
1047
|
+
});
|
|
1048
|
+
}
|
|
1049
|
+
for (const signer of data.results) {
|
|
1050
|
+
if (identifier.type === "address") {
|
|
1051
|
+
if (signer.signer_address === identifier.signerAddress) {
|
|
1052
|
+
totalLocked = BigInt(signer.stacked_amount);
|
|
1053
|
+
found = true;
|
|
1054
|
+
break;
|
|
1055
|
+
}
|
|
1056
|
+
} else {
|
|
1057
|
+
if (signer.signing_key === identifier.signerPublicKey) {
|
|
1058
|
+
totalLocked = BigInt(signer.stacked_amount);
|
|
1059
|
+
found = true;
|
|
1060
|
+
break;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
offset += limit + data.results.length;
|
|
1065
|
+
hasMore = offset < data.total;
|
|
1066
|
+
}
|
|
1067
|
+
if (!found) {
|
|
1068
|
+
return error({
|
|
1069
|
+
name: "SignerNotFound",
|
|
1070
|
+
message: "Signer not found.",
|
|
1071
|
+
data: {
|
|
1072
|
+
identifier,
|
|
1073
|
+
cycle: args.cycleNumber
|
|
1074
|
+
}
|
|
1075
|
+
});
|
|
1076
|
+
}
|
|
1077
|
+
return success(totalLocked);
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
// src/queries/index.ts
|
|
1081
|
+
var queries = {
|
|
1082
|
+
getSignerStackedAmount
|
|
1083
|
+
};
|
|
1084
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
1085
|
+
0 && (module.exports = {
|
|
1086
|
+
queries,
|
|
1087
|
+
stacksApi
|
|
1088
|
+
});
|