@arkade-os/sdk 0.1.4 → 0.2.0

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.
Files changed (114) hide show
  1. package/README.md +156 -174
  2. package/dist/cjs/arknote/index.js +61 -58
  3. package/dist/cjs/bip322/errors.js +13 -0
  4. package/dist/cjs/bip322/index.js +178 -0
  5. package/dist/cjs/forfeit.js +14 -25
  6. package/dist/cjs/identity/singleKey.js +68 -0
  7. package/dist/cjs/index.js +41 -17
  8. package/dist/cjs/providers/ark.js +253 -317
  9. package/dist/cjs/providers/indexer.js +525 -0
  10. package/dist/cjs/providers/onchain.js +193 -15
  11. package/dist/cjs/script/address.js +48 -17
  12. package/dist/cjs/script/base.js +120 -3
  13. package/dist/cjs/script/default.js +18 -4
  14. package/dist/cjs/script/tapscript.js +46 -14
  15. package/dist/cjs/script/vhtlc.js +27 -7
  16. package/dist/cjs/tree/signingSession.js +63 -106
  17. package/dist/cjs/tree/txTree.js +193 -0
  18. package/dist/cjs/tree/validation.js +79 -155
  19. package/dist/cjs/utils/anchor.js +35 -0
  20. package/dist/cjs/utils/arkTransaction.js +108 -0
  21. package/dist/cjs/utils/transactionHistory.js +84 -72
  22. package/dist/cjs/utils/txSizeEstimator.js +12 -0
  23. package/dist/cjs/utils/unknownFields.js +211 -0
  24. package/dist/cjs/wallet/index.js +12 -0
  25. package/dist/cjs/wallet/onchain.js +201 -0
  26. package/dist/cjs/wallet/ramps.js +95 -0
  27. package/dist/cjs/wallet/serviceWorker/db/vtxo/idb.js +32 -0
  28. package/dist/cjs/wallet/serviceWorker/request.js +15 -12
  29. package/dist/cjs/wallet/serviceWorker/response.js +22 -27
  30. package/dist/cjs/wallet/serviceWorker/utils.js +8 -0
  31. package/dist/cjs/wallet/serviceWorker/wallet.js +58 -34
  32. package/dist/cjs/wallet/serviceWorker/worker.js +117 -108
  33. package/dist/cjs/wallet/unroll.js +270 -0
  34. package/dist/cjs/wallet/wallet.js +701 -454
  35. package/dist/esm/arknote/index.js +61 -57
  36. package/dist/esm/bip322/errors.js +9 -0
  37. package/dist/esm/bip322/index.js +174 -0
  38. package/dist/esm/forfeit.js +15 -26
  39. package/dist/esm/identity/singleKey.js +64 -0
  40. package/dist/esm/index.js +30 -12
  41. package/dist/esm/providers/ark.js +252 -317
  42. package/dist/esm/providers/indexer.js +521 -0
  43. package/dist/esm/providers/onchain.js +193 -15
  44. package/dist/esm/script/address.js +48 -17
  45. package/dist/esm/script/base.js +120 -3
  46. package/dist/esm/script/default.js +18 -4
  47. package/dist/esm/script/tapscript.js +46 -14
  48. package/dist/esm/script/vhtlc.js +27 -7
  49. package/dist/esm/tree/signingSession.js +65 -108
  50. package/dist/esm/tree/txTree.js +189 -0
  51. package/dist/esm/tree/validation.js +75 -152
  52. package/dist/esm/utils/anchor.js +31 -0
  53. package/dist/esm/utils/arkTransaction.js +105 -0
  54. package/dist/esm/utils/transactionHistory.js +84 -72
  55. package/dist/esm/utils/txSizeEstimator.js +12 -0
  56. package/dist/esm/utils/unknownFields.js +173 -0
  57. package/dist/esm/wallet/index.js +9 -0
  58. package/dist/esm/wallet/onchain.js +196 -0
  59. package/dist/esm/wallet/ramps.js +91 -0
  60. package/dist/esm/wallet/serviceWorker/db/vtxo/idb.js +32 -0
  61. package/dist/esm/wallet/serviceWorker/request.js +15 -12
  62. package/dist/esm/wallet/serviceWorker/response.js +22 -27
  63. package/dist/esm/wallet/serviceWorker/utils.js +8 -0
  64. package/dist/esm/wallet/serviceWorker/wallet.js +59 -35
  65. package/dist/esm/wallet/serviceWorker/worker.js +117 -108
  66. package/dist/esm/wallet/unroll.js +267 -0
  67. package/dist/esm/wallet/wallet.js +674 -461
  68. package/dist/types/arknote/index.d.ts +40 -13
  69. package/dist/types/bip322/errors.d.ts +6 -0
  70. package/dist/types/bip322/index.d.ts +57 -0
  71. package/dist/types/forfeit.d.ts +2 -14
  72. package/dist/types/identity/singleKey.d.ts +27 -0
  73. package/dist/types/index.d.ts +23 -12
  74. package/dist/types/providers/ark.d.ts +114 -95
  75. package/dist/types/providers/indexer.d.ts +186 -0
  76. package/dist/types/providers/onchain.d.ts +41 -11
  77. package/dist/types/script/address.d.ts +26 -2
  78. package/dist/types/script/base.d.ts +13 -3
  79. package/dist/types/script/default.d.ts +22 -0
  80. package/dist/types/script/tapscript.d.ts +61 -5
  81. package/dist/types/script/vhtlc.d.ts +27 -0
  82. package/dist/types/tree/signingSession.d.ts +5 -5
  83. package/dist/types/tree/txTree.d.ts +28 -0
  84. package/dist/types/tree/validation.d.ts +15 -22
  85. package/dist/types/utils/anchor.d.ts +19 -0
  86. package/dist/types/utils/arkTransaction.d.ts +27 -0
  87. package/dist/types/utils/transactionHistory.d.ts +7 -1
  88. package/dist/types/utils/txSizeEstimator.d.ts +3 -0
  89. package/dist/types/utils/unknownFields.d.ts +83 -0
  90. package/dist/types/wallet/index.d.ts +51 -50
  91. package/dist/types/wallet/onchain.d.ts +49 -0
  92. package/dist/types/wallet/ramps.d.ts +32 -0
  93. package/dist/types/wallet/serviceWorker/db/vtxo/idb.d.ts +2 -0
  94. package/dist/types/wallet/serviceWorker/db/vtxo/index.d.ts +2 -0
  95. package/dist/types/wallet/serviceWorker/request.d.ts +14 -16
  96. package/dist/types/wallet/serviceWorker/response.d.ts +17 -19
  97. package/dist/types/wallet/serviceWorker/utils.d.ts +8 -0
  98. package/dist/types/wallet/serviceWorker/wallet.d.ts +36 -8
  99. package/dist/types/wallet/serviceWorker/worker.d.ts +7 -3
  100. package/dist/types/wallet/unroll.d.ts +102 -0
  101. package/dist/types/wallet/wallet.d.ts +71 -25
  102. package/package.json +14 -15
  103. package/dist/cjs/identity/inMemoryKey.js +0 -40
  104. package/dist/cjs/tree/vtxoTree.js +0 -231
  105. package/dist/cjs/utils/coinselect.js +0 -73
  106. package/dist/cjs/utils/psbt.js +0 -137
  107. package/dist/esm/identity/inMemoryKey.js +0 -36
  108. package/dist/esm/tree/vtxoTree.js +0 -191
  109. package/dist/esm/utils/coinselect.js +0 -69
  110. package/dist/esm/utils/psbt.js +0 -131
  111. package/dist/types/identity/inMemoryKey.d.ts +0 -12
  112. package/dist/types/tree/vtxoTree.d.ts +0 -33
  113. package/dist/types/utils/coinselect.d.ts +0 -21
  114. package/dist/types/utils/psbt.d.ts +0 -11
@@ -0,0 +1,525 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RestIndexerProvider = exports.ChainTxType = exports.IndexerTxType = void 0;
4
+ const ark_1 = require("./ark");
5
+ var IndexerTxType;
6
+ (function (IndexerTxType) {
7
+ IndexerTxType[IndexerTxType["INDEXER_TX_TYPE_UNSPECIFIED"] = 0] = "INDEXER_TX_TYPE_UNSPECIFIED";
8
+ IndexerTxType[IndexerTxType["INDEXER_TX_TYPE_RECEIVED"] = 1] = "INDEXER_TX_TYPE_RECEIVED";
9
+ IndexerTxType[IndexerTxType["INDEXER_TX_TYPE_SENT"] = 2] = "INDEXER_TX_TYPE_SENT";
10
+ })(IndexerTxType || (exports.IndexerTxType = IndexerTxType = {}));
11
+ var ChainTxType;
12
+ (function (ChainTxType) {
13
+ ChainTxType["UNSPECIFIED"] = "INDEXER_CHAINED_TX_TYPE_UNSPECIFIED";
14
+ ChainTxType["COMMITMENT"] = "INDEXER_CHAINED_TX_TYPE_COMMITMENT";
15
+ ChainTxType["ARK"] = "INDEXER_CHAINED_TX_TYPE_ARK";
16
+ ChainTxType["TREE"] = "INDEXER_CHAINED_TX_TYPE_TREE";
17
+ ChainTxType["CHECKPOINT"] = "INDEXER_CHAINED_TX_TYPE_CHECKPOINT";
18
+ })(ChainTxType || (exports.ChainTxType = ChainTxType = {}));
19
+ /**
20
+ * REST-based Indexer provider implementation.
21
+ * @see https://buf.build/arkade-os/arkd/docs/main:ark.v1#ark.v1.IndexerService
22
+ * @example
23
+ * ```typescript
24
+ * const provider = new RestIndexerProvider('https://ark.indexer.example.com');
25
+ * const commitmentTx = await provider.getCommitmentTx("6686af8f3be3517880821f62e6c3d749b9d6713736a1d8e229a55daa659446b2");
26
+ * ```
27
+ */
28
+ class RestIndexerProvider {
29
+ constructor(serverUrl) {
30
+ this.serverUrl = serverUrl;
31
+ }
32
+ async getVtxoTree(batchOutpoint, opts) {
33
+ let url = `${this.serverUrl}/v1/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/tree`;
34
+ const params = new URLSearchParams();
35
+ if (opts) {
36
+ if (opts.pageIndex !== undefined)
37
+ params.append("page.index", opts.pageIndex.toString());
38
+ if (opts.pageSize !== undefined)
39
+ params.append("page.size", opts.pageSize.toString());
40
+ }
41
+ if (params.toString()) {
42
+ url += "?" + params.toString();
43
+ }
44
+ const res = await fetch(url);
45
+ if (!res.ok) {
46
+ throw new Error(`Failed to fetch vtxo tree: ${res.statusText}`);
47
+ }
48
+ const data = await res.json();
49
+ if (!Response.isVtxoTreeResponse(data)) {
50
+ throw new Error("Invalid vtxo tree data received");
51
+ }
52
+ data.vtxoTree.forEach((tx) => {
53
+ tx.children = Object.fromEntries(Object.entries(tx.children).map(([key, value]) => [
54
+ Number(key),
55
+ value,
56
+ ]));
57
+ });
58
+ return data;
59
+ }
60
+ async getVtxoTreeLeaves(batchOutpoint, opts) {
61
+ let url = `${this.serverUrl}/v1/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/tree/leaves`;
62
+ const params = new URLSearchParams();
63
+ if (opts) {
64
+ if (opts.pageIndex !== undefined)
65
+ params.append("page.index", opts.pageIndex.toString());
66
+ if (opts.pageSize !== undefined)
67
+ params.append("page.size", opts.pageSize.toString());
68
+ }
69
+ if (params.toString()) {
70
+ url += "?" + params.toString();
71
+ }
72
+ const res = await fetch(url);
73
+ if (!res.ok) {
74
+ throw new Error(`Failed to fetch vtxo tree leaves: ${res.statusText}`);
75
+ }
76
+ const data = await res.json();
77
+ if (!Response.isVtxoTreeLeavesResponse(data)) {
78
+ throw new Error("Invalid vtxos tree leaves data received");
79
+ }
80
+ return data;
81
+ }
82
+ async getBatchSweepTransactions(batchOutpoint) {
83
+ const url = `${this.serverUrl}/v1/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/sweepTxs`;
84
+ const res = await fetch(url);
85
+ if (!res.ok) {
86
+ throw new Error(`Failed to fetch batch sweep transactions: ${res.statusText}`);
87
+ }
88
+ const data = await res.json();
89
+ if (!Response.isBatchSweepTransactionsResponse(data)) {
90
+ throw new Error("Invalid batch sweep transactions data received");
91
+ }
92
+ return data;
93
+ }
94
+ async getCommitmentTx(txid) {
95
+ const url = `${this.serverUrl}/v1/commitmentTx/${txid}`;
96
+ const res = await fetch(url);
97
+ if (!res.ok) {
98
+ throw new Error(`Failed to fetch commitment tx: ${res.statusText}`);
99
+ }
100
+ const data = await res.json();
101
+ if (!Response.isCommitmentTx(data)) {
102
+ throw new Error("Invalid commitment tx data received");
103
+ }
104
+ return data;
105
+ }
106
+ async getCommitmentTxConnectors(txid, opts) {
107
+ let url = `${this.serverUrl}/v1/commitmentTx/${txid}/connectors`;
108
+ const params = new URLSearchParams();
109
+ if (opts) {
110
+ if (opts.pageIndex !== undefined)
111
+ params.append("page.index", opts.pageIndex.toString());
112
+ if (opts.pageSize !== undefined)
113
+ params.append("page.size", opts.pageSize.toString());
114
+ }
115
+ if (params.toString()) {
116
+ url += "?" + params.toString();
117
+ }
118
+ const res = await fetch(url);
119
+ if (!res.ok) {
120
+ throw new Error(`Failed to fetch commitment tx connectors: ${res.statusText}`);
121
+ }
122
+ const data = await res.json();
123
+ if (!Response.isConnectorsResponse(data)) {
124
+ throw new Error("Invalid commitment tx connectors data received");
125
+ }
126
+ data.connectors.forEach((tx) => {
127
+ tx.children = Object.fromEntries(Object.entries(tx.children).map(([key, value]) => [
128
+ Number(key),
129
+ value,
130
+ ]));
131
+ });
132
+ return data;
133
+ }
134
+ async getCommitmentTxForfeitTxs(txid, opts) {
135
+ let url = `${this.serverUrl}/v1/commitmentTx/${txid}/forfeitTxs`;
136
+ const params = new URLSearchParams();
137
+ if (opts) {
138
+ if (opts.pageIndex !== undefined)
139
+ params.append("page.index", opts.pageIndex.toString());
140
+ if (opts.pageSize !== undefined)
141
+ params.append("page.size", opts.pageSize.toString());
142
+ }
143
+ if (params.toString()) {
144
+ url += "?" + params.toString();
145
+ }
146
+ const res = await fetch(url);
147
+ if (!res.ok) {
148
+ throw new Error(`Failed to fetch commitment tx forfeitTxs: ${res.statusText}`);
149
+ }
150
+ const data = await res.json();
151
+ if (!Response.isForfeitTxsResponse(data)) {
152
+ throw new Error("Invalid commitment tx forfeitTxs data received");
153
+ }
154
+ return data;
155
+ }
156
+ async *getSubscription(subscriptionId, abortSignal) {
157
+ const url = `${this.serverUrl}/v1/script/subscription/${subscriptionId}`;
158
+ while (!abortSignal.aborted) {
159
+ try {
160
+ const res = await fetch(url, {
161
+ headers: {
162
+ Accept: "application/json",
163
+ },
164
+ });
165
+ if (!res.ok) {
166
+ throw new Error(`Unexpected status ${res.status} when subscribing to address updates`);
167
+ }
168
+ if (!res.body) {
169
+ throw new Error("Response body is null");
170
+ }
171
+ const reader = res.body.getReader();
172
+ const decoder = new TextDecoder();
173
+ let buffer = "";
174
+ while (!abortSignal.aborted) {
175
+ const { done, value } = await reader.read();
176
+ if (done) {
177
+ break;
178
+ }
179
+ buffer += decoder.decode(value, { stream: true });
180
+ const lines = buffer.split("\n");
181
+ for (let i = 0; i < lines.length - 1; i++) {
182
+ const line = lines[i].trim();
183
+ if (!line)
184
+ continue;
185
+ const data = JSON.parse(line);
186
+ if ("result" in data) {
187
+ yield {
188
+ txid: data.result.txid,
189
+ scripts: data.result.scripts || [],
190
+ newVtxos: (data.result.newVtxos || []).map(convertVtxo),
191
+ spentVtxos: (data.result.spentVtxos || []).map(convertVtxo),
192
+ tx: data.result.tx,
193
+ checkpointTxs: data.result.checkpointTxs,
194
+ };
195
+ }
196
+ }
197
+ buffer = lines[lines.length - 1];
198
+ }
199
+ }
200
+ catch (error) {
201
+ if (error instanceof Error && error.name === "AbortError") {
202
+ break;
203
+ }
204
+ // ignore timeout errors, they're expected when the server is not sending anything for 5 min
205
+ // these timeouts are set by builtin fetch function
206
+ if ((0, ark_1.isFetchTimeoutError)(error)) {
207
+ console.debug("Timeout error ignored");
208
+ continue;
209
+ }
210
+ console.error("Subscription error:", error);
211
+ throw error;
212
+ }
213
+ }
214
+ }
215
+ async getVirtualTxs(txids, opts) {
216
+ let url = `${this.serverUrl}/v1/virtualTx/${txids.join(",")}`;
217
+ const params = new URLSearchParams();
218
+ if (opts) {
219
+ if (opts.pageIndex !== undefined)
220
+ params.append("page.index", opts.pageIndex.toString());
221
+ if (opts.pageSize !== undefined)
222
+ params.append("page.size", opts.pageSize.toString());
223
+ }
224
+ if (params.toString()) {
225
+ url += "?" + params.toString();
226
+ }
227
+ const res = await fetch(url);
228
+ if (!res.ok) {
229
+ throw new Error(`Failed to fetch virtual txs: ${res.statusText}`);
230
+ }
231
+ const data = await res.json();
232
+ if (!Response.isVirtualTxsResponse(data)) {
233
+ throw new Error("Invalid virtual txs data received");
234
+ }
235
+ return data;
236
+ }
237
+ async getVtxoChain(vtxoOutpoint, opts) {
238
+ let url = `${this.serverUrl}/v1/vtxo/${vtxoOutpoint.txid}/${vtxoOutpoint.vout}/chain`;
239
+ const params = new URLSearchParams();
240
+ if (opts) {
241
+ if (opts.pageIndex !== undefined)
242
+ params.append("page.index", opts.pageIndex.toString());
243
+ if (opts.pageSize !== undefined)
244
+ params.append("page.size", opts.pageSize.toString());
245
+ }
246
+ if (params.toString()) {
247
+ url += "?" + params.toString();
248
+ }
249
+ const res = await fetch(url);
250
+ if (!res.ok) {
251
+ throw new Error(`Failed to fetch vtxo chain: ${res.statusText}`);
252
+ }
253
+ const data = await res.json();
254
+ if (!Response.isVtxoChainResponse(data)) {
255
+ throw new Error("Invalid vtxo chain data received");
256
+ }
257
+ return data;
258
+ }
259
+ async getVtxos(opts) {
260
+ // scripts and outpoints are mutually exclusive
261
+ if (opts?.scripts && opts?.outpoints) {
262
+ throw new Error("scripts and outpoints are mutually exclusive options");
263
+ }
264
+ if (!opts?.scripts && !opts?.outpoints) {
265
+ throw new Error("Either scripts or outpoints must be provided");
266
+ }
267
+ let url = `${this.serverUrl}/v1/vtxos`;
268
+ const params = new URLSearchParams();
269
+ // Handle scripts with multi collection format
270
+ if (opts?.scripts && opts.scripts.length > 0) {
271
+ opts.scripts.forEach((script) => {
272
+ params.append("scripts", script);
273
+ });
274
+ }
275
+ // Handle outpoints with multi collection format
276
+ if (opts?.outpoints && opts.outpoints.length > 0) {
277
+ opts.outpoints.forEach((outpoint) => {
278
+ params.append("outpoints", `${outpoint.txid}:${outpoint.vout}`);
279
+ });
280
+ }
281
+ if (opts) {
282
+ if (opts.spendableOnly !== undefined)
283
+ params.append("spendableOnly", opts.spendableOnly.toString());
284
+ if (opts.spentOnly !== undefined)
285
+ params.append("spentOnly", opts.spentOnly.toString());
286
+ if (opts.recoverableOnly !== undefined)
287
+ params.append("recoverableOnly", opts.recoverableOnly.toString());
288
+ if (opts.pageIndex !== undefined)
289
+ params.append("page.index", opts.pageIndex.toString());
290
+ if (opts.pageSize !== undefined)
291
+ params.append("page.size", opts.pageSize.toString());
292
+ }
293
+ if (params.toString()) {
294
+ url += "?" + params.toString();
295
+ }
296
+ const res = await fetch(url);
297
+ if (!res.ok) {
298
+ throw new Error(`Failed to fetch vtxos: ${res.statusText}`);
299
+ }
300
+ const data = await res.json();
301
+ if (!Response.isVtxosResponse(data)) {
302
+ throw new Error("Invalid vtxos data received");
303
+ }
304
+ return {
305
+ vtxos: data.vtxos.map(convertVtxo),
306
+ page: data.page,
307
+ };
308
+ }
309
+ async subscribeForScripts(scripts, subscriptionId) {
310
+ const url = `${this.serverUrl}/v1/script/subscribe`;
311
+ const res = await fetch(url, {
312
+ headers: {
313
+ "Content-Type": "application/json",
314
+ },
315
+ method: "POST",
316
+ body: JSON.stringify({ scripts, subscriptionId }),
317
+ });
318
+ if (!res.ok) {
319
+ const errorText = await res.text();
320
+ throw new Error(`Failed to subscribe to scripts: ${errorText}`);
321
+ }
322
+ const data = await res.json();
323
+ if (!data.subscriptionId)
324
+ throw new Error(`Subscription ID not found`);
325
+ return data.subscriptionId;
326
+ }
327
+ async unsubscribeForScripts(subscriptionId, scripts) {
328
+ const url = `${this.serverUrl}/v1/script/unsubscribe`;
329
+ const res = await fetch(url, {
330
+ headers: {
331
+ "Content-Type": "application/json",
332
+ },
333
+ method: "POST",
334
+ body: JSON.stringify({ subscriptionId, scripts }),
335
+ });
336
+ if (!res.ok) {
337
+ const errorText = await res.text();
338
+ throw new Error(`Failed to unsubscribe to scripts: ${errorText}`);
339
+ }
340
+ }
341
+ }
342
+ exports.RestIndexerProvider = RestIndexerProvider;
343
+ function convertVtxo(vtxo) {
344
+ return {
345
+ txid: vtxo.outpoint.txid,
346
+ vout: vtxo.outpoint.vout,
347
+ value: Number(vtxo.amount),
348
+ status: {
349
+ confirmed: !vtxo.isSwept && !vtxo.isPreconfirmed,
350
+ },
351
+ virtualStatus: {
352
+ state: vtxo.isSwept
353
+ ? "swept"
354
+ : vtxo.isPreconfirmed
355
+ ? "preconfirmed"
356
+ : "settled",
357
+ commitmentTxIds: vtxo.commitmentTxids,
358
+ batchExpiry: vtxo.expiresAt
359
+ ? Number(vtxo.expiresAt) * 1000
360
+ : undefined,
361
+ },
362
+ spentBy: vtxo.spentBy ?? "",
363
+ settledBy: vtxo.settledBy,
364
+ arkTxId: vtxo.arkTxid,
365
+ createdAt: new Date(Number(vtxo.createdAt) * 1000),
366
+ isUnrolled: vtxo.isUnrolled,
367
+ };
368
+ }
369
+ // Unexported namespace for type guards only
370
+ var Response;
371
+ (function (Response) {
372
+ function isBatch(data) {
373
+ return (typeof data === "object" &&
374
+ typeof data.totalOutputAmount === "string" &&
375
+ typeof data.totalOutputVtxos === "number" &&
376
+ typeof data.expiresAt === "string" &&
377
+ typeof data.swept === "boolean");
378
+ }
379
+ function isChain(data) {
380
+ return (typeof data === "object" &&
381
+ typeof data.txid === "string" &&
382
+ typeof data.expiresAt === "string" &&
383
+ Object.values(ChainTxType).includes(data.type) &&
384
+ Array.isArray(data.spends) &&
385
+ data.spends.every((spend) => typeof spend === "string"));
386
+ }
387
+ function isCommitmentTx(data) {
388
+ return (typeof data === "object" &&
389
+ typeof data.startedAt === "string" &&
390
+ typeof data.endedAt === "string" &&
391
+ typeof data.totalInputAmount === "string" &&
392
+ typeof data.totalInputVtxos === "number" &&
393
+ typeof data.totalOutputAmount === "string" &&
394
+ typeof data.totalOutputVtxos === "number" &&
395
+ typeof data.batches === "object" &&
396
+ Object.values(data.batches).every(isBatch));
397
+ }
398
+ Response.isCommitmentTx = isCommitmentTx;
399
+ function isOutpoint(data) {
400
+ return (typeof data === "object" &&
401
+ typeof data.txid === "string" &&
402
+ typeof data.vout === "number");
403
+ }
404
+ Response.isOutpoint = isOutpoint;
405
+ function isOutpointArray(data) {
406
+ return Array.isArray(data) && data.every(isOutpoint);
407
+ }
408
+ Response.isOutpointArray = isOutpointArray;
409
+ function isTx(data) {
410
+ return (typeof data === "object" &&
411
+ typeof data.txid === "string" &&
412
+ typeof data.children === "object" &&
413
+ Object.values(data.children).every(isTxid) &&
414
+ Object.keys(data.children).every((k) => Number.isInteger(Number(k))));
415
+ }
416
+ function isTxsArray(data) {
417
+ return Array.isArray(data) && data.every(isTx);
418
+ }
419
+ Response.isTxsArray = isTxsArray;
420
+ function isTxHistoryRecord(data) {
421
+ return (typeof data === "object" &&
422
+ typeof data.amount === "string" &&
423
+ typeof data.createdAt === "string" &&
424
+ typeof data.isSettled === "boolean" &&
425
+ typeof data.settledBy === "string" &&
426
+ Object.values(IndexerTxType).includes(data.type) &&
427
+ ((!data.commitmentTxid && typeof data.virtualTxid === "string") ||
428
+ (typeof data.commitmentTxid === "string" && !data.virtualTxid)));
429
+ }
430
+ function isTxHistoryRecordArray(data) {
431
+ return Array.isArray(data) && data.every(isTxHistoryRecord);
432
+ }
433
+ Response.isTxHistoryRecordArray = isTxHistoryRecordArray;
434
+ function isTxid(data) {
435
+ return typeof data === "string" && data.length === 64;
436
+ }
437
+ function isTxidArray(data) {
438
+ return Array.isArray(data) && data.every(isTxid);
439
+ }
440
+ Response.isTxidArray = isTxidArray;
441
+ function isVtxo(data) {
442
+ return (typeof data === "object" &&
443
+ isOutpoint(data.outpoint) &&
444
+ typeof data.createdAt === "string" &&
445
+ typeof data.expiresAt === "string" &&
446
+ typeof data.amount === "string" &&
447
+ typeof data.script === "string" &&
448
+ typeof data.isPreconfirmed === "boolean" &&
449
+ typeof data.isSwept === "boolean" &&
450
+ typeof data.isUnrolled === "boolean" &&
451
+ typeof data.isSpent === "boolean" &&
452
+ (!data.spentBy || typeof data.spentBy === "string") &&
453
+ (!data.settledBy || typeof data.settledBy === "string") &&
454
+ (!data.arkTxid || typeof data.arkTxid === "string") &&
455
+ Array.isArray(data.commitmentTxids) &&
456
+ data.commitmentTxids.every(isTxid));
457
+ }
458
+ function isPageResponse(data) {
459
+ return (typeof data === "object" &&
460
+ typeof data.current === "number" &&
461
+ typeof data.next === "number" &&
462
+ typeof data.total === "number");
463
+ }
464
+ function isVtxoTreeResponse(data) {
465
+ return (typeof data === "object" &&
466
+ Array.isArray(data.vtxoTree) &&
467
+ data.vtxoTree.every(isTx) &&
468
+ (!data.page || isPageResponse(data.page)));
469
+ }
470
+ Response.isVtxoTreeResponse = isVtxoTreeResponse;
471
+ function isVtxoTreeLeavesResponse(data) {
472
+ return (typeof data === "object" &&
473
+ Array.isArray(data.leaves) &&
474
+ data.leaves.every(isOutpoint) &&
475
+ (!data.page || isPageResponse(data.page)));
476
+ }
477
+ Response.isVtxoTreeLeavesResponse = isVtxoTreeLeavesResponse;
478
+ function isConnectorsResponse(data) {
479
+ return (typeof data === "object" &&
480
+ Array.isArray(data.connectors) &&
481
+ data.connectors.every(isTx) &&
482
+ (!data.page || isPageResponse(data.page)));
483
+ }
484
+ Response.isConnectorsResponse = isConnectorsResponse;
485
+ function isForfeitTxsResponse(data) {
486
+ return (typeof data === "object" &&
487
+ Array.isArray(data.txids) &&
488
+ data.txids.every(isTxid) &&
489
+ (!data.page || isPageResponse(data.page)));
490
+ }
491
+ Response.isForfeitTxsResponse = isForfeitTxsResponse;
492
+ function isSweptCommitmentTxResponse(data) {
493
+ return (typeof data === "object" &&
494
+ Array.isArray(data.sweptBy) &&
495
+ data.sweptBy.every(isTxid));
496
+ }
497
+ Response.isSweptCommitmentTxResponse = isSweptCommitmentTxResponse;
498
+ function isBatchSweepTransactionsResponse(data) {
499
+ return (typeof data === "object" &&
500
+ Array.isArray(data.sweptBy) &&
501
+ data.sweptBy.every(isTxid));
502
+ }
503
+ Response.isBatchSweepTransactionsResponse = isBatchSweepTransactionsResponse;
504
+ function isVirtualTxsResponse(data) {
505
+ return (typeof data === "object" &&
506
+ Array.isArray(data.txs) &&
507
+ data.txs.every((tx) => typeof tx === "string") &&
508
+ (!data.page || isPageResponse(data.page)));
509
+ }
510
+ Response.isVirtualTxsResponse = isVirtualTxsResponse;
511
+ function isVtxoChainResponse(data) {
512
+ return (typeof data === "object" &&
513
+ Array.isArray(data.chain) &&
514
+ data.chain.every(isChain) &&
515
+ (!data.page || isPageResponse(data.page)));
516
+ }
517
+ Response.isVtxoChainResponse = isVtxoChainResponse;
518
+ function isVtxosResponse(data) {
519
+ return (typeof data === "object" &&
520
+ Array.isArray(data.vtxos) &&
521
+ data.vtxos.every(isVtxo) &&
522
+ (!data.page || isPageResponse(data.page)));
523
+ }
524
+ Response.isVtxosResponse = isVtxosResponse;
525
+ })(Response || (Response = {}));