@arkade-os/sdk 0.5.0-rc.12 → 0.5.0-rc.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/expo.cjs +5 -5
  3. package/dist/adapters/expo.d.cts +2 -2
  4. package/dist/adapters/expo.d.ts +2 -2
  5. package/dist/adapters/expo.js +3 -3
  6. package/dist/{asyncStorageTaskQueue-ZJ0uB_km.d.cts → asyncStorageTaskQueue-0EeSeCAt.d.cts} +1 -1
  7. package/dist/{asyncStorageTaskQueue-DDVTySuO.d.ts → asyncStorageTaskQueue-DV94jhwq.d.ts} +1 -1
  8. package/dist/{chunk-KBXBS4WO.js → chunk-3JLYJ5KZ.js} +3 -3
  9. package/dist/{chunk-KBXBS4WO.js.map → chunk-3JLYJ5KZ.js.map} +1 -1
  10. package/dist/{chunk-C7ARQI5U.js → chunk-4EU2Q6YT.js} +4 -4
  11. package/dist/{chunk-C7ARQI5U.js.map → chunk-4EU2Q6YT.js.map} +1 -1
  12. package/dist/{chunk-6ZBLIJ3N.cjs → chunk-7BACS4XK.cjs} +10 -10
  13. package/dist/{chunk-6ZBLIJ3N.cjs.map → chunk-7BACS4XK.cjs.map} +1 -1
  14. package/dist/{chunk-VKM6VUOZ.cjs → chunk-7NK6XFC3.cjs} +3 -3
  15. package/dist/{chunk-VKM6VUOZ.cjs.map → chunk-7NK6XFC3.cjs.map} +1 -1
  16. package/dist/{chunk-XDT24LBQ.cjs → chunk-BFQX2KS3.cjs} +18 -18
  17. package/dist/{chunk-XDT24LBQ.cjs.map → chunk-BFQX2KS3.cjs.map} +1 -1
  18. package/dist/{chunk-QD3N3ZS7.js → chunk-D7JLTHSZ.js} +4 -4
  19. package/dist/{chunk-QD3N3ZS7.js.map → chunk-D7JLTHSZ.js.map} +1 -1
  20. package/dist/{chunk-2G3XR3E7.js → chunk-EJYWGTZ7.js} +3 -3
  21. package/dist/{chunk-2G3XR3E7.js.map → chunk-EJYWGTZ7.js.map} +1 -1
  22. package/dist/{chunk-73NPW5LY.cjs → chunk-FDQQOF3F.cjs} +47 -47
  23. package/dist/{chunk-73NPW5LY.cjs.map → chunk-FDQQOF3F.cjs.map} +1 -1
  24. package/dist/{chunk-HQTM6HLJ.cjs → chunk-I4YBVHAK.cjs} +457 -456
  25. package/dist/chunk-I4YBVHAK.cjs.map +1 -0
  26. package/dist/{chunk-F5P5V3XR.js → chunk-IV2252XM.js} +11 -10
  27. package/dist/chunk-IV2252XM.js.map +1 -0
  28. package/dist/{chunk-6UKMLPWP.js → chunk-JOUPIZ32.js} +3 -3
  29. package/dist/{chunk-6UKMLPWP.js.map → chunk-JOUPIZ32.js.map} +1 -1
  30. package/dist/{chunk-LG4B4CFA.cjs → chunk-RDQSVIXD.cjs} +15 -15
  31. package/dist/{chunk-LG4B4CFA.cjs.map → chunk-RDQSVIXD.cjs.map} +1 -1
  32. package/dist/contracts/handlers/index.cjs +9 -9
  33. package/dist/contracts/handlers/index.d.cts +3 -3
  34. package/dist/contracts/handlers/index.d.ts +3 -3
  35. package/dist/contracts/handlers/index.js +2 -2
  36. package/dist/{delegate--_TwHqAa.d.cts → delegate-BgpUJW5B.d.cts} +1 -1
  37. package/dist/{delegate-DbYSf9lY.d.ts → delegate-BuagcGnG.d.ts} +1 -1
  38. package/dist/{index-D-zl1tea.d.cts → index-CKmB14Yu.d.cts} +7 -2
  39. package/dist/{index-D-zl1tea.d.ts → index-CKmB14Yu.d.ts} +7 -2
  40. package/dist/{index--rMssbOo.d.cts → index-D0BuYwhF.d.cts} +2 -2
  41. package/dist/{index-BwYXDgZM.d.ts → index-DbzyrqK7.d.ts} +2 -2
  42. package/dist/index.cjs +305 -305
  43. package/dist/index.d.cts +12 -12
  44. package/dist/index.d.ts +12 -12
  45. package/dist/index.js +4 -4
  46. package/dist/repositories/realm/index.cjs +36 -36
  47. package/dist/repositories/realm/index.cjs.map +1 -1
  48. package/dist/repositories/realm/index.d.cts +4 -4
  49. package/dist/repositories/realm/index.d.ts +4 -4
  50. package/dist/repositories/realm/index.js +7 -7
  51. package/dist/repositories/realm/index.js.map +1 -1
  52. package/dist/repositories/sqlite/index.cjs +34 -34
  53. package/dist/repositories/sqlite/index.cjs.map +1 -1
  54. package/dist/repositories/sqlite/index.d.cts +4 -4
  55. package/dist/repositories/sqlite/index.d.ts +4 -4
  56. package/dist/repositories/sqlite/index.js +7 -7
  57. package/dist/repositories/sqlite/index.js.map +1 -1
  58. package/dist/{taskRunner-ChQpqvfy.d.ts → taskRunner-BX-pB0sv.d.ts} +1 -1
  59. package/dist/{taskRunner-DjzP-n_3.d.cts → taskRunner-DJrFFyus.d.cts} +1 -1
  60. package/dist/wallet/expo/background.cjs +14 -14
  61. package/dist/wallet/expo/background.d.cts +3 -3
  62. package/dist/wallet/expo/background.d.ts +3 -3
  63. package/dist/wallet/expo/background.js +6 -6
  64. package/dist/wallet/expo/index.cjs +14 -14
  65. package/dist/wallet/expo/index.d.cts +4 -4
  66. package/dist/wallet/expo/index.d.ts +4 -4
  67. package/dist/wallet/expo/index.js +5 -5
  68. package/dist/{wallet-DfYA1QzQ.d.cts → wallet-BsL2G3Qb.d.cts} +2 -2
  69. package/dist/{wallet-BwCcOWEI.d.ts → wallet-DXNiCmq8.d.ts} +2 -2
  70. package/dist/worker/expo/index.cjs +9 -9
  71. package/dist/worker/expo/index.d.cts +4 -4
  72. package/dist/worker/expo/index.d.ts +4 -4
  73. package/dist/worker/expo/index.js +5 -5
  74. package/package.json +1 -1
  75. package/dist/chunk-F5P5V3XR.js.map +0 -1
  76. package/dist/chunk-HQTM6HLJ.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":["scriptFromArkAddress","legacyVtxoFacts","serializeVtxo","createdAtToIso","assertPageRequest","pageResult","isVtxoSpent","checkSaveVtxosForScript","serializeUtxo","assertHistoryPageFilter","serializeAssets","deserializeVtxo","deserializeUtxo","deserializeAssets","contractFilterMatchesNothing","intentMatchesFilter","isTerminalIntentState","mergeChainedTxType"],"mappings":"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","file":"index.cjs","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} 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 * 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 = 1 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 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 for (const vtxo of vtxos) {\n const s = serializeVtxo(vtxo);\n await this.db.run(\n `INSERT OR REPLACE INTO ${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 VALUES (?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?,\n ?, ?,\n ?, ?, ?, ?, ?, ?)`,\n [\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(address: string, utxos: ExtendedCoin[]): Promise<void> {\n await this.ensureInit();\n for (const utxo of utxos) {\n const s = serializeUtxo(utxo);\n await this.db.run(\n `INSERT OR REPLACE INTO ${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 VALUES (?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?)`,\n [\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 }\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 for (const tx of txs) {\n await this.db.run(\n `INSERT OR REPLACE INTO ${this.tables.transactions}\n (address, boarding_txid, commitment_txid, ark_txid,\n type, amount, settled, created_at, assets_json)\n VALUES (?, ?, ?, ?,\n ?, ?, ?, ?, ?)`,\n [\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\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\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 = 2 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 }\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.addWatchCondition(conditions, params, 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 * Same as {@link addFilterCondition}, except a row predating the\n * column stores NULL and must match `\"watched\"`.\n */\n private addWatchCondition(\n conditions: string[],\n params: unknown[],\n value?: ContractWatchState | ContractWatchState[],\n ): void {\n if (value === undefined) return;\n\n const wanted = Array.isArray(value) ? value : [value];\n if (wanted.length === 0) return;\n\n const placeholders = wanted.map(() => \"?\").join(\", \");\n const clause = `watch IN (${placeholders})`;\n conditions.push(wanted.includes(\"watched\") ? `(${clause} OR watch IS NULL)` : clause);\n params.push(...wanted);\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":["scriptFromArkAddress","legacyVtxoFacts","serializeVtxo","createdAtToIso","assertPageRequest","pageResult","isVtxoSpent","checkSaveVtxosForScript","serializeUtxo","assertHistoryPageFilter","serializeAssets","deserializeVtxo","deserializeUtxo","deserializeAssets","contractFilterMatchesNothing","intentMatchesFilter","isTerminalIntentState","mergeChainedTxType"],"mappings":"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","file":"index.cjs","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} 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 * 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 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 for (const vtxo of vtxos) {\n const s = serializeVtxo(vtxo);\n await this.db.run(\n `INSERT OR REPLACE INTO ${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 VALUES (?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?,\n ?, ?,\n ?, ?, ?, ?, ?, ?)`,\n [\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(address: string, utxos: ExtendedCoin[]): Promise<void> {\n await this.ensureInit();\n for (const utxo of utxos) {\n const s = serializeUtxo(utxo);\n await this.db.run(\n `INSERT OR REPLACE INTO ${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 VALUES (?, ?, ?, ?,\n ?, ?, ?, ?, ?,\n ?, ?)`,\n [\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 }\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 for (const tx of txs) {\n await this.db.run(\n `INSERT OR REPLACE INTO ${this.tables.transactions}\n (address, boarding_txid, commitment_txid, ark_txid,\n type, amount, settled, created_at, assets_json)\n VALUES (?, ?, ?, ?,\n ?, ?, ?, ?, ?)`,\n [\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\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\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 }\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.addWatchCondition(conditions, params, 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 * Same as {@link addFilterCondition}, except a row predating the\n * column stores NULL and must match `\"watched\"`.\n */\n private addWatchCondition(\n conditions: string[],\n params: unknown[],\n value?: ContractWatchState | ContractWatchState[],\n ): void {\n if (value === undefined) return;\n\n const wanted = Array.isArray(value) ? value : [value];\n if (wanted.length === 0) return;\n\n const placeholders = wanted.map(() => \"?\").join(\", \");\n const clause = `watch IN (${placeholders})`;\n conditions.push(wanted.includes(\"watched\") ? `(${clause} OR watch IS NULL)` : clause);\n params.push(...wanted);\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,5 +1,5 @@
1
- import { W as WalletRepository, P as PageRequest, O as Outpoint, D as PageResult, B as ExtendedVirtualCoin, F as ScriptVtxoCursor, H as ScriptVtxoPageOptions, J as StoredVtxo, K as VtxoRepositoryKey, E as ExtendedCoin, L as TransactionHistoryPageFilter, M as TransactionHistoryPageCursor, h as ArkTransaction, Q as WalletState, C as ContractRepository, U as ContractFilter, z as Contract, X as IntentRepository, Y as ArkIntent, Z as IntentPageFilter, _ as VirtualTxRepository, $ as VirtualTx, a0 as VtxoBranch } from '../../index-D-zl1tea.cjs';
2
- export { a1 as ChainedTxType } from '../../index-D-zl1tea.cjs';
1
+ import { W as WalletRepository, P as PageRequest, O as Outpoint, D as PageResult, B as ExtendedVirtualCoin, F as ScriptVtxoCursor, H as ScriptVtxoPageOptions, J as StoredVtxo, K as VtxoRepositoryKey, E as ExtendedCoin, L as TransactionHistoryPageFilter, M as TransactionHistoryPageCursor, h as ArkTransaction, Q as WalletState, C as ContractRepository, U as ContractFilter, z as Contract, X as IntentRepository, Y as ArkIntent, Z as IntentPageFilter, _ as VirtualTxRepository, $ as VirtualTx, a0 as VtxoBranch } from '../../index-CKmB14Yu.cjs';
2
+ export { a1 as ChainedTxType } from '../../index-CKmB14Yu.cjs';
3
3
  import '@scure/btc-signer/utils.js';
4
4
  import '@scure/btc-signer/transaction.js';
5
5
  import '@scure/btc-signer';
@@ -39,7 +39,7 @@ interface SQLiteWalletRepositoryOptions {
39
39
  */
40
40
  declare class SQLiteWalletRepository implements WalletRepository {
41
41
  private readonly db;
42
- readonly version: 1;
42
+ readonly version: 2;
43
43
  private initPromise;
44
44
  private readonly prefix;
45
45
  private readonly tables;
@@ -117,7 +117,7 @@ interface SQLiteContractRepositoryOptions {
117
117
  */
118
118
  declare class SQLiteContractRepository implements ContractRepository {
119
119
  private readonly db;
120
- readonly version: 2;
120
+ readonly version: 3;
121
121
  private initPromise;
122
122
  private readonly prefix;
123
123
  private readonly table;
@@ -1,5 +1,5 @@
1
- import { W as WalletRepository, P as PageRequest, O as Outpoint, D as PageResult, B as ExtendedVirtualCoin, F as ScriptVtxoCursor, H as ScriptVtxoPageOptions, J as StoredVtxo, K as VtxoRepositoryKey, E as ExtendedCoin, L as TransactionHistoryPageFilter, M as TransactionHistoryPageCursor, h as ArkTransaction, Q as WalletState, C as ContractRepository, U as ContractFilter, z as Contract, X as IntentRepository, Y as ArkIntent, Z as IntentPageFilter, _ as VirtualTxRepository, $ as VirtualTx, a0 as VtxoBranch } from '../../index-D-zl1tea.js';
2
- export { a1 as ChainedTxType } from '../../index-D-zl1tea.js';
1
+ import { W as WalletRepository, P as PageRequest, O as Outpoint, D as PageResult, B as ExtendedVirtualCoin, F as ScriptVtxoCursor, H as ScriptVtxoPageOptions, J as StoredVtxo, K as VtxoRepositoryKey, E as ExtendedCoin, L as TransactionHistoryPageFilter, M as TransactionHistoryPageCursor, h as ArkTransaction, Q as WalletState, C as ContractRepository, U as ContractFilter, z as Contract, X as IntentRepository, Y as ArkIntent, Z as IntentPageFilter, _ as VirtualTxRepository, $ as VirtualTx, a0 as VtxoBranch } from '../../index-CKmB14Yu.js';
2
+ export { a1 as ChainedTxType } from '../../index-CKmB14Yu.js';
3
3
  import '@scure/btc-signer/utils.js';
4
4
  import '@scure/btc-signer/transaction.js';
5
5
  import '@scure/btc-signer';
@@ -39,7 +39,7 @@ interface SQLiteWalletRepositoryOptions {
39
39
  */
40
40
  declare class SQLiteWalletRepository implements WalletRepository {
41
41
  private readonly db;
42
- readonly version: 1;
42
+ readonly version: 2;
43
43
  private initPromise;
44
44
  private readonly prefix;
45
45
  private readonly tables;
@@ -117,7 +117,7 @@ interface SQLiteContractRepositoryOptions {
117
117
  */
118
118
  declare class SQLiteContractRepository implements ContractRepository {
119
119
  private readonly db;
120
- readonly version: 2;
120
+ readonly version: 3;
121
121
  private initPromise;
122
122
  private readonly prefix;
123
123
  private readonly table;
@@ -1,8 +1,8 @@
1
- import { scriptFromArkAddress, legacyVtxoFacts, serializeVtxo, createdAtToIso, assertPageRequest, pageResult, checkSaveVtxosForScript, serializeUtxo, assertHistoryPageFilter, serializeAssets, deserializeVtxo, deserializeUtxo, deserializeAssets, contractFilterMatchesNothing, intentMatchesFilter, isTerminalIntentState, mergeChainedTxType } from '../../chunk-F5P5V3XR.js';
2
- export { ChainedTxType } from '../../chunk-F5P5V3XR.js';
3
- import '../../chunk-KBXBS4WO.js';
4
- import '../../chunk-6UKMLPWP.js';
5
- import { isVtxoSpent } from '../../chunk-2G3XR3E7.js';
1
+ import { scriptFromArkAddress, legacyVtxoFacts, serializeVtxo, createdAtToIso, assertPageRequest, pageResult, checkSaveVtxosForScript, serializeUtxo, assertHistoryPageFilter, serializeAssets, deserializeVtxo, deserializeUtxo, deserializeAssets, contractFilterMatchesNothing, intentMatchesFilter, isTerminalIntentState, mergeChainedTxType } from '../../chunk-IV2252XM.js';
2
+ export { ChainedTxType } from '../../chunk-IV2252XM.js';
3
+ import '../../chunk-3JLYJ5KZ.js';
4
+ import '../../chunk-JOUPIZ32.js';
5
+ import { isVtxoSpent } from '../../chunk-EJYWGTZ7.js';
6
6
 
7
7
  // src/repositories/sqlite/transaction.ts
8
8
  var writeChains = /* @__PURE__ */ new WeakMap();
@@ -49,7 +49,7 @@ var SQLiteWalletRepository = class {
49
49
  };
50
50
  }
51
51
  db;
52
- version = 1;
52
+ version = 2;
53
53
  initPromise = null;
54
54
  prefix;
55
55
  tables;
@@ -603,7 +603,7 @@ var SQLiteContractRepository = class {
603
603
  this.table = `${this.prefix}contracts`;
604
604
  }
605
605
  db;
606
- version = 2;
606
+ version = 3;
607
607
  initPromise = null;
608
608
  prefix;
609
609
  table;