{"version":3,"sources":["../../../src/wallet/expo/wallet.ts"],"names":["Wallet","contractPollProcessor","extendVirtualCoinForContract","extractArkProviderUrl","hex","runTasks","CONTRACT_POLL_TASK_TYPE","getRandomId"],"mappings":"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","file":"index.cjs","sourcesContent":["import { hex } from \"@scure/base\";\nimport { Wallet, extractArkProviderUrl, type ProviderConnectionState } from \"../wallet\";\nimport type { Activity, ActivityRegistry } from \"../activity\";\nimport type {\n    IWallet,\n    IAssetManager,\n    WalletBalance,\n    WalletConfig,\n    SendBitcoinParams,\n    SettleParams,\n    GetVtxosFilter,\n    GetSpendableVtxosFilter,\n    GetNewAddressesOptions,\n    NewAddress,\n    ArkTransaction,\n    ExtendedCoin,\n    Recipient,\n    SendParams,\n} from \"..\";\nimport type { SettlementEvent } from \"../../providers/ark\";\nimport type { Identity } from \"../../identity\";\nimport type {\n    AddressAllocationCapable,\n    HDAllocationCapable,\n    HDWalletCapable,\n} from \"../hdWalletCapable\";\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\";\nimport type { NormalizedExtendedVirtualCoin } from \"../vtxo\";\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\n    implements IWallet, HDWalletCapable, HDAllocationCapable, AddressAllocationCapable\n{\n    readonly identity: Identity;\n    readonly arkProvider: Wallet[\"arkProvider\"];\n    readonly indexerProvider: Wallet[\"indexerProvider\"];\n\n    private foregroundIntervalId?: ReturnType<typeof setInterval>;\n    private foregroundPollChain: Promise<void> = Promise.resolve();\n    private cleared = false;\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 = config.arkServerUrl || extractArkProviderUrl(wallet.arkProvider);\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            // Serialize polls so clear() can await the in-flight one before wiping.\n            this.foregroundPollChain = this.foregroundPollChain\n                .then(() => this.runForegroundPoll())\n                .catch(console.error);\n        }, intervalMs);\n    }\n\n    private async runForegroundPoll(): Promise<void> {\n        if (this.cleared) return;\n\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        if (this.cleared) return;\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    private async removeContractPollTasks(): Promise<void> {\n        const tasks = await this.taskQueue.getTasks(CONTRACT_POLL_TASK_TYPE);\n        for (const task of tasks) {\n            await this.taskQueue.removeTask(task.id);\n        }\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    /**\n     * Stop foreground polling and wipe all locally persisted wallet data.\n     * Does not unregister the OS background task or persisted queue config.\n     */\n    async clear(): Promise<void> {\n        this.cleared = true;\n\n        if (this.foregroundIntervalId) {\n            clearInterval(this.foregroundIntervalId);\n            this.foregroundIntervalId = undefined;\n        }\n\n        await this.foregroundPollChain;\n        await this.wallet.clear();\n        await this.removeContractPollTasks();\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<NormalizedExtendedVirtualCoin[]> {\n        return this.wallet.getVtxos(filter);\n    }\n\n    getSpendableVtxos(filter?: GetSpendableVtxosFilter): Promise<NormalizedExtendedVirtualCoin[]> {\n        return this.wallet.getSpendableVtxos(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    get activity(): ActivityRegistry {\n        return this.wallet.activity;\n    }\n\n    getActivityHistory(): Promise<Activity[]> {\n        return this.wallet.getActivityHistory();\n    }\n\n    getContractManager(): Promise<IContractManager> {\n        return this.wallet.getContractManager();\n    }\n\n    // Descriptor surface, delegated like everything else here. Without these\n    // the structural probes see a wallet with no HD state, so an Expo wallet\n    // running `walletMode: 'hd'` would bind every artifact to its baseline\n    // identity key — reusing one key across swaps while its receive addresses\n    // rotate, and never allocating the indices a restore scan looks for.\n\n    getCurrentSigningDescriptor(): Promise<string | undefined> {\n        return this.wallet.getCurrentSigningDescriptor();\n    }\n\n    getNextSigningDescriptor(): Promise<string | undefined> {\n        return this.wallet.getNextSigningDescriptor();\n    }\n\n    /** @see Wallet.getNewAddresses */\n    getNewAddresses(opts?: GetNewAddressesOptions): Promise<NewAddress[]> {\n        return this.wallet.getNewAddresses(opts);\n    }\n\n    getUsedSigningDescriptors(opts?: { lookAhead?: number }): Promise<string[]> {\n        return this.wallet.getUsedSigningDescriptors(opts);\n    }\n\n    advanceSigningDescriptorWatermark(descriptor: string): Promise<void> {\n        return this.wallet.advanceSigningDescriptorWatermark(descriptor);\n    }\n\n    signerForDescriptor(descriptor: string): Promise<Identity> {\n        return this.wallet.signerForDescriptor(descriptor);\n    }\n\n    /**\n     * Wallet-level provider-connection freshness, delegated to the wrapped\n     * in-process wallet. Synchronous because the Expo foreground wallet is\n     * in-process (no worker boundary). Foreground-only: it does not imply any\n     * background task can read live foreground state.\n     */\n    getProviderConnectionState(): ProviderConnectionState {\n        return this.wallet.getProviderConnectionState();\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(...args: [SendParams] | [Recipient, ...Recipient[]]): Promise<string> {\n        return this.wallet.send(...args);\n    }\n\n    get assetManager(): IAssetManager {\n        return this.wallet.assetManager;\n    }\n}\n"]}