@arkade-os/sdk 0.4.34 → 0.4.36
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/adapters/expo.cjs +4 -4
- package/dist/adapters/expo.d.cts +2 -2
- package/dist/adapters/expo.d.ts +2 -2
- package/dist/adapters/expo.js +2 -2
- package/dist/adapters/indexedDB.cjs +3 -3
- package/dist/adapters/indexedDB.js +2 -2
- package/dist/{ark-Dsv5Jq4E.d.cts → ark-D6sau_6-.d.cts} +458 -3
- package/dist/{ark-Dsv5Jq4E.d.ts → ark-D6sau_6-.d.ts} +458 -3
- package/dist/{asyncStorageTaskQueue-D92ch8yI.d.cts → asyncStorageTaskQueue-CpC027t_.d.cts} +2 -2
- package/dist/{asyncStorageTaskQueue-BH-zuth5.d.ts → asyncStorageTaskQueue-GT8fmPUG.d.ts} +2 -2
- package/dist/{chunk-FXFBPXV3.js → chunk-2JJKX2RK.js} +139 -41
- package/dist/chunk-2JJKX2RK.js.map +1 -0
- package/dist/{chunk-CCLNFHJ5.cjs → chunk-2XE5BSIY.cjs} +16 -10
- package/dist/chunk-2XE5BSIY.cjs.map +1 -0
- package/dist/{chunk-ZS3OZHC7.cjs → chunk-A5PY4NBP.cjs} +7 -7
- package/dist/{chunk-ZS3OZHC7.cjs.map → chunk-A5PY4NBP.cjs.map} +1 -1
- package/dist/{chunk-FSAXPBGP.cjs → chunk-C6OODRWD.cjs} +143 -40
- package/dist/chunk-C6OODRWD.cjs.map +1 -0
- package/dist/{chunk-HFXEUW55.js → chunk-HBPKIIMN.js} +1472 -202
- package/dist/chunk-HBPKIIMN.js.map +1 -0
- package/dist/{chunk-5WDBHWX3.js → chunk-KZV3FJJR.js} +10 -4
- package/dist/chunk-KZV3FJJR.js.map +1 -0
- package/dist/{chunk-XCHBQVMK.cjs → chunk-TUSGEWOX.cjs} +1540 -265
- package/dist/chunk-TUSGEWOX.cjs.map +1 -0
- package/dist/{chunk-VVGD3JIP.js → chunk-Z2VRVZW4.js} +3 -3
- package/dist/{chunk-VVGD3JIP.js.map → chunk-Z2VRVZW4.js.map} +1 -1
- package/dist/contracts/handlers/index.d.cts +3 -3
- package/dist/contracts/handlers/index.d.ts +3 -3
- package/dist/{delegate-BaS5SCIW.d.cts → delegate-C-L6gSZx.d.cts} +1 -1
- package/dist/{delegate-Baz_hb83.d.ts → delegate-De5__fpZ.d.ts} +1 -1
- package/dist/{index-FwXZveaX.d.ts → index-BETdjE_o.d.ts} +2 -2
- package/dist/{index-lNZ6qaO3.d.cts → index-jwQfHP6D.d.cts} +2 -2
- package/dist/index.cjs +129 -105
- package/dist/index.d.cts +69 -9
- package/dist/index.d.ts +69 -9
- package/dist/index.js +2 -2
- package/dist/repositories/realm/index.cjs +12 -12
- package/dist/repositories/realm/index.cjs.map +1 -1
- package/dist/repositories/realm/index.d.cts +2 -2
- package/dist/repositories/realm/index.d.ts +2 -2
- package/dist/repositories/realm/index.js +3 -3
- package/dist/repositories/realm/index.js.map +1 -1
- package/dist/repositories/sqlite/index.cjs +11 -11
- package/dist/repositories/sqlite/index.d.cts +1 -1
- package/dist/repositories/sqlite/index.d.ts +1 -1
- package/dist/repositories/sqlite/index.js +2 -2
- package/dist/{taskRunner-vFRA3F9b.d.cts → taskRunner-DCyp6Gea.d.cts} +2 -2
- package/dist/{taskRunner-B1NUWyWR.d.ts → taskRunner-DnxtObeq.d.ts} +2 -2
- package/dist/wallet/expo/background.cjs +12 -12
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +4 -4
- package/dist/wallet/expo/index.cjs +11 -11
- package/dist/wallet/expo/index.d.cts +4 -4
- package/dist/wallet/expo/index.d.ts +4 -4
- package/dist/wallet/expo/index.js +3 -3
- package/dist/{wallet-D6uoBLmS.d.ts → wallet-BWHbd5b1.d.cts} +231 -8
- package/dist/{wallet-By9HIo0Q.d.cts → wallet-Bth5uucA.d.ts} +231 -8
- package/dist/worker/expo/index.cjs +7 -7
- package/dist/worker/expo/index.d.cts +4 -4
- package/dist/worker/expo/index.d.ts +4 -4
- package/dist/worker/expo/index.js +3 -3
- package/package.json +2 -2
- package/dist/chunk-5WDBHWX3.js.map +0 -1
- package/dist/chunk-CCLNFHJ5.cjs.map +0 -1
- package/dist/chunk-FSAXPBGP.cjs.map +0 -1
- package/dist/chunk-FXFBPXV3.js.map +0 -1
- package/dist/chunk-HFXEUW55.js.map +0 -1
- package/dist/chunk-XCHBQVMK.cjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkC6OODRWD_cjs = require('./chunk-C6OODRWD.cjs');
|
|
4
4
|
var chunkCMPJR3HS_cjs = require('./chunk-CMPJR3HS.cjs');
|
|
5
5
|
|
|
6
6
|
// src/providers/expoUtils.ts
|
|
@@ -8,13 +8,19 @@ async function getExpoFetch(options) {
|
|
|
8
8
|
try {
|
|
9
9
|
const expoFetchModule = await import('expo/fetch');
|
|
10
10
|
console.debug("Using expo/fetch for streaming");
|
|
11
|
-
|
|
11
|
+
const expoFetchWithHeader = (input, init) => {
|
|
12
|
+
const headers = new Headers(init?.headers);
|
|
13
|
+
headers.set("X-Build-Version", chunkC6OODRWD_cjs.buildVersion);
|
|
14
|
+
headers.set("X-SDK-VERSION", chunkC6OODRWD_cjs.sdkVersion);
|
|
15
|
+
return expoFetchModule.fetch(input, { ...init, headers });
|
|
16
|
+
};
|
|
17
|
+
return expoFetchWithHeader;
|
|
12
18
|
} catch (error) {
|
|
13
19
|
console.warn(
|
|
14
20
|
"Using standard fetch instead of expo/fetch. Streaming may not be fully supported in some environments.",
|
|
15
21
|
error
|
|
16
22
|
);
|
|
17
|
-
return fetch;
|
|
23
|
+
return chunkC6OODRWD_cjs.fetch;
|
|
18
24
|
}
|
|
19
25
|
}
|
|
20
26
|
async function* sseStreamIterator(url, abortSignal, fetchFn, headers, parseData) {
|
|
@@ -71,7 +77,7 @@ async function* sseStreamIterator(url, abortSignal, fetchFn, headers, parseData)
|
|
|
71
77
|
}
|
|
72
78
|
|
|
73
79
|
// src/providers/expoArk.ts
|
|
74
|
-
var ExpoArkProvider = class extends
|
|
80
|
+
var ExpoArkProvider = class extends chunkC6OODRWD_cjs.RestArkProvider {
|
|
75
81
|
constructor(serverUrl = chunkCMPJR3HS_cjs.DEFAULT_ARKADE_SERVER_URL) {
|
|
76
82
|
super(serverUrl);
|
|
77
83
|
}
|
|
@@ -92,7 +98,7 @@ var ExpoArkProvider = class extends chunkFSAXPBGP_cjs.RestArkProvider {
|
|
|
92
98
|
if (error instanceof Error && error.name === "AbortError") {
|
|
93
99
|
break;
|
|
94
100
|
}
|
|
95
|
-
if (
|
|
101
|
+
if (chunkC6OODRWD_cjs.isFetchTimeoutError(error)) {
|
|
96
102
|
console.debug("Timeout error ignored");
|
|
97
103
|
continue;
|
|
98
104
|
}
|
|
@@ -113,7 +119,7 @@ var ExpoArkProvider = class extends chunkFSAXPBGP_cjs.RestArkProvider {
|
|
|
113
119
|
if (error instanceof Error && error.name === "AbortError") {
|
|
114
120
|
break;
|
|
115
121
|
}
|
|
116
|
-
if (
|
|
122
|
+
if (chunkC6OODRWD_cjs.isFetchTimeoutError(error)) {
|
|
117
123
|
console.debug("Timeout error ignored");
|
|
118
124
|
continue;
|
|
119
125
|
}
|
|
@@ -152,7 +158,7 @@ function convertVtxo(vtxo) {
|
|
|
152
158
|
}))
|
|
153
159
|
};
|
|
154
160
|
}
|
|
155
|
-
var ExpoIndexerProvider = class extends
|
|
161
|
+
var ExpoIndexerProvider = class extends chunkC6OODRWD_cjs.RestIndexerProvider {
|
|
156
162
|
constructor(serverUrl = chunkCMPJR3HS_cjs.DEFAULT_ARKADE_SERVER_URL) {
|
|
157
163
|
super(serverUrl);
|
|
158
164
|
}
|
|
@@ -196,7 +202,7 @@ var ExpoIndexerProvider = class extends chunkFSAXPBGP_cjs.RestIndexerProvider {
|
|
|
196
202
|
if (error instanceof Error && error.name === "AbortError") {
|
|
197
203
|
break;
|
|
198
204
|
}
|
|
199
|
-
if (
|
|
205
|
+
if (chunkC6OODRWD_cjs.isFetchTimeoutError(error)) {
|
|
200
206
|
console.debug("Timeout error ignored");
|
|
201
207
|
continue;
|
|
202
208
|
}
|
|
@@ -209,5 +215,5 @@ var ExpoIndexerProvider = class extends chunkFSAXPBGP_cjs.RestIndexerProvider {
|
|
|
209
215
|
|
|
210
216
|
exports.ExpoArkProvider = ExpoArkProvider;
|
|
211
217
|
exports.ExpoIndexerProvider = ExpoIndexerProvider;
|
|
212
|
-
//# sourceMappingURL=chunk-
|
|
213
|
-
//# sourceMappingURL=chunk-
|
|
218
|
+
//# sourceMappingURL=chunk-2XE5BSIY.cjs.map
|
|
219
|
+
//# sourceMappingURL=chunk-2XE5BSIY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/expoUtils.ts","../src/providers/expoArk.ts","../src/providers/expoIndexer.ts"],"names":["buildVersion","sdkVersion","fetch","RestArkProvider","DEFAULT_ARKADE_SERVER_URL","isFetchTimeoutError","RestIndexerProvider"],"mappings":"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","file":"chunk-2XE5BSIY.cjs","sourcesContent":["import { fetch, buildVersion, sdkVersion } from \"../utils/fetch\";\n\n/**\n * Dynamically imports expo/fetch with fallback to standard fetch.\n * @returns A fetch function suitable for SSE streaming\n */\nexport async function getExpoFetch(options?: { requireExpo?: boolean }): Promise<typeof fetch> {\n const requireExpo = options?.requireExpo ?? false;\n\n try {\n const expoFetchModule = await import(\"expo/fetch\");\n console.debug(\"Using expo/fetch for streaming\");\n const expoFetchWithHeader = (input: RequestInfo, init?: RequestInit) => {\n const headers = new Headers(init?.headers);\n headers.set(\"X-Build-Version\", buildVersion);\n headers.set(\"X-SDK-VERSION\", sdkVersion);\n return expoFetchModule.fetch(input, { ...init, headers });\n };\n return expoFetchWithHeader as unknown as typeof fetch;\n } catch (error) {\n if (requireExpo) {\n throw new Error(\n \"expo/fetch is unavailable in this environment. \" +\n \"Please ensure expo/fetch is installed and properly configured.\",\n );\n }\n\n console.warn(\n \"Using standard fetch instead of expo/fetch. \" +\n \"Streaming may not be fully supported in some environments.\",\n error,\n );\n return fetch;\n }\n}\n\n/**\n * Generic SSE stream processor using fetch API with ReadableStream.\n * Handles SSE format parsing, buffer management, and abort signals.\n *\n * @param url - The SSE endpoint URL\n * @param abortSignal - Signal to abort the stream\n * @param fetchFn - Fetch function to use (defaults to standard fetch)\n * @param headers - Additional headers to send\n * @param parseData - Function to parse and yield data from SSE events\n */\nexport async function* sseStreamIterator<T>(\n url: string,\n abortSignal: AbortSignal,\n fetchFn: typeof fetch,\n headers: Record<string, string>,\n parseData: (data: any) => T | null,\n): AsyncGenerator<T, void, unknown> {\n const fetchController = new AbortController();\n const cleanup = () => fetchController.abort();\n abortSignal?.addEventListener(\"abort\", cleanup, { once: true });\n\n try {\n const response = await fetchFn(url, {\n headers: {\n Accept: \"text/event-stream\",\n ...headers,\n },\n signal: fetchController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Unexpected status ${response.status} when fetching SSE stream`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (!abortSignal?.aborted) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n\n for (let i = 0; i < lines.length - 1; i++) {\n const line = lines[i].trim();\n if (!line) continue;\n\n if (line.startsWith(\"data:\")) {\n const jsonStr = line.substring(5).trim();\n if (!jsonStr) continue;\n\n try {\n const data = JSON.parse(jsonStr);\n const parsed = parseData(data);\n if (parsed !== null) {\n yield parsed;\n }\n } catch (parseError) {\n console.error(\"Failed to parse SSE data:\", parseError);\n throw parseError;\n }\n }\n }\n\n buffer = lines[lines.length - 1];\n }\n } finally {\n abortSignal?.removeEventListener(\"abort\", cleanup);\n }\n}\n","import { DEFAULT_ARKADE_SERVER_URL } from \"../networks\";\nimport { RestArkProvider, SettlementEvent, TxNotification, isFetchTimeoutError } from \"./ark\";\nimport { getExpoFetch, sseStreamIterator } from \"./expoUtils\";\n\n/**\n * Expo-compatible Arkade provider implementation using expo/fetch for SSE support.\n * This provider works specifically in React Native/Expo environments where\n * standard EventSource is not available but expo/fetch provides SSE capabilities.\n *\n * @example\n * ```typescript\n * import { ExpoArkProvider } from '@arkade-os/sdk/providers/expo';\n *\n * const provider = new ExpoArkProvider('https://arkade.computer');\n * const info = await provider.getInfo();\n * ```\n */\nexport class ExpoArkProvider extends RestArkProvider {\n constructor(serverUrl: string = DEFAULT_ARKADE_SERVER_URL) {\n super(serverUrl);\n }\n\n override async *getEventStream(\n signal: AbortSignal,\n topics: string[],\n ): AsyncIterableIterator<SettlementEvent> {\n const expoFetch = await getExpoFetch();\n const url = `${this.serverUrl}/v1/batch/events`;\n const queryParams =\n topics.length > 0\n ? `?${topics.map((topic) => `topics=${encodeURIComponent(topic)}`).join(\"&\")}`\n : \"\";\n\n while (!signal?.aborted) {\n try {\n yield* sseStreamIterator(url + queryParams, signal, expoFetch, {}, (data) => {\n // Handle different response structures\n // v8 mesh API might wrap in {result: ...} or send directly\n const eventData = data.result || data;\n\n // Skip heartbeat messages\n if (eventData.heartbeat !== undefined) {\n return null;\n }\n\n return this.parseSettlementEvent(eventData);\n });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n break;\n }\n\n // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n // these timeouts are set by expo/fetch function\n if (isFetchTimeoutError(error)) {\n console.debug(\"Timeout error ignored\");\n continue;\n }\n\n console.error(\"Event stream error:\", error);\n throw error;\n }\n }\n }\n\n override async *getTransactionsStream(signal: AbortSignal): AsyncIterableIterator<{\n commitmentTx?: TxNotification;\n arkTx?: TxNotification;\n }> {\n const expoFetch = await getExpoFetch();\n const url = `${this.serverUrl}/v1/txs`;\n\n while (!signal?.aborted) {\n try {\n yield* sseStreamIterator(url, signal, expoFetch, {}, (data) => {\n return this.parseTransactionNotification(data.result);\n });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n break;\n }\n\n // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n // these timeouts are set by expo/fetch function\n if (isFetchTimeoutError(error)) {\n console.debug(\"Timeout error ignored\");\n continue;\n }\n\n console.error(\"Transaction stream error:\", error);\n throw error;\n }\n }\n }\n}\n","import { RestIndexerProvider, SubscriptionResponse, Vtxo } from \"./indexer\";\nimport { isFetchTimeoutError } from \"./ark\";\nimport { VirtualCoin } from \"../wallet\";\nimport { getExpoFetch, sseStreamIterator } from \"./expoUtils\";\nimport { DEFAULT_ARKADE_SERVER_URL } from \"../networks\";\n\n// Helper function to convert Vtxo to VirtualCoin (same as in indexer.ts)\nfunction convertVtxo(vtxo: Vtxo): VirtualCoin {\n return {\n txid: vtxo.outpoint.txid,\n vout: vtxo.outpoint.vout,\n value: Number(vtxo.amount),\n status: {\n confirmed: !vtxo.isSwept && !vtxo.isPreconfirmed,\n isLeaf: !vtxo.isPreconfirmed,\n },\n virtualStatus: {\n state: vtxo.isSwept ? \"swept\" : vtxo.isPreconfirmed ? \"preconfirmed\" : \"settled\",\n commitmentTxIds: vtxo.commitmentTxids,\n batchExpiry: vtxo.expiresAt ? Number(vtxo.expiresAt) * 1000 : undefined,\n },\n spentBy: vtxo.spentBy ?? \"\",\n settledBy: vtxo.settledBy,\n arkTxId: vtxo.arkTxid,\n createdAt: new Date(Number(vtxo.createdAt) * 1000),\n isUnrolled: vtxo.isUnrolled,\n isSpent: vtxo.isSpent,\n script: vtxo.script,\n assets: vtxo.assets?.map((a) => ({\n assetId: a.assetId,\n amount: BigInt(a.amount),\n })),\n };\n}\n\n/**\n * Expo-compatible Indexer provider implementation using expo/fetch for streaming support.\n * This provider works specifically in React Native/Expo environments where\n * standard fetch streaming may not work properly but expo/fetch provides streaming capabilities.\n *\n * @example\n * ```typescript\n * import { ExpoIndexerProvider } from '@arkade-os/sdk/adapters/expo';\n *\n * const provider = new ExpoIndexerProvider('https://indexer.example.com');\n * const vtxos = await provider.getVtxos({ scripts: ['script1'] });\n * ```\n */\nexport class ExpoIndexerProvider extends RestIndexerProvider {\n constructor(serverUrl: string = DEFAULT_ARKADE_SERVER_URL) {\n super(serverUrl);\n }\n\n override async *getSubscription(\n subscriptionId: string,\n abortSignal: AbortSignal,\n ): AsyncIterableIterator<SubscriptionResponse> {\n // Detect if we're running in React Native/Expo environment\n const isReactNative =\n typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\";\n\n const expoFetch = await getExpoFetch().catch((error) => {\n // In React Native/Expo, expo/fetch is required for proper streaming support\n if (isReactNative) {\n throw new Error(\n \"expo/fetch is unavailable in React Native environment. \" +\n \"Please ensure expo/fetch is installed and properly configured. \" +\n \"Streaming support may not work with standard fetch in React Native.\",\n );\n }\n throw error;\n });\n\n const url = `${this.serverUrl}/v1/indexer/script/subscription/${subscriptionId}`;\n\n while (!abortSignal.aborted) {\n try {\n yield* sseStreamIterator(\n url,\n abortSignal,\n expoFetch,\n { \"Content-Type\": \"application/json\" },\n (data): SubscriptionResponse | null => {\n // Handle new v8 proto format with heartbeat or event\n if (data.heartbeat !== undefined) {\n // Skip heartbeat messages\n return null;\n }\n // Process event messages\n if (data.event) {\n return {\n txid: data.event.txid,\n scripts: data.event.scripts || [],\n newVtxos: (data.event.newVtxos || []).map(convertVtxo),\n spentVtxos: (data.event.spentVtxos || []).map(convertVtxo),\n sweptVtxos: (data.event.sweptVtxos || []).map(convertVtxo),\n tx: data.event.tx,\n checkpointTxs: data.event.checkpointTxs,\n };\n }\n return null;\n },\n );\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n break;\n }\n\n // ignore timeout errors, they're expected when the server is not sending anything for 5 min\n // these timeouts are set by expo/fetch function\n if (isFetchTimeoutError(error)) {\n console.debug(\"Timeout error ignored\");\n continue;\n }\n\n console.error(\"Subscription error:\", error);\n throw error;\n }\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkTUSGEWOX_cjs = require('./chunk-TUSGEWOX.cjs');
|
|
4
4
|
|
|
5
5
|
// src/worker/expo/taskRunner.ts
|
|
6
6
|
async function runTasks(queue, processors, deps) {
|
|
@@ -32,7 +32,7 @@ async function runTasks(queue, processors, deps) {
|
|
|
32
32
|
}
|
|
33
33
|
const result = {
|
|
34
34
|
...partial,
|
|
35
|
-
id:
|
|
35
|
+
id: chunkTUSGEWOX_cjs.getRandomId(),
|
|
36
36
|
executedAt: Date.now()
|
|
37
37
|
};
|
|
38
38
|
await queue.pushResult(result);
|
|
@@ -44,7 +44,7 @@ async function runTasks(queue, processors, deps) {
|
|
|
44
44
|
function createTaskDependencies(options) {
|
|
45
45
|
return {
|
|
46
46
|
...options,
|
|
47
|
-
extendVtxo: (vtxo, contract) =>
|
|
47
|
+
extendVtxo: (vtxo, contract) => chunkTUSGEWOX_cjs.extendVirtualCoinForContract(vtxo, contract)
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
|
|
@@ -74,12 +74,12 @@ var contractPollProcessor = {
|
|
|
74
74
|
hasMore = page ? vtxos.length === pageSize : false;
|
|
75
75
|
pageIndex++;
|
|
76
76
|
}
|
|
77
|
-
const filtered =
|
|
77
|
+
const filtered = chunkTUSGEWOX_cjs.warnAndFilterVtxosForScript(
|
|
78
78
|
allVtxos,
|
|
79
79
|
contract.script,
|
|
80
80
|
"contractPollProcessor"
|
|
81
81
|
);
|
|
82
|
-
await
|
|
82
|
+
await chunkTUSGEWOX_cjs.saveVtxosForContract(walletRepository, contract, filtered);
|
|
83
83
|
vtxosSaved += filtered.length;
|
|
84
84
|
contractsProcessed++;
|
|
85
85
|
}
|
|
@@ -96,5 +96,5 @@ exports.CONTRACT_POLL_TASK_TYPE = CONTRACT_POLL_TASK_TYPE;
|
|
|
96
96
|
exports.contractPollProcessor = contractPollProcessor;
|
|
97
97
|
exports.createTaskDependencies = createTaskDependencies;
|
|
98
98
|
exports.runTasks = runTasks;
|
|
99
|
-
//# sourceMappingURL=chunk-
|
|
100
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
//# sourceMappingURL=chunk-A5PY4NBP.cjs.map
|
|
100
|
+
//# sourceMappingURL=chunk-A5PY4NBP.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/worker/expo/taskRunner.ts","../src/worker/expo/processors/contractPollProcessor.ts"],"names":["getRandomId","extendVirtualCoinForContract","warnAndFilterVtxosForScript","saveVtxosForContract"],"mappings":"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","file":"chunk-ZS3OZHC7.cjs","sourcesContent":["import type { TaskItem, TaskResult, TaskQueue } from \"./taskQueue\";\nimport type { WalletRepository } from \"../../repositories/walletRepository\";\nimport type { ContractRepository } from \"../../repositories/contractRepository\";\nimport type { IndexerProvider } from \"../../providers/indexer\";\nimport type { ArkProvider } from \"../../providers/ark\";\nimport type { ExtendedVirtualCoin, VirtualCoin } from \"../../wallet\";\nimport type { Contract } from \"../../contracts/types\";\nimport { getRandomId, extendVirtualCoinForContract } from \"../../wallet/utils\";\n\n/**\n * Shared dependencies injected into every processor at runtime.\n *\n * `extendVtxo` requires the owning contract — processors must resolve each\n * vtxo's `script` to a known contract (via the contract repository) before\n * calling this. The strict signature prevents the footgun where a missing\n * contract silently falls back to the wallet's default tapscript.\n */\nexport interface TaskDependencies {\n walletRepository: WalletRepository;\n contractRepository: ContractRepository;\n indexerProvider: IndexerProvider;\n arkProvider: ArkProvider;\n extendVtxo: (vtxo: VirtualCoin, contract: Contract) => ExtendedVirtualCoin;\n}\n\n/**\n * A stateless unit that handles one type of task item.\n *\n * Processors must not keep in-memory state across invocations —\n * all coordination lives in the @see TaskQueue and repositories.\n *\n * The `TDeps` parameter defaults to @see TaskDependencies but\n * can be overridden for domain-specific processors (e.g. swap processing).\n */\nexport interface TaskProcessor<TDeps = TaskDependencies> {\n readonly taskType: string;\n execute(item: TaskItem, deps: TDeps): Promise<Omit<TaskResult, \"id\" | \"executedAt\">>;\n}\n\n/**\n * Run all pending tasks from the queue through matching processors.\n *\n * For each task in the inbox:\n * 1. Find the processor whose `taskType` matches `task.type`.\n * 2. Execute it, producing a @see TaskResult.\n * 3. Push the result to the outbox and remove the task from the inbox.\n *\n * Tasks with no matching processor produce a `\"noop\"` result.\n * Processor errors produce a `\"failed\"` result with the error message.\n */\nexport async function runTasks<TDeps = TaskDependencies>(\n queue: TaskQueue,\n processors: TaskProcessor<TDeps>[],\n deps: TDeps,\n): Promise<TaskResult[]> {\n const tasks = await queue.getTasks();\n const processorMap = new Map(processors.map((p) => [p.taskType, p]));\n const results: TaskResult[] = [];\n\n for (const task of tasks) {\n const processor = processorMap.get(task.type);\n\n let partial: Omit<TaskResult, \"id\" | \"executedAt\">;\n\n if (!processor) {\n partial = {\n taskItemId: task.id,\n type: task.type,\n status: \"noop\",\n };\n } else {\n try {\n partial = await processor.execute(task, deps);\n } catch (error) {\n partial = {\n taskItemId: task.id,\n type: task.type,\n status: \"failed\",\n data: {\n error: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n const result: TaskResult = {\n ...partial,\n id: getRandomId(),\n executedAt: Date.now(),\n };\n\n await queue.pushResult(result);\n await queue.removeTask(task.id);\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Options for @see createTaskDependencies.\n */\nexport interface CreateTaskDependenciesOptions {\n walletRepository: WalletRepository;\n contractRepository: ContractRepository;\n indexerProvider: IndexerProvider;\n arkProvider: ArkProvider;\n}\n\n/**\n * Build the @see TaskDependencies needed by task processors\n * (e.g. `src/worker/expo/processors/contractPollProcessor.ts`)\n *\n * This is the same construction that `defineExpoBackgroundTask` does\n * internally, extracted so that consumers with custom schedulers\n * (e.g. bare React Native with `react-native-background-fetch`)\n * can build deps without depending on Expo.\n */\nexport function createTaskDependencies(options: CreateTaskDependenciesOptions): TaskDependencies {\n return {\n ...options,\n extendVtxo: (vtxo: VirtualCoin, contract: Contract) =>\n extendVirtualCoinForContract(vtxo, contract),\n };\n}\n","import type { TaskItem, TaskResult } from \"../taskQueue\";\nimport type { TaskProcessor, TaskDependencies } from \"../taskRunner\";\nimport type { ExtendedVirtualCoin } from \"../../../wallet\";\nimport {\n warnAndFilterVtxosForScript,\n saveVtxosForContract,\n} from \"../../../contracts/vtxoOwnership\";\n\nexport const CONTRACT_POLL_TASK_TYPE = \"contract-poll\";\n\n/**\n * Polls the indexer for the latest VTXO state of every contract and\n * persists the results to the wallet repository.\n *\n * Replicates the polling subset of @see ContractManager.initialize:\n * 1. Load all contracts from the contract repository.\n * 2. Paginated fetch of every VTXO (including spent) from the indexer.\n * 3. Extend each VTXO with tapscript data.\n * 4. Save to the wallet repository.\n *\n * NOTE: the indexer query deliberately omits `spendableOnly`. Every\n * repository implements `saveVtxos` as an upsert with no batch delete,\n * so filtering to spendable-only would leave VTXOs that became spent\n * between polls marked as spendable forever. Fetching the full set lets\n * the upsert overwrite stale records with their latest state.\n */\nexport const contractPollProcessor: TaskProcessor = {\n taskType: CONTRACT_POLL_TASK_TYPE,\n\n async execute(\n item: TaskItem,\n deps: TaskDependencies,\n ): Promise<Omit<TaskResult, \"id\" | \"executedAt\">> {\n const { contractRepository, walletRepository, indexerProvider, extendVtxo } = deps;\n\n const contracts = await contractRepository.getContracts();\n let contractsProcessed = 0;\n let vtxosSaved = 0;\n\n for (const contract of contracts) {\n // Paginated fetch of spendable virtual outputs\n const pageSize = 100;\n let pageIndex = 0;\n let hasMore = true;\n const allVtxos: ExtendedVirtualCoin[] = [];\n\n while (hasMore) {\n const { vtxos, page } = await indexerProvider.getVtxos({\n scripts: [contract.script],\n pageIndex,\n pageSize,\n });\n\n for (const vtxo of vtxos) {\n allVtxos.push(extendVtxo(vtxo, contract));\n }\n\n hasMore = page ? vtxos.length === pageSize : false;\n pageIndex++;\n }\n\n // Skip wrong-script rows (legacy duplicates or indexer drift)\n // before persisting; the loop must keep going for the remaining\n // contracts even when one row is rejected.\n const filtered = warnAndFilterVtxosForScript(\n allVtxos,\n contract.script,\n \"contractPollProcessor\",\n );\n await saveVtxosForContract(walletRepository, contract, filtered);\n vtxosSaved += filtered.length;\n contractsProcessed++;\n }\n\n return {\n taskItemId: item.id,\n type: CONTRACT_POLL_TASK_TYPE,\n status: \"success\",\n data: { contractsProcessed, vtxosSaved },\n };\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/worker/expo/taskRunner.ts","../src/worker/expo/processors/contractPollProcessor.ts"],"names":["getRandomId","extendVirtualCoinForContract","warnAndFilterVtxosForScript","saveVtxosForContract"],"mappings":"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","file":"chunk-A5PY4NBP.cjs","sourcesContent":["import type { TaskItem, TaskResult, TaskQueue } from \"./taskQueue\";\nimport type { WalletRepository } from \"../../repositories/walletRepository\";\nimport type { ContractRepository } from \"../../repositories/contractRepository\";\nimport type { IndexerProvider } from \"../../providers/indexer\";\nimport type { ArkProvider } from \"../../providers/ark\";\nimport type { ExtendedVirtualCoin, VirtualCoin } from \"../../wallet\";\nimport type { Contract } from \"../../contracts/types\";\nimport { getRandomId, extendVirtualCoinForContract } from \"../../wallet/utils\";\n\n/**\n * Shared dependencies injected into every processor at runtime.\n *\n * `extendVtxo` requires the owning contract — processors must resolve each\n * vtxo's `script` to a known contract (via the contract repository) before\n * calling this. The strict signature prevents the footgun where a missing\n * contract silently falls back to the wallet's default tapscript.\n */\nexport interface TaskDependencies {\n walletRepository: WalletRepository;\n contractRepository: ContractRepository;\n indexerProvider: IndexerProvider;\n arkProvider: ArkProvider;\n extendVtxo: (vtxo: VirtualCoin, contract: Contract) => ExtendedVirtualCoin;\n}\n\n/**\n * A stateless unit that handles one type of task item.\n *\n * Processors must not keep in-memory state across invocations —\n * all coordination lives in the @see TaskQueue and repositories.\n *\n * The `TDeps` parameter defaults to @see TaskDependencies but\n * can be overridden for domain-specific processors (e.g. swap processing).\n */\nexport interface TaskProcessor<TDeps = TaskDependencies> {\n readonly taskType: string;\n execute(item: TaskItem, deps: TDeps): Promise<Omit<TaskResult, \"id\" | \"executedAt\">>;\n}\n\n/**\n * Run all pending tasks from the queue through matching processors.\n *\n * For each task in the inbox:\n * 1. Find the processor whose `taskType` matches `task.type`.\n * 2. Execute it, producing a @see TaskResult.\n * 3. Push the result to the outbox and remove the task from the inbox.\n *\n * Tasks with no matching processor produce a `\"noop\"` result.\n * Processor errors produce a `\"failed\"` result with the error message.\n */\nexport async function runTasks<TDeps = TaskDependencies>(\n queue: TaskQueue,\n processors: TaskProcessor<TDeps>[],\n deps: TDeps,\n): Promise<TaskResult[]> {\n const tasks = await queue.getTasks();\n const processorMap = new Map(processors.map((p) => [p.taskType, p]));\n const results: TaskResult[] = [];\n\n for (const task of tasks) {\n const processor = processorMap.get(task.type);\n\n let partial: Omit<TaskResult, \"id\" | \"executedAt\">;\n\n if (!processor) {\n partial = {\n taskItemId: task.id,\n type: task.type,\n status: \"noop\",\n };\n } else {\n try {\n partial = await processor.execute(task, deps);\n } catch (error) {\n partial = {\n taskItemId: task.id,\n type: task.type,\n status: \"failed\",\n data: {\n error: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n const result: TaskResult = {\n ...partial,\n id: getRandomId(),\n executedAt: Date.now(),\n };\n\n await queue.pushResult(result);\n await queue.removeTask(task.id);\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Options for @see createTaskDependencies.\n */\nexport interface CreateTaskDependenciesOptions {\n walletRepository: WalletRepository;\n contractRepository: ContractRepository;\n indexerProvider: IndexerProvider;\n arkProvider: ArkProvider;\n}\n\n/**\n * Build the @see TaskDependencies needed by task processors\n * (e.g. `src/worker/expo/processors/contractPollProcessor.ts`)\n *\n * This is the same construction that `defineExpoBackgroundTask` does\n * internally, extracted so that consumers with custom schedulers\n * (e.g. bare React Native with `react-native-background-fetch`)\n * can build deps without depending on Expo.\n */\nexport function createTaskDependencies(options: CreateTaskDependenciesOptions): TaskDependencies {\n return {\n ...options,\n extendVtxo: (vtxo: VirtualCoin, contract: Contract) =>\n extendVirtualCoinForContract(vtxo, contract),\n };\n}\n","import type { TaskItem, TaskResult } from \"../taskQueue\";\nimport type { TaskProcessor, TaskDependencies } from \"../taskRunner\";\nimport type { ExtendedVirtualCoin } from \"../../../wallet\";\nimport {\n warnAndFilterVtxosForScript,\n saveVtxosForContract,\n} from \"../../../contracts/vtxoOwnership\";\n\nexport const CONTRACT_POLL_TASK_TYPE = \"contract-poll\";\n\n/**\n * Polls the indexer for the latest VTXO state of every contract and\n * persists the results to the wallet repository.\n *\n * Replicates the polling subset of @see ContractManager.initialize:\n * 1. Load all contracts from the contract repository.\n * 2. Paginated fetch of every VTXO (including spent) from the indexer.\n * 3. Extend each VTXO with tapscript data.\n * 4. Save to the wallet repository.\n *\n * NOTE: the indexer query deliberately omits `spendableOnly`. Every\n * repository implements `saveVtxos` as an upsert with no batch delete,\n * so filtering to spendable-only would leave VTXOs that became spent\n * between polls marked as spendable forever. Fetching the full set lets\n * the upsert overwrite stale records with their latest state.\n */\nexport const contractPollProcessor: TaskProcessor = {\n taskType: CONTRACT_POLL_TASK_TYPE,\n\n async execute(\n item: TaskItem,\n deps: TaskDependencies,\n ): Promise<Omit<TaskResult, \"id\" | \"executedAt\">> {\n const { contractRepository, walletRepository, indexerProvider, extendVtxo } = deps;\n\n const contracts = await contractRepository.getContracts();\n let contractsProcessed = 0;\n let vtxosSaved = 0;\n\n for (const contract of contracts) {\n // Paginated fetch of spendable virtual outputs\n const pageSize = 100;\n let pageIndex = 0;\n let hasMore = true;\n const allVtxos: ExtendedVirtualCoin[] = [];\n\n while (hasMore) {\n const { vtxos, page } = await indexerProvider.getVtxos({\n scripts: [contract.script],\n pageIndex,\n pageSize,\n });\n\n for (const vtxo of vtxos) {\n allVtxos.push(extendVtxo(vtxo, contract));\n }\n\n hasMore = page ? vtxos.length === pageSize : false;\n pageIndex++;\n }\n\n // Skip wrong-script rows (legacy duplicates or indexer drift)\n // before persisting; the loop must keep going for the remaining\n // contracts even when one row is rejected.\n const filtered = warnAndFilterVtxosForScript(\n allVtxos,\n contract.script,\n \"contractPollProcessor\",\n );\n await saveVtxosForContract(walletRepository, contract, filtered);\n vtxosSaved += filtered.length;\n contractsProcessed++;\n }\n\n return {\n taskItemId: item.id,\n type: CONTRACT_POLL_TASK_TYPE,\n status: \"success\",\n data: { contractsProcessed, vtxosSaved },\n };\n },\n};\n"]}
|
|
@@ -138,23 +138,27 @@ function maybeArkError(error) {
|
|
|
138
138
|
try {
|
|
139
139
|
if (!(error instanceof Error)) return void 0;
|
|
140
140
|
const decoded = JSON.parse(error.message);
|
|
141
|
-
if (
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
141
|
+
if (Array.isArray(decoded.details)) {
|
|
142
|
+
for (const details of decoded.details) {
|
|
143
|
+
if (!("@type" in details)) continue;
|
|
144
|
+
const type = details["@type"];
|
|
145
|
+
if (type !== "type.googleapis.com/ark.v1.ErrorDetails") continue;
|
|
146
|
+
if (!("code" in details)) continue;
|
|
147
|
+
const code = details.code;
|
|
148
|
+
if (!("message" in details)) continue;
|
|
149
|
+
const message = details.message;
|
|
150
|
+
if (!("name" in details)) continue;
|
|
151
|
+
const name = details.name;
|
|
152
|
+
let metadata;
|
|
153
|
+
if ("metadata" in details && isMetadata(details.metadata)) {
|
|
154
|
+
metadata = details.metadata;
|
|
155
|
+
}
|
|
156
|
+
return new ArkError(code, message, name, metadata);
|
|
156
157
|
}
|
|
157
|
-
|
|
158
|
+
}
|
|
159
|
+
if (typeof decoded.message === "string") {
|
|
160
|
+
const m = decoded.message.match(/^([A-Z][A-Z0-9_]*) \((\d+)\): ([\s\S]*)$/);
|
|
161
|
+
if (m) return new ArkError(Number(m[2]), m[3], m[1]);
|
|
158
162
|
}
|
|
159
163
|
return void 0;
|
|
160
164
|
} catch (e) {
|
|
@@ -437,7 +441,32 @@ function isEventSourceError(error) {
|
|
|
437
441
|
return error instanceof Error && error.name === "EventSourceError";
|
|
438
442
|
}
|
|
439
443
|
|
|
444
|
+
// package.json
|
|
445
|
+
var version = "0.4.36";
|
|
446
|
+
|
|
447
|
+
// src/utils/fetch.ts
|
|
448
|
+
var buildVersion = "0.9.9";
|
|
449
|
+
var sdkVersion = `ts-sdk/${version}`;
|
|
450
|
+
function baseFetch(input, init) {
|
|
451
|
+
if (typeof globalThis.fetch !== "function") {
|
|
452
|
+
throw new Error("Fetch API is not available in this environment.");
|
|
453
|
+
}
|
|
454
|
+
return globalThis.fetch(input, init);
|
|
455
|
+
}
|
|
456
|
+
function fetch(input, init) {
|
|
457
|
+
const headers = new Headers(init?.headers);
|
|
458
|
+
headers.set("X-Build-Version", buildVersion);
|
|
459
|
+
headers.set("X-SDK-VERSION", sdkVersion);
|
|
460
|
+
return baseFetch(input, { ...init, headers });
|
|
461
|
+
}
|
|
462
|
+
|
|
440
463
|
// src/providers/ark.ts
|
|
464
|
+
var DigestMismatchError = class extends Error {
|
|
465
|
+
constructor(message) {
|
|
466
|
+
super(message);
|
|
467
|
+
this.name = "DigestMismatchError";
|
|
468
|
+
}
|
|
469
|
+
};
|
|
441
470
|
var SettlementEventType = /* @__PURE__ */ ((SettlementEventType2) => {
|
|
442
471
|
SettlementEventType2["BatchStarted"] = "batch_started";
|
|
443
472
|
SettlementEventType2["BatchFinalization"] = "batch_finalization";
|
|
@@ -454,6 +483,67 @@ var RestArkProvider = class {
|
|
|
454
483
|
constructor(serverUrl = chunkCMPJR3HS_cjs.DEFAULT_ARKADE_SERVER_URL) {
|
|
455
484
|
this.serverUrl = serverUrl;
|
|
456
485
|
}
|
|
486
|
+
/**
|
|
487
|
+
* Last server-info digest seen (from {@link getInfo}). Sent as `X-Digest`
|
|
488
|
+
* on outgoing requests so arkd can reject a client whose cached info is
|
|
489
|
+
* stale. Empty until the first {@link getInfo}.
|
|
490
|
+
*/
|
|
491
|
+
_digest = "";
|
|
492
|
+
_serverInfoListeners = /* @__PURE__ */ new Set();
|
|
493
|
+
/**
|
|
494
|
+
* Subscribe to server-info changes. Fired when a request is rejected with
|
|
495
|
+
* `DIGEST_MISMATCH` and fresh info is re-fetched, so consumers (the wallet)
|
|
496
|
+
* can re-derive signer-dependent state mid-session without polling. Returns
|
|
497
|
+
* an unsubscribe function.
|
|
498
|
+
*/
|
|
499
|
+
onServerInfoChanged(listener) {
|
|
500
|
+
this._serverInfoListeners.add(listener);
|
|
501
|
+
return () => {
|
|
502
|
+
this._serverInfoListeners.delete(listener);
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
emitServerInfoChanged(info) {
|
|
506
|
+
for (const listener of this._serverInfoListeners) {
|
|
507
|
+
try {
|
|
508
|
+
listener(info);
|
|
509
|
+
} catch (e) {
|
|
510
|
+
console.warn("onServerInfoChanged listener threw", e);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* `fetch` wrapper for arkd requests that participates in server-info digest
|
|
516
|
+
* negotiation. Sends the cached `X-Digest`; when arkd rejects a request with
|
|
517
|
+
* `DIGEST_MISMATCH`, refreshes {@link getInfo} (updating the digest), fires
|
|
518
|
+
* {@link onServerInfoChanged}, and THROWS {@link DigestMismatchError} — it
|
|
519
|
+
* never silently retries, since the in-flight request was built against the
|
|
520
|
+
* now-stale config. Dormant until arkd returns the error — then it is the
|
|
521
|
+
* instant, event-driven signer-rotation trigger. {@link getInfo} itself never
|
|
522
|
+
* routes through here: it is the refresh path and must not be digest-gated.
|
|
523
|
+
*/
|
|
524
|
+
async authedFetch(url, init) {
|
|
525
|
+
const digest = this._digest;
|
|
526
|
+
const headers = {
|
|
527
|
+
...init.headers
|
|
528
|
+
};
|
|
529
|
+
if (digest) headers["X-Digest"] = digest;
|
|
530
|
+
const response = await fetch(url, { ...init, headers });
|
|
531
|
+
if (response.ok) return response;
|
|
532
|
+
let body;
|
|
533
|
+
try {
|
|
534
|
+
body = await response.clone().text();
|
|
535
|
+
} catch (e) {
|
|
536
|
+
console.warn("authedFetch could not read response body for digest check", e);
|
|
537
|
+
return response;
|
|
538
|
+
}
|
|
539
|
+
if (maybeArkError(new Error(body))?.name !== "DIGEST_MISMATCH") return response;
|
|
540
|
+
this._digest = "";
|
|
541
|
+
const info = await this.getInfo();
|
|
542
|
+
this.emitServerInfoChanged(info);
|
|
543
|
+
throw new DigestMismatchError(
|
|
544
|
+
"Arkade server reported a configuration digest mismatch; server info was refreshed. Rebuild and retry the request under the new server info."
|
|
545
|
+
);
|
|
546
|
+
}
|
|
457
547
|
async getInfo() {
|
|
458
548
|
const url = `${this.serverUrl}/v1/info`;
|
|
459
549
|
const response = await fetch(url);
|
|
@@ -462,10 +552,16 @@ var RestArkProvider = class {
|
|
|
462
552
|
handleError(errorText, `Failed to get server info: ${response.statusText}`);
|
|
463
553
|
}
|
|
464
554
|
const fromServer = await response.json();
|
|
465
|
-
|
|
555
|
+
const info = {
|
|
466
556
|
boardingExitDelay: BigInt(fromServer.boardingExitDelay ?? 0),
|
|
467
557
|
checkpointTapscript: fromServer.checkpointTapscript ?? "",
|
|
468
558
|
deprecatedSigners: fromServer.deprecatedSigners?.map((signer) => ({
|
|
559
|
+
// arkd advertises `cutoffDate` as a non-nullable field, so it
|
|
560
|
+
// is always a bigint here — `0n` is the sentinel for "no
|
|
561
|
+
// cutoff" (the classifier maps it to DUE_NOW). The grpc-gateway
|
|
562
|
+
// marshals with EmitUnpopulated, so an unset `cutoff_date`
|
|
563
|
+
// already arrives as `"0"`; a genuinely missing field defaults
|
|
564
|
+
// to `0n` too. Never collapse to `undefined`.
|
|
469
565
|
cutoffDate: BigInt(signer.cutoffDate ?? 0),
|
|
470
566
|
pubkey: signer.pubkey ?? ""
|
|
471
567
|
})) ?? [],
|
|
@@ -495,10 +591,12 @@ var RestArkProvider = class {
|
|
|
495
591
|
vtxoMaxAmount: BigInt(fromServer.vtxoMaxAmount ?? -1),
|
|
496
592
|
vtxoMinAmount: BigInt(fromServer.vtxoMinAmount ?? 0)
|
|
497
593
|
};
|
|
594
|
+
this._digest = info.digest;
|
|
595
|
+
return info;
|
|
498
596
|
}
|
|
499
597
|
async submitTx(signedArkTx, checkpointTxs) {
|
|
500
598
|
const url = `${this.serverUrl}/v1/tx/submit`;
|
|
501
|
-
const response = await
|
|
599
|
+
const response = await this.authedFetch(url, {
|
|
502
600
|
method: "POST",
|
|
503
601
|
headers: {
|
|
504
602
|
"Content-Type": "application/json"
|
|
@@ -521,7 +619,7 @@ var RestArkProvider = class {
|
|
|
521
619
|
}
|
|
522
620
|
async finalizeTx(arkTxid, finalCheckpointTxs) {
|
|
523
621
|
const url = `${this.serverUrl}/v1/tx/finalize`;
|
|
524
|
-
const response = await
|
|
622
|
+
const response = await this.authedFetch(url, {
|
|
525
623
|
method: "POST",
|
|
526
624
|
headers: {
|
|
527
625
|
"Content-Type": "application/json"
|
|
@@ -538,7 +636,7 @@ var RestArkProvider = class {
|
|
|
538
636
|
}
|
|
539
637
|
async registerIntent(intent) {
|
|
540
638
|
const url = `${this.serverUrl}/v1/batch/registerIntent`;
|
|
541
|
-
const response = await
|
|
639
|
+
const response = await this.authedFetch(url, {
|
|
542
640
|
method: "POST",
|
|
543
641
|
headers: {
|
|
544
642
|
"Content-Type": "application/json"
|
|
@@ -559,7 +657,7 @@ var RestArkProvider = class {
|
|
|
559
657
|
}
|
|
560
658
|
async deleteIntent(intent) {
|
|
561
659
|
const url = `${this.serverUrl}/v1/batch/deleteIntent`;
|
|
562
|
-
const response = await
|
|
660
|
+
const response = await this.authedFetch(url, {
|
|
563
661
|
method: "POST",
|
|
564
662
|
headers: {
|
|
565
663
|
"Content-Type": "application/json"
|
|
@@ -578,7 +676,7 @@ var RestArkProvider = class {
|
|
|
578
676
|
}
|
|
579
677
|
async confirmRegistration(intentId) {
|
|
580
678
|
const url = `${this.serverUrl}/v1/batch/ack`;
|
|
581
|
-
const response = await
|
|
679
|
+
const response = await this.authedFetch(url, {
|
|
582
680
|
method: "POST",
|
|
583
681
|
headers: {
|
|
584
682
|
"Content-Type": "application/json"
|
|
@@ -594,7 +692,7 @@ var RestArkProvider = class {
|
|
|
594
692
|
}
|
|
595
693
|
async submitTreeNonces(batchId, pubkey, nonces) {
|
|
596
694
|
const url = `${this.serverUrl}/v1/batch/tree/submitNonces`;
|
|
597
|
-
const response = await
|
|
695
|
+
const response = await this.authedFetch(url, {
|
|
598
696
|
method: "POST",
|
|
599
697
|
headers: {
|
|
600
698
|
"Content-Type": "application/json"
|
|
@@ -612,7 +710,7 @@ var RestArkProvider = class {
|
|
|
612
710
|
}
|
|
613
711
|
async submitTreeSignatures(batchId, pubkey, signatures) {
|
|
614
712
|
const url = `${this.serverUrl}/v1/batch/tree/submitSignatures`;
|
|
615
|
-
const response = await
|
|
713
|
+
const response = await this.authedFetch(url, {
|
|
616
714
|
method: "POST",
|
|
617
715
|
headers: {
|
|
618
716
|
"Content-Type": "application/json"
|
|
@@ -630,7 +728,7 @@ var RestArkProvider = class {
|
|
|
630
728
|
}
|
|
631
729
|
async submitSignedForfeitTxs(signedForfeitTxs, signedCommitmentTx) {
|
|
632
730
|
const url = `${this.serverUrl}/v1/batch/submitForfeitTxs`;
|
|
633
|
-
const response = await
|
|
731
|
+
const response = await this.authedFetch(url, {
|
|
634
732
|
method: "POST",
|
|
635
733
|
headers: {
|
|
636
734
|
"Content-Type": "application/json"
|
|
@@ -760,7 +858,7 @@ var RestArkProvider = class {
|
|
|
760
858
|
}
|
|
761
859
|
async getPendingTxs(intent) {
|
|
762
860
|
const url = `${this.serverUrl}/v1/tx/pending`;
|
|
763
|
-
const response = await
|
|
861
|
+
const response = await this.authedFetch(url, {
|
|
764
862
|
method: "POST",
|
|
765
863
|
headers: {
|
|
766
864
|
"Content-Type": "application/json"
|
|
@@ -2203,7 +2301,7 @@ var RestIndexerProvider = class {
|
|
|
2203
2301
|
if (params.toString()) {
|
|
2204
2302
|
url += "?" + params.toString();
|
|
2205
2303
|
}
|
|
2206
|
-
const res = await
|
|
2304
|
+
const res = await baseFetch(url);
|
|
2207
2305
|
if (!res.ok) {
|
|
2208
2306
|
throw new Error(`Failed to fetch vtxo tree: ${res.statusText}`);
|
|
2209
2307
|
}
|
|
@@ -2229,7 +2327,7 @@ var RestIndexerProvider = class {
|
|
|
2229
2327
|
if (params.toString()) {
|
|
2230
2328
|
url += "?" + params.toString();
|
|
2231
2329
|
}
|
|
2232
|
-
const res = await
|
|
2330
|
+
const res = await baseFetch(url);
|
|
2233
2331
|
if (!res.ok) {
|
|
2234
2332
|
throw new Error(`Failed to fetch vtxo tree leaves: ${res.statusText}`);
|
|
2235
2333
|
}
|
|
@@ -2241,7 +2339,7 @@ var RestIndexerProvider = class {
|
|
|
2241
2339
|
}
|
|
2242
2340
|
async getBatchSweepTransactions(batchOutpoint) {
|
|
2243
2341
|
const url = `${this.serverUrl}/v1/indexer/batch/${batchOutpoint.txid}/${batchOutpoint.vout}/sweepTxs`;
|
|
2244
|
-
const res = await
|
|
2342
|
+
const res = await baseFetch(url);
|
|
2245
2343
|
if (!res.ok) {
|
|
2246
2344
|
throw new Error(`Failed to fetch batch sweep transactions: ${res.statusText}`);
|
|
2247
2345
|
}
|
|
@@ -2253,7 +2351,7 @@ var RestIndexerProvider = class {
|
|
|
2253
2351
|
}
|
|
2254
2352
|
async getCommitmentTx(txid) {
|
|
2255
2353
|
const url = `${this.serverUrl}/v1/indexer/commitmentTx/${txid}`;
|
|
2256
|
-
const res = await
|
|
2354
|
+
const res = await baseFetch(url);
|
|
2257
2355
|
if (!res.ok) {
|
|
2258
2356
|
throw new Error(`Failed to fetch commitment tx: ${res.statusText}`);
|
|
2259
2357
|
}
|
|
@@ -2274,7 +2372,7 @@ var RestIndexerProvider = class {
|
|
|
2274
2372
|
if (params.toString()) {
|
|
2275
2373
|
url += "?" + params.toString();
|
|
2276
2374
|
}
|
|
2277
|
-
const res = await
|
|
2375
|
+
const res = await baseFetch(url);
|
|
2278
2376
|
if (!res.ok) {
|
|
2279
2377
|
throw new Error(`Failed to fetch commitment tx connectors: ${res.statusText}`);
|
|
2280
2378
|
}
|
|
@@ -2300,7 +2398,7 @@ var RestIndexerProvider = class {
|
|
|
2300
2398
|
if (params.toString()) {
|
|
2301
2399
|
url += "?" + params.toString();
|
|
2302
2400
|
}
|
|
2303
|
-
const res = await
|
|
2401
|
+
const res = await baseFetch(url);
|
|
2304
2402
|
if (!res.ok) {
|
|
2305
2403
|
throw new Error(`Failed to fetch commitment tx forfeitTxs: ${res.statusText}`);
|
|
2306
2404
|
}
|
|
@@ -2383,7 +2481,7 @@ var RestIndexerProvider = class {
|
|
|
2383
2481
|
if (params.toString()) {
|
|
2384
2482
|
url += "?" + params.toString();
|
|
2385
2483
|
}
|
|
2386
|
-
const res = await
|
|
2484
|
+
const res = await baseFetch(url);
|
|
2387
2485
|
if (!res.ok) {
|
|
2388
2486
|
throw new Error(`Failed to fetch virtual txs: ${res.statusText}`);
|
|
2389
2487
|
}
|
|
@@ -2404,7 +2502,7 @@ var RestIndexerProvider = class {
|
|
|
2404
2502
|
if (params.toString()) {
|
|
2405
2503
|
url += "?" + params.toString();
|
|
2406
2504
|
}
|
|
2407
|
-
const res = await
|
|
2505
|
+
const res = await baseFetch(url);
|
|
2408
2506
|
if (!res.ok) {
|
|
2409
2507
|
throw new Error(`Failed to fetch vtxo chain: ${res.statusText}`);
|
|
2410
2508
|
}
|
|
@@ -2463,7 +2561,7 @@ var RestIndexerProvider = class {
|
|
|
2463
2561
|
if (params.toString()) {
|
|
2464
2562
|
url += "?" + params.toString();
|
|
2465
2563
|
}
|
|
2466
|
-
const res = await
|
|
2564
|
+
const res = await baseFetch(url);
|
|
2467
2565
|
if (!res.ok) {
|
|
2468
2566
|
throw new Error(`Failed to fetch vtxos: ${res.statusText}`);
|
|
2469
2567
|
}
|
|
@@ -2478,7 +2576,7 @@ var RestIndexerProvider = class {
|
|
|
2478
2576
|
}
|
|
2479
2577
|
async getAssetDetails(assetId) {
|
|
2480
2578
|
const url = `${this.serverUrl}/v1/indexer/asset/${encodeURIComponent(assetId)}`;
|
|
2481
|
-
const res = await
|
|
2579
|
+
const res = await baseFetch(url);
|
|
2482
2580
|
if (!res.ok) {
|
|
2483
2581
|
throw new Error(`Failed to fetch asset details: ${res.statusText}`);
|
|
2484
2582
|
}
|
|
@@ -2496,7 +2594,7 @@ var RestIndexerProvider = class {
|
|
|
2496
2594
|
}
|
|
2497
2595
|
async subscribeForScripts(scripts, subscriptionId) {
|
|
2498
2596
|
const url = `${this.serverUrl}/v1/indexer/script/subscribe`;
|
|
2499
|
-
const res = await
|
|
2597
|
+
const res = await baseFetch(url, {
|
|
2500
2598
|
headers: {
|
|
2501
2599
|
"Content-Type": "application/json"
|
|
2502
2600
|
},
|
|
@@ -2513,7 +2611,7 @@ var RestIndexerProvider = class {
|
|
|
2513
2611
|
}
|
|
2514
2612
|
async unsubscribeForScripts(subscriptionId, scripts) {
|
|
2515
2613
|
const url = `${this.serverUrl}/v1/indexer/script/unsubscribe`;
|
|
2516
|
-
const res = await
|
|
2614
|
+
const res = await baseFetch(url, {
|
|
2517
2615
|
headers: {
|
|
2518
2616
|
"Content-Type": "application/json"
|
|
2519
2617
|
},
|
|
@@ -2680,6 +2778,7 @@ exports.BufferReader = BufferReader;
|
|
|
2680
2778
|
exports.ChainTxType = ChainTxType;
|
|
2681
2779
|
exports.ConditionWitness = ConditionWitness;
|
|
2682
2780
|
exports.CosignerPublicKey = CosignerPublicKey;
|
|
2781
|
+
exports.DigestMismatchError = DigestMismatchError;
|
|
2683
2782
|
exports.IndexerTxType = IndexerTxType;
|
|
2684
2783
|
exports.Metadata = Metadata;
|
|
2685
2784
|
exports.OP_RETURN_EMPTY_PKSCRIPT = OP_RETURN_EMPTY_PKSCRIPT;
|
|
@@ -2691,11 +2790,15 @@ exports.Transaction = Transaction;
|
|
|
2691
2790
|
exports.VtxoTaprootTree = VtxoTaprootTree;
|
|
2692
2791
|
exports.VtxoTreeExpiry = VtxoTreeExpiry;
|
|
2693
2792
|
exports.asset_exports = asset_exports;
|
|
2793
|
+
exports.baseFetch = baseFetch;
|
|
2794
|
+
exports.buildVersion = buildVersion;
|
|
2694
2795
|
exports.craftToSpendTx = craftToSpendTx;
|
|
2796
|
+
exports.fetch = fetch;
|
|
2695
2797
|
exports.getArkPsbtFields = getArkPsbtFields;
|
|
2696
2798
|
exports.isEventSourceError = isEventSourceError;
|
|
2697
2799
|
exports.isFetchTimeoutError = isFetchTimeoutError;
|
|
2698
2800
|
exports.maybeArkError = maybeArkError;
|
|
2801
|
+
exports.sdkVersion = sdkVersion;
|
|
2699
2802
|
exports.setArkPsbtField = setArkPsbtField;
|
|
2700
|
-
//# sourceMappingURL=chunk-
|
|
2701
|
-
//# sourceMappingURL=chunk-
|
|
2803
|
+
//# sourceMappingURL=chunk-C6OODRWD.cjs.map
|
|
2804
|
+
//# sourceMappingURL=chunk-C6OODRWD.cjs.map
|