@arkade-os/sdk 0.5.0-rc.26 → 0.5.0-rc.27

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 (72) hide show
  1. package/README.md +2 -0
  2. package/dist/adapters/expo.cjs +5 -5
  3. package/dist/adapters/expo.d.cts +2 -2
  4. package/dist/adapters/expo.d.ts +2 -2
  5. package/dist/adapters/expo.js +3 -3
  6. package/dist/{asyncStorageTaskQueue-CFWscYpG.d.cts → asyncStorageTaskQueue-CGZMG8Mc.d.cts} +1 -1
  7. package/dist/{asyncStorageTaskQueue-DrFapzPg.d.ts → asyncStorageTaskQueue-Ca-mM3NR.d.ts} +1 -1
  8. package/dist/{chunk-HPUKFTZV.js → chunk-BULTXVEN.js} +4 -4
  9. package/dist/{chunk-HPUKFTZV.js.map → chunk-BULTXVEN.js.map} +1 -1
  10. package/dist/{chunk-K2YTDYQF.cjs → chunk-DKHBOT5W.cjs} +16 -16
  11. package/dist/{chunk-K2YTDYQF.cjs.map → chunk-DKHBOT5W.cjs.map} +1 -1
  12. package/dist/{chunk-CFOIHLON.cjs → chunk-EP6XF7JX.cjs} +48 -48
  13. package/dist/{chunk-CFOIHLON.cjs.map → chunk-EP6XF7JX.cjs.map} +1 -1
  14. package/dist/{chunk-5JQ5EOYE.js → chunk-FTJ2YWJJ.js} +3 -3
  15. package/dist/{chunk-5JQ5EOYE.js.map → chunk-FTJ2YWJJ.js.map} +1 -1
  16. package/dist/{chunk-U5ZRDVVB.js → chunk-I4ZWKG7B.js} +11 -6
  17. package/dist/chunk-I4ZWKG7B.js.map +1 -0
  18. package/dist/{chunk-B2YMUJD5.cjs → chunk-PM6KYV7S.cjs} +495 -490
  19. package/dist/chunk-PM6KYV7S.cjs.map +1 -0
  20. package/dist/{chunk-N2VM6V6K.js → chunk-PO6AJUWK.js} +3 -3
  21. package/dist/{chunk-N2VM6V6K.js.map → chunk-PO6AJUWK.js.map} +1 -1
  22. package/dist/{chunk-QCD3SJOL.cjs → chunk-QXZS4J3V.cjs} +10 -10
  23. package/dist/{chunk-QCD3SJOL.cjs.map → chunk-QXZS4J3V.cjs.map} +1 -1
  24. package/dist/{chunk-HTCIPDVW.js → chunk-RUWTAAJK.js} +3 -3
  25. package/dist/{chunk-HTCIPDVW.js.map → chunk-RUWTAAJK.js.map} +1 -1
  26. package/dist/{chunk-FEBAG2K2.cjs → chunk-URILS6HH.cjs} +18 -18
  27. package/dist/{chunk-FEBAG2K2.cjs.map → chunk-URILS6HH.cjs.map} +1 -1
  28. package/dist/{chunk-Y5VSJURH.js → chunk-X42Z36L5.js} +4 -4
  29. package/dist/{chunk-Y5VSJURH.js.map → chunk-X42Z36L5.js.map} +1 -1
  30. package/dist/{chunk-VVFCCNU2.cjs → chunk-ZN7BX5XT.cjs} +3 -3
  31. package/dist/{chunk-VVFCCNU2.cjs.map → chunk-ZN7BX5XT.cjs.map} +1 -1
  32. package/dist/contracts/handlers/index.cjs +9 -9
  33. package/dist/contracts/handlers/index.d.cts +3 -3
  34. package/dist/contracts/handlers/index.d.ts +3 -3
  35. package/dist/contracts/handlers/index.js +2 -2
  36. package/dist/{delegate-Cz8FnLqi.d.ts → delegate-CG3EwryS.d.ts} +1 -1
  37. package/dist/{delegate-r3jh7UcH.d.cts → delegate-CH-QUGok.d.cts} +1 -1
  38. package/dist/{index-DOION7Ta.d.cts → index-BPS3Ki3l.d.cts} +2 -2
  39. package/dist/{index-BfvbSL0W.d.cts → index-BpiwCcFb.d.cts} +2 -2
  40. package/dist/{index-BfvbSL0W.d.ts → index-BpiwCcFb.d.ts} +2 -2
  41. package/dist/{index-Chgwl4dO.d.ts → index-DLn2XUIl.d.ts} +2 -2
  42. package/dist/index.cjs +316 -316
  43. package/dist/index.d.cts +14 -9
  44. package/dist/index.d.ts +14 -9
  45. package/dist/index.js +4 -4
  46. package/dist/repositories/realm/index.cjs +35 -35
  47. package/dist/repositories/realm/index.d.cts +2 -2
  48. package/dist/repositories/realm/index.d.ts +2 -2
  49. package/dist/repositories/realm/index.js +5 -5
  50. package/dist/repositories/sqlite/index.cjs +33 -33
  51. package/dist/repositories/sqlite/index.d.cts +2 -2
  52. package/dist/repositories/sqlite/index.d.ts +2 -2
  53. package/dist/repositories/sqlite/index.js +5 -5
  54. package/dist/{taskRunner-CXAcjtdU.d.ts → taskRunner-Dbdr9WMQ.d.ts} +1 -1
  55. package/dist/{taskRunner-BO8a-SQh.d.cts → taskRunner-DtphXKXv.d.cts} +1 -1
  56. package/dist/wallet/expo/background.cjs +14 -14
  57. package/dist/wallet/expo/background.d.cts +3 -3
  58. package/dist/wallet/expo/background.d.ts +3 -3
  59. package/dist/wallet/expo/background.js +6 -6
  60. package/dist/wallet/expo/index.cjs +15 -15
  61. package/dist/wallet/expo/index.d.cts +4 -4
  62. package/dist/wallet/expo/index.d.ts +4 -4
  63. package/dist/wallet/expo/index.js +5 -5
  64. package/dist/{wallet-s90p-vIk.d.cts → wallet-CTrmow5R.d.cts} +2 -2
  65. package/dist/{wallet-CFIfUlQP.d.ts → wallet-QvS_5Jjd.d.ts} +2 -2
  66. package/dist/worker/expo/index.cjs +9 -9
  67. package/dist/worker/expo/index.d.cts +4 -4
  68. package/dist/worker/expo/index.d.ts +4 -4
  69. package/dist/worker/expo/index.js +5 -5
  70. package/package.json +1 -1
  71. package/dist/chunk-B2YMUJD5.cjs.map +0 -1
  72. package/dist/chunk-U5ZRDVVB.js.map +0 -1
package/README.md CHANGED
@@ -306,6 +306,8 @@ const wallet = await OnchainWallet.create(identity, 'bitcoin', provider)
306
306
  await provider.close()
307
307
  ```
308
308
 
309
+ Where the network is only known at runtime (`Wallet.create`, or a service worker's `MessageBus`), pass a factory instead: `onchainProvider: (network) => new ElectrumOnchainProvider(new ElectrumWS(ELECTRUM_WS_URL[network]), networks[network])`. A `MessageBus` calls it on every init and never closes what it returns, so a worker should hand back one instance per network rather than a new connection each time.
310
+
309
311
  #### Atomic 1P1C package broadcast (TRUC / BIP 431)
310
312
 
311
313
  Both providers expose `broadcastTransaction(...txs)` that accepts either a single tx or a 1P1C package (parent first, child last). The package path is **atomic** — the parent doesn't have to independently meet mempool minfee, which is the point of TRUC relay.
@@ -1,18 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var chunkK2YTDYQF_cjs = require('../chunk-K2YTDYQF.cjs');
4
- require('../chunk-FEBAG2K2.cjs');
5
- require('../chunk-VVFCCNU2.cjs');
3
+ var chunkDKHBOT5W_cjs = require('../chunk-DKHBOT5W.cjs');
4
+ require('../chunk-URILS6HH.cjs');
5
+ require('../chunk-ZN7BX5XT.cjs');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "ExpoArkProvider", {
10
10
  enumerable: true,
11
- get: function () { return chunkK2YTDYQF_cjs.ExpoArkProvider; }
11
+ get: function () { return chunkDKHBOT5W_cjs.ExpoArkProvider; }
12
12
  });
13
13
  Object.defineProperty(exports, "ExpoIndexerProvider", {
14
14
  enumerable: true,
15
- get: function () { return chunkK2YTDYQF_cjs.ExpoIndexerProvider; }
15
+ get: function () { return chunkDKHBOT5W_cjs.ExpoIndexerProvider; }
16
16
  });
17
17
  //# sourceMappingURL=expo.cjs.map
18
18
  //# sourceMappingURL=expo.cjs.map
@@ -1,5 +1,5 @@
1
- import { r as RestArkProvider, o as SettlementEvent, T as TxNotificationEvent, s as RestIndexerProvider, t as SubscriptionResponse } from '../index-BfvbSL0W.cjs';
2
- export { u as ArkProvider, v as IndexerProvider } from '../index-BfvbSL0W.cjs';
1
+ import { r as RestArkProvider, o as SettlementEvent, T as TxNotificationEvent, s as RestIndexerProvider, t as SubscriptionResponse } from '../index-BpiwCcFb.cjs';
2
+ export { u as ArkProvider, v as IndexerProvider } from '../index-BpiwCcFb.cjs';
3
3
  import '@scure/btc-signer/utils.js';
4
4
  import '@scure/btc-signer/psbt.js';
5
5
  import '@scure/btc-signer';
@@ -1,5 +1,5 @@
1
- import { r as RestArkProvider, o as SettlementEvent, T as TxNotificationEvent, s as RestIndexerProvider, t as SubscriptionResponse } from '../index-BfvbSL0W.js';
2
- export { u as ArkProvider, v as IndexerProvider } from '../index-BfvbSL0W.js';
1
+ import { r as RestArkProvider, o as SettlementEvent, T as TxNotificationEvent, s as RestIndexerProvider, t as SubscriptionResponse } from '../index-BpiwCcFb.js';
2
+ export { u as ArkProvider, v as IndexerProvider } from '../index-BpiwCcFb.js';
3
3
  import '@scure/btc-signer/utils.js';
4
4
  import '@scure/btc-signer/psbt.js';
5
5
  import '@scure/btc-signer';
@@ -1,5 +1,5 @@
1
- export { ExpoArkProvider, ExpoIndexerProvider } from '../chunk-Y5VSJURH.js';
2
- import '../chunk-5JQ5EOYE.js';
3
- import '../chunk-HTCIPDVW.js';
1
+ export { ExpoArkProvider, ExpoIndexerProvider } from '../chunk-X42Z36L5.js';
2
+ import '../chunk-FTJ2YWJJ.js';
3
+ import '../chunk-RUWTAAJK.js';
4
4
  //# sourceMappingURL=expo.js.map
5
5
  //# sourceMappingURL=expo.js.map
@@ -1,4 +1,4 @@
1
- import { a as TaskQueue, c as TaskItem, d as TaskResult } from './taskRunner-BO8a-SQh.cjs';
1
+ import { a as TaskQueue, c as TaskItem, d as TaskResult } from './taskRunner-DtphXKXv.cjs';
2
2
 
3
3
  /**
4
4
  * Minimal async key-value storage interface.
@@ -1,4 +1,4 @@
1
- import { a as TaskQueue, c as TaskItem, d as TaskResult } from './taskRunner-CXAcjtdU.js';
1
+ import { a as TaskQueue, c as TaskItem, d as TaskResult } from './taskRunner-Dbdr9WMQ.js';
2
2
 
3
3
  /**
4
4
  * Minimal async key-value storage interface.
@@ -1,5 +1,5 @@
1
- import { getRandomId, extendVirtualCoinForContract, collectContracts, warnAndFilterVtxosForScript, saveVtxosForContract } from './chunk-U5ZRDVVB.js';
2
- import { getNormalizedVtxos } from './chunk-HTCIPDVW.js';
1
+ import { getRandomId, extendVirtualCoinForContract, collectContracts, warnAndFilterVtxosForScript, saveVtxosForContract } from './chunk-I4ZWKG7B.js';
2
+ import { getNormalizedVtxos } from './chunk-RUWTAAJK.js';
3
3
 
4
4
  // src/worker/expo/taskRunner.ts
5
5
  async function runTasks(queue, processors, deps) {
@@ -94,5 +94,5 @@ var contractPollProcessor = {
94
94
  };
95
95
 
96
96
  export { CONTRACT_POLL_TASK_TYPE, contractPollProcessor, createTaskDependencies, runTasks };
97
- //# sourceMappingURL=chunk-HPUKFTZV.js.map
98
- //# sourceMappingURL=chunk-HPUKFTZV.js.map
97
+ //# sourceMappingURL=chunk-BULTXVEN.js.map
98
+ //# sourceMappingURL=chunk-BULTXVEN.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-HPUKFTZV.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 { collectContracts } from \"../../../repositories/contractRepository\";\nimport type { TaskItem, TaskResult } from \"../taskQueue\";\nimport type { TaskProcessor, TaskDependencies } from \"../taskRunner\";\nimport type { ExtendedVirtualCoin } from \"../../../wallet\";\nimport { getNormalizedVtxos } from \"../../../wallet/vtxo\";\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 every watched contract 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 // Background channel, so it covers exactly what the watcher's\n // subscription covers: `retained` rows are kept for reads only.\n const contracts = await collectContracts(contractRepository, {\n watch: [\"watched\", \"awaiting-funds\"],\n });\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 getNormalizedVtxos(indexerProvider, {\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-BULTXVEN.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 { collectContracts } from \"../../../repositories/contractRepository\";\nimport type { TaskItem, TaskResult } from \"../taskQueue\";\nimport type { TaskProcessor, TaskDependencies } from \"../taskRunner\";\nimport type { ExtendedVirtualCoin } from \"../../../wallet\";\nimport { getNormalizedVtxos } from \"../../../wallet/vtxo\";\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 every watched contract 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 // Background channel, so it covers exactly what the watcher's\n // subscription covers: `retained` rows are kept for reads only.\n const contracts = await collectContracts(contractRepository, {\n watch: [\"watched\", \"awaiting-funds\"],\n });\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 getNormalizedVtxos(indexerProvider, {\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,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkFEBAG2K2_cjs = require('./chunk-FEBAG2K2.cjs');
4
- var chunkVVFCCNU2_cjs = require('./chunk-VVFCCNU2.cjs');
3
+ var chunkURILS6HH_cjs = require('./chunk-URILS6HH.cjs');
4
+ var chunkZN7BX5XT_cjs = require('./chunk-ZN7BX5XT.cjs');
5
5
 
6
6
  // src/providers/expoUtils.ts
7
7
  async function getExpoFetch(options) {
@@ -20,7 +20,7 @@ async function getExpoFetch(options) {
20
20
  "Using standard fetch instead of expo/fetch. Streaming may not be fully supported in some environments.",
21
21
  error
22
22
  );
23
- return chunkVVFCCNU2_cjs.baseFetch;
23
+ return chunkZN7BX5XT_cjs.baseFetch;
24
24
  }
25
25
  }
26
26
  async function* sseStreamIterator(url, abortSignal, fetchFn, headers, parseData) {
@@ -80,8 +80,8 @@ async function* sseStreamIterator(url, abortSignal, fetchFn, headers, parseData)
80
80
  }
81
81
 
82
82
  // src/providers/expoArk.ts
83
- var ExpoArkProvider = class extends chunkVVFCCNU2_cjs.RestArkProvider {
84
- constructor(serverUrl = chunkVVFCCNU2_cjs.DEFAULT_ARKADE_SERVER_URL) {
83
+ var ExpoArkProvider = class extends chunkZN7BX5XT_cjs.RestArkProvider {
84
+ constructor(serverUrl = chunkZN7BX5XT_cjs.DEFAULT_ARKADE_SERVER_URL) {
85
85
  super(serverUrl);
86
86
  }
87
87
  async *getEventStream(signal, topics) {
@@ -94,7 +94,7 @@ var ExpoArkProvider = class extends chunkVVFCCNU2_cjs.RestArkProvider {
94
94
  url + queryParams,
95
95
  signal,
96
96
  expoFetch,
97
- chunkVVFCCNU2_cjs.ARKADE_VERSION_HEADERS,
97
+ chunkZN7BX5XT_cjs.ARKADE_VERSION_HEADERS,
98
98
  (data) => {
99
99
  const eventData = data.result || data;
100
100
  if (eventData.heartbeat !== void 0) {
@@ -107,7 +107,7 @@ var ExpoArkProvider = class extends chunkVVFCCNU2_cjs.RestArkProvider {
107
107
  if (error instanceof Error && error.name === "AbortError") {
108
108
  break;
109
109
  }
110
- if (chunkVVFCCNU2_cjs.isFetchTimeoutError(error)) {
110
+ if (chunkZN7BX5XT_cjs.isFetchTimeoutError(error)) {
111
111
  console.debug("Timeout error ignored");
112
112
  continue;
113
113
  }
@@ -121,14 +121,14 @@ var ExpoArkProvider = class extends chunkVVFCCNU2_cjs.RestArkProvider {
121
121
  const url = `${this.serverUrl}/v1/txs`;
122
122
  while (!signal?.aborted) {
123
123
  try {
124
- yield* sseStreamIterator(url, signal, expoFetch, chunkVVFCCNU2_cjs.ARKADE_VERSION_HEADERS, (data) => {
124
+ yield* sseStreamIterator(url, signal, expoFetch, chunkZN7BX5XT_cjs.ARKADE_VERSION_HEADERS, (data) => {
125
125
  return this.parseTransactionNotification(data.result);
126
126
  });
127
127
  } catch (error) {
128
128
  if (error instanceof Error && error.name === "AbortError") {
129
129
  break;
130
130
  }
131
- if (chunkVVFCCNU2_cjs.isFetchTimeoutError(error)) {
131
+ if (chunkZN7BX5XT_cjs.isFetchTimeoutError(error)) {
132
132
  console.debug("Timeout error ignored");
133
133
  continue;
134
134
  }
@@ -140,8 +140,8 @@ var ExpoArkProvider = class extends chunkVVFCCNU2_cjs.RestArkProvider {
140
140
  };
141
141
 
142
142
  // src/providers/expoIndexer.ts
143
- var ExpoIndexerProvider = class extends chunkFEBAG2K2_cjs.RestIndexerProvider {
144
- constructor(serverUrl = chunkVVFCCNU2_cjs.DEFAULT_ARKADE_SERVER_URL) {
143
+ var ExpoIndexerProvider = class extends chunkURILS6HH_cjs.RestIndexerProvider {
144
+ constructor(serverUrl = chunkZN7BX5XT_cjs.DEFAULT_ARKADE_SERVER_URL) {
145
145
  super(serverUrl);
146
146
  }
147
147
  async *subscriptionStream(url, abortSignal) {
@@ -166,9 +166,9 @@ var ExpoIndexerProvider = class extends chunkFEBAG2K2_cjs.RestIndexerProvider {
166
166
  return null;
167
167
  }
168
168
  if (data.event) {
169
- return chunkFEBAG2K2_cjs.toSubscriptionResponse(data.event);
169
+ return chunkURILS6HH_cjs.toSubscriptionResponse(data.event);
170
170
  }
171
- if (data.code !== void 0) throw chunkVVFCCNU2_cjs.streamFailureError(data);
171
+ if (data.code !== void 0) throw chunkZN7BX5XT_cjs.streamFailureError(data);
172
172
  return null;
173
173
  }
174
174
  );
@@ -176,7 +176,7 @@ var ExpoIndexerProvider = class extends chunkFEBAG2K2_cjs.RestIndexerProvider {
176
176
  if (error instanceof Error && error.name === "AbortError") {
177
177
  break;
178
178
  }
179
- if (chunkVVFCCNU2_cjs.isFetchTimeoutError(error)) {
179
+ if (chunkZN7BX5XT_cjs.isFetchTimeoutError(error)) {
180
180
  console.debug("Timeout error ignored");
181
181
  continue;
182
182
  }
@@ -189,5 +189,5 @@ var ExpoIndexerProvider = class extends chunkFEBAG2K2_cjs.RestIndexerProvider {
189
189
 
190
190
  exports.ExpoArkProvider = ExpoArkProvider;
191
191
  exports.ExpoIndexerProvider = ExpoIndexerProvider;
192
- //# sourceMappingURL=chunk-K2YTDYQF.cjs.map
193
- //# sourceMappingURL=chunk-K2YTDYQF.cjs.map
192
+ //# sourceMappingURL=chunk-DKHBOT5W.cjs.map
193
+ //# sourceMappingURL=chunk-DKHBOT5W.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/expoUtils.ts","../src/providers/expoArk.ts","../src/providers/expoIndexer.ts"],"names":["baseFetch","RestArkProvider","DEFAULT_ARKADE_SERVER_URL","ARKADE_VERSION_HEADERS","isFetchTimeoutError","RestIndexerProvider","toSubscriptionResponse","streamFailureError"],"mappings":"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","file":"chunk-K2YTDYQF.cjs","sourcesContent":["import { baseFetch, fetch } from \"../utils/fetch\";\n\n/**\n * Dynamically imports expo/fetch, falling back to {@link baseFetch}.\n *\n * Adds no headers of its own: both Expo providers share this function but reach\n * different origins, so each passes its own per request.\n *\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 return expoFetchModule.fetch 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 baseFetch;\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 // Required, not just for cancellation: `getExpoFetch` falls back to\n // `baseFetch`, which bounds any read that brings no signal of its\n // own. Drop this and the stream is truncated at READ_TIMEOUT_MS.\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, TxNotificationEvent, isFetchTimeoutError } from \"./ark\";\nimport { getExpoFetch, sseStreamIterator } from \"./expoUtils\";\nimport { ARKADE_VERSION_HEADERS } from \"../utils/fetch\";\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(\n url + queryParams,\n signal,\n expoFetch,\n ARKADE_VERSION_HEADERS,\n (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 );\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(\n signal: AbortSignal,\n ): AsyncIterableIterator<TxNotificationEvent> {\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, ARKADE_VERSION_HEADERS, (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, toSubscriptionResponse } from \"./indexer\";\nimport { isFetchTimeoutError } from \"./ark\";\nimport { getExpoFetch, sseStreamIterator } from \"./expoUtils\";\nimport { streamFailureError } from \"./utils\";\nimport { DEFAULT_ARKADE_SERVER_URL } from \"../networks\";\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 protected override async *subscriptionStream(\n url: 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({ requireExpo: isReactNative }).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 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 toSubscriptionResponse(data.event);\n }\n // A `failure` event's status, which this reader sees as a plain data line.\n // Skipping it would reconnect into the same refusal at once, in a tight loop.\n if (data.code !== undefined) throw streamFailureError(data);\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
+ {"version":3,"sources":["../src/providers/expoUtils.ts","../src/providers/expoArk.ts","../src/providers/expoIndexer.ts"],"names":["baseFetch","RestArkProvider","DEFAULT_ARKADE_SERVER_URL","ARKADE_VERSION_HEADERS","isFetchTimeoutError","RestIndexerProvider","toSubscriptionResponse","streamFailureError"],"mappings":"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","file":"chunk-DKHBOT5W.cjs","sourcesContent":["import { baseFetch, fetch } from \"../utils/fetch\";\n\n/**\n * Dynamically imports expo/fetch, falling back to {@link baseFetch}.\n *\n * Adds no headers of its own: both Expo providers share this function but reach\n * different origins, so each passes its own per request.\n *\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 return expoFetchModule.fetch 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 baseFetch;\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 // Required, not just for cancellation: `getExpoFetch` falls back to\n // `baseFetch`, which bounds any read that brings no signal of its\n // own. Drop this and the stream is truncated at READ_TIMEOUT_MS.\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, TxNotificationEvent, isFetchTimeoutError } from \"./ark\";\nimport { getExpoFetch, sseStreamIterator } from \"./expoUtils\";\nimport { ARKADE_VERSION_HEADERS } from \"../utils/fetch\";\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(\n url + queryParams,\n signal,\n expoFetch,\n ARKADE_VERSION_HEADERS,\n (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 );\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(\n signal: AbortSignal,\n ): AsyncIterableIterator<TxNotificationEvent> {\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, ARKADE_VERSION_HEADERS, (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, toSubscriptionResponse } from \"./indexer\";\nimport { isFetchTimeoutError } from \"./ark\";\nimport { getExpoFetch, sseStreamIterator } from \"./expoUtils\";\nimport { streamFailureError } from \"./utils\";\nimport { DEFAULT_ARKADE_SERVER_URL } from \"../networks\";\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 protected override async *subscriptionStream(\n url: 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({ requireExpo: isReactNative }).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 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 toSubscriptionResponse(data.event);\n }\n // A `failure` event's status, which this reader sees as a plain data line.\n // Skipping it would reconnect into the same refusal at once, in a tight loop.\n if (data.code !== undefined) throw streamFailureError(data);\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 chunkVVFCCNU2_cjs = require('./chunk-VVFCCNU2.cjs');
3
+ var chunkZN7BX5XT_cjs = require('./chunk-ZN7BX5XT.cjs');
4
4
  var base = require('@scure/base');
5
5
  var descriptorsScure = require('@bitcoinerlab/descriptors-scure');
6
6
  var btcSigner = require('@scure/btc-signer');
@@ -67,14 +67,14 @@ var ContractHandlerRegistry = class {
67
67
  var contractHandlers = new ContractHandlerRegistry();
68
68
  exports.DefaultVtxo = void 0;
69
69
  ((DefaultVtxo2) => {
70
- class Script3 extends chunkVVFCCNU2_cjs.VtxoScript {
70
+ class Script3 extends chunkZN7BX5XT_cjs.VtxoScript {
71
71
  /** Create the default virtual output script with one forfeit path and one exit path. */
72
72
  constructor(options) {
73
73
  const { pubKey, serverPubKey, csvTimelock } = options;
74
- const forfeitScript = chunkVVFCCNU2_cjs.MultisigTapscript.encode({
74
+ const forfeitScript = chunkZN7BX5XT_cjs.MultisigTapscript.encode({
75
75
  pubkeys: [pubKey, serverPubKey]
76
76
  }).script;
77
- const exitScript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({
77
+ const exitScript = chunkZN7BX5XT_cjs.CSVMultisigTapscript.encode({
78
78
  timelock: csvTimelock,
79
79
  pubkeys: [pubKey]
80
80
  }).script;
@@ -266,7 +266,7 @@ function extractPubKeyBytes(value) {
266
266
  return base.hex.decode(extractPubKey(normalizeToDescriptor(value)));
267
267
  }
268
268
  function deserializeCsvTimelock(value) {
269
- return value !== void 0 && value !== "" ? chunkVVFCCNU2_cjs.sequenceToTimelock(Number(value)) : exports.DefaultVtxo.Script.DEFAULT_TIMELOCK;
269
+ return value !== void 0 && value !== "" ? chunkZN7BX5XT_cjs.sequenceToTimelock(Number(value)) : exports.DefaultVtxo.Script.DEFAULT_TIMELOCK;
270
270
  }
271
271
  var CLTV_HEIGHT_THRESHOLD = 500000000n;
272
272
  function isCltvSatisfied(context, locktime) {
@@ -437,7 +437,7 @@ function deriveVhtlcTapscripts(script) {
437
437
  function isCsvSpendable(context, sequence) {
438
438
  if (sequence === void 0) return true;
439
439
  if (!context.vtxo) return false;
440
- const timelock = chunkVVFCCNU2_cjs.sequenceToTimelock(sequence);
440
+ const timelock = chunkZN7BX5XT_cjs.sequenceToTimelock(sequence);
441
441
  if (timelock.type === "blocks") {
442
442
  if (context.blockHeight === void 0 || context.vtxo.status.block_height === void 0) {
443
443
  return false;
@@ -495,21 +495,21 @@ function forfeitExitSpendablePaths(script, contract, context) {
495
495
  async function detectUsedScripts(indexerProvider, scriptHexes) {
496
496
  const used = /* @__PURE__ */ new Set();
497
497
  const unique = [...new Set(scriptHexes)];
498
- for (let offset = 0; offset < unique.length; offset += chunkVVFCCNU2_cjs.SCRIPT_QUERY_CHUNK_SIZE) {
499
- const scripts = unique.slice(offset, offset + chunkVVFCCNU2_cjs.SCRIPT_QUERY_CHUNK_SIZE);
498
+ for (let offset = 0; offset < unique.length; offset += chunkZN7BX5XT_cjs.SCRIPT_QUERY_CHUNK_SIZE) {
499
+ const scripts = unique.slice(offset, offset + chunkZN7BX5XT_cjs.SCRIPT_QUERY_CHUNK_SIZE);
500
500
  const remaining = new Set(scripts);
501
501
  let pageIndex = 0;
502
502
  let hasMore = true;
503
503
  while (hasMore && remaining.size > 0) {
504
- const { vtxos, page } = await chunkVVFCCNU2_cjs.getNormalizedVtxos(indexerProvider, {
504
+ const { vtxos, page } = await chunkZN7BX5XT_cjs.getNormalizedVtxos(indexerProvider, {
505
505
  scripts,
506
506
  pageIndex,
507
- pageSize: chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE
507
+ pageSize: chunkZN7BX5XT_cjs.DEFAULT_PAGE_SIZE
508
508
  });
509
509
  for (const vtxo of vtxos) {
510
510
  if (remaining.delete(vtxo.script)) used.add(vtxo.script);
511
511
  }
512
- hasMore = page ? vtxos.length === chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE : false;
512
+ hasMore = page ? vtxos.length === chunkZN7BX5XT_cjs.DEFAULT_PAGE_SIZE : false;
513
513
  pageIndex++;
514
514
  }
515
515
  }
@@ -570,7 +570,7 @@ var DefaultContractHandler = {
570
570
  return {
571
571
  pubKey: base.hex.encode(params.pubKey),
572
572
  serverPubKey: base.hex.encode(params.serverPubKey),
573
- csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(params.csvTimelock).toString()
573
+ csvTimelock: chunkZN7BX5XT_cjs.timelockToSequence(params.csvTimelock).toString()
574
574
  };
575
575
  },
576
576
  deserializeParams(params) {
@@ -617,12 +617,12 @@ function discoverDefaultRange(entries, deps) {
617
617
  }
618
618
  exports.DelegateVtxo = void 0;
619
619
  ((DelegateVtxo2) => {
620
- class Script3 extends chunkVVFCCNU2_cjs.VtxoScript {
620
+ class Script3 extends chunkZN7BX5XT_cjs.VtxoScript {
621
621
  /** Create a delegated virtual output script with forfeit, exit, and delegate paths. */
622
622
  constructor(options) {
623
623
  const defaultVtxo = new exports.DefaultVtxo.Script(options);
624
624
  const { delegatePubKey, pubKey, serverPubKey } = options;
625
- const delegateScript = chunkVVFCCNU2_cjs.MultisigTapscript.encode({
625
+ const delegateScript = chunkZN7BX5XT_cjs.MultisigTapscript.encode({
626
626
  pubkeys: [pubKey, delegatePubKey, serverPubKey]
627
627
  }).script;
628
628
  super([...defaultVtxo.scripts, delegateScript]);
@@ -661,7 +661,7 @@ var DelegateContractHandler = {
661
661
  pubKey: base.hex.encode(params.pubKey),
662
662
  serverPubKey: base.hex.encode(params.serverPubKey),
663
663
  delegatePubKey: base.hex.encode(params.delegatePubKey),
664
- csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(params.csvTimelock).toString()
664
+ csvTimelock: chunkZN7BX5XT_cjs.timelockToSequence(params.csvTimelock).toString()
665
665
  };
666
666
  },
667
667
  deserializeParams(params) {
@@ -855,7 +855,7 @@ function getOpcodeValue(name) {
855
855
 
856
856
  // src/arkade/bignum.ts
857
857
  var bignum_exports = {};
858
- chunkVVFCCNU2_cjs.__export(bignum_exports, {
858
+ chunkZN7BX5XT_cjs.__export(bignum_exports, {
859
859
  BIGNUM_MAX_BYTES: () => BIGNUM_MAX_BYTES,
860
860
  decode: () => decode,
861
861
  encode: () => encode
@@ -1044,7 +1044,7 @@ function computeArkadeScriptPublicKey(pubKey, script) {
1044
1044
  // src/script/vhtlc.ts
1045
1045
  exports.VHTLC = void 0;
1046
1046
  ((VHTLC2) => {
1047
- class BaseScript extends chunkVVFCCNU2_cjs.VtxoScript {
1047
+ class BaseScript extends chunkZN7BX5XT_cjs.VtxoScript {
1048
1048
  options;
1049
1049
  claimScript;
1050
1050
  refundScript;
@@ -1071,27 +1071,27 @@ exports.VHTLC = void 0;
1071
1071
  unilateralRefundWithoutReceiverDelay
1072
1072
  } = options;
1073
1073
  const conditionScript = preimageCondition(preimageHash);
1074
- const claimScript = chunkVVFCCNU2_cjs.ConditionMultisigTapscript.encode({
1074
+ const claimScript = chunkZN7BX5XT_cjs.ConditionMultisigTapscript.encode({
1075
1075
  conditionScript,
1076
1076
  pubkeys: [receiver, server]
1077
1077
  }).script;
1078
- const refundScript = chunkVVFCCNU2_cjs.MultisigTapscript.encode({
1078
+ const refundScript = chunkZN7BX5XT_cjs.MultisigTapscript.encode({
1079
1079
  pubkeys: [sender, receiver, server]
1080
1080
  }).script;
1081
- const refundWithoutReceiverScript = chunkVVFCCNU2_cjs.CLTVMultisigTapscript.encode({
1081
+ const refundWithoutReceiverScript = chunkZN7BX5XT_cjs.CLTVMultisigTapscript.encode({
1082
1082
  absoluteTimelock: refundLocktime,
1083
1083
  pubkeys: [sender, server]
1084
1084
  }).script;
1085
- const unilateralClaimScript = chunkVVFCCNU2_cjs.ConditionCSVMultisigTapscript.encode({
1085
+ const unilateralClaimScript = chunkZN7BX5XT_cjs.ConditionCSVMultisigTapscript.encode({
1086
1086
  conditionScript,
1087
1087
  timelock: unilateralClaimDelay,
1088
1088
  pubkeys: [receiver]
1089
1089
  }).script;
1090
- const unilateralRefundScript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({
1090
+ const unilateralRefundScript = chunkZN7BX5XT_cjs.CSVMultisigTapscript.encode({
1091
1091
  timelock: unilateralRefundDelay,
1092
1092
  pubkeys: [sender, receiver]
1093
1093
  }).script;
1094
- const unilateralRefundWithoutReceiverScript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({
1094
+ const unilateralRefundWithoutReceiverScript = chunkZN7BX5XT_cjs.CSVMultisigTapscript.encode({
1095
1095
  timelock: unilateralRefundWithoutReceiverDelay,
1096
1096
  pubkeys: [sender]
1097
1097
  }).script;
@@ -1111,7 +1111,7 @@ exports.VHTLC = void 0;
1111
1111
  const covenants = options.nonInteractiveParameters;
1112
1112
  if (covenants) {
1113
1113
  arkadeScriptNic = enforcePayToMaybeAsset(covenants.receiverPkScript, options.asset);
1114
- nonInteractiveClaimScript = chunkVVFCCNU2_cjs.ConditionMultisigTapscript.encode({
1114
+ nonInteractiveClaimScript = chunkZN7BX5XT_cjs.ConditionMultisigTapscript.encode({
1115
1115
  conditionScript,
1116
1116
  pubkeys: [
1117
1117
  server,
@@ -1124,12 +1124,12 @@ exports.VHTLC = void 0;
1124
1124
  covenants.emulatorPubkey,
1125
1125
  arkadeScriptNir
1126
1126
  );
1127
- nonInteractiveRefundScript = chunkVVFCCNU2_cjs.MultisigTapscript.encode({
1127
+ nonInteractiveRefundScript = chunkZN7BX5XT_cjs.MultisigTapscript.encode({
1128
1128
  pubkeys: [server, receiver, nirCosigner]
1129
1129
  }).script;
1130
1130
  scripts.push(nonInteractiveRefundScript);
1131
1131
  if (covenants.legacy !== "preTimelockedRefund") {
1132
- nonInteractiveRefundWithoutReceiverScript = chunkVVFCCNU2_cjs.CLTVMultisigTapscript.encode({
1132
+ nonInteractiveRefundWithoutReceiverScript = chunkZN7BX5XT_cjs.CLTVMultisigTapscript.encode({
1133
1133
  absoluteTimelock: refundLocktime,
1134
1134
  pubkeys: [server, nirCosigner]
1135
1135
  }).script;
@@ -1405,9 +1405,9 @@ var VHTLCContractHandler = {
1405
1405
  server: base.hex.encode(params.server),
1406
1406
  hash: base.hex.encode(params.preimageHash),
1407
1407
  refundLocktime: params.refundLocktime.toString(),
1408
- claimDelay: chunkVVFCCNU2_cjs.timelockToSequence(params.unilateralClaimDelay).toString(),
1409
- refundDelay: chunkVVFCCNU2_cjs.timelockToSequence(params.unilateralRefundDelay).toString(),
1410
- refundNoReceiverDelay: chunkVVFCCNU2_cjs.timelockToSequence(
1408
+ claimDelay: chunkZN7BX5XT_cjs.timelockToSequence(params.unilateralClaimDelay).toString(),
1409
+ refundDelay: chunkZN7BX5XT_cjs.timelockToSequence(params.unilateralRefundDelay).toString(),
1410
+ refundNoReceiverDelay: chunkZN7BX5XT_cjs.timelockToSequence(
1411
1411
  params.unilateralRefundWithoutReceiverDelay
1412
1412
  ).toString()
1413
1413
  };
@@ -1419,9 +1419,9 @@ var VHTLCContractHandler = {
1419
1419
  server: base.hex.decode(params.server),
1420
1420
  preimageHash: base.hex.decode(params.hash),
1421
1421
  refundLocktime: BigInt(params.refundLocktime),
1422
- unilateralClaimDelay: chunkVVFCCNU2_cjs.sequenceToTimelock(Number(params.claimDelay)),
1423
- unilateralRefundDelay: chunkVVFCCNU2_cjs.sequenceToTimelock(Number(params.refundDelay)),
1424
- unilateralRefundWithoutReceiverDelay: chunkVVFCCNU2_cjs.sequenceToTimelock(
1422
+ unilateralClaimDelay: chunkZN7BX5XT_cjs.sequenceToTimelock(Number(params.claimDelay)),
1423
+ unilateralRefundDelay: chunkZN7BX5XT_cjs.sequenceToTimelock(Number(params.refundDelay)),
1424
+ unilateralRefundWithoutReceiverDelay: chunkZN7BX5XT_cjs.sequenceToTimelock(
1425
1425
  Number(params.refundNoReceiverDelay)
1426
1426
  )
1427
1427
  };
@@ -1514,9 +1514,9 @@ var VHTLCV2ContractHandler = {
1514
1514
  server: base.hex.encode(params.server),
1515
1515
  hash: base.hex.encode(params.preimageHash),
1516
1516
  refundLocktime: params.refundLocktime.toString(),
1517
- claimDelay: chunkVVFCCNU2_cjs.timelockToSequence(params.unilateralClaimDelay).toString(),
1518
- refundDelay: chunkVVFCCNU2_cjs.timelockToSequence(params.unilateralRefundDelay).toString(),
1519
- refundNoReceiverDelay: chunkVVFCCNU2_cjs.timelockToSequence(
1517
+ claimDelay: chunkZN7BX5XT_cjs.timelockToSequence(params.unilateralClaimDelay).toString(),
1518
+ refundDelay: chunkZN7BX5XT_cjs.timelockToSequence(params.unilateralRefundDelay).toString(),
1519
+ refundNoReceiverDelay: chunkZN7BX5XT_cjs.timelockToSequence(
1520
1520
  params.unilateralRefundWithoutReceiverDelay
1521
1521
  ).toString(),
1522
1522
  // Per-leaf on-disk keys predate the grouped param and older rows carry exactly these;
@@ -1594,9 +1594,9 @@ var VHTLCV2ContractHandler = {
1594
1594
  preimageHash: base.hex.decode(params.hash),
1595
1595
  refundLocktime: BigInt(params.refundLocktime),
1596
1596
  ...asset && { asset },
1597
- unilateralClaimDelay: chunkVVFCCNU2_cjs.sequenceToTimelock(Number(params.claimDelay)),
1598
- unilateralRefundDelay: chunkVVFCCNU2_cjs.sequenceToTimelock(Number(params.refundDelay)),
1599
- unilateralRefundWithoutReceiverDelay: chunkVVFCCNU2_cjs.sequenceToTimelock(
1597
+ unilateralClaimDelay: chunkZN7BX5XT_cjs.sequenceToTimelock(Number(params.claimDelay)),
1598
+ unilateralRefundDelay: chunkZN7BX5XT_cjs.sequenceToTimelock(Number(params.refundDelay)),
1599
+ unilateralRefundWithoutReceiverDelay: chunkZN7BX5XT_cjs.sequenceToTimelock(
1600
1600
  Number(params.refundNoReceiverDelay)
1601
1601
  ),
1602
1602
  ...claim && refund && {
@@ -1739,7 +1739,7 @@ function resolveTimelockValue(value, args) {
1739
1739
  function resolveCsvTimelock(csv, args) {
1740
1740
  const value = resolveTimelockValue(csv.value, args);
1741
1741
  if (csv.type !== "sequence") return { type: csv.type, value };
1742
- const timelock = chunkVVFCCNU2_cjs.sequenceToCanonicalTimelock(value);
1742
+ const timelock = chunkZN7BX5XT_cjs.sequenceToCanonicalTimelock(value);
1743
1743
  if (!timelock) {
1744
1744
  throw new Error(
1745
1745
  `csv '${csv.value}' resolved to ${value}, which is not a canonical BIP68 sequence`
@@ -1868,27 +1868,27 @@ function encodeTapscriptSegment(seg, pubkeys, args) {
1868
1868
  if (seg.csv) {
1869
1869
  const timelock = resolveCsvTimelock(seg.csv, args);
1870
1870
  if (seg.asm) {
1871
- return chunkVVFCCNU2_cjs.ConditionCSVMultisigTapscript.encode({
1871
+ return chunkZN7BX5XT_cjs.ConditionCSVMultisigTapscript.encode({
1872
1872
  conditionScript: resolveAsm(seg.asm, args),
1873
1873
  timelock,
1874
1874
  pubkeys
1875
1875
  });
1876
1876
  }
1877
- return chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({ timelock, pubkeys });
1877
+ return chunkZN7BX5XT_cjs.CSVMultisigTapscript.encode({ timelock, pubkeys });
1878
1878
  }
1879
1879
  if (seg.cltv !== void 0) {
1880
- return chunkVVFCCNU2_cjs.CLTVMultisigTapscript.encode({
1880
+ return chunkZN7BX5XT_cjs.CLTVMultisigTapscript.encode({
1881
1881
  absoluteTimelock: resolveTimelockValue(seg.cltv, args),
1882
1882
  pubkeys
1883
1883
  });
1884
1884
  }
1885
1885
  if (seg.asm) {
1886
- return chunkVVFCCNU2_cjs.ConditionMultisigTapscript.encode({
1886
+ return chunkZN7BX5XT_cjs.ConditionMultisigTapscript.encode({
1887
1887
  conditionScript: resolveAsm(seg.asm, args),
1888
1888
  pubkeys
1889
1889
  });
1890
1890
  }
1891
- return chunkVVFCCNU2_cjs.MultisigTapscript.encode({ pubkeys });
1891
+ return chunkZN7BX5XT_cjs.MultisigTapscript.encode({ pubkeys });
1892
1892
  }
1893
1893
  function compileFunctions(program, args, keys) {
1894
1894
  if (program.version !== SUPPORTED_PROGRAM_VERSION) {
@@ -1930,7 +1930,7 @@ function compileFunctions(program, args, keys) {
1930
1930
  return { name: names[i], def, leafScript, arkadeScript, signerKeys: pubkeys };
1931
1931
  });
1932
1932
  }
1933
- var ArkadeProgramScript = class extends chunkVVFCCNU2_cjs.VtxoScript {
1933
+ var ArkadeProgramScript = class extends chunkZN7BX5XT_cjs.VtxoScript {
1934
1934
  constructor(program, args, keys) {
1935
1935
  const partial = compileFunctions(program, args, keys);
1936
1936
  super(partial.map((p) => p.leafScript));
@@ -2148,7 +2148,7 @@ function pathsFor(script, context, opts) {
2148
2148
  continue;
2149
2149
  }
2150
2150
  if (requiresServer) continue;
2151
- const sequence = csv ? Number(chunkVVFCCNU2_cjs.timelockToSequence(csv)) : void 0;
2151
+ const sequence = csv ? Number(chunkZN7BX5XT_cjs.timelockToSequence(csv)) : void 0;
2152
2152
  if (opts.checkTimelocks && csv && !isCsvSpendable(context, sequence)) continue;
2153
2153
  if (opts.checkTimelocks && cltv !== void 0 && !isCltvSatisfied(context, cltv)) {
2154
2154
  continue;
@@ -2278,5 +2278,5 @@ exports.toASM = toASM;
2278
2278
  exports.toXOnly = toXOnly;
2279
2279
  exports.validateProgram = validateProgram;
2280
2280
  exports.witnessRefToBytes = witnessRefToBytes;
2281
- //# sourceMappingURL=chunk-CFOIHLON.cjs.map
2282
- //# sourceMappingURL=chunk-CFOIHLON.cjs.map
2281
+ //# sourceMappingURL=chunk-EP6XF7JX.cjs.map
2282
+ //# sourceMappingURL=chunk-EP6XF7JX.cjs.map