@arkade-os/sdk 0.5.3 → 0.5.4
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 +36 -34
- package/dist/adapters/expo.cjs +9 -5
- package/dist/adapters/expo.d.cts +11 -7
- package/dist/adapters/expo.d.ts +11 -7
- package/dist/adapters/expo.js +3 -3
- package/dist/{asyncStorageTaskQueue-B3U5gQ-i.d.ts → asyncStorageTaskQueue-DHMIxY04.d.ts} +2 -2
- package/dist/{asyncStorageTaskQueue-C9PkPcW_.d.cts → asyncStorageTaskQueue-DTBa8EH7.d.cts} +2 -2
- package/dist/{chunk-P7B4LQ3H.js → chunk-6CUP6ZIF.js} +4 -4
- package/dist/{chunk-P7B4LQ3H.js.map → chunk-6CUP6ZIF.js.map} +1 -1
- package/dist/{chunk-OPX2HRWM.js → chunk-AG4TFD6F.js} +137 -59
- package/dist/chunk-AG4TFD6F.js.map +1 -0
- package/dist/{chunk-5WRA66RV.cjs → chunk-B6VNKGIH.cjs} +10 -10
- package/dist/chunk-B6VNKGIH.cjs.map +1 -0
- package/dist/{chunk-6FL4N4S2.js → chunk-BTRCN4JJ.js} +22 -19
- package/dist/chunk-BTRCN4JJ.js.map +1 -0
- package/dist/{chunk-ZPF4I3K2.cjs → chunk-DNITZVNG.cjs} +28 -47
- package/dist/chunk-DNITZVNG.cjs.map +1 -0
- package/dist/{chunk-BYPBVHVA.cjs → chunk-E6OOJEHL.cjs} +49 -49
- package/dist/{chunk-BYPBVHVA.cjs.map → chunk-E6OOJEHL.cjs.map} +1 -1
- package/dist/{chunk-OUTWUYJ4.cjs → chunk-F3FAE7VJ.cjs} +769 -619
- package/dist/chunk-F3FAE7VJ.cjs.map +1 -0
- package/dist/{chunk-KW7ZEWYS.cjs → chunk-GHUUT54D.cjs} +140 -58
- package/dist/chunk-GHUUT54D.cjs.map +1 -0
- package/dist/{chunk-Y4BL3YYX.js → chunk-MWVAWFX6.js} +4 -4
- package/dist/chunk-MWVAWFX6.js.map +1 -0
- package/dist/{chunk-T7C3E2HL.js → chunk-TUOLZBNC.js} +19 -39
- package/dist/chunk-TUOLZBNC.js.map +1 -0
- package/dist/{chunk-ZMSM3NOH.cjs → chunk-WXNSISXK.cjs} +37 -34
- package/dist/chunk-WXNSISXK.cjs.map +1 -0
- package/dist/{chunk-HAQAWBYG.js → chunk-ZJHLLDBP.js} +283 -136
- package/dist/chunk-ZJHLLDBP.js.map +1 -0
- 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-ByfKszb6.d.cts → delegate-f4_t864Z.d.cts} +1 -1
- package/dist/{delegate-Cd28gxpM.d.ts → delegate-xrSBNybC.d.ts} +1 -1
- package/dist/{index-DgH_0j14.d.cts → index-BJDz15ms.d.ts} +5 -5
- package/dist/{index-B6X2E7W_.d.ts → index-BjiVGtp8.d.cts} +5 -5
- package/dist/{index-BURzbRup.d.ts → index-DRwe0UDN.d.cts} +182 -114
- package/dist/{index-BURzbRup.d.cts → index-DRwe0UDN.d.ts} +182 -114
- package/dist/index.cjs +333 -313
- package/dist/index.d.cts +66 -44
- package/dist/index.d.ts +66 -44
- package/dist/index.js +4 -4
- package/dist/repositories/realm/index.cjs +65 -36
- package/dist/repositories/realm/index.cjs.map +1 -1
- package/dist/repositories/realm/index.d.cts +7 -3
- package/dist/repositories/realm/index.d.ts +7 -3
- package/dist/repositories/realm/index.js +35 -6
- package/dist/repositories/realm/index.js.map +1 -1
- package/dist/repositories/sqlite/index.cjs +176 -110
- package/dist/repositories/sqlite/index.cjs.map +1 -1
- package/dist/repositories/sqlite/index.d.cts +23 -13
- package/dist/repositories/sqlite/index.d.ts +23 -13
- package/dist/repositories/sqlite/index.js +148 -83
- package/dist/repositories/sqlite/index.js.map +1 -1
- package/dist/{taskRunner-i56-drQV.d.cts → taskRunner-BPPU-YHG.d.cts} +4 -4
- package/dist/{taskRunner-BaNCSxqK.d.ts → taskRunner-CDlNeth0.d.ts} +4 -4
- package/dist/wallet/expo/background.cjs +14 -14
- package/dist/wallet/expo/background.cjs.map +1 -1
- package/dist/wallet/expo/background.d.cts +3 -3
- package/dist/wallet/expo/background.d.ts +3 -3
- package/dist/wallet/expo/background.js +7 -7
- package/dist/wallet/expo/background.js.map +1 -1
- package/dist/wallet/expo/index.cjs +15 -15
- package/dist/wallet/expo/index.cjs.map +1 -1
- package/dist/wallet/expo/index.d.cts +6 -6
- package/dist/wallet/expo/index.d.ts +6 -6
- package/dist/wallet/expo/index.js +6 -6
- package/dist/wallet/expo/index.js.map +1 -1
- package/dist/{wallet-BjQugVUt.d.cts → wallet-Oc3Wd5gv.d.ts} +22 -18
- package/dist/{wallet-BnmhohgZ.d.ts → wallet-jVBDQl6R.d.cts} +22 -18
- 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-5WRA66RV.cjs.map +0 -1
- package/dist/chunk-6FL4N4S2.js.map +0 -1
- package/dist/chunk-HAQAWBYG.js.map +0 -1
- package/dist/chunk-KW7ZEWYS.cjs.map +0 -1
- package/dist/chunk-OPX2HRWM.js.map +0 -1
- package/dist/chunk-OUTWUYJ4.cjs.map +0 -1
- package/dist/chunk-T7C3E2HL.js.map +0 -1
- package/dist/chunk-Y4BL3YYX.js.map +0 -1
- package/dist/chunk-ZMSM3NOH.cjs.map +0 -1
- package/dist/chunk-ZPF4I3K2.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/repositories/sqlite/transaction.ts","../../../src/repositories/sqlite/prefix.ts","../../../src/repositories/sqlite/walletRepository.ts","../../../src/repositories/sqlite/contractRepository.ts","../../../src/repositories/sqlite/intentRepository.ts","../../../src/repositories/sqlite/virtualTxRepository.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { SQLExecutor } from \"./types\";\n\n// One write chain per connection. SQLite (a single connection) cannot nest\n// BEGIN IMMEDIATE, so every transaction on a given executor must run one at a\n// time — across ALL repositories that share it, not just one instance. Keyed\n// by the executor object so callers keep passing a raw SQLExecutor with no\n// wiring change; separate executors (separate connections) get separate chains.\nconst writeChains = new WeakMap<SQLExecutor, Promise<void>>();\n\n/**\n * Run `fn` inside a serialized `BEGIN IMMEDIATE` / `COMMIT` on `db`.\n *\n * `fn` must issue only raw `db.run`/`db.all` calls: calling `runInTransaction`\n * again on the same `db` from within `fn` would wait on the chain it is part of\n * and deadlock.\n */\nexport function runInTransaction(db: SQLExecutor, fn: () => Promise<void>): Promise<void> {\n // Chain onto the previous transaction; no await between get and set, so the\n // enqueue is atomic.\n const prev = writeChains.get(db) ?? Promise.resolve();\n const run = prev.then(async () => {\n await db.run(\"BEGIN IMMEDIATE\");\n try {\n await fn();\n await db.run(\"COMMIT\");\n } catch (e) {\n try {\n await db.run(\"ROLLBACK\");\n } catch {\n /* already rolled back */\n }\n throw e;\n }\n });\n // Keep the chain alive regardless of this run's outcome so a failed\n // transaction doesn't wedge every subsequent writer.\n writeChains.set(\n db,\n run.catch(() => {}),\n );\n return run;\n}\n","// A table name cannot be a bound parameter, so every prefixed repository\n// interpolates it into SQL. This is the check that keeps that safe.\nconst SAFE_PREFIX = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n/**\n * Validate a SQLite table prefix and return it unchanged.\n *\n * Rejects a leading digit as well as punctuation: `1_vtxos` is not a valid SQL\n * identifier either.\n */\nexport function sanitizeTablePrefix(p: string): string {\n if (!SAFE_PREFIX.test(p)) throw new Error(`Invalid table prefix \"${p}\"`);\n return p;\n}\n","import { ArkTransaction, ExtendedCoin, ExtendedVirtualCoin } from \"../../wallet\";\nimport type { Outpoint } from \"../../wallet\";\nimport {\n WalletRepository,\n WalletState,\n VtxoRepositoryKey,\n assertHistoryPageFilter,\n type TransactionHistoryPageFilter,\n type TransactionHistoryPageCursor,\n type ScriptVtxoCursor,\n type StoredVtxo,\n type ScriptVtxoPageOptions,\n utxoEntries,\n} from \"../walletRepository\";\nimport { assertPageRequest, pageResult, type PageRequest, type PageResult } from \"../page\";\nimport {\n serializeVtxo,\n serializeUtxo,\n deserializeVtxo,\n deserializeUtxo,\n serializeAssets,\n deserializeAssets,\n SerializedTapLeaf,\n createdAtToIso,\n} from \"../serialization\";\nimport { scriptFromArkAddress } from \"../scriptFromAddress\";\nimport { legacyVtxoFacts } from \"../legacyVtxoFacts\";\nimport { SQLExecutor } from \"./types\";\nimport { runInTransaction } from \"./transaction\";\nimport { sanitizeTablePrefix } from \"./prefix\";\nimport { checkSaveVtxosForScript } from \"../../contracts/vtxoOwnership\";\nimport { isVtxoSpent } from \"../../wallet/vtxo\";\n\ninterface SQLiteWalletRepositoryOptions {\n /** Table name prefix (default: \"ark_\") */\n prefix?: string;\n}\n\n/**\n * Bound parameters per statement: 999 was SQLite's limit before 3.32, and the\n * executor is the consumer's, so its SQLite build may be that old.\n */\nconst MAX_BOUND_PARAMETERS = 999;\n\n/**\n * SQLite-based implementation of WalletRepository.\n *\n * Uses the SQLExecutor interface so consumers can plug in any SQLite driver\n * (expo-sqlite, better-sqlite3, etc.).\n *\n * Tables are created lazily on first operation via `ensureInit()`.\n * The consumer owns the SQLExecutor lifecycle — `[Symbol.asyncDispose]` is a no-op.\n */\nexport class SQLiteWalletRepository implements WalletRepository {\n readonly version = 2 as const;\n private initPromise: Promise<void> | null = null;\n private readonly prefix: string;\n private readonly tables: {\n vtxos: string;\n utxos: string;\n transactions: string;\n walletState: string;\n };\n\n constructor(\n private readonly db: SQLExecutor,\n options?: SQLiteWalletRepositoryOptions,\n ) {\n this.prefix = sanitizeTablePrefix(options?.prefix ?? \"ark_\");\n this.tables = {\n vtxos: `${this.prefix}vtxos`,\n utxos: `${this.prefix}utxos`,\n transactions: `${this.prefix}transactions`,\n walletState: `${this.prefix}wallet_state`,\n };\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n private ensureInit(): Promise<void> {\n if (!this.initPromise) {\n this.initPromise = this.init();\n }\n return this.initPromise;\n }\n\n private async init(): Promise<void> {\n await this.migrateVtxosTable();\n\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS ${this.tables.utxos} (\n txid TEXT NOT NULL,\n vout INTEGER NOT NULL,\n value INTEGER NOT NULL,\n address TEXT NOT NULL,\n tap_tree TEXT NOT NULL,\n forfeit_cb TEXT NOT NULL,\n forfeit_s TEXT NOT NULL,\n intent_cb TEXT NOT NULL,\n intent_s TEXT NOT NULL,\n status_json TEXT NOT NULL,\n extra_witness_json TEXT,\n PRIMARY KEY (txid, vout)\n )\n `);\n\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS ${this.tables.transactions} (\n address TEXT NOT NULL,\n boarding_txid TEXT NOT NULL,\n commitment_txid TEXT NOT NULL,\n ark_txid TEXT NOT NULL,\n type TEXT NOT NULL,\n amount INTEGER NOT NULL,\n settled INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n assets_json TEXT,\n PRIMARY KEY (address, boarding_txid, commitment_txid, ark_txid)\n )\n `);\n\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS ${this.tables.walletState} (\n key TEXT PRIMARY KEY,\n settings_json TEXT,\n last_sync_time INTEGER\n )\n `);\n\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_address ON ${this.tables.vtxos} (address)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_script ON ${this.tables.vtxos} (script)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_script_page ON ${this.tables.vtxos} (script, address, txid, vout)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_address_page ON ${this.tables.vtxos} (address, txid, vout)`,\n );\n // Replaced by the paged partial index below, which serves the same reads in page order.\n await this.db.run(`DROP INDEX IF EXISTS idx_${this.prefix}vtxos_live_script`);\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_live_script_page ON ${this.tables.vtxos} (script, address, txid, vout)\n WHERE ${UNSPENT_VTXO_PREDICATE}`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}utxos_address ON ${this.tables.utxos} (address)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}utxos_address_page ON ${this.tables.utxos} (address, txid, vout)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}transactions_address ON ${this.tables.transactions} (address)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}transactions_history ON ${this.tables.transactions} (address, created_at, boarding_txid, commitment_txid, ark_txid)`,\n );\n }\n\n /**\n * Bring the `vtxos` table to the current schema (v1 = `script` NOT NULL).\n *\n * Four cases:\n * - Fresh install: create the v1 schema directly.\n * - Legacy install without a `script` column: add it, backfill from\n * `address`, then rebuild the table with NOT NULL (SQLite cannot add\n * the NOT NULL constraint in place).\n * - Legacy install with a nullable `script` column: backfill the NULLs\n * and rebuild.\n * - 0.4.x install: `script` is already NOT NULL but `virtual_status_json\n * NOT NULL` is still there, and `saveVtxos` no longer writes it.\n *\n * The backfill derives `script` from the Ark address, matching what the\n * indexer would have returned — new rows from the indexer always carry a\n * populated `script`, so the migration is idempotent.\n *\n * The whole check-and-migrate runs inside one transaction, not just the\n * rebuild: the schema inspection is the decision point, so a second\n * concurrent init on the same connection must not read a pre-migration\n * schema and then re-run `ADD COLUMN` (duplicate column) after the first\n * migration already committed. It also guards the crash window between the\n * `DROP TABLE vtxos` and the `RENAME tmp → vtxos`, which would otherwise\n * leave the next startup seeing no `vtxos` table.\n */\n private async migrateVtxosTable(): Promise<void> {\n await runInTransaction(this.db, async () => {\n const tableExists = await this.db.get<{ name: string }>(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`,\n [this.tables.vtxos],\n );\n if (!tableExists) {\n await this.db.run(this.vtxosCreateSql(this.tables.vtxos));\n return;\n }\n\n const cols = await this.db.all<{ name: string; notnull: number }>(\n `PRAGMA table_info(${this.tables.vtxos})`,\n );\n const scriptCol = cols.find((c) => c.name === \"script\");\n const nullableCanonicalColumns = [\n [\"is_swept\", \"INTEGER\"],\n [\"is_preconfirmed\", \"INTEGER\"],\n [\"commitment_txids_json\", \"TEXT\"],\n [\"expires_at\", \"TEXT\"],\n [\"expires_at_height\", \"INTEGER\"],\n ] as const;\n let addedCanonicalColumns = false;\n for (const [name, type] of nullableCanonicalColumns) {\n if (!cols.some((c) => c.name === name)) {\n await this.db.run(\n `ALTER TABLE ${this.tables.vtxos} ADD COLUMN ${name} ${type}`,\n );\n addedCanonicalColumns = true;\n }\n }\n // Every row this ALTER touched has the canonical columns NULL by construction, and its\n // state survives only in the legacy blob — which SQLite cannot drop, so it is still\n // there to read. Without the copy a swept row comes back `isSwept: false`, spendable,\n // until the first indexer sync. Runs before the rebuild below, whose INSERT…SELECT\n // carries these columns across.\n const hasLegacyBlob = cols.some((c) => c.name === \"virtual_status_json\");\n if (addedCanonicalColumns && hasLegacyBlob) {\n await this.backfillCanonicalVtxoColumns();\n }\n if (scriptCol && scriptCol.notnull === 1 && !hasLegacyBlob) {\n // Already on v1 schema.\n return;\n }\n\n if (!scriptCol) {\n await this.db.run(`ALTER TABLE ${this.tables.vtxos} ADD COLUMN script TEXT`);\n }\n\n // Backfill any NULL scripts from the owning address. Derivation\n // is deterministic, so re-running after a rolled-back attempt\n // produces the same values.\n const nullRows = await this.db.all<{\n txid: string;\n vout: number;\n address: string;\n }>(`SELECT txid, vout, address FROM ${this.tables.vtxos} WHERE script IS NULL`);\n for (const row of nullRows) {\n await this.db.run(\n `UPDATE ${this.tables.vtxos} SET script = ? WHERE txid = ? AND vout = ?`,\n [scriptFromArkAddress(row.address), row.txid, row.vout],\n );\n }\n\n // SQLite can't turn a nullable column into NOT NULL in place —\n // do the canonical 12-step table rebuild. Drop any stale temp\n // table from a prior aborted attempt first.\n const tempName = `${this.tables.vtxos}__migrate_tmp`;\n await this.db.run(`DROP TABLE IF EXISTS ${tempName}`);\n await this.db.run(this.vtxosCreateSql(tempName));\n await this.db.run(`\n INSERT INTO ${tempName}\n (txid, vout, value, address, tap_tree,\n forfeit_cb, forfeit_s, intent_cb, intent_s,\n status_json, created_at, is_unrolled, is_spent,\n is_swept, is_preconfirmed, commitment_txids_json,\n expires_at, expires_at_height,\n spent_by, settled_by, ark_tx_id, extra_witness_json, assets_json, script)\n SELECT txid, vout, value, address, tap_tree,\n forfeit_cb, forfeit_s, intent_cb, intent_s,\n status_json, created_at, is_unrolled, is_spent,\n is_swept, is_preconfirmed, commitment_txids_json,\n expires_at, expires_at_height,\n spent_by, settled_by, ark_tx_id, extra_witness_json, assets_json, script\n FROM ${this.tables.vtxos}\n `);\n await this.db.run(`DROP TABLE ${this.tables.vtxos}`);\n await this.db.run(`ALTER TABLE ${tempName} RENAME TO ${this.tables.vtxos}`);\n });\n }\n\n /**\n * Copy the canonical VTXO facts out of the legacy `virtual_status_json` blob.\n *\n * Scoped to rows that still have `is_swept` NULL, which is what \"never backfilled\" looks\n * like: the copy writes 0 or 1 to every row it touches, so a second pass — a later column\n * addition, say — cannot overwrite what an indexer sync has since corrected. Rows whose blob\n * is missing or corrupt are left alone: a migration must not be stopped by one bad row, and\n * the next sync repairs it.\n */\n private async backfillCanonicalVtxoColumns(): Promise<void> {\n const rows = await this.db.all<{\n txid: string;\n vout: number;\n virtual_status_json: string | null;\n }>(\n `SELECT txid, vout, virtual_status_json FROM ${this.tables.vtxos}\n WHERE virtual_status_json IS NOT NULL AND is_swept IS NULL`,\n );\n for (const row of rows) {\n const facts = legacyVtxoFacts(row.virtual_status_json);\n if (!facts) continue;\n await this.db.run(\n `UPDATE ${this.tables.vtxos}\n SET is_swept = ?, is_preconfirmed = ?, commitment_txids_json = ?,\n expires_at = ?, expires_at_height = ?,\n is_spent = COALESCE(is_spent, ?)\n WHERE txid = ? AND vout = ?`,\n [\n facts.isSwept ? 1 : 0,\n facts.isPreconfirmed ? 1 : 0,\n facts.commitmentTxIds ? JSON.stringify(facts.commitmentTxIds) : null,\n facts.expiresAt ? facts.expiresAt.toISOString() : null,\n facts.expiresAtHeight ?? null,\n facts.isSpent ? 1 : 0,\n row.txid,\n row.vout,\n ],\n );\n }\n }\n\n private vtxosCreateSql(tableName: string): string {\n return `CREATE TABLE ${tableName} (\n txid TEXT NOT NULL,\n vout INTEGER NOT NULL,\n value INTEGER NOT NULL,\n address TEXT NOT NULL,\n tap_tree TEXT NOT NULL,\n forfeit_cb TEXT NOT NULL,\n forfeit_s TEXT NOT NULL,\n intent_cb TEXT NOT NULL,\n intent_s TEXT NOT NULL,\n status_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n is_unrolled INTEGER NOT NULL DEFAULT 0,\n is_spent INTEGER,\n is_swept INTEGER,\n is_preconfirmed INTEGER,\n commitment_txids_json TEXT,\n expires_at TEXT,\n expires_at_height INTEGER,\n spent_by TEXT,\n settled_by TEXT,\n ark_tx_id TEXT,\n extra_witness_json TEXT,\n assets_json TEXT,\n script TEXT NOT NULL,\n PRIMARY KEY (txid, vout)\n )`;\n }\n\n /**\n * `INSERT OR REPLACE` rows, as many to a statement as the parameter budget allows.\n * No enclosing transaction: on the shared connection it would take in other repos' writes.\n */\n private async insertOrReplace(\n table: string,\n columns: string,\n rows: unknown[][],\n ): Promise<void> {\n const width = columns.split(\",\").length;\n const tuple = `(${Array(width).fill(\"?\").join(\", \")})`;\n const rowsPerStatement = Math.floor(MAX_BOUND_PARAMETERS / width);\n for (let i = 0; i < rows.length; i += rowsPerStatement) {\n const chunk = rows.slice(i, i + rowsPerStatement);\n await this.db.run(\n `INSERT OR REPLACE INTO ${table} (${columns})\n VALUES ${chunk.map(() => tuple).join(\", \")}`,\n chunk.flat(),\n );\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n // no-op — consumer owns the SQLExecutor lifecycle\n }\n\n // ── Clear ──────────────────────────────────────────────────────────\n\n async clear(): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.vtxos}`);\n await this.db.run(`DELETE FROM ${this.tables.utxos}`);\n await this.db.run(`DELETE FROM ${this.tables.transactions}`);\n await this.db.run(`DELETE FROM ${this.tables.walletState}`);\n }\n\n // ── VTXO management ────────────────────────────────────────────────\n\n async getVtxosPage(\n address: string,\n page: PageRequest<Outpoint>,\n ): Promise<PageResult<ExtendedVirtualCoin, Outpoint>> {\n return this.pageByAddress(this.tables.vtxos, address, page, vtxoRowToDomain);\n }\n\n async saveVtxos(address: string, vtxos: ExtendedVirtualCoin[]): Promise<void> {\n await this.ensureInit();\n await this.insertOrReplace(\n this.tables.vtxos,\n `txid, vout, value, address,\n tap_tree, forfeit_cb, forfeit_s, intent_cb, intent_s,\n status_json, created_at, is_unrolled, is_spent,\n is_swept, is_preconfirmed, commitment_txids_json,\n expires_at, expires_at_height,\n spent_by, settled_by, ark_tx_id, extra_witness_json, assets_json, script`,\n vtxos.map((vtxo) => {\n const s = serializeVtxo(vtxo);\n return [\n s.txid,\n s.vout,\n s.value,\n address,\n s.tapTree,\n s.forfeitTapLeafScript.cb,\n s.forfeitTapLeafScript.s,\n s.intentTapLeafScript.cb,\n s.intentTapLeafScript.s,\n JSON.stringify(s.status),\n createdAtToIso(s.createdAt),\n s.isUnrolled ? 1 : 0,\n s.isSpent === undefined ? null : s.isSpent ? 1 : 0,\n s.isSwept === undefined ? null : s.isSwept ? 1 : 0,\n s.isPreconfirmed === undefined ? null : s.isPreconfirmed ? 1 : 0,\n s.commitmentTxIds ? JSON.stringify(s.commitmentTxIds) : null,\n s.expiresAt === undefined ? null : new Date(s.expiresAt).toISOString(),\n s.expiresAtHeight ?? null,\n s.spentBy ?? null,\n s.settledBy ?? null,\n s.arkTxId ?? null,\n s.extraWitness ? JSON.stringify(s.extraWitness) : null,\n s.assets ? JSON.stringify(s.assets) : null,\n s.script ?? null,\n ];\n }),\n );\n }\n\n async deleteVtxos(address: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.vtxos} WHERE address = ?`, [address]);\n }\n\n async getVtxosForScriptPage(\n script: string,\n page: PageRequest<ScriptVtxoCursor>,\n options?: ScriptVtxoPageOptions,\n ): Promise<PageResult<StoredVtxo, ScriptVtxoCursor>> {\n assertPageRequest(page);\n await this.ensureInit();\n const after = page.after;\n const rows = await this.db.all<VtxoRow>(\n `SELECT * FROM ${this.tables.vtxos} WHERE script = ?\n ${options?.unspentOnly ? `AND ${UNSPENT_VTXO_PREDICATE}` : \"\"}\n ${after ? \"AND (address > ? OR (address = ? AND (txid > ? OR (txid = ? AND vout > ?))))\" : \"\"}\n ORDER BY address, txid, vout LIMIT ?`,\n after\n ? [\n script,\n after.address,\n after.address,\n after.txid,\n after.txid,\n after.vout,\n page.limit + 1,\n ]\n : [script, page.limit + 1],\n );\n const result = pageResult(\n rows.map((row) => ({ address: row.address, vtxo: vtxoRowToDomain(row) })),\n page.limit,\n (row) => ({ address: row.address, txid: row.vtxo.txid, vout: row.vtxo.vout }),\n );\n // Legacy facts decoded from the row can still mark it spent.\n return options?.unspentOnly\n ? { ...result, items: result.items.filter((row) => !isVtxoSpent(row.vtxo)) }\n : result;\n }\n\n async saveVtxosForScript(key: VtxoRepositoryKey, vtxos: ExtendedVirtualCoin[]): Promise<void> {\n return this.saveVtxos(checkSaveVtxosForScript(\"SQLiteWalletRepository\", key, vtxos), vtxos);\n }\n\n async deleteVtxosForScript(script: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.vtxos} WHERE script = ?`, [script]);\n }\n\n // ── UTXO management ────────────────────────────────────────────────\n\n async getUtxosPage(\n address: string,\n page: PageRequest<Outpoint>,\n ): Promise<PageResult<ExtendedCoin, Outpoint>> {\n return this.pageByAddress(this.tables.utxos, address, page, utxoRowToDomain);\n }\n\n private async pageByAddress<Row extends Outpoint, Item>(\n table: string,\n address: string,\n page: PageRequest<Outpoint>,\n deserialize: (row: Row) => Item,\n ): Promise<PageResult<Item, Outpoint>> {\n assertPageRequest(page);\n await this.ensureInit();\n const rows = await this.db.all<Row>(\n `SELECT * FROM ${table} WHERE address = ? AND (txid, vout) > (?, ?)\n ORDER BY txid, vout LIMIT ?`,\n [address, page.after?.txid ?? \"\", page.after?.vout ?? -1, page.limit + 1],\n );\n const result = pageResult(rows, page.limit, ({ txid, vout }) => ({ txid, vout }));\n return { items: result.items.map(deserialize), nextCursor: result.nextCursor };\n }\n\n async saveUtxos(\n addressOrBatch: string | ReadonlyMap<string, ExtendedCoin[]>,\n utxos?: ExtendedCoin[],\n ): Promise<void> {\n await this.ensureInit();\n const rows = utxoEntries(addressOrBatch, utxos).flatMap(([address, list]) =>\n list.map((utxo) => {\n const s = serializeUtxo(utxo);\n return [\n s.txid,\n s.vout,\n s.value,\n address,\n s.tapTree,\n s.forfeitTapLeafScript.cb,\n s.forfeitTapLeafScript.s,\n s.intentTapLeafScript.cb,\n s.intentTapLeafScript.s,\n JSON.stringify(s.status),\n s.extraWitness ? JSON.stringify(s.extraWitness) : null,\n ];\n }),\n );\n await this.insertOrReplace(\n this.tables.utxos,\n `txid, vout, value, address,\n tap_tree, forfeit_cb, forfeit_s, intent_cb, intent_s,\n status_json, extra_witness_json`,\n rows,\n );\n }\n\n async deleteUtxos(address: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.utxos} WHERE address = ?`, [address]);\n }\n\n // ── Transaction history ────────────────────────────────────────────\n\n async getTransactionHistoryPage(\n filter: TransactionHistoryPageFilter,\n page: PageRequest<TransactionHistoryPageCursor>,\n ): Promise<PageResult<ArkTransaction, TransactionHistoryPageCursor>> {\n assertPageRequest(page);\n assertHistoryPageFilter(filter);\n await this.ensureInit();\n const conditions = [\"address = ?\"];\n const params: unknown[] = [filter.address];\n if (filter.since !== undefined) {\n conditions.push(\"created_at >= ?\");\n params.push(filter.since);\n }\n if (page.after !== undefined) {\n conditions.push(\n \"(created_at, boarding_txid, commitment_txid, ark_txid) > (?, ?, ?, ?)\",\n );\n params.push(\n page.after.createdAt,\n page.after.key.boardingTxid,\n page.after.key.commitmentTxid,\n page.after.key.arkTxid,\n );\n }\n const rows = await this.db.all<TransactionRow>(\n `SELECT * FROM ${this.tables.transactions} WHERE ${conditions.join(\" AND \")}\n ORDER BY created_at, boarding_txid, commitment_txid, ark_txid LIMIT ?`,\n [...params, page.limit + 1],\n );\n return pageResult(rows.map(txRowToDomain), page.limit, (tx) => ({\n createdAt: tx.createdAt,\n key: tx.key,\n }));\n }\n\n async saveTransactions(address: string, txs: ArkTransaction[]): Promise<void> {\n await this.ensureInit();\n await this.insertOrReplace(\n this.tables.transactions,\n `address, boarding_txid, commitment_txid, ark_txid,\n type, amount, settled, created_at, assets_json`,\n txs.map((tx) => [\n address,\n tx.key.boardingTxid,\n tx.key.commitmentTxid,\n tx.key.arkTxid,\n tx.type,\n tx.amount,\n tx.settled ? 1 : 0,\n tx.createdAt,\n tx.assets ? JSON.stringify(serializeAssets(tx.assets)) : null,\n ]),\n );\n }\n\n async deleteTransactions(address: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.transactions} WHERE address = ?`, [address]);\n }\n\n // ── Wallet state ───────────────────────────────────────────────────\n\n async getWalletState(): Promise<WalletState | null> {\n await this.ensureInit();\n const row = await this.db.get<WalletStateRow>(\n `SELECT * FROM ${this.tables.walletState} WHERE key = ?`,\n [\"state\"],\n );\n if (!row) return null;\n\n const state: WalletState = {};\n if (row.settings_json) {\n state.settings = JSON.parse(row.settings_json);\n }\n state.lastSyncTime = row.last_sync_time ?? undefined;\n return state;\n }\n\n async saveWalletState(state: WalletState): Promise<void> {\n await this.ensureInit();\n await this.db.run(\n `INSERT OR REPLACE INTO ${this.tables.walletState}\n (key, settings_json, last_sync_time)\n VALUES (?, ?, ?)`,\n [\n \"state\",\n state.settings ? JSON.stringify(state.settings) : null,\n state.lastSyncTime ?? null,\n ],\n );\n }\n}\n\n// ── Row types ──────────────────────────────────────────────────────────\n\ninterface VtxoRow {\n txid: string;\n vout: number;\n value: number;\n address: string;\n tap_tree: string;\n forfeit_cb: string;\n forfeit_s: string;\n intent_cb: string;\n intent_s: string;\n status_json: string;\n created_at: string;\n is_unrolled: number;\n is_spent: number | null;\n is_swept?: number | null;\n is_preconfirmed?: number | null;\n commitment_txids_json?: string | null;\n expires_at?: string | null;\n expires_at_height?: number | null;\n spent_by: string | null;\n settled_by: string | null;\n ark_tx_id: string | null;\n extra_witness_json: string | null;\n assets_json: string | null;\n script: string | null;\n}\n\ninterface UtxoRow {\n txid: string;\n vout: number;\n value: number;\n address: string;\n tap_tree: string;\n forfeit_cb: string;\n forfeit_s: string;\n intent_cb: string;\n intent_s: string;\n status_json: string;\n extra_witness_json: string | null;\n}\n\ninterface TransactionRow {\n address: string;\n boarding_txid: string;\n commitment_txid: string;\n ark_txid: string;\n type: string;\n amount: number;\n settled: number;\n created_at: number;\n assets_json: string | null;\n}\n\ninterface WalletStateRow {\n key: string;\n settings_json: string | null;\n last_sync_time: number | null;\n}\n\n// The page query repeats the index predicate verbatim so SQLite can use the partial index.\nconst UNSPENT_VTXO_PREDICATE =\n \"(is_spent IS NULL OR is_spent = 0) AND (spent_by IS NULL OR spent_by = '') AND (settled_by IS NULL OR settled_by = '')\";\n\n// ── Row → Domain converters ────────────────────────────────────────────\n\nfunction vtxoRowToDomain(row: VtxoRow): ExtendedVirtualCoin {\n const serialized = {\n txid: row.txid,\n vout: row.vout,\n value: row.value,\n tapTree: row.tap_tree,\n forfeitTapLeafScript: {\n cb: row.forfeit_cb,\n s: row.forfeit_s,\n } as SerializedTapLeaf,\n intentTapLeafScript: {\n cb: row.intent_cb,\n s: row.intent_s,\n } as SerializedTapLeaf,\n status: JSON.parse(row.status_json),\n createdAt: new Date(row.created_at),\n isUnrolled: row.is_unrolled === 1,\n isSpent: row.is_spent === null ? undefined : row.is_spent === 1,\n isSwept: row.is_swept == null ? undefined : row.is_swept === 1,\n isPreconfirmed: row.is_preconfirmed == null ? undefined : row.is_preconfirmed === 1,\n commitmentTxIds: row.commitment_txids_json\n ? JSON.parse(row.commitment_txids_json)\n : undefined,\n expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,\n expiresAtHeight: row.expires_at_height ?? undefined,\n spentBy: row.spent_by ?? undefined,\n settledBy: row.settled_by ?? undefined,\n arkTxId: row.ark_tx_id ?? undefined,\n extraWitness: row.extra_witness_json ? JSON.parse(row.extra_witness_json) : undefined,\n assets: row.assets_json ? JSON.parse(row.assets_json) : undefined,\n // Post-migration every row has `script`, but the backfill is\n // idempotent: derive from `address` if the legacy column is still\n // null (e.g. the migration hasn't run yet on this handle).\n script: row.script ?? scriptFromArkAddress(row.address),\n };\n\n return deserializeVtxo(serialized);\n}\n\nfunction utxoRowToDomain(row: UtxoRow): ExtendedCoin {\n const serialized = {\n txid: row.txid,\n vout: row.vout,\n value: row.value,\n tapTree: row.tap_tree,\n forfeitTapLeafScript: {\n cb: row.forfeit_cb,\n s: row.forfeit_s,\n } as SerializedTapLeaf,\n intentTapLeafScript: {\n cb: row.intent_cb,\n s: row.intent_s,\n } as SerializedTapLeaf,\n status: JSON.parse(row.status_json),\n extraWitness: row.extra_witness_json ? JSON.parse(row.extra_witness_json) : undefined,\n };\n\n return deserializeUtxo(serialized);\n}\n\nfunction txRowToDomain(row: TransactionRow): ArkTransaction {\n const tx: ArkTransaction = {\n key: {\n boardingTxid: row.boarding_txid,\n commitmentTxid: row.commitment_txid,\n arkTxid: row.ark_txid,\n },\n type: row.type as ArkTransaction[\"type\"],\n amount: row.amount,\n settled: row.settled === 1,\n createdAt: row.created_at,\n };\n if (row.assets_json) {\n tx.assets = deserializeAssets(JSON.parse(row.assets_json));\n }\n return tx;\n}\n","import { Contract, ContractState, ContractWatchState } from \"../../contracts/types\";\nimport {\n contractFilterMatchesNothing,\n ContractFilter,\n ContractRepository,\n} from \"../contractRepository\";\nimport { assertPageRequest, pageResult, type PageRequest, type PageResult } from \"../page\";\nimport { SQLExecutor } from \"./types\";\nimport { sanitizeTablePrefix } from \"./prefix\";\n\n/** A row stored before the `watch` column existed holds NULL and counts as \"watched\".\n * Indexes and filters must share this expression: SQLite uses an expression index\n * only for a WHERE term with the same expression. */\nconst WATCH_STATE = \"IFNULL(watch, 'watched')\";\n\ninterface SQLiteContractRepositoryOptions {\n /** Table name prefix (default: \"ark_\") */\n prefix?: string;\n}\n\n/**\n * SQLite-based implementation of ContractRepository.\n *\n * Uses the SQLExecutor interface so consumers can plug in any SQLite driver\n * (expo-sqlite, better-sqlite3, etc.).\n *\n * Tables are created lazily on first operation via `ensureInit()`.\n * The consumer owns the SQLExecutor lifecycle — `[Symbol.asyncDispose]` is a no-op.\n */\nexport class SQLiteContractRepository implements ContractRepository {\n readonly version = 3 as const;\n private initPromise: Promise<void> | null = null;\n private readonly prefix: string;\n private readonly table: string;\n\n constructor(\n private readonly db: SQLExecutor,\n options?: SQLiteContractRepositoryOptions,\n ) {\n this.prefix = sanitizeTablePrefix(options?.prefix ?? \"ark_\");\n this.table = `${this.prefix}contracts`;\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n private ensureInit(): Promise<void> {\n if (!this.initPromise) {\n this.initPromise = this.init();\n }\n return this.initPromise;\n }\n\n private async init(): Promise<void> {\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS ${this.table} (\n script TEXT PRIMARY KEY,\n address TEXT NOT NULL,\n type TEXT NOT NULL,\n state TEXT NOT NULL,\n params_json TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n expires_at INTEGER,\n label TEXT,\n metadata_json TEXT,\n watch TEXT\n )\n `);\n\n // Nullable and added in place, so a table created before the\n // column existed keeps every row and reads back as \"watched\" —\n // the coverage those rows have today.\n await this.addColumnIfMissing(\"watch\", \"TEXT\");\n\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}contracts_type ON ${this.table} (type)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}contracts_state ON ${this.table} (state)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}contracts_watch_state ON ${this.table} (${WATCH_STATE}, script)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}contracts_type_watch_state ON ${this.table} (type, ${WATCH_STATE}, script)`,\n );\n }\n\n private async addColumnIfMissing(column: string, type: string): Promise<void> {\n const columns = await this.db.all<{ name: string }>(`PRAGMA table_info(${this.table})`);\n if (columns.some((c) => c.name === column)) return;\n await this.db.run(`ALTER TABLE ${this.table} ADD COLUMN ${column} ${type}`);\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n // no-op — consumer owns the SQLExecutor lifecycle\n }\n\n // ── Clear ──────────────────────────────────────────────────────────\n\n async clear(): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.table}`);\n }\n\n // ── Contract management ────────────────────────────────────────────\n\n async getContractsPage(\n filter: ContractFilter | undefined,\n page: PageRequest,\n ): Promise<PageResult<Contract>> {\n assertPageRequest(page);\n await this.ensureInit();\n if (contractFilterMatchesNothing(filter)) return { items: [] };\n const conditions: string[] = [];\n const params: unknown[] = [];\n if (filter) {\n this.addFilterCondition(conditions, params, \"script\", filter.script);\n this.addFilterCondition(conditions, params, \"state\", filter.state);\n this.addFilterCondition(conditions, params, \"type\", filter.type);\n this.addFilterCondition(conditions, params, WATCH_STATE, filter.watch);\n }\n if (page.after !== undefined) {\n conditions.push(\"script > ?\");\n params.push(page.after);\n }\n const where = conditions.length ? ` WHERE ${conditions.join(\" AND \")}` : \"\";\n const rows = await this.db.all<ContractRow>(\n `SELECT * FROM ${this.table}${where} ORDER BY script LIMIT ?`,\n [...params, page.limit + 1],\n );\n return pageResult(rows.map(contractRowToDomain), page.limit, (contract) => contract.script);\n }\n\n async saveContract(contract: Contract): Promise<void> {\n await this.ensureInit();\n await this.db.run(\n `INSERT OR REPLACE INTO ${this.table}\n (script, address, type, state, params_json,\n created_at, label, metadata_json, watch)\n VALUES (?, ?, ?, ?, ?,\n ?, ?, ?, ?)`,\n [\n contract.script,\n contract.address,\n contract.type,\n contract.state,\n JSON.stringify(contract.params),\n contract.createdAt,\n contract.label ?? null,\n contract.metadata ? JSON.stringify(contract.metadata) : null,\n contract.watch ?? null,\n ],\n );\n }\n\n async deleteContract(script: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.table} WHERE script = ?`, [script]);\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────\n\n private addFilterCondition(\n conditions: string[],\n params: unknown[],\n column: string,\n value?: string | string[],\n ): void {\n if (value === undefined) return;\n\n if (Array.isArray(value)) {\n if (value.length === 0) return;\n const placeholders = value.map(() => \"?\").join(\", \");\n conditions.push(`${column} IN (${placeholders})`);\n params.push(...value);\n } else {\n conditions.push(`${column} = ?`);\n params.push(value);\n }\n }\n}\n\n// ── Row type ────────────────────────────────────────────────────────────\n\ninterface ContractRow {\n script: string;\n address: string;\n type: string;\n state: string;\n params_json: string;\n created_at: number;\n label: string | null;\n metadata_json: string | null;\n watch: string | null;\n}\n\n// ── Row → Domain converter ──────────────────────────────────────────────\n\nfunction contractRowToDomain(row: ContractRow): Contract {\n const contract: Contract = {\n script: row.script,\n address: row.address,\n type: row.type,\n state: row.state as ContractState,\n params: JSON.parse(row.params_json),\n createdAt: row.created_at,\n };\n\n if (row.label !== null) {\n contract.label = row.label;\n }\n if (row.metadata_json !== null) {\n contract.metadata = JSON.parse(row.metadata_json);\n }\n if (row.watch !== null && row.watch !== undefined) {\n contract.watch = row.watch as ContractWatchState;\n }\n\n return contract;\n}\n","import { Outpoint } from \"../../wallet\";\nimport {\n ArkIntent,\n ArkIntentState,\n IntentPageFilter,\n IntentRepository,\n intentMatchesFilter,\n isTerminalIntentState,\n} from \"../intentRepository\";\nimport { assertPageRequest, pageResult, type PageRequest, type PageResult } from \"../page\";\nimport { SQLExecutor } from \"./types\";\nimport { runInTransaction } from \"./transaction\";\nimport { sanitizeTablePrefix } from \"./prefix\";\n\ninterface IntentRow {\n intent_tx_id: string;\n intent_id: string | null;\n state: string;\n valid_from: number | null;\n valid_until: number | null;\n created_at: number;\n updated_at: number;\n register_proof: string;\n register_proof_message: string;\n delete_proof: string;\n delete_proof_message: string;\n batch_id: string | null;\n commitment_txid: string | null;\n cancellation_reason: string | null;\n partial_forfeits_json: string;\n signer_descriptor: string | null;\n intent_vtxos_json: string;\n}\n\nexport class SQLiteIntentRepository implements IntentRepository {\n readonly version = 1 as const;\n private initPromise: Promise<void> | null = null;\n private readonly prefix: string;\n private readonly t: string;\n\n constructor(\n private readonly db: SQLExecutor,\n options?: { prefix?: string },\n ) {\n this.prefix = sanitizeTablePrefix(options?.prefix ?? \"ark_\");\n this.t = `${this.prefix}intents`;\n }\n\n private ensureInit(): Promise<void> {\n if (!this.initPromise) this.initPromise = this.init();\n return this.initPromise;\n }\n\n private async init(): Promise<void> {\n await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.t} (\n intent_tx_id TEXT PRIMARY KEY,\n intent_id TEXT,\n state TEXT NOT NULL,\n valid_from INTEGER,\n valid_until INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n register_proof TEXT NOT NULL,\n register_proof_message TEXT NOT NULL,\n delete_proof TEXT NOT NULL,\n delete_proof_message TEXT NOT NULL,\n batch_id TEXT,\n commitment_txid TEXT,\n cancellation_reason TEXT,\n partial_forfeits_json TEXT NOT NULL,\n signer_descriptor TEXT,\n intent_vtxos_json TEXT NOT NULL\n )`);\n await this.db.run(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_${this.prefix}intent_id ON ${this.t} (intent_id) WHERE intent_id IS NOT NULL`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}intent_state ON ${this.t} (state)`,\n );\n }\n\n async clear(): Promise<void> {\n await this.ensureInit();\n // Route through the same serialized write chain as saveIntent so a\n // clear can't interleave with an in-flight transaction on this executor.\n await runInTransaction(this.db, async () => {\n await this.db.run(`DELETE FROM ${this.t}`);\n });\n }\n\n async saveIntent(intent: ArkIntent): Promise<void> {\n await this.ensureInit();\n const now = Date.now();\n await runInTransaction(this.db, async () => {\n // Upsert by the primary key only. INSERT OR REPLACE would also fire\n // on the intent_id unique index, silently deleting the *other* row\n // that holds it; ON CONFLICT(intent_tx_id) updates in place and lets\n // an intent_id collision surface as a constraint error instead.\n await this.db.run(\n `INSERT INTO ${this.t}\n (intent_tx_id, intent_id, state, valid_from, valid_until,\n created_at, updated_at, register_proof, register_proof_message,\n delete_proof, delete_proof_message, batch_id, commitment_txid,\n cancellation_reason, partial_forfeits_json, signer_descriptor,\n intent_vtxos_json)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(intent_tx_id) DO UPDATE SET\n intent_id = excluded.intent_id,\n state = excluded.state,\n valid_from = excluded.valid_from,\n valid_until = excluded.valid_until,\n created_at = excluded.created_at,\n updated_at = excluded.updated_at,\n register_proof = excluded.register_proof,\n register_proof_message = excluded.register_proof_message,\n delete_proof = excluded.delete_proof,\n delete_proof_message = excluded.delete_proof_message,\n batch_id = excluded.batch_id,\n commitment_txid = excluded.commitment_txid,\n cancellation_reason = excluded.cancellation_reason,\n partial_forfeits_json = excluded.partial_forfeits_json,\n signer_descriptor = excluded.signer_descriptor,\n intent_vtxos_json = excluded.intent_vtxos_json`,\n [\n intent.intentTxId,\n intent.intentId ?? null,\n intent.state,\n intent.validFrom ?? null,\n intent.validUntil ?? null,\n intent.createdAt,\n now,\n intent.registerProof,\n intent.registerProofMessage,\n intent.deleteProof,\n intent.deleteProofMessage,\n intent.batchId ?? null,\n intent.commitmentTransactionId ?? null,\n intent.cancellationReason ?? null,\n JSON.stringify(intent.partialForfeits),\n intent.signerDescriptor ?? null,\n JSON.stringify(intent.intentVtxos),\n ],\n );\n });\n }\n\n async getIntentsPage(\n filter: IntentPageFilter | undefined,\n page: PageRequest,\n ): Promise<PageResult<ArkIntent>> {\n assertPageRequest(page);\n await this.ensureInit();\n if (filter?.states?.length === 0) return { items: [] };\n const stateSql = filter?.states\n ? ` AND state IN (${filter.states.map(() => \"?\").join(\", \")})`\n : \"\";\n const stateParams = filter?.states ?? [];\n const batchSize = Math.max(64, page.limit + 1);\n const rows: ArkIntent[] = [];\n let after = page.after;\n // SQL narrows by indexed state; the shared filter handles the remaining predicates.\n while (rows.length <= page.limit) {\n const batch = await this.db.all<IntentRow>(\n `SELECT * FROM ${this.t} WHERE intent_tx_id > ?${stateSql} ORDER BY intent_tx_id LIMIT ?`,\n [after ?? \"\", ...stateParams, batchSize],\n );\n if (batch.length === 0) break;\n for (const row of batch) {\n after = row.intent_tx_id;\n const intent = rowToIntent(row);\n if (!filter || intentMatchesFilter(intent, filter)) rows.push(intent);\n if (rows.length > page.limit) break;\n }\n if (batch.length < batchSize) break;\n }\n return pageResult(rows, page.limit, (intent) => intent.intentTxId);\n }\n\n async getLockedVtxoOutpoints(): Promise<Outpoint[]> {\n await this.ensureInit();\n const rows = await this.db.all<IntentRow>(`SELECT * FROM ${this.t}`);\n const out: Outpoint[] = [];\n for (const r of rows) {\n if (isTerminalIntentState(r.state as ArkIntentState)) continue;\n for (const o of JSON.parse(r.intent_vtxos_json) as Outpoint[]) out.push(o);\n }\n return out;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {}\n}\n\nfunction rowToIntent(r: IntentRow): ArkIntent {\n return {\n intentTxId: r.intent_tx_id,\n intentId: r.intent_id ?? undefined,\n state: r.state as ArkIntentState,\n validFrom: r.valid_from ?? undefined,\n validUntil: r.valid_until ?? undefined,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n registerProof: r.register_proof,\n registerProofMessage: r.register_proof_message,\n deleteProof: r.delete_proof,\n deleteProofMessage: r.delete_proof_message,\n batchId: r.batch_id ?? undefined,\n commitmentTransactionId: r.commitment_txid ?? undefined,\n cancellationReason: r.cancellation_reason ?? undefined,\n partialForfeits: JSON.parse(r.partial_forfeits_json),\n signerDescriptor: r.signer_descriptor ?? undefined,\n intentVtxos: JSON.parse(r.intent_vtxos_json),\n };\n}\n","import { Outpoint } from \"../../wallet\";\nimport {\n ChainedTxType,\n mergeChainedTxType,\n VirtualTx,\n VirtualTxRepository,\n VtxoBranch,\n} from \"../virtualTxRepository\";\nimport { SQLExecutor } from \"./types\";\nimport { runInTransaction } from \"./transaction\";\nimport { sanitizeTablePrefix } from \"./prefix\";\n\ninterface VtxRow {\n txid: string;\n psbt: string | null;\n expires_at: number | null;\n type: number;\n}\nexport class SQLiteVirtualTxRepository implements VirtualTxRepository {\n readonly version = 1 as const;\n private initPromise: Promise<void> | null = null;\n private readonly prefix: string;\n private readonly tTx: string;\n private readonly tBranch: string;\n\n constructor(\n private readonly db: SQLExecutor,\n options?: { prefix?: string },\n ) {\n this.prefix = sanitizeTablePrefix(options?.prefix ?? \"ark_\");\n this.tTx = `${this.prefix}virtual_txs`;\n this.tBranch = `${this.prefix}vtxo_branches`;\n }\n\n private ensureInit(): Promise<void> {\n if (!this.initPromise) this.initPromise = this.init();\n return this.initPromise;\n }\n\n private async init(): Promise<void> {\n await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.tTx} (\n txid TEXT PRIMARY KEY,\n psbt TEXT,\n expires_at INTEGER,\n type INTEGER NOT NULL DEFAULT 0\n )`);\n await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.tBranch} (\n vtxo_txid TEXT NOT NULL,\n vtxo_vout INTEGER NOT NULL,\n virtual_txid TEXT NOT NULL,\n position INTEGER NOT NULL,\n PRIMARY KEY (vtxo_txid, vtxo_vout, position)\n )`);\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}branch_vtxid ON ${this.tBranch} (virtual_txid)`,\n );\n }\n\n async clear(): Promise<void> {\n await this.ensureInit();\n await runInTransaction(this.db, async () => {\n await this.db.run(`DELETE FROM ${this.tTx}`);\n await this.db.run(`DELETE FROM ${this.tBranch}`);\n });\n }\n\n async upsertVirtualTxs(txs: VirtualTx[]): Promise<void> {\n if (txs.length === 0) return;\n await this.ensureInit();\n await runInTransaction(this.db, async () => {\n // Prefetch existing rows in one query instead of a SELECT per tx,\n // then merge (new value wins, else keep the stored one) in memory.\n const placeholders = txs.map(() => \"?\").join(\", \");\n const existing = await this.db.all<VtxRow>(\n `SELECT * FROM ${this.tTx} WHERE txid IN (${placeholders})`,\n txs.map((t) => t.txid),\n );\n const prevByTxid = new Map(existing.map((r) => [r.txid, r]));\n for (const t of txs) {\n const prev = prevByTxid.get(t.txid);\n const psbt = t.psbt ?? prev?.psbt ?? null;\n const expires = t.expiresAt ?? prev?.expires_at ?? null;\n const type = mergeChainedTxType(t.type, prev?.type);\n await this.db.run(\n `INSERT OR REPLACE INTO ${this.tTx} (txid, psbt, expires_at, type) VALUES (?, ?, ?, ?)`,\n [t.txid, psbt, expires, type],\n );\n // A txid repeated later in the same batch must merge onto this\n // just-written row, matching the original per-tx-read behavior.\n prevByTxid.set(t.txid, { txid: t.txid, psbt, expires_at: expires, type });\n }\n });\n }\n\n async getVirtualTx(txid: string): Promise<VirtualTx | null> {\n await this.ensureInit();\n const row = await this.db.get<VtxRow>(`SELECT * FROM ${this.tTx} WHERE txid = ?`, [txid]);\n return row ? rowToTx(row) : null;\n }\n\n async setBranch(vtxo: Outpoint, branch: VtxoBranch[]): Promise<void> {\n await this.ensureInit();\n await runInTransaction(this.db, async () => {\n await this.db.run(`DELETE FROM ${this.tBranch} WHERE vtxo_txid = ? AND vtxo_vout = ?`, [\n vtxo.txid,\n vtxo.vout,\n ]);\n for (const b of branch) {\n await this.db.run(\n `INSERT OR REPLACE INTO ${this.tBranch} (vtxo_txid, vtxo_vout, virtual_txid, position) VALUES (?, ?, ?, ?)`,\n [b.vtxoTxid, b.vtxoVout, b.virtualTxid, b.position],\n );\n }\n });\n }\n\n async getBranch(vtxo: Outpoint): Promise<VirtualTx[]> {\n await this.ensureInit();\n // Single JOIN instead of one lookup per branch row; the inner join\n // naturally drops branch rows whose tx no longer exists.\n const rows = await this.db.all<VtxRow>(\n `SELECT t.txid, t.psbt, t.expires_at, t.type\n FROM ${this.tBranch} b\n JOIN ${this.tTx} t ON t.txid = b.virtual_txid\n WHERE b.vtxo_txid = ? AND b.vtxo_vout = ?\n ORDER BY b.position ASC`,\n [vtxo.txid, vtxo.vout],\n );\n return rows.map(rowToTx);\n }\n\n async hasBranch(vtxo: Outpoint): Promise<boolean> {\n await this.ensureInit();\n const r = await this.db.get<{ c: number }>(\n `SELECT COUNT(*) AS c FROM ${this.tBranch} WHERE vtxo_txid = ? AND vtxo_vout = ?`,\n [vtxo.txid, vtxo.vout],\n );\n return (r?.c ?? 0) > 0;\n }\n\n async pruneForSpentVtxo(vtxo: Outpoint): Promise<void> {\n await this.ensureInit();\n await runInTransaction(this.db, async () => {\n // Capture the txs this vtxo's branch referenced, then delete its\n // branch rows and — in one set-based pass — drop only those txs\n // that no other branch still references. Scoping the delete to the\n // captured txids preserves txs inserted without a branch.\n const removed = await this.db.all<{ virtual_txid: string }>(\n `SELECT DISTINCT virtual_txid FROM ${this.tBranch} WHERE vtxo_txid = ? AND vtxo_vout = ?`,\n [vtxo.txid, vtxo.vout],\n );\n await this.db.run(`DELETE FROM ${this.tBranch} WHERE vtxo_txid = ? AND vtxo_vout = ?`, [\n vtxo.txid,\n vtxo.vout,\n ]);\n if (removed.length === 0) return;\n const placeholders = removed.map(() => \"?\").join(\", \");\n await this.db.run(\n `DELETE FROM ${this.tTx}\n WHERE txid IN (${placeholders})\n AND NOT EXISTS (\n SELECT 1 FROM ${this.tBranch} b WHERE b.virtual_txid = ${this.tTx}.txid\n )`,\n removed.map((r) => r.virtual_txid),\n );\n });\n }\n\n async [Symbol.asyncDispose](): Promise<void> {}\n}\n\nfunction rowToTx(r: VtxRow): VirtualTx {\n return {\n txid: r.txid,\n psbt: r.psbt ?? null,\n expiresAt: r.expires_at ?? null,\n type: r.type as ChainedTxType,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/repositories/sqlite/transaction.ts","../../../src/repositories/sqlite/prefix.ts","../../../src/repositories/sqlite/walletRepository.ts","../../../src/repositories/sqlite/contractRepository.ts","../../../src/repositories/sqlite/intentRepository.ts","../../../src/repositories/sqlite/virtualTxRepository.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { SQLExecutor } from \"./types\";\n\ntype ExecutorQueue = {\n raw: SQLExecutor;\n facade: SQLExecutor;\n tail: Promise<unknown>;\n inTransaction: boolean;\n};\nconst executorQueues = new WeakMap<SQLExecutor, ExecutorQueue>();\n\nconst STALL_WARN_MS = 10_000;\n\nfunction enqueue<T>(queue: ExecutorQueue, operation: () => Promise<T>): Promise<T> {\n // A queued call made from inside a transaction callback waits on that callback forever.\n // Telling it apart from a concurrent caller needs async context that Hermes lacks, so warn\n // instead of failing, with the stack captured at the call site.\n let stall: ReturnType<typeof setTimeout> | undefined;\n if (queue.inTransaction) {\n const site = new Error(\n `SQLite operation waited ${STALL_WARN_MS / 1000}s behind a transaction. A repository, ` +\n \"getSerializedExecutor or runInTransaction call inside a runInTransaction \" +\n \"callback deadlocks; use the callback's tx.\",\n );\n stall = setTimeout(() => console.warn(site), STALL_WARN_MS);\n }\n const run = queue.tail.then(() => {\n clearTimeout(stall);\n return operation();\n });\n queue.tail = run.catch(() => undefined);\n return run;\n}\n\nfunction queueFor(db: SQLExecutor): ExecutorQueue {\n const existing = executorQueues.get(db);\n if (existing) return existing;\n // These closures run only after queue has been initialized.\n const facade: SQLExecutor = {\n run: (sql, params) => enqueue(queue, () => db.run(sql, params)),\n get: <T>(sql: string, params?: unknown[]) => enqueue(queue, () => db.get<T>(sql, params)),\n all: <T>(sql: string, params?: unknown[]) => enqueue(queue, () => db.all<T>(sql, params)),\n };\n const queue: ExecutorQueue = {\n raw: db,\n facade,\n tail: Promise.resolve(),\n inTransaction: false,\n };\n executorQueues.set(db, queue);\n executorQueues.set(facade, queue);\n return queue;\n}\n\n/** SDK reads and writes share the transaction queue; direct raw-driver calls do not. */\nexport function getSerializedExecutor(db: SQLExecutor): SQLExecutor {\n return queueFor(db).facade;\n}\n\n/**\n * Run `fn` inside `BEGIN IMMEDIATE` / `COMMIT`, excluding queued SDK reads and writes.\n * Use only the supplied raw executor inside `fn`; repository calls or nested transactions deadlock.\n * Existing zero-argument callbacks closing over the original raw executor remain supported.\n */\nexport function runInTransaction(\n db: SQLExecutor,\n fn: (tx: SQLExecutor) => Promise<void>,\n): Promise<void> {\n const queue = queueFor(db);\n return enqueue(queue, async () => {\n const tx = queue.raw;\n queue.inTransaction = true;\n try {\n await tx.run(\"BEGIN IMMEDIATE\");\n try {\n await fn(tx);\n await tx.run(\"COMMIT\");\n } catch (e) {\n try {\n await tx.run(\"ROLLBACK\");\n } catch {\n /* already rolled back */\n }\n throw e;\n }\n } finally {\n queue.inTransaction = false;\n }\n });\n}\n","// A table name cannot be a bound parameter, so every prefixed repository\n// interpolates it into SQL. This is the check that keeps that safe.\nconst SAFE_PREFIX = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n/**\n * Validate a SQLite table prefix and return it unchanged.\n *\n * Rejects a leading digit as well as punctuation: `1_vtxos` is not a valid SQL\n * identifier either.\n */\nexport function sanitizeTablePrefix(p: string): string {\n if (!SAFE_PREFIX.test(p)) throw new Error(`Invalid table prefix \"${p}\"`);\n return p;\n}\n","import { ArkTransaction, ExtendedCoin, ExtendedVirtualCoin } from \"../../wallet\";\nimport type { Outpoint } from \"../../wallet\";\nimport {\n WalletRepository,\n WalletState,\n type AtomicWalletState,\n applyWalletStateUpdate,\n VtxoRepositoryKey,\n assertHistoryPageFilter,\n type TransactionHistoryPageFilter,\n type TransactionHistoryPageCursor,\n type ScriptVtxoCursor,\n type StoredVtxo,\n type ScriptVtxoPageOptions,\n utxoEntries,\n} from \"../walletRepository\";\nimport { assertPageRequest, pageResult, type PageRequest, type PageResult } from \"../page\";\nimport {\n serializeVtxo,\n serializeUtxo,\n deserializeVtxo,\n deserializeUtxo,\n serializeAssets,\n deserializeAssets,\n SerializedTapLeaf,\n createdAtToIso,\n} from \"../serialization\";\nimport { scriptFromArkAddress } from \"../scriptFromAddress\";\nimport { legacyVtxoFacts } from \"../legacyVtxoFacts\";\nimport { SQLExecutor } from \"./types\";\nimport { getSerializedExecutor, runInTransaction } from \"./transaction\";\nimport { sanitizeTablePrefix } from \"./prefix\";\nimport { checkSaveVtxosForScript } from \"../../contracts/vtxoOwnership\";\nimport { isVtxoSpent } from \"../../wallet/vtxo\";\n\ninterface SQLiteWalletRepositoryOptions {\n /** Table name prefix (default: \"ark_\") */\n prefix?: string;\n /** Opt in only with a dedicated connection or all operations coordinated through\n * getSerializedExecutor/runInTransaction on the same executor object. Default: false.\n * All read-modify-write callers must use atomic updates; queued legacy updates can still race. */\n walletStateTransactions?: boolean;\n /** Caller asserts durable backing; requires walletStateTransactions. No storage detection. */\n persistentWalletState?: boolean;\n}\n\n/**\n * Bound parameters per statement: 999 was SQLite's limit before 3.32, and the\n * executor is the consumer's, so its SQLite build may be that old.\n */\nconst MAX_BOUND_PARAMETERS = 999;\n\n/**\n * SQLite-based implementation of WalletRepository.\n *\n * Uses the SQLExecutor interface so consumers can plug in any SQLite driver\n * (expo-sqlite, better-sqlite3, etc.).\n *\n * Tables are created lazily on first operation via `ensureInit()`.\n * The consumer owns the SQLExecutor lifecycle — `[Symbol.asyncDispose]` is a no-op.\n */\nexport class SQLiteWalletRepository implements WalletRepository {\n readonly version = 2 as const;\n readonly atomicWalletState?: AtomicWalletState;\n private readonly db: SQLExecutor;\n private initPromise: Promise<void> | null = null;\n private readonly prefix: string;\n private readonly tables: {\n vtxos: string;\n utxos: string;\n transactions: string;\n walletState: string;\n };\n\n constructor(db: SQLExecutor, options?: SQLiteWalletRepositoryOptions) {\n this.db = getSerializedExecutor(db);\n if (options?.walletStateTransactions === true) {\n this.atomicWalletState =\n options.persistentWalletState === true\n ? { ...this.atomicState, persistent: true }\n : this.atomicState;\n }\n this.prefix = sanitizeTablePrefix(options?.prefix ?? \"ark_\");\n this.tables = {\n vtxos: `${this.prefix}vtxos`,\n utxos: `${this.prefix}utxos`,\n transactions: `${this.prefix}transactions`,\n walletState: `${this.prefix}wallet_state`,\n };\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n private ensureInit(): Promise<void> {\n if (!this.initPromise) {\n this.initPromise = this.init();\n }\n return this.initPromise;\n }\n\n private async init(): Promise<void> {\n await this.migrateVtxosTable();\n\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS ${this.tables.utxos} (\n txid TEXT NOT NULL,\n vout INTEGER NOT NULL,\n value INTEGER NOT NULL,\n address TEXT NOT NULL,\n tap_tree TEXT NOT NULL,\n forfeit_cb TEXT NOT NULL,\n forfeit_s TEXT NOT NULL,\n intent_cb TEXT NOT NULL,\n intent_s TEXT NOT NULL,\n status_json TEXT NOT NULL,\n extra_witness_json TEXT,\n PRIMARY KEY (txid, vout)\n )\n `);\n\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS ${this.tables.transactions} (\n address TEXT NOT NULL,\n boarding_txid TEXT NOT NULL,\n commitment_txid TEXT NOT NULL,\n ark_txid TEXT NOT NULL,\n type TEXT NOT NULL,\n amount INTEGER NOT NULL,\n settled INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n assets_json TEXT,\n PRIMARY KEY (address, boarding_txid, commitment_txid, ark_txid)\n )\n `);\n\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS ${this.tables.walletState} (\n key TEXT PRIMARY KEY,\n settings_json TEXT,\n last_sync_time INTEGER\n )\n `);\n\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_address ON ${this.tables.vtxos} (address)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_script ON ${this.tables.vtxos} (script)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_script_page ON ${this.tables.vtxos} (script, address, txid, vout)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_address_page ON ${this.tables.vtxos} (address, txid, vout)`,\n );\n // Replaced by the paged partial index below, which serves the same reads in page order.\n await this.db.run(`DROP INDEX IF EXISTS idx_${this.prefix}vtxos_live_script`);\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}vtxos_live_script_page ON ${this.tables.vtxos} (script, address, txid, vout)\n WHERE ${UNSPENT_VTXO_PREDICATE}`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}utxos_address ON ${this.tables.utxos} (address)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}utxos_address_page ON ${this.tables.utxos} (address, txid, vout)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}transactions_address ON ${this.tables.transactions} (address)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}transactions_history ON ${this.tables.transactions} (address, created_at, boarding_txid, commitment_txid, ark_txid)`,\n );\n }\n\n /**\n * Bring the `vtxos` table to the current schema (v1 = `script` NOT NULL).\n *\n * Four cases:\n * - Fresh install: create the v1 schema directly.\n * - Legacy install without a `script` column: add it, backfill from\n * `address`, then rebuild the table with NOT NULL (SQLite cannot add\n * the NOT NULL constraint in place).\n * - Legacy install with a nullable `script` column: backfill the NULLs\n * and rebuild.\n * - 0.4.x install: `script` is already NOT NULL but `virtual_status_json\n * NOT NULL` is still there, and `saveVtxos` no longer writes it.\n *\n * The backfill derives `script` from the Ark address, matching what the\n * indexer would have returned — new rows from the indexer always carry a\n * populated `script`, so the migration is idempotent.\n *\n * The whole check-and-migrate runs inside one transaction, not just the\n * rebuild: the schema inspection is the decision point, so a second\n * concurrent init on the same connection must not read a pre-migration\n * schema and then re-run `ADD COLUMN` (duplicate column) after the first\n * migration already committed. It also guards the crash window between the\n * `DROP TABLE vtxos` and the `RENAME tmp → vtxos`, which would otherwise\n * leave the next startup seeing no `vtxos` table.\n */\n private async migrateVtxosTable(): Promise<void> {\n await runInTransaction(this.db, async (tx) => {\n const tableExists = await tx.get<{ name: string }>(\n `SELECT name FROM sqlite_master WHERE type='table' AND name=?`,\n [this.tables.vtxos],\n );\n if (!tableExists) {\n await tx.run(this.vtxosCreateSql(this.tables.vtxos));\n return;\n }\n\n const cols = await tx.all<{ name: string; notnull: number }>(\n `PRAGMA table_info(${this.tables.vtxos})`,\n );\n const scriptCol = cols.find((c) => c.name === \"script\");\n const nullableCanonicalColumns = [\n [\"is_swept\", \"INTEGER\"],\n [\"is_preconfirmed\", \"INTEGER\"],\n [\"commitment_txids_json\", \"TEXT\"],\n [\"expires_at\", \"TEXT\"],\n [\"expires_at_height\", \"INTEGER\"],\n ] as const;\n let addedCanonicalColumns = false;\n for (const [name, type] of nullableCanonicalColumns) {\n if (!cols.some((c) => c.name === name)) {\n await tx.run(`ALTER TABLE ${this.tables.vtxos} ADD COLUMN ${name} ${type}`);\n addedCanonicalColumns = true;\n }\n }\n // Every row this ALTER touched has the canonical columns NULL by construction, and its\n // state survives only in the legacy blob — which SQLite cannot drop, so it is still\n // there to read. Without the copy a swept row comes back `isSwept: false`, spendable,\n // until the first indexer sync. Runs before the rebuild below, whose INSERT…SELECT\n // carries these columns across.\n const hasLegacyBlob = cols.some((c) => c.name === \"virtual_status_json\");\n if (addedCanonicalColumns && hasLegacyBlob) {\n await this.backfillCanonicalVtxoColumns(tx);\n }\n if (scriptCol && scriptCol.notnull === 1 && !hasLegacyBlob) {\n // Already on v1 schema.\n return;\n }\n\n if (!scriptCol) {\n await tx.run(`ALTER TABLE ${this.tables.vtxos} ADD COLUMN script TEXT`);\n }\n\n // Backfill any NULL scripts from the owning address. Derivation\n // is deterministic, so re-running after a rolled-back attempt\n // produces the same values.\n const nullRows = await tx.all<{\n txid: string;\n vout: number;\n address: string;\n }>(`SELECT txid, vout, address FROM ${this.tables.vtxos} WHERE script IS NULL`);\n for (const row of nullRows) {\n await tx.run(\n `UPDATE ${this.tables.vtxos} SET script = ? WHERE txid = ? AND vout = ?`,\n [scriptFromArkAddress(row.address), row.txid, row.vout],\n );\n }\n\n // SQLite can't turn a nullable column into NOT NULL in place —\n // do the canonical 12-step table rebuild. Drop any stale temp\n // table from a prior aborted attempt first.\n const tempName = `${this.tables.vtxos}__migrate_tmp`;\n await tx.run(`DROP TABLE IF EXISTS ${tempName}`);\n await tx.run(this.vtxosCreateSql(tempName));\n await tx.run(`\n INSERT INTO ${tempName}\n (txid, vout, value, address, tap_tree,\n forfeit_cb, forfeit_s, intent_cb, intent_s,\n status_json, created_at, is_unrolled, is_spent,\n is_swept, is_preconfirmed, commitment_txids_json,\n expires_at, expires_at_height,\n spent_by, settled_by, ark_tx_id, extra_witness_json, assets_json, script)\n SELECT txid, vout, value, address, tap_tree,\n forfeit_cb, forfeit_s, intent_cb, intent_s,\n status_json, created_at, is_unrolled, is_spent,\n is_swept, is_preconfirmed, commitment_txids_json,\n expires_at, expires_at_height,\n spent_by, settled_by, ark_tx_id, extra_witness_json, assets_json, script\n FROM ${this.tables.vtxos}\n `);\n await tx.run(`DROP TABLE ${this.tables.vtxos}`);\n await tx.run(`ALTER TABLE ${tempName} RENAME TO ${this.tables.vtxos}`);\n });\n }\n\n /**\n * Copy the canonical VTXO facts out of the legacy `virtual_status_json` blob.\n *\n * Scoped to rows that still have `is_swept` NULL, which is what \"never backfilled\" looks\n * like: the copy writes 0 or 1 to every row it touches, so a second pass — a later column\n * addition, say — cannot overwrite what an indexer sync has since corrected. Rows whose blob\n * is missing or corrupt are left alone: a migration must not be stopped by one bad row, and\n * the next sync repairs it.\n */\n private async backfillCanonicalVtxoColumns(tx: SQLExecutor): Promise<void> {\n const rows = await tx.all<{\n txid: string;\n vout: number;\n virtual_status_json: string | null;\n }>(\n `SELECT txid, vout, virtual_status_json FROM ${this.tables.vtxos}\n WHERE virtual_status_json IS NOT NULL AND is_swept IS NULL`,\n );\n for (const row of rows) {\n const facts = legacyVtxoFacts(row.virtual_status_json);\n if (!facts) continue;\n await tx.run(\n `UPDATE ${this.tables.vtxos}\n SET is_swept = ?, is_preconfirmed = ?, commitment_txids_json = ?,\n expires_at = ?, expires_at_height = ?,\n is_spent = COALESCE(is_spent, ?)\n WHERE txid = ? AND vout = ?`,\n [\n facts.isSwept ? 1 : 0,\n facts.isPreconfirmed ? 1 : 0,\n facts.commitmentTxIds ? JSON.stringify(facts.commitmentTxIds) : null,\n facts.expiresAt ? facts.expiresAt.toISOString() : null,\n facts.expiresAtHeight ?? null,\n facts.isSpent ? 1 : 0,\n row.txid,\n row.vout,\n ],\n );\n }\n }\n\n private vtxosCreateSql(tableName: string): string {\n return `CREATE TABLE ${tableName} (\n txid TEXT NOT NULL,\n vout INTEGER NOT NULL,\n value INTEGER NOT NULL,\n address TEXT NOT NULL,\n tap_tree TEXT NOT NULL,\n forfeit_cb TEXT NOT NULL,\n forfeit_s TEXT NOT NULL,\n intent_cb TEXT NOT NULL,\n intent_s TEXT NOT NULL,\n status_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n is_unrolled INTEGER NOT NULL DEFAULT 0,\n is_spent INTEGER,\n is_swept INTEGER,\n is_preconfirmed INTEGER,\n commitment_txids_json TEXT,\n expires_at TEXT,\n expires_at_height INTEGER,\n spent_by TEXT,\n settled_by TEXT,\n ark_tx_id TEXT,\n extra_witness_json TEXT,\n assets_json TEXT,\n script TEXT NOT NULL,\n PRIMARY KEY (txid, vout)\n )`;\n }\n\n /**\n * `INSERT OR REPLACE` rows, as many to a statement as the parameter budget allows.\n * No enclosing transaction: on the shared connection it would take in other repos' writes.\n */\n private async insertOrReplace(\n table: string,\n columns: string,\n rows: unknown[][],\n ): Promise<void> {\n const width = columns.split(\",\").length;\n const tuple = `(${Array(width).fill(\"?\").join(\", \")})`;\n const rowsPerStatement = Math.floor(MAX_BOUND_PARAMETERS / width);\n for (let i = 0; i < rows.length; i += rowsPerStatement) {\n const chunk = rows.slice(i, i + rowsPerStatement);\n await this.db.run(\n `INSERT OR REPLACE INTO ${table} (${columns})\n VALUES ${chunk.map(() => tuple).join(\", \")}`,\n chunk.flat(),\n );\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n // no-op — consumer owns the SQLExecutor lifecycle\n }\n\n // ── Clear ──────────────────────────────────────────────────────────\n\n async clear(): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.vtxos}`);\n await this.db.run(`DELETE FROM ${this.tables.utxos}`);\n await this.db.run(`DELETE FROM ${this.tables.transactions}`);\n await this.db.run(`DELETE FROM ${this.tables.walletState}`);\n }\n\n // ── VTXO management ────────────────────────────────────────────────\n\n async getVtxosPage(\n address: string,\n page: PageRequest<Outpoint>,\n ): Promise<PageResult<ExtendedVirtualCoin, Outpoint>> {\n return this.pageByAddress(this.tables.vtxos, address, page, vtxoRowToDomain);\n }\n\n async saveVtxos(address: string, vtxos: ExtendedVirtualCoin[]): Promise<void> {\n await this.ensureInit();\n await this.insertOrReplace(\n this.tables.vtxos,\n `txid, vout, value, address,\n tap_tree, forfeit_cb, forfeit_s, intent_cb, intent_s,\n status_json, created_at, is_unrolled, is_spent,\n is_swept, is_preconfirmed, commitment_txids_json,\n expires_at, expires_at_height,\n spent_by, settled_by, ark_tx_id, extra_witness_json, assets_json, script`,\n vtxos.map((vtxo) => {\n const s = serializeVtxo(vtxo);\n return [\n s.txid,\n s.vout,\n s.value,\n address,\n s.tapTree,\n s.forfeitTapLeafScript.cb,\n s.forfeitTapLeafScript.s,\n s.intentTapLeafScript.cb,\n s.intentTapLeafScript.s,\n JSON.stringify(s.status),\n createdAtToIso(s.createdAt),\n s.isUnrolled ? 1 : 0,\n s.isSpent === undefined ? null : s.isSpent ? 1 : 0,\n s.isSwept === undefined ? null : s.isSwept ? 1 : 0,\n s.isPreconfirmed === undefined ? null : s.isPreconfirmed ? 1 : 0,\n s.commitmentTxIds ? JSON.stringify(s.commitmentTxIds) : null,\n s.expiresAt === undefined ? null : new Date(s.expiresAt).toISOString(),\n s.expiresAtHeight ?? null,\n s.spentBy ?? null,\n s.settledBy ?? null,\n s.arkTxId ?? null,\n s.extraWitness ? JSON.stringify(s.extraWitness) : null,\n s.assets ? JSON.stringify(s.assets) : null,\n s.script ?? null,\n ];\n }),\n );\n }\n\n async deleteVtxos(address: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.vtxos} WHERE address = ?`, [address]);\n }\n\n async getVtxosForScriptPage(\n script: string,\n page: PageRequest<ScriptVtxoCursor>,\n options?: ScriptVtxoPageOptions,\n ): Promise<PageResult<StoredVtxo, ScriptVtxoCursor>> {\n assertPageRequest(page);\n await this.ensureInit();\n const after = page.after;\n const rows = await this.db.all<VtxoRow>(\n `SELECT * FROM ${this.tables.vtxos} WHERE script = ?\n ${options?.unspentOnly ? `AND ${UNSPENT_VTXO_PREDICATE}` : \"\"}\n ${after ? \"AND (address > ? OR (address = ? AND (txid > ? OR (txid = ? AND vout > ?))))\" : \"\"}\n ORDER BY address, txid, vout LIMIT ?`,\n after\n ? [\n script,\n after.address,\n after.address,\n after.txid,\n after.txid,\n after.vout,\n page.limit + 1,\n ]\n : [script, page.limit + 1],\n );\n const result = pageResult(\n rows.map((row) => ({ address: row.address, vtxo: vtxoRowToDomain(row) })),\n page.limit,\n (row) => ({ address: row.address, txid: row.vtxo.txid, vout: row.vtxo.vout }),\n );\n // Legacy facts decoded from the row can still mark it spent.\n return options?.unspentOnly\n ? { ...result, items: result.items.filter((row) => !isVtxoSpent(row.vtxo)) }\n : result;\n }\n\n async saveVtxosForScript(key: VtxoRepositoryKey, vtxos: ExtendedVirtualCoin[]): Promise<void> {\n return this.saveVtxos(checkSaveVtxosForScript(\"SQLiteWalletRepository\", key, vtxos), vtxos);\n }\n\n async deleteVtxosForScript(script: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.vtxos} WHERE script = ?`, [script]);\n }\n\n // ── UTXO management ────────────────────────────────────────────────\n\n async getUtxosPage(\n address: string,\n page: PageRequest<Outpoint>,\n ): Promise<PageResult<ExtendedCoin, Outpoint>> {\n return this.pageByAddress(this.tables.utxos, address, page, utxoRowToDomain);\n }\n\n private async pageByAddress<Row extends Outpoint, Item>(\n table: string,\n address: string,\n page: PageRequest<Outpoint>,\n deserialize: (row: Row) => Item,\n ): Promise<PageResult<Item, Outpoint>> {\n assertPageRequest(page);\n await this.ensureInit();\n const rows = await this.db.all<Row>(\n `SELECT * FROM ${table} WHERE address = ? AND (txid, vout) > (?, ?)\n ORDER BY txid, vout LIMIT ?`,\n [address, page.after?.txid ?? \"\", page.after?.vout ?? -1, page.limit + 1],\n );\n const result = pageResult(rows, page.limit, ({ txid, vout }) => ({ txid, vout }));\n return { items: result.items.map(deserialize), nextCursor: result.nextCursor };\n }\n\n async saveUtxos(\n addressOrBatch: string | ReadonlyMap<string, ExtendedCoin[]>,\n utxos?: ExtendedCoin[],\n ): Promise<void> {\n await this.ensureInit();\n const rows = utxoEntries(addressOrBatch, utxos).flatMap(([address, list]) =>\n list.map((utxo) => {\n const s = serializeUtxo(utxo);\n return [\n s.txid,\n s.vout,\n s.value,\n address,\n s.tapTree,\n s.forfeitTapLeafScript.cb,\n s.forfeitTapLeafScript.s,\n s.intentTapLeafScript.cb,\n s.intentTapLeafScript.s,\n JSON.stringify(s.status),\n s.extraWitness ? JSON.stringify(s.extraWitness) : null,\n ];\n }),\n );\n await this.insertOrReplace(\n this.tables.utxos,\n `txid, vout, value, address,\n tap_tree, forfeit_cb, forfeit_s, intent_cb, intent_s,\n status_json, extra_witness_json`,\n rows,\n );\n }\n\n async deleteUtxos(address: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.utxos} WHERE address = ?`, [address]);\n }\n\n // ── Transaction history ────────────────────────────────────────────\n\n async getTransactionHistoryPage(\n filter: TransactionHistoryPageFilter,\n page: PageRequest<TransactionHistoryPageCursor>,\n ): Promise<PageResult<ArkTransaction, TransactionHistoryPageCursor>> {\n assertPageRequest(page);\n assertHistoryPageFilter(filter);\n await this.ensureInit();\n const conditions = [\"address = ?\"];\n const params: unknown[] = [filter.address];\n if (filter.since !== undefined) {\n conditions.push(\"created_at >= ?\");\n params.push(filter.since);\n }\n if (page.after !== undefined) {\n conditions.push(\n \"(created_at, boarding_txid, commitment_txid, ark_txid) > (?, ?, ?, ?)\",\n );\n params.push(\n page.after.createdAt,\n page.after.key.boardingTxid,\n page.after.key.commitmentTxid,\n page.after.key.arkTxid,\n );\n }\n const rows = await this.db.all<TransactionRow>(\n `SELECT * FROM ${this.tables.transactions} WHERE ${conditions.join(\" AND \")}\n ORDER BY created_at, boarding_txid, commitment_txid, ark_txid LIMIT ?`,\n [...params, page.limit + 1],\n );\n return pageResult(rows.map(txRowToDomain), page.limit, (tx) => ({\n createdAt: tx.createdAt,\n key: tx.key,\n }));\n }\n\n async saveTransactions(address: string, txs: ArkTransaction[]): Promise<void> {\n await this.ensureInit();\n await this.insertOrReplace(\n this.tables.transactions,\n `address, boarding_txid, commitment_txid, ark_txid,\n type, amount, settled, created_at, assets_json`,\n txs.map((tx) => [\n address,\n tx.key.boardingTxid,\n tx.key.commitmentTxid,\n tx.key.arkTxid,\n tx.type,\n tx.amount,\n tx.settled ? 1 : 0,\n tx.createdAt,\n tx.assets ? JSON.stringify(serializeAssets(tx.assets)) : null,\n ]),\n );\n }\n\n async deleteTransactions(address: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.tables.transactions} WHERE address = ?`, [address]);\n }\n\n // ── Wallet state ───────────────────────────────────────────────────\n\n private readonly atomicState: AtomicWalletState = {\n version: 1,\n update: async (updater) => {\n await this.ensureInit();\n await runInTransaction(this.db, async (tx) => {\n const row = await tx.get<WalletStateRow>(\n `SELECT * FROM ${this.tables.walletState} WHERE key = ?`,\n [\"state\"],\n );\n const current: WalletState = row\n ? {\n settings: row.settings_json ? JSON.parse(row.settings_json) : undefined,\n lastSyncTime: row.last_sync_time ?? undefined,\n }\n : {};\n const state = applyWalletStateUpdate(current, updater);\n await tx.run(\n `INSERT OR REPLACE INTO ${this.tables.walletState}\n (key, settings_json, last_sync_time) VALUES (?, ?, ?)`,\n [\n \"state\",\n state.settings ? JSON.stringify(state.settings) : null,\n state.lastSyncTime ?? null,\n ],\n );\n });\n },\n };\n\n async getWalletState(): Promise<WalletState | null> {\n await this.ensureInit();\n const row = await this.db.get<WalletStateRow>(\n `SELECT * FROM ${this.tables.walletState} WHERE key = ?`,\n [\"state\"],\n );\n if (!row) return null;\n\n const state: WalletState = {};\n if (row.settings_json) {\n state.settings = JSON.parse(row.settings_json);\n }\n state.lastSyncTime = row.last_sync_time ?? undefined;\n return state;\n }\n\n async saveWalletState(state: WalletState): Promise<void> {\n await this.ensureInit();\n await this.db.run(\n `INSERT OR REPLACE INTO ${this.tables.walletState}\n (key, settings_json, last_sync_time)\n VALUES (?, ?, ?)`,\n [\n \"state\",\n state.settings ? JSON.stringify(state.settings) : null,\n state.lastSyncTime ?? null,\n ],\n );\n }\n}\n\n// ── Row types ──────────────────────────────────────────────────────────\n\ninterface VtxoRow {\n txid: string;\n vout: number;\n value: number;\n address: string;\n tap_tree: string;\n forfeit_cb: string;\n forfeit_s: string;\n intent_cb: string;\n intent_s: string;\n status_json: string;\n created_at: string;\n is_unrolled: number;\n is_spent: number | null;\n is_swept?: number | null;\n is_preconfirmed?: number | null;\n commitment_txids_json?: string | null;\n expires_at?: string | null;\n expires_at_height?: number | null;\n spent_by: string | null;\n settled_by: string | null;\n ark_tx_id: string | null;\n extra_witness_json: string | null;\n assets_json: string | null;\n script: string | null;\n}\n\ninterface UtxoRow {\n txid: string;\n vout: number;\n value: number;\n address: string;\n tap_tree: string;\n forfeit_cb: string;\n forfeit_s: string;\n intent_cb: string;\n intent_s: string;\n status_json: string;\n extra_witness_json: string | null;\n}\n\ninterface TransactionRow {\n address: string;\n boarding_txid: string;\n commitment_txid: string;\n ark_txid: string;\n type: string;\n amount: number;\n settled: number;\n created_at: number;\n assets_json: string | null;\n}\n\ninterface WalletStateRow {\n key: string;\n settings_json: string | null;\n last_sync_time: number | null;\n}\n\n// The page query repeats the index predicate verbatim so SQLite can use the partial index.\nconst UNSPENT_VTXO_PREDICATE =\n \"(is_spent IS NULL OR is_spent = 0) AND (spent_by IS NULL OR spent_by = '') AND (settled_by IS NULL OR settled_by = '')\";\n\n// ── Row → Domain converters ────────────────────────────────────────────\n\nfunction vtxoRowToDomain(row: VtxoRow): ExtendedVirtualCoin {\n const serialized = {\n txid: row.txid,\n vout: row.vout,\n value: row.value,\n tapTree: row.tap_tree,\n forfeitTapLeafScript: {\n cb: row.forfeit_cb,\n s: row.forfeit_s,\n } as SerializedTapLeaf,\n intentTapLeafScript: {\n cb: row.intent_cb,\n s: row.intent_s,\n } as SerializedTapLeaf,\n status: JSON.parse(row.status_json),\n createdAt: new Date(row.created_at),\n isUnrolled: row.is_unrolled === 1,\n isSpent: row.is_spent === null ? undefined : row.is_spent === 1,\n isSwept: row.is_swept == null ? undefined : row.is_swept === 1,\n isPreconfirmed: row.is_preconfirmed == null ? undefined : row.is_preconfirmed === 1,\n commitmentTxIds: row.commitment_txids_json\n ? JSON.parse(row.commitment_txids_json)\n : undefined,\n expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,\n expiresAtHeight: row.expires_at_height ?? undefined,\n spentBy: row.spent_by ?? undefined,\n settledBy: row.settled_by ?? undefined,\n arkTxId: row.ark_tx_id ?? undefined,\n extraWitness: row.extra_witness_json ? JSON.parse(row.extra_witness_json) : undefined,\n assets: row.assets_json ? JSON.parse(row.assets_json) : undefined,\n // Post-migration every row has `script`, but the backfill is\n // idempotent: derive from `address` if the legacy column is still\n // null (e.g. the migration hasn't run yet on this handle).\n script: row.script ?? scriptFromArkAddress(row.address),\n };\n\n return deserializeVtxo(serialized);\n}\n\nfunction utxoRowToDomain(row: UtxoRow): ExtendedCoin {\n const serialized = {\n txid: row.txid,\n vout: row.vout,\n value: row.value,\n tapTree: row.tap_tree,\n forfeitTapLeafScript: {\n cb: row.forfeit_cb,\n s: row.forfeit_s,\n } as SerializedTapLeaf,\n intentTapLeafScript: {\n cb: row.intent_cb,\n s: row.intent_s,\n } as SerializedTapLeaf,\n status: JSON.parse(row.status_json),\n extraWitness: row.extra_witness_json ? JSON.parse(row.extra_witness_json) : undefined,\n };\n\n return deserializeUtxo(serialized);\n}\n\nfunction txRowToDomain(row: TransactionRow): ArkTransaction {\n const tx: ArkTransaction = {\n key: {\n boardingTxid: row.boarding_txid,\n commitmentTxid: row.commitment_txid,\n arkTxid: row.ark_txid,\n },\n type: row.type as ArkTransaction[\"type\"],\n amount: row.amount,\n settled: row.settled === 1,\n createdAt: row.created_at,\n };\n if (row.assets_json) {\n tx.assets = deserializeAssets(JSON.parse(row.assets_json));\n }\n return tx;\n}\n","import { Contract, ContractState, ContractWatchState } from \"../../contracts/types\";\nimport {\n contractFilterMatchesNothing,\n ContractFilter,\n ContractRepository,\n} from \"../contractRepository\";\nimport { assertPageRequest, pageResult, type PageRequest, type PageResult } from \"../page\";\nimport { SQLExecutor } from \"./types\";\nimport { getSerializedExecutor } from \"./transaction\";\nimport { sanitizeTablePrefix } from \"./prefix\";\n\n/** A row stored before the `watch` column existed holds NULL and counts as \"watched\".\n * Indexes and filters must share this expression: SQLite uses an expression index\n * only for a WHERE term with the same expression. */\nconst WATCH_STATE = \"IFNULL(watch, 'watched')\";\n\ninterface SQLiteContractRepositoryOptions {\n /** Table name prefix (default: \"ark_\") */\n prefix?: string;\n}\n\n/**\n * SQLite-based implementation of ContractRepository.\n *\n * Uses the SQLExecutor interface so consumers can plug in any SQLite driver\n * (expo-sqlite, better-sqlite3, etc.).\n *\n * Tables are created lazily on first operation via `ensureInit()`.\n * The consumer owns the SQLExecutor lifecycle — `[Symbol.asyncDispose]` is a no-op.\n */\nexport class SQLiteContractRepository implements ContractRepository {\n readonly version = 3 as const;\n private readonly db: SQLExecutor;\n private initPromise: Promise<void> | null = null;\n private readonly prefix: string;\n private readonly table: string;\n\n constructor(db: SQLExecutor, options?: SQLiteContractRepositoryOptions) {\n this.db = getSerializedExecutor(db);\n this.prefix = sanitizeTablePrefix(options?.prefix ?? \"ark_\");\n this.table = `${this.prefix}contracts`;\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n private ensureInit(): Promise<void> {\n if (!this.initPromise) {\n this.initPromise = this.init();\n }\n return this.initPromise;\n }\n\n private async init(): Promise<void> {\n await this.db.run(`\n CREATE TABLE IF NOT EXISTS ${this.table} (\n script TEXT PRIMARY KEY,\n address TEXT NOT NULL,\n type TEXT NOT NULL,\n state TEXT NOT NULL,\n params_json TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n expires_at INTEGER,\n label TEXT,\n metadata_json TEXT,\n watch TEXT\n )\n `);\n\n // Nullable and added in place, so a table created before the\n // column existed keeps every row and reads back as \"watched\" —\n // the coverage those rows have today.\n await this.addColumnIfMissing(\"watch\", \"TEXT\");\n\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}contracts_type ON ${this.table} (type)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}contracts_state ON ${this.table} (state)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}contracts_watch_state ON ${this.table} (${WATCH_STATE}, script)`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}contracts_type_watch_state ON ${this.table} (type, ${WATCH_STATE}, script)`,\n );\n }\n\n private async addColumnIfMissing(column: string, type: string): Promise<void> {\n const columns = await this.db.all<{ name: string }>(`PRAGMA table_info(${this.table})`);\n if (columns.some((c) => c.name === column)) return;\n await this.db.run(`ALTER TABLE ${this.table} ADD COLUMN ${column} ${type}`);\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n // no-op — consumer owns the SQLExecutor lifecycle\n }\n\n // ── Clear ──────────────────────────────────────────────────────────\n\n async clear(): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.table}`);\n }\n\n // ── Contract management ────────────────────────────────────────────\n\n async getContractsPage(\n filter: ContractFilter | undefined,\n page: PageRequest,\n ): Promise<PageResult<Contract>> {\n assertPageRequest(page);\n await this.ensureInit();\n if (contractFilterMatchesNothing(filter)) return { items: [] };\n const conditions: string[] = [];\n const params: unknown[] = [];\n if (filter) {\n this.addFilterCondition(conditions, params, \"script\", filter.script);\n this.addFilterCondition(conditions, params, \"state\", filter.state);\n this.addFilterCondition(conditions, params, \"type\", filter.type);\n this.addFilterCondition(conditions, params, WATCH_STATE, filter.watch);\n }\n if (page.after !== undefined) {\n conditions.push(\"script > ?\");\n params.push(page.after);\n }\n const where = conditions.length ? ` WHERE ${conditions.join(\" AND \")}` : \"\";\n const rows = await this.db.all<ContractRow>(\n `SELECT * FROM ${this.table}${where} ORDER BY script LIMIT ?`,\n [...params, page.limit + 1],\n );\n return pageResult(rows.map(contractRowToDomain), page.limit, (contract) => contract.script);\n }\n\n async saveContract(contract: Contract): Promise<void> {\n await this.ensureInit();\n await this.db.run(\n `INSERT OR REPLACE INTO ${this.table}\n (script, address, type, state, params_json,\n created_at, label, metadata_json, watch)\n VALUES (?, ?, ?, ?, ?,\n ?, ?, ?, ?)`,\n [\n contract.script,\n contract.address,\n contract.type,\n contract.state,\n JSON.stringify(contract.params),\n contract.createdAt,\n contract.label ?? null,\n contract.metadata ? JSON.stringify(contract.metadata) : null,\n contract.watch ?? null,\n ],\n );\n }\n\n async deleteContract(script: string): Promise<void> {\n await this.ensureInit();\n await this.db.run(`DELETE FROM ${this.table} WHERE script = ?`, [script]);\n }\n\n // ── Helpers ─────────────────────────────────────────────────────────\n\n private addFilterCondition(\n conditions: string[],\n params: unknown[],\n column: string,\n value?: string | string[],\n ): void {\n if (value === undefined) return;\n\n if (Array.isArray(value)) {\n if (value.length === 0) return;\n const placeholders = value.map(() => \"?\").join(\", \");\n conditions.push(`${column} IN (${placeholders})`);\n params.push(...value);\n } else {\n conditions.push(`${column} = ?`);\n params.push(value);\n }\n }\n}\n\n// ── Row type ────────────────────────────────────────────────────────────\n\ninterface ContractRow {\n script: string;\n address: string;\n type: string;\n state: string;\n params_json: string;\n created_at: number;\n label: string | null;\n metadata_json: string | null;\n watch: string | null;\n}\n\n// ── Row → Domain converter ──────────────────────────────────────────────\n\nfunction contractRowToDomain(row: ContractRow): Contract {\n const contract: Contract = {\n script: row.script,\n address: row.address,\n type: row.type,\n state: row.state as ContractState,\n params: JSON.parse(row.params_json),\n createdAt: row.created_at,\n };\n\n if (row.label !== null) {\n contract.label = row.label;\n }\n if (row.metadata_json !== null) {\n contract.metadata = JSON.parse(row.metadata_json);\n }\n if (row.watch !== null && row.watch !== undefined) {\n contract.watch = row.watch as ContractWatchState;\n }\n\n return contract;\n}\n","import { Outpoint } from \"../../wallet\";\nimport {\n ArkIntent,\n ArkIntentState,\n IntentPageFilter,\n IntentRepository,\n intentMatchesFilter,\n isTerminalIntentState,\n} from \"../intentRepository\";\nimport { assertPageRequest, pageResult, type PageRequest, type PageResult } from \"../page\";\nimport { SQLExecutor } from \"./types\";\nimport { getSerializedExecutor, runInTransaction } from \"./transaction\";\nimport { sanitizeTablePrefix } from \"./prefix\";\n\ninterface IntentRow {\n intent_tx_id: string;\n intent_id: string | null;\n state: string;\n valid_from: number | null;\n valid_until: number | null;\n created_at: number;\n updated_at: number;\n register_proof: string;\n register_proof_message: string;\n delete_proof: string;\n delete_proof_message: string;\n batch_id: string | null;\n commitment_txid: string | null;\n cancellation_reason: string | null;\n partial_forfeits_json: string;\n signer_descriptor: string | null;\n intent_vtxos_json: string;\n}\n\nexport class SQLiteIntentRepository implements IntentRepository {\n readonly version = 1 as const;\n private readonly db: SQLExecutor;\n private initPromise: Promise<void> | null = null;\n private readonly prefix: string;\n private readonly t: string;\n\n constructor(db: SQLExecutor, options?: { prefix?: string }) {\n this.db = getSerializedExecutor(db);\n this.prefix = sanitizeTablePrefix(options?.prefix ?? \"ark_\");\n this.t = `${this.prefix}intents`;\n }\n\n private ensureInit(): Promise<void> {\n if (!this.initPromise) this.initPromise = this.init();\n return this.initPromise;\n }\n\n private async init(): Promise<void> {\n await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.t} (\n intent_tx_id TEXT PRIMARY KEY,\n intent_id TEXT,\n state TEXT NOT NULL,\n valid_from INTEGER,\n valid_until INTEGER,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n register_proof TEXT NOT NULL,\n register_proof_message TEXT NOT NULL,\n delete_proof TEXT NOT NULL,\n delete_proof_message TEXT NOT NULL,\n batch_id TEXT,\n commitment_txid TEXT,\n cancellation_reason TEXT,\n partial_forfeits_json TEXT NOT NULL,\n signer_descriptor TEXT,\n intent_vtxos_json TEXT NOT NULL\n )`);\n await this.db.run(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_${this.prefix}intent_id ON ${this.t} (intent_id) WHERE intent_id IS NOT NULL`,\n );\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}intent_state ON ${this.t} (state)`,\n );\n }\n\n async clear(): Promise<void> {\n await this.ensureInit();\n // Route through the same serialized write chain as saveIntent so a\n // clear can't interleave with an in-flight transaction on this executor.\n await runInTransaction(this.db, async (tx) => {\n await tx.run(`DELETE FROM ${this.t}`);\n });\n }\n\n async saveIntent(intent: ArkIntent): Promise<void> {\n await this.ensureInit();\n const now = Date.now();\n await runInTransaction(this.db, async (tx) => {\n // Upsert by the primary key only. INSERT OR REPLACE would also fire\n // on the intent_id unique index, silently deleting the *other* row\n // that holds it; ON CONFLICT(intent_tx_id) updates in place and lets\n // an intent_id collision surface as a constraint error instead.\n await tx.run(\n `INSERT INTO ${this.t}\n (intent_tx_id, intent_id, state, valid_from, valid_until,\n created_at, updated_at, register_proof, register_proof_message,\n delete_proof, delete_proof_message, batch_id, commitment_txid,\n cancellation_reason, partial_forfeits_json, signer_descriptor,\n intent_vtxos_json)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(intent_tx_id) DO UPDATE SET\n intent_id = excluded.intent_id,\n state = excluded.state,\n valid_from = excluded.valid_from,\n valid_until = excluded.valid_until,\n created_at = excluded.created_at,\n updated_at = excluded.updated_at,\n register_proof = excluded.register_proof,\n register_proof_message = excluded.register_proof_message,\n delete_proof = excluded.delete_proof,\n delete_proof_message = excluded.delete_proof_message,\n batch_id = excluded.batch_id,\n commitment_txid = excluded.commitment_txid,\n cancellation_reason = excluded.cancellation_reason,\n partial_forfeits_json = excluded.partial_forfeits_json,\n signer_descriptor = excluded.signer_descriptor,\n intent_vtxos_json = excluded.intent_vtxos_json`,\n [\n intent.intentTxId,\n intent.intentId ?? null,\n intent.state,\n intent.validFrom ?? null,\n intent.validUntil ?? null,\n intent.createdAt,\n now,\n intent.registerProof,\n intent.registerProofMessage,\n intent.deleteProof,\n intent.deleteProofMessage,\n intent.batchId ?? null,\n intent.commitmentTransactionId ?? null,\n intent.cancellationReason ?? null,\n JSON.stringify(intent.partialForfeits),\n intent.signerDescriptor ?? null,\n JSON.stringify(intent.intentVtxos),\n ],\n );\n });\n }\n\n async getIntentsPage(\n filter: IntentPageFilter | undefined,\n page: PageRequest,\n ): Promise<PageResult<ArkIntent>> {\n assertPageRequest(page);\n await this.ensureInit();\n if (filter?.states?.length === 0) return { items: [] };\n const stateSql = filter?.states\n ? ` AND state IN (${filter.states.map(() => \"?\").join(\", \")})`\n : \"\";\n const stateParams = filter?.states ?? [];\n const batchSize = Math.max(64, page.limit + 1);\n const rows: ArkIntent[] = [];\n let after = page.after;\n // SQL narrows by indexed state; the shared filter handles the remaining predicates.\n while (rows.length <= page.limit) {\n const batch = await this.db.all<IntentRow>(\n `SELECT * FROM ${this.t} WHERE intent_tx_id > ?${stateSql} ORDER BY intent_tx_id LIMIT ?`,\n [after ?? \"\", ...stateParams, batchSize],\n );\n if (batch.length === 0) break;\n for (const row of batch) {\n after = row.intent_tx_id;\n const intent = rowToIntent(row);\n if (!filter || intentMatchesFilter(intent, filter)) rows.push(intent);\n if (rows.length > page.limit) break;\n }\n if (batch.length < batchSize) break;\n }\n return pageResult(rows, page.limit, (intent) => intent.intentTxId);\n }\n\n async getLockedVtxoOutpoints(): Promise<Outpoint[]> {\n await this.ensureInit();\n const rows = await this.db.all<IntentRow>(`SELECT * FROM ${this.t}`);\n const out: Outpoint[] = [];\n for (const r of rows) {\n if (isTerminalIntentState(r.state as ArkIntentState)) continue;\n for (const o of JSON.parse(r.intent_vtxos_json) as Outpoint[]) out.push(o);\n }\n return out;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {}\n}\n\nfunction rowToIntent(r: IntentRow): ArkIntent {\n return {\n intentTxId: r.intent_tx_id,\n intentId: r.intent_id ?? undefined,\n state: r.state as ArkIntentState,\n validFrom: r.valid_from ?? undefined,\n validUntil: r.valid_until ?? undefined,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n registerProof: r.register_proof,\n registerProofMessage: r.register_proof_message,\n deleteProof: r.delete_proof,\n deleteProofMessage: r.delete_proof_message,\n batchId: r.batch_id ?? undefined,\n commitmentTransactionId: r.commitment_txid ?? undefined,\n cancellationReason: r.cancellation_reason ?? undefined,\n partialForfeits: JSON.parse(r.partial_forfeits_json),\n signerDescriptor: r.signer_descriptor ?? undefined,\n intentVtxos: JSON.parse(r.intent_vtxos_json),\n };\n}\n","import { Outpoint } from \"../../wallet\";\nimport {\n ChainedTxType,\n mergeChainedTxType,\n VirtualTx,\n VirtualTxRepository,\n VtxoBranch,\n} from \"../virtualTxRepository\";\nimport { SQLExecutor } from \"./types\";\nimport { getSerializedExecutor, runInTransaction } from \"./transaction\";\nimport { sanitizeTablePrefix } from \"./prefix\";\n\ninterface VtxRow {\n txid: string;\n psbt: string | null;\n expires_at: number | null;\n type: number;\n}\nexport class SQLiteVirtualTxRepository implements VirtualTxRepository {\n readonly version = 1 as const;\n private readonly db: SQLExecutor;\n private initPromise: Promise<void> | null = null;\n private readonly prefix: string;\n private readonly tTx: string;\n private readonly tBranch: string;\n\n constructor(db: SQLExecutor, options?: { prefix?: string }) {\n this.db = getSerializedExecutor(db);\n this.prefix = sanitizeTablePrefix(options?.prefix ?? \"ark_\");\n this.tTx = `${this.prefix}virtual_txs`;\n this.tBranch = `${this.prefix}vtxo_branches`;\n }\n\n private ensureInit(): Promise<void> {\n if (!this.initPromise) this.initPromise = this.init();\n return this.initPromise;\n }\n\n private async init(): Promise<void> {\n await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.tTx} (\n txid TEXT PRIMARY KEY,\n psbt TEXT,\n expires_at INTEGER,\n type INTEGER NOT NULL DEFAULT 0\n )`);\n await this.db.run(`CREATE TABLE IF NOT EXISTS ${this.tBranch} (\n vtxo_txid TEXT NOT NULL,\n vtxo_vout INTEGER NOT NULL,\n virtual_txid TEXT NOT NULL,\n position INTEGER NOT NULL,\n PRIMARY KEY (vtxo_txid, vtxo_vout, position)\n )`);\n await this.db.run(\n `CREATE INDEX IF NOT EXISTS idx_${this.prefix}branch_vtxid ON ${this.tBranch} (virtual_txid)`,\n );\n }\n\n async clear(): Promise<void> {\n await this.ensureInit();\n await runInTransaction(this.db, async (tx) => {\n await tx.run(`DELETE FROM ${this.tTx}`);\n await tx.run(`DELETE FROM ${this.tBranch}`);\n });\n }\n\n async upsertVirtualTxs(txs: VirtualTx[]): Promise<void> {\n if (txs.length === 0) return;\n await this.ensureInit();\n await runInTransaction(this.db, async (tx) => {\n // Prefetch existing rows in one query instead of a SELECT per tx,\n // then merge (new value wins, else keep the stored one) in memory.\n const placeholders = txs.map(() => \"?\").join(\", \");\n const existing = await tx.all<VtxRow>(\n `SELECT * FROM ${this.tTx} WHERE txid IN (${placeholders})`,\n txs.map((t) => t.txid),\n );\n const prevByTxid = new Map(existing.map((r) => [r.txid, r]));\n for (const t of txs) {\n const prev = prevByTxid.get(t.txid);\n const psbt = t.psbt ?? prev?.psbt ?? null;\n const expires = t.expiresAt ?? prev?.expires_at ?? null;\n const type = mergeChainedTxType(t.type, prev?.type);\n await tx.run(\n `INSERT OR REPLACE INTO ${this.tTx} (txid, psbt, expires_at, type) VALUES (?, ?, ?, ?)`,\n [t.txid, psbt, expires, type],\n );\n // A txid repeated later in the same batch must merge onto this\n // just-written row, matching the original per-tx-read behavior.\n prevByTxid.set(t.txid, { txid: t.txid, psbt, expires_at: expires, type });\n }\n });\n }\n\n async getVirtualTx(txid: string): Promise<VirtualTx | null> {\n await this.ensureInit();\n const row = await this.db.get<VtxRow>(`SELECT * FROM ${this.tTx} WHERE txid = ?`, [txid]);\n return row ? rowToTx(row) : null;\n }\n\n async setBranch(vtxo: Outpoint, branch: VtxoBranch[]): Promise<void> {\n await this.ensureInit();\n await runInTransaction(this.db, async (tx) => {\n await tx.run(`DELETE FROM ${this.tBranch} WHERE vtxo_txid = ? AND vtxo_vout = ?`, [\n vtxo.txid,\n vtxo.vout,\n ]);\n for (const b of branch) {\n await tx.run(\n `INSERT OR REPLACE INTO ${this.tBranch} (vtxo_txid, vtxo_vout, virtual_txid, position) VALUES (?, ?, ?, ?)`,\n [b.vtxoTxid, b.vtxoVout, b.virtualTxid, b.position],\n );\n }\n });\n }\n\n async getBranch(vtxo: Outpoint): Promise<VirtualTx[]> {\n await this.ensureInit();\n // Single JOIN instead of one lookup per branch row; the inner join\n // naturally drops branch rows whose tx no longer exists.\n const rows = await this.db.all<VtxRow>(\n `SELECT t.txid, t.psbt, t.expires_at, t.type\n FROM ${this.tBranch} b\n JOIN ${this.tTx} t ON t.txid = b.virtual_txid\n WHERE b.vtxo_txid = ? AND b.vtxo_vout = ?\n ORDER BY b.position ASC`,\n [vtxo.txid, vtxo.vout],\n );\n return rows.map(rowToTx);\n }\n\n async hasBranch(vtxo: Outpoint): Promise<boolean> {\n await this.ensureInit();\n const r = await this.db.get<{ c: number }>(\n `SELECT COUNT(*) AS c FROM ${this.tBranch} WHERE vtxo_txid = ? AND vtxo_vout = ?`,\n [vtxo.txid, vtxo.vout],\n );\n return (r?.c ?? 0) > 0;\n }\n\n async pruneForSpentVtxo(vtxo: Outpoint): Promise<void> {\n await this.ensureInit();\n await runInTransaction(this.db, async (tx) => {\n // Capture the txs this vtxo's branch referenced, then delete its\n // branch rows and — in one set-based pass — drop only those txs\n // that no other branch still references. Scoping the delete to the\n // captured txids preserves txs inserted without a branch.\n const removed = await tx.all<{ virtual_txid: string }>(\n `SELECT DISTINCT virtual_txid FROM ${this.tBranch} WHERE vtxo_txid = ? AND vtxo_vout = ?`,\n [vtxo.txid, vtxo.vout],\n );\n await tx.run(`DELETE FROM ${this.tBranch} WHERE vtxo_txid = ? AND vtxo_vout = ?`, [\n vtxo.txid,\n vtxo.vout,\n ]);\n if (removed.length === 0) return;\n const placeholders = removed.map(() => \"?\").join(\", \");\n await tx.run(\n `DELETE FROM ${this.tTx}\n WHERE txid IN (${placeholders})\n AND NOT EXISTS (\n SELECT 1 FROM ${this.tBranch} b WHERE b.virtual_txid = ${this.tTx}.txid\n )`,\n removed.map((r) => r.virtual_txid),\n );\n });\n }\n\n async [Symbol.asyncDispose](): Promise<void> {}\n}\n\nfunction rowToTx(r: VtxRow): VirtualTx {\n return {\n txid: r.txid,\n psbt: r.psbt ?? null,\n expiresAt: r.expires_at ?? null,\n type: r.type as ChainedTxType,\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { W as WalletRepository, C as ContractRepository, w as IndexerProvider,
|
|
1
|
+
import { W as WalletRepository, C as ContractRepository, w as IndexerProvider, O as OperatorProvider, z as VirtualCoin, B as Contract, D as ExtendedVirtualCoin } from './index-DRwe0UDN.cjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* A task item represents a unit of work in the inbox.
|
|
@@ -63,7 +63,7 @@ interface TaskDependencies {
|
|
|
63
63
|
walletRepository: WalletRepository;
|
|
64
64
|
contractRepository: ContractRepository;
|
|
65
65
|
indexerProvider: IndexerProvider;
|
|
66
|
-
arkProvider:
|
|
66
|
+
arkProvider: OperatorProvider;
|
|
67
67
|
extendVtxo: (vtxo: VirtualCoin, contract: Contract) => ExtendedVirtualCoin;
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
@@ -98,7 +98,7 @@ interface CreateTaskDependenciesOptions {
|
|
|
98
98
|
walletRepository: WalletRepository;
|
|
99
99
|
contractRepository: ContractRepository;
|
|
100
100
|
indexerProvider: IndexerProvider;
|
|
101
|
-
arkProvider:
|
|
101
|
+
arkProvider: OperatorProvider;
|
|
102
102
|
}
|
|
103
103
|
/**
|
|
104
104
|
* Build the @see TaskDependencies needed by task processors
|
|
@@ -111,4 +111,4 @@ interface CreateTaskDependenciesOptions {
|
|
|
111
111
|
*/
|
|
112
112
|
declare function createTaskDependencies(options: CreateTaskDependenciesOptions): TaskDependencies;
|
|
113
113
|
|
|
114
|
-
export { type CreateTaskDependenciesOptions as C, InMemoryTaskQueue as I, type TaskProcessor as T, type
|
|
114
|
+
export { type CreateTaskDependenciesOptions as C, InMemoryTaskQueue as I, type TaskProcessor as T, type TaskDependencies as a, type TaskItem as b, type TaskQueue as c, type TaskResult as d, createTaskDependencies as e, runTasks as r };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { W as WalletRepository, C as ContractRepository, w as IndexerProvider,
|
|
1
|
+
import { W as WalletRepository, C as ContractRepository, w as IndexerProvider, O as OperatorProvider, z as VirtualCoin, B as Contract, D as ExtendedVirtualCoin } from './index-DRwe0UDN.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* A task item represents a unit of work in the inbox.
|
|
@@ -63,7 +63,7 @@ interface TaskDependencies {
|
|
|
63
63
|
walletRepository: WalletRepository;
|
|
64
64
|
contractRepository: ContractRepository;
|
|
65
65
|
indexerProvider: IndexerProvider;
|
|
66
|
-
arkProvider:
|
|
66
|
+
arkProvider: OperatorProvider;
|
|
67
67
|
extendVtxo: (vtxo: VirtualCoin, contract: Contract) => ExtendedVirtualCoin;
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
@@ -98,7 +98,7 @@ interface CreateTaskDependenciesOptions {
|
|
|
98
98
|
walletRepository: WalletRepository;
|
|
99
99
|
contractRepository: ContractRepository;
|
|
100
100
|
indexerProvider: IndexerProvider;
|
|
101
|
-
arkProvider:
|
|
101
|
+
arkProvider: OperatorProvider;
|
|
102
102
|
}
|
|
103
103
|
/**
|
|
104
104
|
* Build the @see TaskDependencies needed by task processors
|
|
@@ -111,4 +111,4 @@ interface CreateTaskDependenciesOptions {
|
|
|
111
111
|
*/
|
|
112
112
|
declare function createTaskDependencies(options: CreateTaskDependenciesOptions): TaskDependencies;
|
|
113
113
|
|
|
114
|
-
export { type CreateTaskDependenciesOptions as C, InMemoryTaskQueue as I, type TaskProcessor as T, type
|
|
114
|
+
export { type CreateTaskDependenciesOptions as C, InMemoryTaskQueue as I, type TaskProcessor as T, type TaskDependencies as a, type TaskItem as b, type TaskQueue as c, type TaskResult as d, createTaskDependencies as e, runTasks as r };
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
require('../../chunk-
|
|
7
|
-
require('../../chunk-
|
|
8
|
-
require('../../chunk-
|
|
3
|
+
var chunkDNITZVNG_cjs = require('../../chunk-DNITZVNG.cjs');
|
|
4
|
+
var chunkB6VNKGIH_cjs = require('../../chunk-B6VNKGIH.cjs');
|
|
5
|
+
var chunkF3FAE7VJ_cjs = require('../../chunk-F3FAE7VJ.cjs');
|
|
6
|
+
require('../../chunk-WXNSISXK.cjs');
|
|
7
|
+
require('../../chunk-E6OOJEHL.cjs');
|
|
8
|
+
require('../../chunk-GHUUT54D.cjs');
|
|
9
9
|
var TaskManager = require('expo-task-manager');
|
|
10
10
|
var BackgroundTask = require('expo-background-task');
|
|
11
11
|
|
|
@@ -35,7 +35,7 @@ function defineExpoBackgroundTask(taskName, options) {
|
|
|
35
35
|
taskQueue,
|
|
36
36
|
walletRepository,
|
|
37
37
|
contractRepository,
|
|
38
|
-
processors = [
|
|
38
|
+
processors = [chunkB6VNKGIH_cjs.contractPollProcessor]
|
|
39
39
|
} = options;
|
|
40
40
|
TaskManager__namespace.defineTask(taskName, async () => {
|
|
41
41
|
try {
|
|
@@ -43,24 +43,24 @@ function defineExpoBackgroundTask(taskName, options) {
|
|
|
43
43
|
if (!config) {
|
|
44
44
|
return BackgroundTask__namespace.BackgroundTaskResult.Success;
|
|
45
45
|
}
|
|
46
|
-
const indexerProvider = new
|
|
47
|
-
const arkProvider = new
|
|
48
|
-
const deps =
|
|
46
|
+
const indexerProvider = new chunkDNITZVNG_cjs.ExpoIndexerProvider(config.arkServerUrl);
|
|
47
|
+
const arkProvider = new chunkDNITZVNG_cjs.ExpoOperatorProvider(config.arkServerUrl);
|
|
48
|
+
const deps = chunkB6VNKGIH_cjs.createTaskDependencies({
|
|
49
49
|
walletRepository,
|
|
50
50
|
contractRepository,
|
|
51
51
|
indexerProvider,
|
|
52
52
|
arkProvider
|
|
53
53
|
});
|
|
54
|
-
await
|
|
54
|
+
await chunkB6VNKGIH_cjs.runTasks(taskQueue, processors, deps);
|
|
55
55
|
const results = await taskQueue.getResults();
|
|
56
56
|
if (results.length > 0) {
|
|
57
57
|
await taskQueue.acknowledgeResults(results.map((r) => r.id));
|
|
58
58
|
}
|
|
59
|
-
const existing = await taskQueue.getTasks(
|
|
59
|
+
const existing = await taskQueue.getTasks(chunkB6VNKGIH_cjs.CONTRACT_POLL_TASK_TYPE);
|
|
60
60
|
if (existing.length === 0) {
|
|
61
61
|
const task = {
|
|
62
|
-
id:
|
|
63
|
-
type:
|
|
62
|
+
id: chunkF3FAE7VJ_cjs.getRandomId(),
|
|
63
|
+
type: chunkB6VNKGIH_cjs.CONTRACT_POLL_TASK_TYPE,
|
|
64
64
|
data: {},
|
|
65
65
|
createdAt: Date.now()
|
|
66
66
|
};
|