@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.
- package/README.md +2 -0
- package/dist/adapters/expo.cjs +5 -5
- package/dist/adapters/expo.d.cts +2 -2
- package/dist/adapters/expo.d.ts +2 -2
- package/dist/adapters/expo.js +3 -3
- package/dist/{asyncStorageTaskQueue-CFWscYpG.d.cts → asyncStorageTaskQueue-CGZMG8Mc.d.cts} +1 -1
- package/dist/{asyncStorageTaskQueue-DrFapzPg.d.ts → asyncStorageTaskQueue-Ca-mM3NR.d.ts} +1 -1
- package/dist/{chunk-HPUKFTZV.js → chunk-BULTXVEN.js} +4 -4
- package/dist/{chunk-HPUKFTZV.js.map → chunk-BULTXVEN.js.map} +1 -1
- package/dist/{chunk-K2YTDYQF.cjs → chunk-DKHBOT5W.cjs} +16 -16
- package/dist/{chunk-K2YTDYQF.cjs.map → chunk-DKHBOT5W.cjs.map} +1 -1
- package/dist/{chunk-CFOIHLON.cjs → chunk-EP6XF7JX.cjs} +48 -48
- package/dist/{chunk-CFOIHLON.cjs.map → chunk-EP6XF7JX.cjs.map} +1 -1
- package/dist/{chunk-5JQ5EOYE.js → chunk-FTJ2YWJJ.js} +3 -3
- package/dist/{chunk-5JQ5EOYE.js.map → chunk-FTJ2YWJJ.js.map} +1 -1
- package/dist/{chunk-U5ZRDVVB.js → chunk-I4ZWKG7B.js} +11 -6
- package/dist/chunk-I4ZWKG7B.js.map +1 -0
- package/dist/{chunk-B2YMUJD5.cjs → chunk-PM6KYV7S.cjs} +495 -490
- package/dist/chunk-PM6KYV7S.cjs.map +1 -0
- package/dist/{chunk-N2VM6V6K.js → chunk-PO6AJUWK.js} +3 -3
- package/dist/{chunk-N2VM6V6K.js.map → chunk-PO6AJUWK.js.map} +1 -1
- package/dist/{chunk-QCD3SJOL.cjs → chunk-QXZS4J3V.cjs} +10 -10
- package/dist/{chunk-QCD3SJOL.cjs.map → chunk-QXZS4J3V.cjs.map} +1 -1
- package/dist/{chunk-HTCIPDVW.js → chunk-RUWTAAJK.js} +3 -3
- package/dist/{chunk-HTCIPDVW.js.map → chunk-RUWTAAJK.js.map} +1 -1
- package/dist/{chunk-FEBAG2K2.cjs → chunk-URILS6HH.cjs} +18 -18
- package/dist/{chunk-FEBAG2K2.cjs.map → chunk-URILS6HH.cjs.map} +1 -1
- package/dist/{chunk-Y5VSJURH.js → chunk-X42Z36L5.js} +4 -4
- package/dist/{chunk-Y5VSJURH.js.map → chunk-X42Z36L5.js.map} +1 -1
- package/dist/{chunk-VVFCCNU2.cjs → chunk-ZN7BX5XT.cjs} +3 -3
- package/dist/{chunk-VVFCCNU2.cjs.map → chunk-ZN7BX5XT.cjs.map} +1 -1
- package/dist/contracts/handlers/index.cjs +9 -9
- package/dist/contracts/handlers/index.d.cts +3 -3
- package/dist/contracts/handlers/index.d.ts +3 -3
- package/dist/contracts/handlers/index.js +2 -2
- package/dist/{delegate-Cz8FnLqi.d.ts → delegate-CG3EwryS.d.ts} +1 -1
- package/dist/{delegate-r3jh7UcH.d.cts → delegate-CH-QUGok.d.cts} +1 -1
- package/dist/{index-DOION7Ta.d.cts → index-BPS3Ki3l.d.cts} +2 -2
- package/dist/{index-BfvbSL0W.d.cts → index-BpiwCcFb.d.cts} +2 -2
- package/dist/{index-BfvbSL0W.d.ts → index-BpiwCcFb.d.ts} +2 -2
- package/dist/{index-Chgwl4dO.d.ts → index-DLn2XUIl.d.ts} +2 -2
- package/dist/index.cjs +316 -316
- package/dist/index.d.cts +14 -9
- package/dist/index.d.ts +14 -9
- package/dist/index.js +4 -4
- package/dist/repositories/realm/index.cjs +35 -35
- package/dist/repositories/realm/index.d.cts +2 -2
- package/dist/repositories/realm/index.d.ts +2 -2
- package/dist/repositories/realm/index.js +5 -5
- package/dist/repositories/sqlite/index.cjs +33 -33
- package/dist/repositories/sqlite/index.d.cts +2 -2
- package/dist/repositories/sqlite/index.d.ts +2 -2
- package/dist/repositories/sqlite/index.js +5 -5
- package/dist/{taskRunner-CXAcjtdU.d.ts → taskRunner-Dbdr9WMQ.d.ts} +1 -1
- package/dist/{taskRunner-BO8a-SQh.d.cts → taskRunner-DtphXKXv.d.cts} +1 -1
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +6 -6
- package/dist/wallet/expo/index.cjs +15 -15
- package/dist/wallet/expo/index.d.cts +4 -4
- package/dist/wallet/expo/index.d.ts +4 -4
- package/dist/wallet/expo/index.js +5 -5
- package/dist/{wallet-s90p-vIk.d.cts → wallet-CTrmow5R.d.cts} +2 -2
- package/dist/{wallet-CFIfUlQP.d.ts → wallet-QvS_5Jjd.d.ts} +2 -2
- package/dist/worker/expo/index.cjs +9 -9
- package/dist/worker/expo/index.d.cts +4 -4
- package/dist/worker/expo/index.d.ts +4 -4
- package/dist/worker/expo/index.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-B2YMUJD5.cjs.map +0 -1
- 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.
|
package/dist/adapters/expo.cjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
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
|
|
11
|
+
get: function () { return chunkDKHBOT5W_cjs.ExpoArkProvider; }
|
|
12
12
|
});
|
|
13
13
|
Object.defineProperty(exports, "ExpoIndexerProvider", {
|
|
14
14
|
enumerable: true,
|
|
15
|
-
get: function () { return
|
|
15
|
+
get: function () { return chunkDKHBOT5W_cjs.ExpoIndexerProvider; }
|
|
16
16
|
});
|
|
17
17
|
//# sourceMappingURL=expo.cjs.map
|
|
18
18
|
//# sourceMappingURL=expo.cjs.map
|
package/dist/adapters/expo.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as RestArkProvider, o as SettlementEvent, T as TxNotificationEvent, s as RestIndexerProvider, t as SubscriptionResponse } from '../index-
|
|
2
|
-
export { u as ArkProvider, v as IndexerProvider } from '../index-
|
|
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';
|
package/dist/adapters/expo.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as RestArkProvider, o as SettlementEvent, T as TxNotificationEvent, s as RestIndexerProvider, t as SubscriptionResponse } from '../index-
|
|
2
|
-
export { u as ArkProvider, v as IndexerProvider } from '../index-
|
|
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';
|
package/dist/adapters/expo.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { ExpoArkProvider, ExpoIndexerProvider } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
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,5 +1,5 @@
|
|
|
1
|
-
import { getRandomId, extendVirtualCoinForContract, collectContracts, warnAndFilterVtxosForScript, saveVtxosForContract } from './chunk-
|
|
2
|
-
import { getNormalizedVtxos } from './chunk-
|
|
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-
|
|
98
|
-
//# sourceMappingURL=chunk-
|
|
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
|
|
4
|
-
var
|
|
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
|
|
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
|
|
84
|
-
constructor(serverUrl =
|
|
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
|
-
|
|
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 (
|
|
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,
|
|
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 (
|
|
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
|
|
144
|
-
constructor(serverUrl =
|
|
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
|
|
169
|
+
return chunkURILS6HH_cjs.toSubscriptionResponse(data.event);
|
|
170
170
|
}
|
|
171
|
-
if (data.code !== void 0) throw
|
|
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 (
|
|
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-
|
|
193
|
-
//# sourceMappingURL=chunk-
|
|
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
|
|
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
|
|
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 =
|
|
74
|
+
const forfeitScript = chunkZN7BX5XT_cjs.MultisigTapscript.encode({
|
|
75
75
|
pubkeys: [pubKey, serverPubKey]
|
|
76
76
|
}).script;
|
|
77
|
-
const exitScript =
|
|
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 !== "" ?
|
|
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 =
|
|
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 +=
|
|
499
|
-
const scripts = unique.slice(offset, offset +
|
|
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
|
|
504
|
+
const { vtxos, page } = await chunkZN7BX5XT_cjs.getNormalizedVtxos(indexerProvider, {
|
|
505
505
|
scripts,
|
|
506
506
|
pageIndex,
|
|
507
|
-
pageSize:
|
|
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 ===
|
|
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:
|
|
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
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
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
|
|
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 =
|
|
1074
|
+
const claimScript = chunkZN7BX5XT_cjs.ConditionMultisigTapscript.encode({
|
|
1075
1075
|
conditionScript,
|
|
1076
1076
|
pubkeys: [receiver, server]
|
|
1077
1077
|
}).script;
|
|
1078
|
-
const refundScript =
|
|
1078
|
+
const refundScript = chunkZN7BX5XT_cjs.MultisigTapscript.encode({
|
|
1079
1079
|
pubkeys: [sender, receiver, server]
|
|
1080
1080
|
}).script;
|
|
1081
|
-
const refundWithoutReceiverScript =
|
|
1081
|
+
const refundWithoutReceiverScript = chunkZN7BX5XT_cjs.CLTVMultisigTapscript.encode({
|
|
1082
1082
|
absoluteTimelock: refundLocktime,
|
|
1083
1083
|
pubkeys: [sender, server]
|
|
1084
1084
|
}).script;
|
|
1085
|
-
const unilateralClaimScript =
|
|
1085
|
+
const unilateralClaimScript = chunkZN7BX5XT_cjs.ConditionCSVMultisigTapscript.encode({
|
|
1086
1086
|
conditionScript,
|
|
1087
1087
|
timelock: unilateralClaimDelay,
|
|
1088
1088
|
pubkeys: [receiver]
|
|
1089
1089
|
}).script;
|
|
1090
|
-
const unilateralRefundScript =
|
|
1090
|
+
const unilateralRefundScript = chunkZN7BX5XT_cjs.CSVMultisigTapscript.encode({
|
|
1091
1091
|
timelock: unilateralRefundDelay,
|
|
1092
1092
|
pubkeys: [sender, receiver]
|
|
1093
1093
|
}).script;
|
|
1094
|
-
const unilateralRefundWithoutReceiverScript =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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:
|
|
1409
|
-
refundDelay:
|
|
1410
|
-
refundNoReceiverDelay:
|
|
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:
|
|
1423
|
-
unilateralRefundDelay:
|
|
1424
|
-
unilateralRefundWithoutReceiverDelay:
|
|
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:
|
|
1518
|
-
refundDelay:
|
|
1519
|
-
refundNoReceiverDelay:
|
|
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:
|
|
1598
|
-
unilateralRefundDelay:
|
|
1599
|
-
unilateralRefundWithoutReceiverDelay:
|
|
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 =
|
|
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
|
|
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
|
|
1877
|
+
return chunkZN7BX5XT_cjs.CSVMultisigTapscript.encode({ timelock, pubkeys });
|
|
1878
1878
|
}
|
|
1879
1879
|
if (seg.cltv !== void 0) {
|
|
1880
|
-
return
|
|
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
|
|
1886
|
+
return chunkZN7BX5XT_cjs.ConditionMultisigTapscript.encode({
|
|
1887
1887
|
conditionScript: resolveAsm(seg.asm, args),
|
|
1888
1888
|
pubkeys
|
|
1889
1889
|
});
|
|
1890
1890
|
}
|
|
1891
|
-
return
|
|
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
|
|
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(
|
|
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-
|
|
2282
|
-
//# sourceMappingURL=chunk-
|
|
2281
|
+
//# sourceMappingURL=chunk-EP6XF7JX.cjs.map
|
|
2282
|
+
//# sourceMappingURL=chunk-EP6XF7JX.cjs.map
|