@arkade-os/sdk 0.4.34 → 0.4.35

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 (69) hide show
  1. package/dist/adapters/expo.cjs +4 -4
  2. package/dist/adapters/expo.d.cts +2 -2
  3. package/dist/adapters/expo.d.ts +2 -2
  4. package/dist/adapters/expo.js +2 -2
  5. package/dist/adapters/indexedDB.cjs +3 -3
  6. package/dist/adapters/indexedDB.js +2 -2
  7. package/dist/{ark-Dsv5Jq4E.d.cts → ark-D6sau_6-.d.cts} +458 -3
  8. package/dist/{ark-Dsv5Jq4E.d.ts → ark-D6sau_6-.d.ts} +458 -3
  9. package/dist/{asyncStorageTaskQueue-D92ch8yI.d.cts → asyncStorageTaskQueue-CpC027t_.d.cts} +2 -2
  10. package/dist/{asyncStorageTaskQueue-BH-zuth5.d.ts → asyncStorageTaskQueue-GT8fmPUG.d.ts} +2 -2
  11. package/dist/{chunk-FXFBPXV3.js → chunk-3JR77WQ4.js} +139 -41
  12. package/dist/chunk-3JR77WQ4.js.map +1 -0
  13. package/dist/{chunk-ZS3OZHC7.cjs → chunk-FM7T7JVL.cjs} +7 -7
  14. package/dist/{chunk-ZS3OZHC7.cjs.map → chunk-FM7T7JVL.cjs.map} +1 -1
  15. package/dist/{chunk-XCHBQVMK.cjs → chunk-H2LX2KKY.cjs} +1540 -265
  16. package/dist/chunk-H2LX2KKY.cjs.map +1 -0
  17. package/dist/{chunk-HFXEUW55.js → chunk-NOR7XOKN.js} +1472 -202
  18. package/dist/chunk-NOR7XOKN.js.map +1 -0
  19. package/dist/{chunk-VVGD3JIP.js → chunk-OURFR4UR.js} +3 -3
  20. package/dist/{chunk-VVGD3JIP.js.map → chunk-OURFR4UR.js.map} +1 -1
  21. package/dist/{chunk-CCLNFHJ5.cjs → chunk-VYS3KGRI.cjs} +16 -10
  22. package/dist/chunk-VYS3KGRI.cjs.map +1 -0
  23. package/dist/{chunk-FSAXPBGP.cjs → chunk-X2EQLK4O.cjs} +143 -40
  24. package/dist/chunk-X2EQLK4O.cjs.map +1 -0
  25. package/dist/{chunk-5WDBHWX3.js → chunk-XQS2HW4Q.js} +10 -4
  26. package/dist/chunk-XQS2HW4Q.js.map +1 -0
  27. package/dist/contracts/handlers/index.d.cts +3 -3
  28. package/dist/contracts/handlers/index.d.ts +3 -3
  29. package/dist/{delegate-BaS5SCIW.d.cts → delegate-C-L6gSZx.d.cts} +1 -1
  30. package/dist/{delegate-Baz_hb83.d.ts → delegate-De5__fpZ.d.ts} +1 -1
  31. package/dist/{index-FwXZveaX.d.ts → index-BETdjE_o.d.ts} +2 -2
  32. package/dist/{index-lNZ6qaO3.d.cts → index-jwQfHP6D.d.cts} +2 -2
  33. package/dist/index.cjs +129 -105
  34. package/dist/index.d.cts +69 -9
  35. package/dist/index.d.ts +69 -9
  36. package/dist/index.js +2 -2
  37. package/dist/repositories/realm/index.cjs +12 -12
  38. package/dist/repositories/realm/index.cjs.map +1 -1
  39. package/dist/repositories/realm/index.d.cts +2 -2
  40. package/dist/repositories/realm/index.d.ts +2 -2
  41. package/dist/repositories/realm/index.js +3 -3
  42. package/dist/repositories/realm/index.js.map +1 -1
  43. package/dist/repositories/sqlite/index.cjs +11 -11
  44. package/dist/repositories/sqlite/index.d.cts +1 -1
  45. package/dist/repositories/sqlite/index.d.ts +1 -1
  46. package/dist/repositories/sqlite/index.js +2 -2
  47. package/dist/{taskRunner-vFRA3F9b.d.cts → taskRunner-DCyp6Gea.d.cts} +2 -2
  48. package/dist/{taskRunner-B1NUWyWR.d.ts → taskRunner-DnxtObeq.d.ts} +2 -2
  49. package/dist/wallet/expo/background.cjs +12 -12
  50. package/dist/wallet/expo/background.d.cts +3 -3
  51. package/dist/wallet/expo/background.d.ts +3 -3
  52. package/dist/wallet/expo/background.js +4 -4
  53. package/dist/wallet/expo/index.cjs +11 -11
  54. package/dist/wallet/expo/index.d.cts +4 -4
  55. package/dist/wallet/expo/index.d.ts +4 -4
  56. package/dist/wallet/expo/index.js +3 -3
  57. package/dist/{wallet-D6uoBLmS.d.ts → wallet-BWHbd5b1.d.cts} +231 -8
  58. package/dist/{wallet-By9HIo0Q.d.cts → wallet-Bth5uucA.d.ts} +231 -8
  59. package/dist/worker/expo/index.cjs +7 -7
  60. package/dist/worker/expo/index.d.cts +4 -4
  61. package/dist/worker/expo/index.d.ts +4 -4
  62. package/dist/worker/expo/index.js +3 -3
  63. package/package.json +2 -2
  64. package/dist/chunk-5WDBHWX3.js.map +0 -1
  65. package/dist/chunk-CCLNFHJ5.cjs.map +0 -1
  66. package/dist/chunk-FSAXPBGP.cjs.map +0 -1
  67. package/dist/chunk-FXFBPXV3.js.map +0 -1
  68. package/dist/chunk-HFXEUW55.js.map +0 -1
  69. package/dist/chunk-XCHBQVMK.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { getRandomId, extendVirtualCoinForContract, warnAndFilterVtxosForScript, saveVtxosForContract } from './chunk-HFXEUW55.js';
1
+ import { getRandomId, extendVirtualCoinForContract, warnAndFilterVtxosForScript, saveVtxosForContract } from './chunk-NOR7XOKN.js';
2
2
 
3
3
  // src/worker/expo/taskRunner.ts
4
4
  async function runTasks(queue, processors, deps) {
@@ -91,5 +91,5 @@ var contractPollProcessor = {
91
91
  };
92
92
 
93
93
  export { CONTRACT_POLL_TASK_TYPE, contractPollProcessor, createTaskDependencies, runTasks };
94
- //# sourceMappingURL=chunk-VVGD3JIP.js.map
95
- //# sourceMappingURL=chunk-VVGD3JIP.js.map
94
+ //# sourceMappingURL=chunk-OURFR4UR.js.map
95
+ //# sourceMappingURL=chunk-OURFR4UR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/worker/expo/taskRunner.ts","../src/worker/expo/processors/contractPollProcessor.ts"],"names":[],"mappings":"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","file":"chunk-VVGD3JIP.js","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":[],"mappings":"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","file":"chunk-OURFR4UR.js","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,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkFSAXPBGP_cjs = require('./chunk-FSAXPBGP.cjs');
3
+ var chunkX2EQLK4O_cjs = require('./chunk-X2EQLK4O.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
- return expoFetchModule.fetch;
11
+ const expoFetchWithHeader = (input, init) => {
12
+ const headers = new Headers(init?.headers);
13
+ headers.set("X-Build-Version", chunkX2EQLK4O_cjs.buildVersion);
14
+ headers.set("X-SDK-VERSION", chunkX2EQLK4O_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 chunkX2EQLK4O_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 chunkFSAXPBGP_cjs.RestArkProvider {
80
+ var ExpoArkProvider = class extends chunkX2EQLK4O_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 (chunkFSAXPBGP_cjs.isFetchTimeoutError(error)) {
101
+ if (chunkX2EQLK4O_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 (chunkFSAXPBGP_cjs.isFetchTimeoutError(error)) {
122
+ if (chunkX2EQLK4O_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 chunkFSAXPBGP_cjs.RestIndexerProvider {
161
+ var ExpoIndexerProvider = class extends chunkX2EQLK4O_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 (chunkFSAXPBGP_cjs.isFetchTimeoutError(error)) {
205
+ if (chunkX2EQLK4O_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-CCLNFHJ5.cjs.map
213
- //# sourceMappingURL=chunk-CCLNFHJ5.cjs.map
218
+ //# sourceMappingURL=chunk-VYS3KGRI.cjs.map
219
+ //# sourceMappingURL=chunk-VYS3KGRI.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-VYS3KGRI.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"]}
@@ -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 (!("details" in decoded)) return void 0;
142
- if (!Array.isArray(decoded.details)) return void 0;
143
- for (const details of decoded.details) {
144
- if (!("@type" in details)) continue;
145
- const type = details["@type"];
146
- if (type !== "type.googleapis.com/ark.v1.ErrorDetails") continue;
147
- if (!("code" in details)) continue;
148
- const code = details.code;
149
- if (!("message" in details)) continue;
150
- const message = details.message;
151
- if (!("name" in details)) continue;
152
- const name = details.name;
153
- let metadata;
154
- if ("metadata" in details && isMetadata(details.metadata)) {
155
- metadata = details.metadata;
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
- return new ArkError(code, message, name, metadata);
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.35";
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
- return {
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 fetch(url, {
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 fetch(url, {
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 fetch(url, {
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 fetch(url, {
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 fetch(url, {
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 fetch(url, {
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 fetch(url, {
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 fetch(url, {
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 fetch(url, {
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 fetch(url);
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 fetch(url);
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 fetch(url);
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 fetch(url);
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 fetch(url);
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 fetch(url);
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 fetch(url);
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 fetch(url);
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 fetch(url);
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 fetch(url);
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 fetch(url, {
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 fetch(url, {
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-FSAXPBGP.cjs.map
2701
- //# sourceMappingURL=chunk-FSAXPBGP.cjs.map
2803
+ //# sourceMappingURL=chunk-X2EQLK4O.cjs.map
2804
+ //# sourceMappingURL=chunk-X2EQLK4O.cjs.map