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