@arkade-os/sdk 0.4.32 → 0.4.34

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 (82) hide show
  1. package/README.md +1 -1
  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/adapters/indexedDB.cjs +5 -5
  7. package/dist/adapters/indexedDB.js +4 -4
  8. package/dist/{ark-ibLW4Hte.d.cts → ark-Dsv5Jq4E.d.cts} +81 -10
  9. package/dist/{ark-ibLW4Hte.d.ts → ark-Dsv5Jq4E.d.ts} +81 -10
  10. package/dist/{asyncStorageTaskQueue-BEOFPNc0.d.ts → asyncStorageTaskQueue-BH-zuth5.d.ts} +1 -1
  11. package/dist/{asyncStorageTaskQueue-VGHXWR9F.d.cts → asyncStorageTaskQueue-D92ch8yI.d.cts} +1 -1
  12. package/dist/{chunk-ABWRLTX5.js → chunk-5WDBHWX3.js} +4 -4
  13. package/dist/{chunk-ABWRLTX5.js.map → chunk-5WDBHWX3.js.map} +1 -1
  14. package/dist/{chunk-GIGILVVP.cjs → chunk-CCLNFHJ5.cjs} +11 -11
  15. package/dist/{chunk-GIGILVVP.cjs.map → chunk-CCLNFHJ5.cjs.map} +1 -1
  16. package/dist/{chunk-WMIPYZSB.cjs → chunk-CMPJR3HS.cjs} +42 -9
  17. package/dist/chunk-CMPJR3HS.cjs.map +1 -0
  18. package/dist/{chunk-YA4G7RFB.js → chunk-CUSABEUQ.js} +166 -38
  19. package/dist/chunk-CUSABEUQ.js.map +1 -0
  20. package/dist/{chunk-6FLL2Q36.cjs → chunk-FSAXPBGP.cjs} +9 -9
  21. package/dist/chunk-FSAXPBGP.cjs.map +1 -0
  22. package/dist/{chunk-6NWNOLL3.js → chunk-FXFBPXV3.js} +4 -4
  23. package/dist/chunk-FXFBPXV3.js.map +1 -0
  24. package/dist/{chunk-IEO3XDKI.cjs → chunk-GUTKJMSF.cjs} +190 -58
  25. package/dist/chunk-GUTKJMSF.cjs.map +1 -0
  26. package/dist/{chunk-XROGFOPX.js → chunk-HFXEUW55.js} +740 -175
  27. package/dist/chunk-HFXEUW55.js.map +1 -0
  28. package/dist/{chunk-TU3LVAPX.js → chunk-OUVTG72A.js} +43 -11
  29. package/dist/chunk-OUVTG72A.js.map +1 -0
  30. package/dist/{chunk-SHEBNWOQ.js → chunk-VVGD3JIP.js} +3 -3
  31. package/dist/{chunk-SHEBNWOQ.js.map → chunk-VVGD3JIP.js.map} +1 -1
  32. package/dist/{chunk-KQK4PP6L.cjs → chunk-XCHBQVMK.cjs} +879 -314
  33. package/dist/chunk-XCHBQVMK.cjs.map +1 -0
  34. package/dist/{chunk-I2UIKZM5.cjs → chunk-ZS3OZHC7.cjs} +7 -7
  35. package/dist/{chunk-I2UIKZM5.cjs.map → chunk-ZS3OZHC7.cjs.map} +1 -1
  36. package/dist/contracts/handlers/index.cjs +10 -6
  37. package/dist/contracts/handlers/index.d.cts +3 -3
  38. package/dist/contracts/handlers/index.d.ts +3 -3
  39. package/dist/contracts/handlers/index.js +2 -2
  40. package/dist/{delegate-BvNTw44a.d.cts → delegate-BaS5SCIW.d.cts} +10 -2
  41. package/dist/{delegate-BXaR1RNG.d.ts → delegate-Baz_hb83.d.ts} +10 -2
  42. package/dist/{index-BusKawmy.d.ts → index-FwXZveaX.d.ts} +63 -3
  43. package/dist/{index-C-5Tw7VA.d.cts → index-lNZ6qaO3.d.cts} +63 -3
  44. package/dist/index.cjs +143 -127
  45. package/dist/index.d.cts +89 -16
  46. package/dist/index.d.ts +89 -16
  47. package/dist/index.js +4 -4
  48. package/dist/repositories/realm/index.cjs +13 -13
  49. package/dist/repositories/realm/index.d.cts +1 -1
  50. package/dist/repositories/realm/index.d.ts +1 -1
  51. package/dist/repositories/realm/index.js +4 -4
  52. package/dist/repositories/sqlite/index.cjs +13 -13
  53. package/dist/repositories/sqlite/index.d.cts +1 -1
  54. package/dist/repositories/sqlite/index.d.ts +1 -1
  55. package/dist/repositories/sqlite/index.js +4 -4
  56. package/dist/{taskRunner-B1igKGAo.d.ts → taskRunner-B1NUWyWR.d.ts} +1 -1
  57. package/dist/{taskRunner-By92TQ1m.d.cts → taskRunner-vFRA3F9b.d.cts} +1 -1
  58. package/dist/wallet/expo/background.cjs +14 -14
  59. package/dist/wallet/expo/background.d.cts +3 -3
  60. package/dist/wallet/expo/background.d.ts +3 -3
  61. package/dist/wallet/expo/background.js +6 -6
  62. package/dist/wallet/expo/index.cjs +14 -14
  63. package/dist/wallet/expo/index.cjs.map +1 -1
  64. package/dist/wallet/expo/index.d.cts +5 -5
  65. package/dist/wallet/expo/index.d.ts +5 -5
  66. package/dist/wallet/expo/index.js +6 -6
  67. package/dist/wallet/expo/index.js.map +1 -1
  68. package/dist/{wallet-B_rxgQTu.d.cts → wallet-By9HIo0Q.d.cts} +160 -5
  69. package/dist/{wallet-CyM4F7Bs.d.ts → wallet-D6uoBLmS.d.ts} +160 -5
  70. package/dist/worker/expo/index.cjs +9 -9
  71. package/dist/worker/expo/index.d.cts +4 -4
  72. package/dist/worker/expo/index.d.ts +4 -4
  73. package/dist/worker/expo/index.js +5 -5
  74. package/package.json +4 -4
  75. package/dist/chunk-6FLL2Q36.cjs.map +0 -1
  76. package/dist/chunk-6NWNOLL3.js.map +0 -1
  77. package/dist/chunk-IEO3XDKI.cjs.map +0 -1
  78. package/dist/chunk-KQK4PP6L.cjs.map +0 -1
  79. package/dist/chunk-TU3LVAPX.js.map +0 -1
  80. package/dist/chunk-WMIPYZSB.cjs.map +0 -1
  81. package/dist/chunk-XROGFOPX.js.map +0 -1
  82. package/dist/chunk-YA4G7RFB.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { W as WalletRepository, C as ContractRepository, n as IndexerProvider, m as ArkProvider, q as VirtualCoin, r as Contract, E as ExtendedVirtualCoin } from './ark-ibLW4Hte.cjs';
1
+ import { W as WalletRepository, C as ContractRepository, n as IndexerProvider, m as ArkProvider, q as VirtualCoin, r as Contract, E as ExtendedVirtualCoin } from './ark-Dsv5Jq4E.cjs';
2
2
 
3
3
  /**
4
4
  * A task item represents a unit of work in the inbox.
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkI2UIKZM5_cjs = require('../../chunk-I2UIKZM5.cjs');
4
- var chunkGIGILVVP_cjs = require('../../chunk-GIGILVVP.cjs');
5
- var chunkKQK4PP6L_cjs = require('../../chunk-KQK4PP6L.cjs');
6
- require('../../chunk-6FLL2Q36.cjs');
7
- require('../../chunk-IEO3XDKI.cjs');
8
- require('../../chunk-WMIPYZSB.cjs');
3
+ var chunkZS3OZHC7_cjs = require('../../chunk-ZS3OZHC7.cjs');
4
+ var chunkCCLNFHJ5_cjs = require('../../chunk-CCLNFHJ5.cjs');
5
+ var chunkXCHBQVMK_cjs = require('../../chunk-XCHBQVMK.cjs');
6
+ require('../../chunk-FSAXPBGP.cjs');
7
+ require('../../chunk-GUTKJMSF.cjs');
8
+ require('../../chunk-CMPJR3HS.cjs');
9
9
  require('../../chunk-5BLDMQED.cjs');
10
10
  var TaskManager = require('expo-task-manager');
11
11
  var BackgroundTask = require('expo-background-task');
@@ -36,7 +36,7 @@ function defineExpoBackgroundTask(taskName, options) {
36
36
  taskQueue,
37
37
  walletRepository,
38
38
  contractRepository,
39
- processors = [chunkI2UIKZM5_cjs.contractPollProcessor]
39
+ processors = [chunkZS3OZHC7_cjs.contractPollProcessor]
40
40
  } = options;
41
41
  TaskManager__namespace.defineTask(taskName, async () => {
42
42
  try {
@@ -44,24 +44,24 @@ function defineExpoBackgroundTask(taskName, options) {
44
44
  if (!config) {
45
45
  return BackgroundTask__namespace.BackgroundTaskResult.Success;
46
46
  }
47
- const indexerProvider = new chunkGIGILVVP_cjs.ExpoIndexerProvider(config.arkServerUrl);
48
- const arkProvider = new chunkGIGILVVP_cjs.ExpoArkProvider(config.arkServerUrl);
49
- const deps = chunkI2UIKZM5_cjs.createTaskDependencies({
47
+ const indexerProvider = new chunkCCLNFHJ5_cjs.ExpoIndexerProvider(config.arkServerUrl);
48
+ const arkProvider = new chunkCCLNFHJ5_cjs.ExpoArkProvider(config.arkServerUrl);
49
+ const deps = chunkZS3OZHC7_cjs.createTaskDependencies({
50
50
  walletRepository,
51
51
  contractRepository,
52
52
  indexerProvider,
53
53
  arkProvider
54
54
  });
55
- await chunkI2UIKZM5_cjs.runTasks(taskQueue, processors, deps);
55
+ await chunkZS3OZHC7_cjs.runTasks(taskQueue, processors, deps);
56
56
  const results = await taskQueue.getResults();
57
57
  if (results.length > 0) {
58
58
  await taskQueue.acknowledgeResults(results.map((r) => r.id));
59
59
  }
60
- const existing = await taskQueue.getTasks(chunkI2UIKZM5_cjs.CONTRACT_POLL_TASK_TYPE);
60
+ const existing = await taskQueue.getTasks(chunkZS3OZHC7_cjs.CONTRACT_POLL_TASK_TYPE);
61
61
  if (existing.length === 0) {
62
62
  const task = {
63
- id: chunkKQK4PP6L_cjs.getRandomId(),
64
- type: chunkI2UIKZM5_cjs.CONTRACT_POLL_TASK_TYPE,
63
+ id: chunkXCHBQVMK_cjs.getRandomId(),
64
+ type: chunkZS3OZHC7_cjs.CONTRACT_POLL_TASK_TYPE,
65
65
  data: {},
66
66
  createdAt: Date.now()
67
67
  };
@@ -1,6 +1,6 @@
1
- import { W as WalletRepository, C as ContractRepository } from '../../ark-ibLW4Hte.cjs';
2
- import { A as AsyncStorageTaskQueue } from '../../asyncStorageTaskQueue-VGHXWR9F.cjs';
3
- import { T as TaskProcessor } from '../../taskRunner-By92TQ1m.cjs';
1
+ import { W as WalletRepository, C as ContractRepository } from '../../ark-Dsv5Jq4E.cjs';
2
+ import { A as AsyncStorageTaskQueue } from '../../asyncStorageTaskQueue-D92ch8yI.cjs';
3
+ import { T as TaskProcessor } from '../../taskRunner-vFRA3F9b.cjs';
4
4
  import '@scure/btc-signer/transaction.js';
5
5
  import '@scure/btc-signer/utils.js';
6
6
  import '@scure/btc-signer/psbt.js';
@@ -1,6 +1,6 @@
1
- import { W as WalletRepository, C as ContractRepository } from '../../ark-ibLW4Hte.js';
2
- import { A as AsyncStorageTaskQueue } from '../../asyncStorageTaskQueue-BEOFPNc0.js';
3
- import { T as TaskProcessor } from '../../taskRunner-B1igKGAo.js';
1
+ import { W as WalletRepository, C as ContractRepository } from '../../ark-Dsv5Jq4E.js';
2
+ import { A as AsyncStorageTaskQueue } from '../../asyncStorageTaskQueue-BH-zuth5.js';
3
+ import { T as TaskProcessor } from '../../taskRunner-B1NUWyWR.js';
4
4
  import '@scure/btc-signer/transaction.js';
5
5
  import '@scure/btc-signer/utils.js';
6
6
  import '@scure/btc-signer/psbt.js';
@@ -1,9 +1,9 @@
1
- import { contractPollProcessor, createTaskDependencies, runTasks, CONTRACT_POLL_TASK_TYPE } from '../../chunk-SHEBNWOQ.js';
2
- import { ExpoIndexerProvider, ExpoArkProvider } from '../../chunk-ABWRLTX5.js';
3
- import { getRandomId } from '../../chunk-XROGFOPX.js';
4
- import '../../chunk-6NWNOLL3.js';
5
- import '../../chunk-YA4G7RFB.js';
6
- import '../../chunk-TU3LVAPX.js';
1
+ import { contractPollProcessor, createTaskDependencies, runTasks, CONTRACT_POLL_TASK_TYPE } from '../../chunk-VVGD3JIP.js';
2
+ import { ExpoIndexerProvider, ExpoArkProvider } from '../../chunk-5WDBHWX3.js';
3
+ import { getRandomId } from '../../chunk-HFXEUW55.js';
4
+ import '../../chunk-FXFBPXV3.js';
5
+ import '../../chunk-CUSABEUQ.js';
6
+ import '../../chunk-OUVTG72A.js';
7
7
  import '../../chunk-NSBPE2FW.js';
8
8
  import * as TaskManager from 'expo-task-manager';
9
9
  import * as BackgroundTask from 'expo-background-task';
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkI2UIKZM5_cjs = require('../../chunk-I2UIKZM5.cjs');
4
- var chunkKQK4PP6L_cjs = require('../../chunk-KQK4PP6L.cjs');
5
- var chunk6FLL2Q36_cjs = require('../../chunk-6FLL2Q36.cjs');
6
- var chunkIEO3XDKI_cjs = require('../../chunk-IEO3XDKI.cjs');
7
- require('../../chunk-WMIPYZSB.cjs');
3
+ var chunkZS3OZHC7_cjs = require('../../chunk-ZS3OZHC7.cjs');
4
+ var chunkXCHBQVMK_cjs = require('../../chunk-XCHBQVMK.cjs');
5
+ var chunkFSAXPBGP_cjs = require('../../chunk-FSAXPBGP.cjs');
6
+ require('../../chunk-GUTKJMSF.cjs');
7
+ require('../../chunk-CMPJR3HS.cjs');
8
8
  require('../../chunk-5BLDMQED.cjs');
9
9
  var base = require('@scure/base');
10
10
 
@@ -52,20 +52,20 @@ var ExpoWallet = class _ExpoWallet {
52
52
  */
53
53
  static async setup(config) {
54
54
  warnOnRemovedBackgroundFields(config.background);
55
- const wallet = await chunkKQK4PP6L_cjs.Wallet.create(config);
56
- const processors = config.background.processors ?? [chunkI2UIKZM5_cjs.contractPollProcessor];
55
+ const wallet = await chunkXCHBQVMK_cjs.Wallet.create(config);
56
+ const processors = config.background.processors ?? [chunkZS3OZHC7_cjs.contractPollProcessor];
57
57
  const deps = {
58
58
  walletRepository: wallet.walletRepository,
59
59
  contractRepository: wallet.contractRepository,
60
60
  indexerProvider: wallet.indexerProvider,
61
61
  arkProvider: wallet.arkProvider,
62
- extendVtxo: (vtxo, contract) => chunkKQK4PP6L_cjs.extendVirtualCoinForContract(vtxo, contract)
62
+ extendVtxo: (vtxo, contract) => chunkXCHBQVMK_cjs.extendVirtualCoinForContract(vtxo, contract)
63
63
  };
64
64
  const { taskQueue } = config.background;
65
65
  if ("persistConfig" in taskQueue) {
66
- const arkServerUrl = config.arkServerUrl || (wallet.arkProvider instanceof chunk6FLL2Q36_cjs.RestArkProvider ? wallet.arkProvider.serverUrl : void 0);
66
+ const arkServerUrl = config.arkServerUrl || (wallet.arkProvider instanceof chunkFSAXPBGP_cjs.RestArkProvider ? wallet.arkProvider.serverUrl : void 0);
67
67
  if (arkServerUrl) {
68
- const timelock = wallet.offchainTapscript.options.csvTimelock ?? chunkIEO3XDKI_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
68
+ const timelock = wallet.offchainTapscript.options.csvTimelock;
69
69
  const bgConfig = {
70
70
  arkServerUrl,
71
71
  pubkeyHex: base.hex.encode(wallet.offchainTapscript.options.pubKey),
@@ -93,7 +93,7 @@ var ExpoWallet = class _ExpoWallet {
93
93
  }, intervalMs);
94
94
  }
95
95
  async runForegroundPoll() {
96
- await chunkI2UIKZM5_cjs.runTasks(this.taskQueue, this.processors, this.deps);
96
+ await chunkZS3OZHC7_cjs.runTasks(this.taskQueue, this.processors, this.deps);
97
97
  const results = await this.taskQueue.getResults();
98
98
  if (results.length > 0) {
99
99
  await this.taskQueue.acknowledgeResults(results.map((r) => r.id));
@@ -101,11 +101,11 @@ var ExpoWallet = class _ExpoWallet {
101
101
  await this.seedContractPollTask();
102
102
  }
103
103
  async seedContractPollTask() {
104
- const existing = await this.taskQueue.getTasks(chunkI2UIKZM5_cjs.CONTRACT_POLL_TASK_TYPE);
104
+ const existing = await this.taskQueue.getTasks(chunkZS3OZHC7_cjs.CONTRACT_POLL_TASK_TYPE);
105
105
  if (existing.length > 0) return;
106
106
  const task = {
107
- id: chunkKQK4PP6L_cjs.getRandomId(),
108
- type: chunkI2UIKZM5_cjs.CONTRACT_POLL_TASK_TYPE,
107
+ id: chunkXCHBQVMK_cjs.getRandomId(),
108
+ type: chunkZS3OZHC7_cjs.CONTRACT_POLL_TASK_TYPE,
109
109
  data: {},
110
110
  createdAt: Date.now()
111
111
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/wallet/expo/wallet.ts"],"names":["Wallet","contractPollProcessor","extendVirtualCoinForContract","RestArkProvider","DefaultVtxo","hex","runTasks","CONTRACT_POLL_TASK_TYPE","getRandomId"],"mappings":"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","file":"index.cjs","sourcesContent":["import { hex } from \"@scure/base\";\nimport { Wallet } from \"../wallet\";\nimport { RestArkProvider } from \"../../providers/ark\";\nimport type {\n IWallet,\n IAssetManager,\n WalletBalance,\n WalletConfig,\n SendBitcoinParams,\n SettleParams,\n GetVtxosFilter,\n ArkTransaction,\n ExtendedCoin,\n ExtendedVirtualCoin,\n Recipient,\n} from \"..\";\nimport type { VirtualCoin } from \"..\";\nimport type { SettlementEvent } from \"../../providers/ark\";\nimport type { Identity } from \"../../identity\";\nimport type { IContractManager } from \"../../contracts/contractManager\";\nimport type { IDelegateManager } from \"../delegate\";\nimport type { TaskQueue, TaskItem } from \"../../worker/expo/taskQueue\";\nimport type { TaskProcessor, TaskDependencies } from \"../../worker/expo/taskRunner\";\nimport { runTasks } from \"../../worker/expo/taskRunner\";\nimport { contractPollProcessor, CONTRACT_POLL_TASK_TYPE } from \"../../worker/expo/processors\";\nimport { extendVirtualCoinForContract, getRandomId } from \"../utils\";\nimport { DefaultVtxo } from \"../../script/default\";\nimport type { PersistedBackgroundConfig } from \"./background\";\nimport type { AsyncStorageTaskQueue } from \"../../worker/expo/asyncStorageTaskQueue\";\n\n/**\n * Background processing configuration for @see ExpoWallet.\n *\n * OS-level task registration is **not** part of this config — call\n * `registerExpoBackgroundTask` from `@arkade-os/sdk/wallet/expo/background`\n * explicitly. Splitting that step out keeps `/wallet/expo` free of the\n * `expo-task-manager` / `expo-background-task` dependencies, so\n * react-native-web and Node consumers can use `ExpoWallet` without\n * those native packages. See\n * https://github.com/arkade-os/ts-sdk/issues/486 for details.\n */\nexport interface ExpoBackgroundConfig {\n /** Persistence layer for foreground ↔ background handoff. */\n taskQueue: TaskQueue;\n /** Processors to run on each tick. Defaults to `[contractPollProcessor]`. */\n processors?: TaskProcessor[];\n /** If set, automatically polls at this interval (ms) while the app is in the foreground. */\n foregroundIntervalMs?: number;\n}\n\n/**\n * Configuration for @see ExpoWallet.setup.\n */\nexport interface ExpoWalletConfig extends WalletConfig {\n background: ExpoBackgroundConfig;\n}\n\n/**\n * Catches JS callers still passing the pre-fix-#486 fields: TypeScript\n * blocks these at compile time, but compiled JS silently dropped them\n * and consumers would never realize the OS task wasn't scheduled.\n *\n * @internal Exported for tests; not part of the public API surface.\n */\nexport function warnOnRemovedBackgroundFields(bg: unknown): void {\n if (!bg || typeof bg !== \"object\") return;\n const removed: string[] = [];\n if (\"taskName\" in bg) removed.push(\"taskName\");\n if (\"minimumBackgroundInterval\" in bg) {\n removed.push(\"minimumBackgroundInterval\");\n }\n if (removed.length === 0) return;\n console.warn(\n `[ark-sdk] ExpoWallet.setup: ignoring removed background field(s): ${removed.join(\", \")}. ` +\n 'OS-task registration moved to \"@arkade-os/sdk/wallet/expo/background\". ' +\n \"See https://github.com/arkade-os/ts-sdk/issues/486\",\n );\n}\n\n/**\n * Expo/React Native wallet with built-in background task processing.\n *\n * Wraps a standard @see Wallet and adds a lightweight task queue\n * for keeping contract/VTXO state fresh while the app is active and\n * across Expo BackgroundTask wakes.\n *\n * OS-level task registration is the consumer's responsibility — call\n * `registerExpoBackgroundTask` from\n * `@arkade-os/sdk/wallet/expo/background` after `setup()`. Keeping\n * registration out of `setup()` lets this entrypoint avoid pulling\n * `expo-task-manager` / `expo-background-task` into the `/wallet/expo`\n * bundle.\n *\n * @example\n * ```ts\n * import { ExpoWallet } from \"@arkade-os/sdk/wallet/expo\";\n * import { registerExpoBackgroundTask } from \"@arkade-os/sdk/wallet/expo/background\";\n * import { AsyncStorageTaskQueue } from \"@arkade-os/sdk/worker/expo\";\n *\n * const wallet = await ExpoWallet.setup({\n * identity: MnemonicIdentity.fromMnemonic('abandon abandon...'),\n * arkProvider: new RestArkProvider(),\n * onchainProvider: new EsploraProvider(),\n * storage: { ... },\n * background: {\n * taskQueue: new AsyncStorageTaskQueue(AsyncStorage),\n * foregroundIntervalMs: 20_000,\n * },\n * });\n *\n * // Activate the OS scheduler (Expo Android/iOS only)\n * await registerExpoBackgroundTask(\"ark-background-poll\", { minimumInterval: 15 });\n *\n * const balance = await wallet.getBalance();\n * ```\n */\nexport class ExpoWallet implements IWallet {\n readonly identity: Identity;\n readonly arkProvider: Wallet[\"arkProvider\"];\n readonly indexerProvider: Wallet[\"indexerProvider\"];\n\n private foregroundIntervalId?: ReturnType<typeof setInterval>;\n\n private constructor(\n private readonly wallet: Wallet,\n private readonly taskQueue: TaskQueue,\n private readonly processors: TaskProcessor[],\n private readonly deps: TaskDependencies,\n foregroundIntervalMs?: number,\n ) {\n this.identity = wallet.identity;\n this.arkProvider = wallet.arkProvider;\n this.indexerProvider = wallet.indexerProvider;\n\n if (foregroundIntervalMs && foregroundIntervalMs > 0) {\n this.startForegroundPolling(foregroundIntervalMs);\n }\n }\n\n /**\n * Create an ExpoWallet with foreground/background queue handoff.\n *\n * 1. Creates the inner @see Wallet via `Wallet.create()`.\n * 2. Wires up processors (defaults to @see contractPollProcessor).\n * 3. Persists background config for the background handler (if the queue supports it).\n * 4. Seeds the task queue with a `contract-poll` task.\n * 5. Starts the foreground interval if `foregroundIntervalMs` is set.\n *\n * OS-level scheduling lives in\n * `@arkade-os/sdk/wallet/expo/background` and is invoked separately\n * by the consumer.\n */\n static async setup(config: ExpoWalletConfig): Promise<ExpoWallet> {\n warnOnRemovedBackgroundFields(config.background);\n\n const wallet = await Wallet.create(config);\n\n const processors = config.background.processors ?? [contractPollProcessor];\n\n const deps: TaskDependencies = {\n walletRepository: wallet.walletRepository,\n contractRepository: wallet.contractRepository,\n indexerProvider: wallet.indexerProvider,\n arkProvider: wallet.arkProvider,\n extendVtxo: (vtxo, contract) => extendVirtualCoinForContract(vtxo, contract),\n };\n\n const { taskQueue } = config.background;\n\n // Persist wallet params so the background handler can rehydrate\n // without a network call. Only works with AsyncStorageTaskQueue.\n if (\"persistConfig\" in taskQueue) {\n const arkServerUrl =\n config.arkServerUrl ||\n (wallet.arkProvider instanceof RestArkProvider\n ? wallet.arkProvider.serverUrl\n : undefined);\n\n if (arkServerUrl) {\n const timelock =\n wallet.offchainTapscript.options.csvTimelock ??\n DefaultVtxo.Script.DEFAULT_TIMELOCK;\n\n const bgConfig: PersistedBackgroundConfig = {\n arkServerUrl,\n pubkeyHex: hex.encode(wallet.offchainTapscript.options.pubKey),\n serverPubKeyHex: hex.encode(wallet.offchainTapscript.options.serverPubKey),\n exitTimelockValue: timelock.value.toString(),\n exitTimelockType: timelock.type,\n };\n\n await (taskQueue as AsyncStorageTaskQueue).persistConfig(bgConfig);\n }\n }\n\n const expoWallet = new ExpoWallet(\n wallet,\n taskQueue,\n processors,\n deps,\n config.background.foregroundIntervalMs,\n );\n\n // Seed the queue so the first tick (or background wake) has work to do\n await expoWallet.seedContractPollTask();\n\n return expoWallet;\n }\n\n // ── Foreground polling ───────────────────────────────────────────\n\n private startForegroundPolling(intervalMs: number): void {\n this.foregroundIntervalId = setInterval(() => {\n this.runForegroundPoll().catch(console.error);\n }, intervalMs);\n }\n\n private async runForegroundPoll(): Promise<void> {\n await runTasks(this.taskQueue, this.processors, this.deps);\n\n // Consume results immediately (no background handoff needed)\n const results = await this.taskQueue.getResults();\n if (results.length > 0) {\n await this.taskQueue.acknowledgeResults(results.map((r) => r.id));\n }\n\n // Re-seed for the next tick\n await this.seedContractPollTask();\n }\n\n private async seedContractPollTask(): Promise<void> {\n const existing = await this.taskQueue.getTasks(CONTRACT_POLL_TASK_TYPE);\n if (existing.length > 0) return;\n\n const task: TaskItem = {\n id: getRandomId(),\n type: CONTRACT_POLL_TASK_TYPE,\n data: {},\n createdAt: Date.now(),\n };\n await this.taskQueue.addTask(task);\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────\n\n /**\n * Stop foreground polling and dispose the inner wallet.\n *\n * Does **not** unregister the OS background task — call\n * `unregisterExpoBackgroundTask` from\n * `@arkade-os/sdk/wallet/expo/background` yourself, matching the\n * explicit `register` step.\n */\n async dispose(): Promise<void> {\n if (this.foregroundIntervalId) {\n clearInterval(this.foregroundIntervalId);\n this.foregroundIntervalId = undefined;\n }\n\n await this.wallet.dispose();\n }\n\n // ── IWallet delegation ───────────────────────────────────────────\n\n getAddress(): Promise<string> {\n return this.wallet.getAddress();\n }\n\n getBoardingAddress(): Promise<string> {\n return this.wallet.getBoardingAddress();\n }\n\n getBalance(): Promise<WalletBalance> {\n return this.wallet.getBalance();\n }\n\n getVtxos(filter?: GetVtxosFilter): Promise<ExtendedVirtualCoin[]> {\n return this.wallet.getVtxos(filter);\n }\n\n getBoardingUtxos(): Promise<ExtendedCoin[]> {\n return this.wallet.getBoardingUtxos();\n }\n\n getTransactionHistory(): Promise<ArkTransaction[]> {\n return this.wallet.getTransactionHistory();\n }\n\n getContractManager(): Promise<IContractManager> {\n return this.wallet.getContractManager();\n }\n\n getDelegateManager(): Promise<IDelegateManager | undefined> {\n return this.wallet.getDelegateManager();\n }\n\n /** @deprecated alias for @see ExpoWallet.getDelegateManager */\n getDelegatorManager(): Promise<IDelegateManager | undefined> {\n return this.wallet.getDelegateManager();\n }\n\n sendBitcoin(params: SendBitcoinParams): Promise<string> {\n return this.wallet.sendBitcoin(params);\n }\n\n settle(\n params?: SettleParams,\n eventCallback?: (event: SettlementEvent) => void,\n ): Promise<string> {\n return this.wallet.settle(params, eventCallback);\n }\n\n send(...recipients: [Recipient, ...Recipient[]]): Promise<string> {\n return this.wallet.send(...recipients);\n }\n\n get assetManager(): IAssetManager {\n return this.wallet.assetManager;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/wallet/expo/wallet.ts"],"names":["Wallet","contractPollProcessor","extendVirtualCoinForContract","RestArkProvider","hex","runTasks","CONTRACT_POLL_TASK_TYPE","getRandomId"],"mappings":"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","file":"index.cjs","sourcesContent":["import { hex } from \"@scure/base\";\nimport { Wallet } from \"../wallet\";\nimport { RestArkProvider } from \"../../providers/ark\";\nimport type {\n IWallet,\n IAssetManager,\n WalletBalance,\n WalletConfig,\n SendBitcoinParams,\n SettleParams,\n GetVtxosFilter,\n ArkTransaction,\n ExtendedCoin,\n ExtendedVirtualCoin,\n Recipient,\n} from \"..\";\nimport type { SettlementEvent } from \"../../providers/ark\";\nimport type { Identity } from \"../../identity\";\nimport type { IContractManager } from \"../../contracts/contractManager\";\nimport type { IDelegateManager } from \"../delegate\";\nimport type { TaskQueue, TaskItem } from \"../../worker/expo/taskQueue\";\nimport type { TaskProcessor, TaskDependencies } from \"../../worker/expo/taskRunner\";\nimport { runTasks } from \"../../worker/expo/taskRunner\";\nimport { contractPollProcessor, CONTRACT_POLL_TASK_TYPE } from \"../../worker/expo/processors\";\nimport { extendVirtualCoinForContract, getRandomId } from \"../utils\";\nimport type { PersistedBackgroundConfig } from \"./background\";\nimport type { AsyncStorageTaskQueue } from \"../../worker/expo/asyncStorageTaskQueue\";\n\n/**\n * Background processing configuration for @see ExpoWallet.\n *\n * OS-level task registration is **not** part of this config — call\n * `registerExpoBackgroundTask` from `@arkade-os/sdk/wallet/expo/background`\n * explicitly. Splitting that step out keeps `/wallet/expo` free of the\n * `expo-task-manager` / `expo-background-task` dependencies, so\n * react-native-web and Node consumers can use `ExpoWallet` without\n * those native packages. See\n * https://github.com/arkade-os/ts-sdk/issues/486 for details.\n */\nexport interface ExpoBackgroundConfig {\n /** Persistence layer for foreground ↔ background handoff. */\n taskQueue: TaskQueue;\n /** Processors to run on each tick. Defaults to `[contractPollProcessor]`. */\n processors?: TaskProcessor[];\n /** If set, automatically polls at this interval (ms) while the app is in the foreground. */\n foregroundIntervalMs?: number;\n}\n\n/**\n * Configuration for @see ExpoWallet.setup.\n */\nexport interface ExpoWalletConfig extends WalletConfig {\n background: ExpoBackgroundConfig;\n}\n\n/**\n * Catches JS callers still passing the pre-fix-#486 fields: TypeScript\n * blocks these at compile time, but compiled JS silently dropped them\n * and consumers would never realize the OS task wasn't scheduled.\n *\n * @internal Exported for tests; not part of the public API surface.\n */\nexport function warnOnRemovedBackgroundFields(bg: unknown): void {\n if (!bg || typeof bg !== \"object\") return;\n const removed: string[] = [];\n if (\"taskName\" in bg) removed.push(\"taskName\");\n if (\"minimumBackgroundInterval\" in bg) {\n removed.push(\"minimumBackgroundInterval\");\n }\n if (removed.length === 0) return;\n console.warn(\n `[ark-sdk] ExpoWallet.setup: ignoring removed background field(s): ${removed.join(\", \")}. ` +\n 'OS-task registration moved to \"@arkade-os/sdk/wallet/expo/background\". ' +\n \"See https://github.com/arkade-os/ts-sdk/issues/486\",\n );\n}\n\n/**\n * Expo/React Native wallet with built-in background task processing.\n *\n * Wraps a standard @see Wallet and adds a lightweight task queue\n * for keeping contract/VTXO state fresh while the app is active and\n * across Expo BackgroundTask wakes.\n *\n * OS-level task registration is the consumer's responsibility — call\n * `registerExpoBackgroundTask` from\n * `@arkade-os/sdk/wallet/expo/background` after `setup()`. Keeping\n * registration out of `setup()` lets this entrypoint avoid pulling\n * `expo-task-manager` / `expo-background-task` into the `/wallet/expo`\n * bundle.\n *\n * @example\n * ```ts\n * import { ExpoWallet } from \"@arkade-os/sdk/wallet/expo\";\n * import { registerExpoBackgroundTask } from \"@arkade-os/sdk/wallet/expo/background\";\n * import { AsyncStorageTaskQueue } from \"@arkade-os/sdk/worker/expo\";\n *\n * const wallet = await ExpoWallet.setup({\n * identity: MnemonicIdentity.fromMnemonic('abandon abandon...'),\n * arkProvider: new RestArkProvider(),\n * onchainProvider: new EsploraProvider(),\n * storage: { ... },\n * background: {\n * taskQueue: new AsyncStorageTaskQueue(AsyncStorage),\n * foregroundIntervalMs: 20_000,\n * },\n * });\n *\n * // Activate the OS scheduler (Expo Android/iOS only)\n * await registerExpoBackgroundTask(\"ark-background-poll\", { minimumInterval: 15 });\n *\n * const balance = await wallet.getBalance();\n * ```\n */\nexport class ExpoWallet implements IWallet {\n readonly identity: Identity;\n readonly arkProvider: Wallet[\"arkProvider\"];\n readonly indexerProvider: Wallet[\"indexerProvider\"];\n\n private foregroundIntervalId?: ReturnType<typeof setInterval>;\n\n private constructor(\n private readonly wallet: Wallet,\n private readonly taskQueue: TaskQueue,\n private readonly processors: TaskProcessor[],\n private readonly deps: TaskDependencies,\n foregroundIntervalMs?: number,\n ) {\n this.identity = wallet.identity;\n this.arkProvider = wallet.arkProvider;\n this.indexerProvider = wallet.indexerProvider;\n\n if (foregroundIntervalMs && foregroundIntervalMs > 0) {\n this.startForegroundPolling(foregroundIntervalMs);\n }\n }\n\n /**\n * Create an ExpoWallet with foreground/background queue handoff.\n *\n * 1. Creates the inner @see Wallet via `Wallet.create()`.\n * 2. Wires up processors (defaults to @see contractPollProcessor).\n * 3. Persists background config for the background handler (if the queue supports it).\n * 4. Seeds the task queue with a `contract-poll` task.\n * 5. Starts the foreground interval if `foregroundIntervalMs` is set.\n *\n * OS-level scheduling lives in\n * `@arkade-os/sdk/wallet/expo/background` and is invoked separately\n * by the consumer.\n */\n static async setup(config: ExpoWalletConfig): Promise<ExpoWallet> {\n warnOnRemovedBackgroundFields(config.background);\n\n const wallet = await Wallet.create(config);\n\n const processors = config.background.processors ?? [contractPollProcessor];\n\n const deps: TaskDependencies = {\n walletRepository: wallet.walletRepository,\n contractRepository: wallet.contractRepository,\n indexerProvider: wallet.indexerProvider,\n arkProvider: wallet.arkProvider,\n extendVtxo: (vtxo, contract) => extendVirtualCoinForContract(vtxo, contract),\n };\n\n const { taskQueue } = config.background;\n\n // Persist wallet params so the background handler can rehydrate\n // without a network call. Only works with AsyncStorageTaskQueue.\n if (\"persistConfig\" in taskQueue) {\n const arkServerUrl =\n config.arkServerUrl ||\n (wallet.arkProvider instanceof RestArkProvider\n ? wallet.arkProvider.serverUrl\n : undefined);\n\n if (arkServerUrl) {\n const timelock = wallet.offchainTapscript.options.csvTimelock;\n\n const bgConfig: PersistedBackgroundConfig = {\n arkServerUrl,\n pubkeyHex: hex.encode(wallet.offchainTapscript.options.pubKey),\n serverPubKeyHex: hex.encode(wallet.offchainTapscript.options.serverPubKey),\n exitTimelockValue: timelock.value.toString(),\n exitTimelockType: timelock.type,\n };\n\n await (taskQueue as AsyncStorageTaskQueue).persistConfig(bgConfig);\n }\n }\n\n const expoWallet = new ExpoWallet(\n wallet,\n taskQueue,\n processors,\n deps,\n config.background.foregroundIntervalMs,\n );\n\n // Seed the queue so the first tick (or background wake) has work to do\n await expoWallet.seedContractPollTask();\n\n return expoWallet;\n }\n\n // ── Foreground polling ───────────────────────────────────────────\n\n private startForegroundPolling(intervalMs: number): void {\n this.foregroundIntervalId = setInterval(() => {\n this.runForegroundPoll().catch(console.error);\n }, intervalMs);\n }\n\n private async runForegroundPoll(): Promise<void> {\n await runTasks(this.taskQueue, this.processors, this.deps);\n\n // Consume results immediately (no background handoff needed)\n const results = await this.taskQueue.getResults();\n if (results.length > 0) {\n await this.taskQueue.acknowledgeResults(results.map((r) => r.id));\n }\n\n // Re-seed for the next tick\n await this.seedContractPollTask();\n }\n\n private async seedContractPollTask(): Promise<void> {\n const existing = await this.taskQueue.getTasks(CONTRACT_POLL_TASK_TYPE);\n if (existing.length > 0) return;\n\n const task: TaskItem = {\n id: getRandomId(),\n type: CONTRACT_POLL_TASK_TYPE,\n data: {},\n createdAt: Date.now(),\n };\n await this.taskQueue.addTask(task);\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────\n\n /**\n * Stop foreground polling and dispose the inner wallet.\n *\n * Does **not** unregister the OS background task — call\n * `unregisterExpoBackgroundTask` from\n * `@arkade-os/sdk/wallet/expo/background` yourself, matching the\n * explicit `register` step.\n */\n async dispose(): Promise<void> {\n if (this.foregroundIntervalId) {\n clearInterval(this.foregroundIntervalId);\n this.foregroundIntervalId = undefined;\n }\n\n await this.wallet.dispose();\n }\n\n // ── IWallet delegation ───────────────────────────────────────────\n\n getAddress(): Promise<string> {\n return this.wallet.getAddress();\n }\n\n getBoardingAddress(): Promise<string> {\n return this.wallet.getBoardingAddress();\n }\n\n getBalance(): Promise<WalletBalance> {\n return this.wallet.getBalance();\n }\n\n getVtxos(filter?: GetVtxosFilter): Promise<ExtendedVirtualCoin[]> {\n return this.wallet.getVtxos(filter);\n }\n\n getBoardingUtxos(): Promise<ExtendedCoin[]> {\n return this.wallet.getBoardingUtxos();\n }\n\n getTransactionHistory(): Promise<ArkTransaction[]> {\n return this.wallet.getTransactionHistory();\n }\n\n getContractManager(): Promise<IContractManager> {\n return this.wallet.getContractManager();\n }\n\n getDelegateManager(): Promise<IDelegateManager | undefined> {\n return this.wallet.getDelegateManager();\n }\n\n /** @deprecated alias for @see ExpoWallet.getDelegateManager */\n getDelegatorManager(): Promise<IDelegateManager | undefined> {\n return this.wallet.getDelegateManager();\n }\n\n sendBitcoin(params: SendBitcoinParams): Promise<string> {\n return this.wallet.sendBitcoin(params);\n }\n\n settle(\n params?: SettleParams,\n eventCallback?: (event: SettlementEvent) => void,\n ): Promise<string> {\n return this.wallet.settle(params, eventCallback);\n }\n\n send(...recipients: [Recipient, ...Recipient[]]): Promise<string> {\n return this.wallet.send(...recipients);\n }\n\n get assetManager(): IAssetManager {\n return this.wallet.assetManager;\n }\n}\n"]}
@@ -1,11 +1,11 @@
1
- import { W as Wallet } from '../../wallet-B_rxgQTu.cjs';
2
- import { I as IWallet, a as Identity, b as WalletConfig, c as WalletBalance, G as GetVtxosFilter, E as ExtendedVirtualCoin, d as ExtendedCoin, A as ArkTransaction, e as IContractManager, f as IDelegateManager, S as SendBitcoinParams, g as SettleParams, h as SettlementEvent, R as Recipient, i as IAssetManager } from '../../ark-ibLW4Hte.cjs';
3
- import { a as TaskQueue, T as TaskProcessor } from '../../taskRunner-By92TQ1m.cjs';
1
+ import { W as Wallet } from '../../wallet-By9HIo0Q.cjs';
2
+ import { I as IWallet, a as Identity, b as WalletConfig, c as WalletBalance, G as GetVtxosFilter, E as ExtendedVirtualCoin, d as ExtendedCoin, A as ArkTransaction, e as IContractManager, f as IDelegateManager, S as SendBitcoinParams, g as SettleParams, h as SettlementEvent, R as Recipient, i as IAssetManager } from '../../ark-Dsv5Jq4E.cjs';
3
+ import { a as TaskQueue, T as TaskProcessor } from '../../taskRunner-vFRA3F9b.cjs';
4
+ import '@scure/btc-signer';
4
5
  import '@scure/btc-signer/utils.js';
5
6
  import '@scure/btc-signer/psbt.js';
6
- import '../../delegate-BvNTw44a.cjs';
7
+ import '../../delegate-BaS5SCIW.cjs';
7
8
  import '@scure/btc-signer/transaction.js';
8
- import '@scure/btc-signer';
9
9
 
10
10
  /**
11
11
  * Background processing configuration for @see ExpoWallet.
@@ -1,11 +1,11 @@
1
- import { W as Wallet } from '../../wallet-CyM4F7Bs.js';
2
- import { I as IWallet, a as Identity, b as WalletConfig, c as WalletBalance, G as GetVtxosFilter, E as ExtendedVirtualCoin, d as ExtendedCoin, A as ArkTransaction, e as IContractManager, f as IDelegateManager, S as SendBitcoinParams, g as SettleParams, h as SettlementEvent, R as Recipient, i as IAssetManager } from '../../ark-ibLW4Hte.js';
3
- import { a as TaskQueue, T as TaskProcessor } from '../../taskRunner-B1igKGAo.js';
1
+ import { W as Wallet } from '../../wallet-D6uoBLmS.js';
2
+ import { I as IWallet, a as Identity, b as WalletConfig, c as WalletBalance, G as GetVtxosFilter, E as ExtendedVirtualCoin, d as ExtendedCoin, A as ArkTransaction, e as IContractManager, f as IDelegateManager, S as SendBitcoinParams, g as SettleParams, h as SettlementEvent, R as Recipient, i as IAssetManager } from '../../ark-Dsv5Jq4E.js';
3
+ import { a as TaskQueue, T as TaskProcessor } from '../../taskRunner-B1NUWyWR.js';
4
+ import '@scure/btc-signer';
4
5
  import '@scure/btc-signer/utils.js';
5
6
  import '@scure/btc-signer/psbt.js';
6
- import '../../delegate-BXaR1RNG.js';
7
+ import '../../delegate-Baz_hb83.js';
7
8
  import '@scure/btc-signer/transaction.js';
8
- import '@scure/btc-signer';
9
9
 
10
10
  /**
11
11
  * Background processing configuration for @see ExpoWallet.
@@ -1,8 +1,8 @@
1
- import { contractPollProcessor, runTasks, CONTRACT_POLL_TASK_TYPE } from '../../chunk-SHEBNWOQ.js';
2
- import { Wallet, getRandomId, extendVirtualCoinForContract } from '../../chunk-XROGFOPX.js';
3
- import { RestArkProvider } from '../../chunk-6NWNOLL3.js';
4
- import { DefaultVtxo } from '../../chunk-YA4G7RFB.js';
5
- import '../../chunk-TU3LVAPX.js';
1
+ import { contractPollProcessor, runTasks, CONTRACT_POLL_TASK_TYPE } from '../../chunk-VVGD3JIP.js';
2
+ import { Wallet, getRandomId, extendVirtualCoinForContract } from '../../chunk-HFXEUW55.js';
3
+ import { RestArkProvider } from '../../chunk-FXFBPXV3.js';
4
+ import '../../chunk-CUSABEUQ.js';
5
+ import '../../chunk-OUVTG72A.js';
6
6
  import '../../chunk-NSBPE2FW.js';
7
7
  import { hex } from '@scure/base';
8
8
 
@@ -63,7 +63,7 @@ var ExpoWallet = class _ExpoWallet {
63
63
  if ("persistConfig" in taskQueue) {
64
64
  const arkServerUrl = config.arkServerUrl || (wallet.arkProvider instanceof RestArkProvider ? wallet.arkProvider.serverUrl : void 0);
65
65
  if (arkServerUrl) {
66
- const timelock = wallet.offchainTapscript.options.csvTimelock ?? DefaultVtxo.Script.DEFAULT_TIMELOCK;
66
+ const timelock = wallet.offchainTapscript.options.csvTimelock;
67
67
  const bgConfig = {
68
68
  arkServerUrl,
69
69
  pubkeyHex: hex.encode(wallet.offchainTapscript.options.pubKey),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/wallet/expo/wallet.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { hex } from \"@scure/base\";\nimport { Wallet } from \"../wallet\";\nimport { RestArkProvider } from \"../../providers/ark\";\nimport type {\n IWallet,\n IAssetManager,\n WalletBalance,\n WalletConfig,\n SendBitcoinParams,\n SettleParams,\n GetVtxosFilter,\n ArkTransaction,\n ExtendedCoin,\n ExtendedVirtualCoin,\n Recipient,\n} from \"..\";\nimport type { VirtualCoin } from \"..\";\nimport type { SettlementEvent } from \"../../providers/ark\";\nimport type { Identity } from \"../../identity\";\nimport type { IContractManager } from \"../../contracts/contractManager\";\nimport type { IDelegateManager } from \"../delegate\";\nimport type { TaskQueue, TaskItem } from \"../../worker/expo/taskQueue\";\nimport type { TaskProcessor, TaskDependencies } from \"../../worker/expo/taskRunner\";\nimport { runTasks } from \"../../worker/expo/taskRunner\";\nimport { contractPollProcessor, CONTRACT_POLL_TASK_TYPE } from \"../../worker/expo/processors\";\nimport { extendVirtualCoinForContract, getRandomId } from \"../utils\";\nimport { DefaultVtxo } from \"../../script/default\";\nimport type { PersistedBackgroundConfig } from \"./background\";\nimport type { AsyncStorageTaskQueue } from \"../../worker/expo/asyncStorageTaskQueue\";\n\n/**\n * Background processing configuration for @see ExpoWallet.\n *\n * OS-level task registration is **not** part of this config — call\n * `registerExpoBackgroundTask` from `@arkade-os/sdk/wallet/expo/background`\n * explicitly. Splitting that step out keeps `/wallet/expo` free of the\n * `expo-task-manager` / `expo-background-task` dependencies, so\n * react-native-web and Node consumers can use `ExpoWallet` without\n * those native packages. See\n * https://github.com/arkade-os/ts-sdk/issues/486 for details.\n */\nexport interface ExpoBackgroundConfig {\n /** Persistence layer for foreground ↔ background handoff. */\n taskQueue: TaskQueue;\n /** Processors to run on each tick. Defaults to `[contractPollProcessor]`. */\n processors?: TaskProcessor[];\n /** If set, automatically polls at this interval (ms) while the app is in the foreground. */\n foregroundIntervalMs?: number;\n}\n\n/**\n * Configuration for @see ExpoWallet.setup.\n */\nexport interface ExpoWalletConfig extends WalletConfig {\n background: ExpoBackgroundConfig;\n}\n\n/**\n * Catches JS callers still passing the pre-fix-#486 fields: TypeScript\n * blocks these at compile time, but compiled JS silently dropped them\n * and consumers would never realize the OS task wasn't scheduled.\n *\n * @internal Exported for tests; not part of the public API surface.\n */\nexport function warnOnRemovedBackgroundFields(bg: unknown): void {\n if (!bg || typeof bg !== \"object\") return;\n const removed: string[] = [];\n if (\"taskName\" in bg) removed.push(\"taskName\");\n if (\"minimumBackgroundInterval\" in bg) {\n removed.push(\"minimumBackgroundInterval\");\n }\n if (removed.length === 0) return;\n console.warn(\n `[ark-sdk] ExpoWallet.setup: ignoring removed background field(s): ${removed.join(\", \")}. ` +\n 'OS-task registration moved to \"@arkade-os/sdk/wallet/expo/background\". ' +\n \"See https://github.com/arkade-os/ts-sdk/issues/486\",\n );\n}\n\n/**\n * Expo/React Native wallet with built-in background task processing.\n *\n * Wraps a standard @see Wallet and adds a lightweight task queue\n * for keeping contract/VTXO state fresh while the app is active and\n * across Expo BackgroundTask wakes.\n *\n * OS-level task registration is the consumer's responsibility — call\n * `registerExpoBackgroundTask` from\n * `@arkade-os/sdk/wallet/expo/background` after `setup()`. Keeping\n * registration out of `setup()` lets this entrypoint avoid pulling\n * `expo-task-manager` / `expo-background-task` into the `/wallet/expo`\n * bundle.\n *\n * @example\n * ```ts\n * import { ExpoWallet } from \"@arkade-os/sdk/wallet/expo\";\n * import { registerExpoBackgroundTask } from \"@arkade-os/sdk/wallet/expo/background\";\n * import { AsyncStorageTaskQueue } from \"@arkade-os/sdk/worker/expo\";\n *\n * const wallet = await ExpoWallet.setup({\n * identity: MnemonicIdentity.fromMnemonic('abandon abandon...'),\n * arkProvider: new RestArkProvider(),\n * onchainProvider: new EsploraProvider(),\n * storage: { ... },\n * background: {\n * taskQueue: new AsyncStorageTaskQueue(AsyncStorage),\n * foregroundIntervalMs: 20_000,\n * },\n * });\n *\n * // Activate the OS scheduler (Expo Android/iOS only)\n * await registerExpoBackgroundTask(\"ark-background-poll\", { minimumInterval: 15 });\n *\n * const balance = await wallet.getBalance();\n * ```\n */\nexport class ExpoWallet implements IWallet {\n readonly identity: Identity;\n readonly arkProvider: Wallet[\"arkProvider\"];\n readonly indexerProvider: Wallet[\"indexerProvider\"];\n\n private foregroundIntervalId?: ReturnType<typeof setInterval>;\n\n private constructor(\n private readonly wallet: Wallet,\n private readonly taskQueue: TaskQueue,\n private readonly processors: TaskProcessor[],\n private readonly deps: TaskDependencies,\n foregroundIntervalMs?: number,\n ) {\n this.identity = wallet.identity;\n this.arkProvider = wallet.arkProvider;\n this.indexerProvider = wallet.indexerProvider;\n\n if (foregroundIntervalMs && foregroundIntervalMs > 0) {\n this.startForegroundPolling(foregroundIntervalMs);\n }\n }\n\n /**\n * Create an ExpoWallet with foreground/background queue handoff.\n *\n * 1. Creates the inner @see Wallet via `Wallet.create()`.\n * 2. Wires up processors (defaults to @see contractPollProcessor).\n * 3. Persists background config for the background handler (if the queue supports it).\n * 4. Seeds the task queue with a `contract-poll` task.\n * 5. Starts the foreground interval if `foregroundIntervalMs` is set.\n *\n * OS-level scheduling lives in\n * `@arkade-os/sdk/wallet/expo/background` and is invoked separately\n * by the consumer.\n */\n static async setup(config: ExpoWalletConfig): Promise<ExpoWallet> {\n warnOnRemovedBackgroundFields(config.background);\n\n const wallet = await Wallet.create(config);\n\n const processors = config.background.processors ?? [contractPollProcessor];\n\n const deps: TaskDependencies = {\n walletRepository: wallet.walletRepository,\n contractRepository: wallet.contractRepository,\n indexerProvider: wallet.indexerProvider,\n arkProvider: wallet.arkProvider,\n extendVtxo: (vtxo, contract) => extendVirtualCoinForContract(vtxo, contract),\n };\n\n const { taskQueue } = config.background;\n\n // Persist wallet params so the background handler can rehydrate\n // without a network call. Only works with AsyncStorageTaskQueue.\n if (\"persistConfig\" in taskQueue) {\n const arkServerUrl =\n config.arkServerUrl ||\n (wallet.arkProvider instanceof RestArkProvider\n ? wallet.arkProvider.serverUrl\n : undefined);\n\n if (arkServerUrl) {\n const timelock =\n wallet.offchainTapscript.options.csvTimelock ??\n DefaultVtxo.Script.DEFAULT_TIMELOCK;\n\n const bgConfig: PersistedBackgroundConfig = {\n arkServerUrl,\n pubkeyHex: hex.encode(wallet.offchainTapscript.options.pubKey),\n serverPubKeyHex: hex.encode(wallet.offchainTapscript.options.serverPubKey),\n exitTimelockValue: timelock.value.toString(),\n exitTimelockType: timelock.type,\n };\n\n await (taskQueue as AsyncStorageTaskQueue).persistConfig(bgConfig);\n }\n }\n\n const expoWallet = new ExpoWallet(\n wallet,\n taskQueue,\n processors,\n deps,\n config.background.foregroundIntervalMs,\n );\n\n // Seed the queue so the first tick (or background wake) has work to do\n await expoWallet.seedContractPollTask();\n\n return expoWallet;\n }\n\n // ── Foreground polling ───────────────────────────────────────────\n\n private startForegroundPolling(intervalMs: number): void {\n this.foregroundIntervalId = setInterval(() => {\n this.runForegroundPoll().catch(console.error);\n }, intervalMs);\n }\n\n private async runForegroundPoll(): Promise<void> {\n await runTasks(this.taskQueue, this.processors, this.deps);\n\n // Consume results immediately (no background handoff needed)\n const results = await this.taskQueue.getResults();\n if (results.length > 0) {\n await this.taskQueue.acknowledgeResults(results.map((r) => r.id));\n }\n\n // Re-seed for the next tick\n await this.seedContractPollTask();\n }\n\n private async seedContractPollTask(): Promise<void> {\n const existing = await this.taskQueue.getTasks(CONTRACT_POLL_TASK_TYPE);\n if (existing.length > 0) return;\n\n const task: TaskItem = {\n id: getRandomId(),\n type: CONTRACT_POLL_TASK_TYPE,\n data: {},\n createdAt: Date.now(),\n };\n await this.taskQueue.addTask(task);\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────\n\n /**\n * Stop foreground polling and dispose the inner wallet.\n *\n * Does **not** unregister the OS background task — call\n * `unregisterExpoBackgroundTask` from\n * `@arkade-os/sdk/wallet/expo/background` yourself, matching the\n * explicit `register` step.\n */\n async dispose(): Promise<void> {\n if (this.foregroundIntervalId) {\n clearInterval(this.foregroundIntervalId);\n this.foregroundIntervalId = undefined;\n }\n\n await this.wallet.dispose();\n }\n\n // ── IWallet delegation ───────────────────────────────────────────\n\n getAddress(): Promise<string> {\n return this.wallet.getAddress();\n }\n\n getBoardingAddress(): Promise<string> {\n return this.wallet.getBoardingAddress();\n }\n\n getBalance(): Promise<WalletBalance> {\n return this.wallet.getBalance();\n }\n\n getVtxos(filter?: GetVtxosFilter): Promise<ExtendedVirtualCoin[]> {\n return this.wallet.getVtxos(filter);\n }\n\n getBoardingUtxos(): Promise<ExtendedCoin[]> {\n return this.wallet.getBoardingUtxos();\n }\n\n getTransactionHistory(): Promise<ArkTransaction[]> {\n return this.wallet.getTransactionHistory();\n }\n\n getContractManager(): Promise<IContractManager> {\n return this.wallet.getContractManager();\n }\n\n getDelegateManager(): Promise<IDelegateManager | undefined> {\n return this.wallet.getDelegateManager();\n }\n\n /** @deprecated alias for @see ExpoWallet.getDelegateManager */\n getDelegatorManager(): Promise<IDelegateManager | undefined> {\n return this.wallet.getDelegateManager();\n }\n\n sendBitcoin(params: SendBitcoinParams): Promise<string> {\n return this.wallet.sendBitcoin(params);\n }\n\n settle(\n params?: SettleParams,\n eventCallback?: (event: SettlementEvent) => void,\n ): Promise<string> {\n return this.wallet.settle(params, eventCallback);\n }\n\n send(...recipients: [Recipient, ...Recipient[]]): Promise<string> {\n return this.wallet.send(...recipients);\n }\n\n get assetManager(): IAssetManager {\n return this.wallet.assetManager;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/wallet/expo/wallet.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { hex } from \"@scure/base\";\nimport { Wallet } from \"../wallet\";\nimport { RestArkProvider } from \"../../providers/ark\";\nimport type {\n IWallet,\n IAssetManager,\n WalletBalance,\n WalletConfig,\n SendBitcoinParams,\n SettleParams,\n GetVtxosFilter,\n ArkTransaction,\n ExtendedCoin,\n ExtendedVirtualCoin,\n Recipient,\n} from \"..\";\nimport type { SettlementEvent } from \"../../providers/ark\";\nimport type { Identity } from \"../../identity\";\nimport type { IContractManager } from \"../../contracts/contractManager\";\nimport type { IDelegateManager } from \"../delegate\";\nimport type { TaskQueue, TaskItem } from \"../../worker/expo/taskQueue\";\nimport type { TaskProcessor, TaskDependencies } from \"../../worker/expo/taskRunner\";\nimport { runTasks } from \"../../worker/expo/taskRunner\";\nimport { contractPollProcessor, CONTRACT_POLL_TASK_TYPE } from \"../../worker/expo/processors\";\nimport { extendVirtualCoinForContract, getRandomId } from \"../utils\";\nimport type { PersistedBackgroundConfig } from \"./background\";\nimport type { AsyncStorageTaskQueue } from \"../../worker/expo/asyncStorageTaskQueue\";\n\n/**\n * Background processing configuration for @see ExpoWallet.\n *\n * OS-level task registration is **not** part of this config — call\n * `registerExpoBackgroundTask` from `@arkade-os/sdk/wallet/expo/background`\n * explicitly. Splitting that step out keeps `/wallet/expo` free of the\n * `expo-task-manager` / `expo-background-task` dependencies, so\n * react-native-web and Node consumers can use `ExpoWallet` without\n * those native packages. See\n * https://github.com/arkade-os/ts-sdk/issues/486 for details.\n */\nexport interface ExpoBackgroundConfig {\n /** Persistence layer for foreground ↔ background handoff. */\n taskQueue: TaskQueue;\n /** Processors to run on each tick. Defaults to `[contractPollProcessor]`. */\n processors?: TaskProcessor[];\n /** If set, automatically polls at this interval (ms) while the app is in the foreground. */\n foregroundIntervalMs?: number;\n}\n\n/**\n * Configuration for @see ExpoWallet.setup.\n */\nexport interface ExpoWalletConfig extends WalletConfig {\n background: ExpoBackgroundConfig;\n}\n\n/**\n * Catches JS callers still passing the pre-fix-#486 fields: TypeScript\n * blocks these at compile time, but compiled JS silently dropped them\n * and consumers would never realize the OS task wasn't scheduled.\n *\n * @internal Exported for tests; not part of the public API surface.\n */\nexport function warnOnRemovedBackgroundFields(bg: unknown): void {\n if (!bg || typeof bg !== \"object\") return;\n const removed: string[] = [];\n if (\"taskName\" in bg) removed.push(\"taskName\");\n if (\"minimumBackgroundInterval\" in bg) {\n removed.push(\"minimumBackgroundInterval\");\n }\n if (removed.length === 0) return;\n console.warn(\n `[ark-sdk] ExpoWallet.setup: ignoring removed background field(s): ${removed.join(\", \")}. ` +\n 'OS-task registration moved to \"@arkade-os/sdk/wallet/expo/background\". ' +\n \"See https://github.com/arkade-os/ts-sdk/issues/486\",\n );\n}\n\n/**\n * Expo/React Native wallet with built-in background task processing.\n *\n * Wraps a standard @see Wallet and adds a lightweight task queue\n * for keeping contract/VTXO state fresh while the app is active and\n * across Expo BackgroundTask wakes.\n *\n * OS-level task registration is the consumer's responsibility — call\n * `registerExpoBackgroundTask` from\n * `@arkade-os/sdk/wallet/expo/background` after `setup()`. Keeping\n * registration out of `setup()` lets this entrypoint avoid pulling\n * `expo-task-manager` / `expo-background-task` into the `/wallet/expo`\n * bundle.\n *\n * @example\n * ```ts\n * import { ExpoWallet } from \"@arkade-os/sdk/wallet/expo\";\n * import { registerExpoBackgroundTask } from \"@arkade-os/sdk/wallet/expo/background\";\n * import { AsyncStorageTaskQueue } from \"@arkade-os/sdk/worker/expo\";\n *\n * const wallet = await ExpoWallet.setup({\n * identity: MnemonicIdentity.fromMnemonic('abandon abandon...'),\n * arkProvider: new RestArkProvider(),\n * onchainProvider: new EsploraProvider(),\n * storage: { ... },\n * background: {\n * taskQueue: new AsyncStorageTaskQueue(AsyncStorage),\n * foregroundIntervalMs: 20_000,\n * },\n * });\n *\n * // Activate the OS scheduler (Expo Android/iOS only)\n * await registerExpoBackgroundTask(\"ark-background-poll\", { minimumInterval: 15 });\n *\n * const balance = await wallet.getBalance();\n * ```\n */\nexport class ExpoWallet implements IWallet {\n readonly identity: Identity;\n readonly arkProvider: Wallet[\"arkProvider\"];\n readonly indexerProvider: Wallet[\"indexerProvider\"];\n\n private foregroundIntervalId?: ReturnType<typeof setInterval>;\n\n private constructor(\n private readonly wallet: Wallet,\n private readonly taskQueue: TaskQueue,\n private readonly processors: TaskProcessor[],\n private readonly deps: TaskDependencies,\n foregroundIntervalMs?: number,\n ) {\n this.identity = wallet.identity;\n this.arkProvider = wallet.arkProvider;\n this.indexerProvider = wallet.indexerProvider;\n\n if (foregroundIntervalMs && foregroundIntervalMs > 0) {\n this.startForegroundPolling(foregroundIntervalMs);\n }\n }\n\n /**\n * Create an ExpoWallet with foreground/background queue handoff.\n *\n * 1. Creates the inner @see Wallet via `Wallet.create()`.\n * 2. Wires up processors (defaults to @see contractPollProcessor).\n * 3. Persists background config for the background handler (if the queue supports it).\n * 4. Seeds the task queue with a `contract-poll` task.\n * 5. Starts the foreground interval if `foregroundIntervalMs` is set.\n *\n * OS-level scheduling lives in\n * `@arkade-os/sdk/wallet/expo/background` and is invoked separately\n * by the consumer.\n */\n static async setup(config: ExpoWalletConfig): Promise<ExpoWallet> {\n warnOnRemovedBackgroundFields(config.background);\n\n const wallet = await Wallet.create(config);\n\n const processors = config.background.processors ?? [contractPollProcessor];\n\n const deps: TaskDependencies = {\n walletRepository: wallet.walletRepository,\n contractRepository: wallet.contractRepository,\n indexerProvider: wallet.indexerProvider,\n arkProvider: wallet.arkProvider,\n extendVtxo: (vtxo, contract) => extendVirtualCoinForContract(vtxo, contract),\n };\n\n const { taskQueue } = config.background;\n\n // Persist wallet params so the background handler can rehydrate\n // without a network call. Only works with AsyncStorageTaskQueue.\n if (\"persistConfig\" in taskQueue) {\n const arkServerUrl =\n config.arkServerUrl ||\n (wallet.arkProvider instanceof RestArkProvider\n ? wallet.arkProvider.serverUrl\n : undefined);\n\n if (arkServerUrl) {\n const timelock = wallet.offchainTapscript.options.csvTimelock;\n\n const bgConfig: PersistedBackgroundConfig = {\n arkServerUrl,\n pubkeyHex: hex.encode(wallet.offchainTapscript.options.pubKey),\n serverPubKeyHex: hex.encode(wallet.offchainTapscript.options.serverPubKey),\n exitTimelockValue: timelock.value.toString(),\n exitTimelockType: timelock.type,\n };\n\n await (taskQueue as AsyncStorageTaskQueue).persistConfig(bgConfig);\n }\n }\n\n const expoWallet = new ExpoWallet(\n wallet,\n taskQueue,\n processors,\n deps,\n config.background.foregroundIntervalMs,\n );\n\n // Seed the queue so the first tick (or background wake) has work to do\n await expoWallet.seedContractPollTask();\n\n return expoWallet;\n }\n\n // ── Foreground polling ───────────────────────────────────────────\n\n private startForegroundPolling(intervalMs: number): void {\n this.foregroundIntervalId = setInterval(() => {\n this.runForegroundPoll().catch(console.error);\n }, intervalMs);\n }\n\n private async runForegroundPoll(): Promise<void> {\n await runTasks(this.taskQueue, this.processors, this.deps);\n\n // Consume results immediately (no background handoff needed)\n const results = await this.taskQueue.getResults();\n if (results.length > 0) {\n await this.taskQueue.acknowledgeResults(results.map((r) => r.id));\n }\n\n // Re-seed for the next tick\n await this.seedContractPollTask();\n }\n\n private async seedContractPollTask(): Promise<void> {\n const existing = await this.taskQueue.getTasks(CONTRACT_POLL_TASK_TYPE);\n if (existing.length > 0) return;\n\n const task: TaskItem = {\n id: getRandomId(),\n type: CONTRACT_POLL_TASK_TYPE,\n data: {},\n createdAt: Date.now(),\n };\n await this.taskQueue.addTask(task);\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────\n\n /**\n * Stop foreground polling and dispose the inner wallet.\n *\n * Does **not** unregister the OS background task — call\n * `unregisterExpoBackgroundTask` from\n * `@arkade-os/sdk/wallet/expo/background` yourself, matching the\n * explicit `register` step.\n */\n async dispose(): Promise<void> {\n if (this.foregroundIntervalId) {\n clearInterval(this.foregroundIntervalId);\n this.foregroundIntervalId = undefined;\n }\n\n await this.wallet.dispose();\n }\n\n // ── IWallet delegation ───────────────────────────────────────────\n\n getAddress(): Promise<string> {\n return this.wallet.getAddress();\n }\n\n getBoardingAddress(): Promise<string> {\n return this.wallet.getBoardingAddress();\n }\n\n getBalance(): Promise<WalletBalance> {\n return this.wallet.getBalance();\n }\n\n getVtxos(filter?: GetVtxosFilter): Promise<ExtendedVirtualCoin[]> {\n return this.wallet.getVtxos(filter);\n }\n\n getBoardingUtxos(): Promise<ExtendedCoin[]> {\n return this.wallet.getBoardingUtxos();\n }\n\n getTransactionHistory(): Promise<ArkTransaction[]> {\n return this.wallet.getTransactionHistory();\n }\n\n getContractManager(): Promise<IContractManager> {\n return this.wallet.getContractManager();\n }\n\n getDelegateManager(): Promise<IDelegateManager | undefined> {\n return this.wallet.getDelegateManager();\n }\n\n /** @deprecated alias for @see ExpoWallet.getDelegateManager */\n getDelegatorManager(): Promise<IDelegateManager | undefined> {\n return this.wallet.getDelegateManager();\n }\n\n sendBitcoin(params: SendBitcoinParams): Promise<string> {\n return this.wallet.sendBitcoin(params);\n }\n\n settle(\n params?: SettleParams,\n eventCallback?: (event: SettlementEvent) => void,\n ): Promise<string> {\n return this.wallet.settle(params, eventCallback);\n }\n\n send(...recipients: [Recipient, ...Recipient[]]): Promise<string> {\n return this.wallet.send(...recipients);\n }\n\n get assetManager(): IAssetManager {\n return this.wallet.assetManager;\n }\n}\n"]}