@secretkeylabs/stacks-tools 0.4.0-0fe567d → 0.4.0-13a5f23

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 CHANGED
@@ -32,10 +32,12 @@ var src_exports = {};
32
32
  __export(src_exports, {
33
33
  callRateLimitedApi: () => callRateLimitedApi,
34
34
  error: () => error,
35
+ queries: () => queries,
35
36
  safeCall: () => safeCall,
36
37
  safeCallRateLimitedApi: () => safeCallRateLimitedApi,
37
38
  safePromise: () => safePromise,
38
39
  stacksApi: () => stacksApi,
40
+ stacksRpcApi: () => stacksRpcApi,
39
41
  success: () => success
40
42
  });
41
43
  module.exports = __toCommonJS(src_exports);
@@ -193,6 +195,12 @@ async function latestNonce(opts) {
193
195
  return success(validationResult.output);
194
196
  }
195
197
 
198
+ // src/stacks-api/accounts/index.ts
199
+ var accounts = {
200
+ balances,
201
+ latestNonce
202
+ };
203
+
196
204
  // src/stacks-api/types.ts
197
205
  var v3 = __toESM(require("valibot"), 1);
198
206
  var baseListResponseSchema = v3.object({
@@ -266,6 +274,52 @@ async function getBlock(opts) {
266
274
  return success(validationResult.output);
267
275
  }
268
276
 
277
+ // src/stacks-api/blocks/index.ts
278
+ var blocks = {
279
+ getBlock
280
+ };
281
+
282
+ // src/stacks-api/faucets/stx.ts
283
+ async function stx(opts) {
284
+ const search = new URLSearchParams();
285
+ search.append("address", opts.address);
286
+ if (opts.stacking) search.append("stacking", "true");
287
+ const init = {};
288
+ if (opts.apiKeyConfig) {
289
+ init.headers = {
290
+ [opts.apiKeyConfig.header]: opts.apiKeyConfig.key
291
+ };
292
+ }
293
+ init.method = "POST";
294
+ const endpoint = `${opts.baseUrl}/extended/v1/faucets/stx?${search}`;
295
+ const res = await fetch(endpoint, init);
296
+ if (!res.ok) {
297
+ return error({
298
+ name: "FetchStxError",
299
+ message: "Failed to fetch STX.",
300
+ data: {
301
+ status: res.status,
302
+ statusText: res.statusText,
303
+ bodyParseResult: await safePromise(res.json())
304
+ }
305
+ });
306
+ }
307
+ const [jsonError, data] = await safePromise(res.json());
308
+ if (jsonError) {
309
+ return error({
310
+ name: "ParseBodyError",
311
+ message: "Failed to parse response body as JSON.",
312
+ data: jsonError
313
+ });
314
+ }
315
+ return success(data);
316
+ }
317
+
318
+ // src/stacks-api/faucets/index.ts
319
+ var faucets = {
320
+ stx
321
+ };
322
+
269
323
  // src/stacks-api/info/core-api.ts
270
324
  var v5 = __toESM(require("valibot"), 1);
271
325
  var CoreApiResponseSchema = v5.object({
@@ -418,6 +472,12 @@ async function poxDetails(args) {
418
472
  return success(validationResult.output);
419
473
  }
420
474
 
475
+ // src/stacks-api/info/index.ts
476
+ var info = {
477
+ coreApi,
478
+ poxDetails
479
+ };
480
+
421
481
  // src/stacks-api/proof-of-transfer/cycle.ts
422
482
  var v7 = __toESM(require("valibot"), 1);
423
483
  var responseSchema4 = v7.object({
@@ -706,6 +766,15 @@ async function stackersForSignerInCycle(opts) {
706
766
  return success(validationResult.output);
707
767
  }
708
768
 
769
+ // src/stacks-api/proof-of-transfer/index.ts
770
+ var proofOfTransfer = {
771
+ cycle,
772
+ cycles,
773
+ signerInCycle,
774
+ signersInCycle,
775
+ stackersForSignerInCycle
776
+ };
777
+
709
778
  // src/stacks-api/smart-contracts/read-only.ts
710
779
  var v12 = __toESM(require("valibot"), 1);
711
780
  var readOnlyResponseSchema = v12.variant("okay", [
@@ -768,6 +837,11 @@ async function readOnly(args) {
768
837
  return success(validationResult.output);
769
838
  }
770
839
 
840
+ // src/stacks-api/smart-contracts/index.ts
841
+ var smartContracts = {
842
+ readOnly
843
+ };
844
+
771
845
  // src/stacks-api/stacking-pool/members.ts
772
846
  var v13 = __toESM(require("valibot"), 1);
773
847
  var memberSchema = v13.object({
@@ -784,22 +858,20 @@ var membersResponseSchema = v13.object({
784
858
  total: v13.number(),
785
859
  results: v13.array(memberSchema)
786
860
  });
787
- async function members(opts, apiOpts) {
861
+ async function members(args) {
788
862
  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());
863
+ if (args.afterBlock) search.append("after_block", args.afterBlock.toString());
864
+ if (args.unanchored) search.append("unanchored", "true");
865
+ if (args.limit) search.append("limit", args.limit.toString());
866
+ if (args.offset) search.append("offset", args.offset.toString());
793
867
  const init = {};
794
- if (apiOpts.apiKeyConfig) {
868
+ if (args.apiKeyConfig) {
795
869
  init.headers = {
796
- [apiOpts.apiKeyConfig.header]: apiOpts.apiKeyConfig.key
870
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
797
871
  };
798
872
  }
799
- const res = await fetch(
800
- `${apiOpts.baseUrl}/extended/beta/stacking/${opts.poolPrincipal}/delegations?${search}`,
801
- init
802
- );
873
+ const endpoint = `${args.baseUrl}/extended/v1/pox4/${args.poolPrincipal}/delegations?${search}`;
874
+ const res = await fetch(endpoint, init);
803
875
  if (!res.ok) {
804
876
  return error({
805
877
  name: "FetchMembersError",
@@ -830,6 +902,11 @@ async function members(opts, apiOpts) {
830
902
  return success(validationResult.output);
831
903
  }
832
904
 
905
+ // src/stacks-api/stacking-pool/index.ts
906
+ var stackingPool = {
907
+ members
908
+ };
909
+
833
910
  // src/stacks-api/transactions/schemas.ts
834
911
  var v14 = __toESM(require("valibot"), 1);
835
912
  var baseTransactionSchema = v14.object({
@@ -1033,20 +1110,89 @@ async function getTransaction(args) {
1033
1110
  return success(validationResult.output);
1034
1111
  }
1035
1112
 
1113
+ // src/stacks-api/transactions/index.ts
1114
+ var transactions = {
1115
+ addressTransactions,
1116
+ getTransaction
1117
+ };
1118
+
1036
1119
  // 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
1120
+ var stacksApi = {
1121
+ accounts,
1122
+ blocks,
1123
+ faucets,
1124
+ info,
1125
+ proofOfTransfer,
1126
+ smartContracts,
1127
+ stackingPool,
1128
+ transactions
1129
+ };
1130
+
1131
+ // src/stacks-rpc-api/smart-contracts/map-entry.ts
1132
+ var v17 = __toESM(require("valibot"), 1);
1133
+ var mapEntryResponseSchema = v17.object({
1134
+ /**
1135
+ * Hex-encoded string of clarity value. It is always an optional tuple.
1136
+ */
1137
+ data: v17.string(),
1138
+ /**
1139
+ * Hex-encoded string of the MARF proof for the data
1140
+ */
1141
+ proof: v17.optional(v17.string())
1142
+ });
1143
+ async function mapEntry(args) {
1144
+ const search = new URLSearchParams();
1145
+ if (args.proof === 0) search.append("proof", "0");
1146
+ if (args.tip) search.append("tip", args.tip);
1147
+ const init = {};
1148
+ if (args.apiKeyConfig) {
1149
+ init.headers = {
1150
+ [args.apiKeyConfig.header]: args.apiKeyConfig.key
1151
+ };
1152
+ }
1153
+ init.method = "POST";
1154
+ init.body = args.mapKey;
1155
+ const endpoint = `${args.baseUrl}/v2/map_entry/${args.contractAddress}/${args.contractName}/${args.mapName}?${search}`;
1156
+ const res = await fetch(endpoint, init);
1157
+ if (!res.ok) {
1158
+ return error({
1159
+ name: "FetchMapEntryError",
1160
+ message: "Failed to fetch map entry.",
1161
+ data: {
1162
+ status: res.status,
1163
+ statusText: res.statusText,
1164
+ bodyParseResult: await safePromise(res.json())
1165
+ }
1166
+ });
1167
+ }
1168
+ const [jsonError, data] = await safePromise(res.json());
1169
+ if (jsonError) {
1170
+ return error({
1171
+ name: "ParseBodyError",
1172
+ message: "Failed to parse response body as JSON.",
1173
+ data: jsonError
1174
+ });
1175
+ }
1176
+ const validationResult = v17.safeParse(mapEntryResponseSchema, data);
1177
+ if (!validationResult.success) {
1178
+ return error({
1179
+ name: "ValidateDataError",
1180
+ message: "Failed to validate response data.",
1181
+ data: validationResult
1182
+ });
1183
+ }
1184
+ return success(validationResult.output);
1185
+ }
1186
+
1187
+ // src/stacks-rpc-api/smart-contracts/index.ts
1188
+ var smartContracts2 = {
1189
+ mapEntry
1190
+ };
1191
+
1192
+ // src/stacks-rpc-api/index.ts
1193
+ var stacksRpcApi = {
1194
+ smartContracts: smartContracts2
1046
1195
  };
1047
- var smartContracts = { readOnly };
1048
- var stackingPool = { members };
1049
- var transactions = { addressTransactions, getTransaction };
1050
1196
 
1051
1197
  // src/utils/call-rate-limited-api.ts
1052
1198
  var import_exponential_backoff = require("exponential-backoff");
@@ -1084,23 +1230,74 @@ async function safeCallRateLimitedApi(fn, options) {
1084
1230
  }
1085
1231
  }
1086
1232
 
1087
- // src/index.ts
1088
- var stacksApi = {
1089
- accounts,
1090
- blocks,
1091
- info,
1092
- proofOfTransfer,
1093
- smartContracts,
1094
- stackingPool,
1095
- transactions
1233
+ // src/queries/get-signer-stacked-amount.ts
1234
+ async function getSignerStackedAmount(args) {
1235
+ let totalLocked = 0n;
1236
+ const { identifier, ...rest } = args;
1237
+ let hasMore = true;
1238
+ let offset = 0;
1239
+ let found = false;
1240
+ const limit = 200;
1241
+ while (hasMore && !found) {
1242
+ const [error2, data] = await safeCallRateLimitedApi(
1243
+ () => signersInCycle({
1244
+ ...rest,
1245
+ limit
1246
+ })
1247
+ );
1248
+ if (error2) {
1249
+ return error({
1250
+ name: "GetSignerTotalLockedError",
1251
+ message: "Failed to get signer total locked.",
1252
+ data: {
1253
+ error: error2
1254
+ }
1255
+ });
1256
+ }
1257
+ for (const signer of data.results) {
1258
+ if (identifier.type === "address") {
1259
+ if (signer.signer_address === identifier.signerAddress) {
1260
+ totalLocked = BigInt(signer.stacked_amount);
1261
+ found = true;
1262
+ break;
1263
+ }
1264
+ } else {
1265
+ if (signer.signing_key === identifier.signerPublicKey) {
1266
+ totalLocked = BigInt(signer.stacked_amount);
1267
+ found = true;
1268
+ break;
1269
+ }
1270
+ }
1271
+ }
1272
+ offset += data.results.length;
1273
+ hasMore = offset < data.total;
1274
+ }
1275
+ if (!found) {
1276
+ return error({
1277
+ name: "SignerNotFound",
1278
+ message: "Signer not found.",
1279
+ data: {
1280
+ identifier,
1281
+ cycle: args.cycleNumber
1282
+ }
1283
+ });
1284
+ }
1285
+ return success(totalLocked);
1286
+ }
1287
+
1288
+ // src/queries/index.ts
1289
+ var queries = {
1290
+ getSignerStackedAmount
1096
1291
  };
1097
1292
  // Annotate the CommonJS export names for ESM import in node:
1098
1293
  0 && (module.exports = {
1099
1294
  callRateLimitedApi,
1100
1295
  error,
1296
+ queries,
1101
1297
  safeCall,
1102
1298
  safeCallRateLimitedApi,
1103
1299
  safePromise,
1104
1300
  stacksApi,
1301
+ stacksRpcApi,
1105
1302
  success
1106
1303
  });