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