@arkade-os/sdk 0.4.64 → 0.4.66

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 (79) hide show
  1. package/dist/adapters/expo.cjs +5 -5
  2. package/dist/adapters/expo.d.cts +3 -6
  3. package/dist/adapters/expo.d.ts +3 -6
  4. package/dist/adapters/expo.js +3 -3
  5. package/dist/adapters/indexedDB.cjs +5 -5
  6. package/dist/adapters/indexedDB.js +4 -4
  7. package/dist/{asyncStorageTaskQueue-Dq_UcvDx.d.ts → asyncStorageTaskQueue-B6SijMi3.d.ts} +1 -1
  8. package/dist/{asyncStorageTaskQueue-Chwe60Ce.d.cts → asyncStorageTaskQueue-BZcIN7sA.d.cts} +1 -1
  9. package/dist/{chunk-HQ2DDMQN.js → chunk-2JZGPXU4.js} +170 -6
  10. package/dist/chunk-2JZGPXU4.js.map +1 -0
  11. package/dist/{chunk-RXITDAV4.cjs → chunk-3S3JZUEN.cjs} +184 -19
  12. package/dist/chunk-3S3JZUEN.cjs.map +1 -0
  13. package/dist/{chunk-USXWE2EJ.js → chunk-55ZZ6RBL.js} +4 -4
  14. package/dist/{chunk-USXWE2EJ.js.map → chunk-55ZZ6RBL.js.map} +1 -1
  15. package/dist/{chunk-LPEE2H2M.cjs → chunk-5E6IZNRG.cjs} +656 -774
  16. package/dist/chunk-5E6IZNRG.cjs.map +1 -0
  17. package/dist/{chunk-LN2VZP63.js → chunk-CYOI4PEA.js} +162 -15
  18. package/dist/chunk-CYOI4PEA.js.map +1 -0
  19. package/dist/{chunk-WJN2BLEI.js → chunk-DSC3G6QZ.js} +253 -379
  20. package/dist/chunk-DSC3G6QZ.js.map +1 -0
  21. package/dist/{chunk-4N45WCSJ.cjs → chunk-IM6IKNSL.cjs} +17 -17
  22. package/dist/{chunk-4N45WCSJ.cjs.map → chunk-IM6IKNSL.cjs.map} +1 -1
  23. package/dist/{chunk-XJCBV4AA.js → chunk-J33ZEM3A.js} +26 -18
  24. package/dist/chunk-J33ZEM3A.js.map +1 -0
  25. package/dist/{chunk-35YIP6OA.cjs → chunk-LL47QIHD.cjs} +10 -10
  26. package/dist/{chunk-35YIP6OA.cjs.map → chunk-LL47QIHD.cjs.map} +1 -1
  27. package/dist/{chunk-WXCVS6PD.cjs → chunk-PXPPZF5K.cjs} +207 -59
  28. package/dist/chunk-PXPPZF5K.cjs.map +1 -0
  29. package/dist/{chunk-ZUEGFM3T.js → chunk-R5POS3RS.js} +4 -4
  30. package/dist/{chunk-ZUEGFM3T.js.map → chunk-R5POS3RS.js.map} +1 -1
  31. package/dist/{chunk-FZFSGOTZ.cjs → chunk-ZIRFXBKL.cjs} +26 -18
  32. package/dist/chunk-ZIRFXBKL.cjs.map +1 -0
  33. package/dist/contracts/handlers/index.cjs +9 -9
  34. package/dist/contracts/handlers/index.d.cts +3 -3
  35. package/dist/contracts/handlers/index.d.ts +3 -3
  36. package/dist/contracts/handlers/index.js +2 -2
  37. package/dist/{delegate-Dv_9OVHv.d.ts → delegate-T-vgxMYZ.d.ts} +1 -1
  38. package/dist/{delegate-BBQW61ym.d.cts → delegate-YXupcWWJ.d.cts} +1 -1
  39. package/dist/{index-Bxe9kBFs.d.ts → index-D_FgwLH9.d.ts} +111 -2
  40. package/dist/{index-aZycGEsQ.d.cts → index-e7LYXk1d.d.cts} +111 -2
  41. package/dist/{index-CFOMyVMt.d.cts → index-uUE_uQPn.d.cts} +70 -33
  42. package/dist/{index-CFOMyVMt.d.ts → index-uUE_uQPn.d.ts} +70 -33
  43. package/dist/index.cjs +308 -268
  44. package/dist/index.d.cts +214 -19
  45. package/dist/index.d.ts +214 -19
  46. package/dist/index.js +4 -4
  47. package/dist/repositories/realm/index.cjs +19 -19
  48. package/dist/repositories/realm/index.d.cts +2 -2
  49. package/dist/repositories/realm/index.d.ts +2 -2
  50. package/dist/repositories/realm/index.js +5 -5
  51. package/dist/repositories/sqlite/index.cjs +18 -18
  52. package/dist/repositories/sqlite/index.d.cts +2 -2
  53. package/dist/repositories/sqlite/index.d.ts +2 -2
  54. package/dist/repositories/sqlite/index.js +5 -5
  55. package/dist/{taskRunner-CIKOS2OO.d.cts → taskRunner-BOVcIH1N.d.cts} +1 -1
  56. package/dist/{taskRunner-BDzWbpct.d.ts → taskRunner-DNyD1kXG.d.ts} +1 -1
  57. package/dist/wallet/expo/background.cjs +14 -14
  58. package/dist/wallet/expo/background.d.cts +3 -3
  59. package/dist/wallet/expo/background.d.ts +3 -3
  60. package/dist/wallet/expo/background.js +6 -6
  61. package/dist/wallet/expo/index.cjs +14 -14
  62. package/dist/wallet/expo/index.d.cts +4 -4
  63. package/dist/wallet/expo/index.d.ts +4 -4
  64. package/dist/wallet/expo/index.js +5 -5
  65. package/dist/{wallet-C2NvHjWB.d.cts → wallet-CNibc3yJ.d.ts} +3 -3
  66. package/dist/{wallet-DJUnN939.d.ts → wallet-DJN1QgFt.d.cts} +3 -3
  67. package/dist/worker/expo/index.cjs +9 -9
  68. package/dist/worker/expo/index.d.cts +4 -4
  69. package/dist/worker/expo/index.d.ts +4 -4
  70. package/dist/worker/expo/index.js +5 -5
  71. package/package.json +1 -1
  72. package/dist/chunk-FZFSGOTZ.cjs.map +0 -1
  73. package/dist/chunk-HQ2DDMQN.js.map +0 -1
  74. package/dist/chunk-LN2VZP63.js.map +0 -1
  75. package/dist/chunk-LPEE2H2M.cjs.map +0 -1
  76. package/dist/chunk-RXITDAV4.cjs.map +0 -1
  77. package/dist/chunk-WJN2BLEI.js.map +0 -1
  78. package/dist/chunk-WXCVS6PD.cjs.map +0 -1
  79. package/dist/chunk-XJCBV4AA.js.map +0 -1
@@ -1,6 +1,6 @@
1
- import { AssetId, AssetGroup, AssetInput, AssetOutput, Metadata, Packet, BufferReader, BufferWriter, AssetRef, RestIndexerProvider } from './chunk-HQ2DDMQN.js';
2
- import { witnessRefToBytes, validateProgram, toASM, stringifyArtifact, serializeArkadeContractParams, resolveAsm, parseArtifact, getOpcodeValue, getOpcodeName, fromASM, deserializeArkadeContractParams, computeArkadeScriptPublicKey, bytesToASM, asmToBytes, arkadeWitnessHash, arkadeScriptHash, SUPPORTED_PROGRAM_VERSION, OPCODE_VALUES, OPCODE_NAMES, bignum_exports, ArkadeScript, ArkadeProgramScript, ARKADE_OPS, ARKADE_OPCODE_VALUES, ARKADE_OPCODE_NAMES, ARKADE_OPCODES, ARKADE_OP, inputName, contractHandlers, isMainnetDescriptor, descriptorIsOurs, deriveDescriptorLeafPubKey, deriveDescriptorLeafCompressedPubKey, parseHDDescriptor, DefaultVtxo, speculativeReceiveMetadata, DelegateVtxo, WALLET_RECEIVE_SOURCE, BoardingContractHandler, identityDescriptor } from './chunk-LN2VZP63.js';
3
- import { VtxoScript, Transaction, isRecoverable, CSVMultisigTapscript, DEFAULT_NETWORK, resolveEmulatorPubkey, hasTerminalSpend, getNormalizedVtxos, setArkPsbtField, PrevArkTxField, ConditionWitness, craftToSpendTx, ArkAddress, isVirtualCoin, getArkPsbtFields, CosignerPublicKey, ServerResponseMismatchError, OP_RETURN_EMPTY_PKSCRIPT, sequenceToTimelock, decodeTapscript, scriptFromTapLeafScript, CLTVMultisigTapscript, VtxoTaprootTree, timelockToSequence, baseFetch, Intent, rateGate, DEFAULT_NETWORK_NAME, normalizeVtxo, getSequence, toBatchExpiry, maybeArkError, isArkError, ArkErrorName, toOffchainInputFeeParams, canRecoverOnchain, getNetwork, MultisigTapscript, isEventSourceError, isEventSourceUnavailableError, isRetryableProviderError, getAllNormalizedVtxos, DEFAULT_PAGE_SIZE, RestArkProvider, toVirtualStatus, ArkError, TapTreeCoder, resolveTimeHeight, canSpendOffchain, parseLegacyExpiry, isExpired, DEFAULT_ARKADE_SERVER_URL, ProviderUnavailableError, networks as networks$1, isPastExpiry, fetchVtxoCreatedAtByTxid } from './chunk-XJCBV4AA.js';
1
+ import { AssetId, AssetGroup, AssetInput, AssetOutput, Metadata, Packet, BufferReader, BufferWriter, AssetRef, RestIndexerProvider } from './chunk-2JZGPXU4.js';
2
+ import { witnessRefToBytes, validateProgram, toASM, stringifyArtifact, serializeArkadeContractParams, resolveAsm, parseArtifact, getOpcodeValue, getOpcodeName, fromASM, deserializeArkadeContractParams, computeArkadeScriptPublicKey, bytesToASM, asmToBytes, arkadeWitnessHash, arkadeScriptHash, SUPPORTED_PROGRAM_VERSION, OPCODE_VALUES, OPCODE_NAMES, bignum_exports, ArkadeScript, ArkadeProgramScript, ARKADE_OPS, ARKADE_OPCODE_VALUES, ARKADE_OPCODE_NAMES, ARKADE_OPCODES, ARKADE_OP, toXOnly, inputName, contractHandlers, isMainnetDescriptor, descriptorIsOurs, deriveDescriptorLeafPubKey, deriveDescriptorLeafCompressedPubKey, parseHDDescriptor, DefaultVtxo, speculativeReceiveMetadata, DelegateVtxo, WALLET_RECEIVE_SOURCE, BoardingContractHandler, identityDescriptor } from './chunk-CYOI4PEA.js';
3
+ import { VtxoScript, Transaction, isRecoverable, CSVMultisigTapscript, DEFAULT_NETWORK, resolveEmulatorPubkey, hasTerminalSpend, getNormalizedVtxos, setArkPsbtField, PrevArkTxField, ConditionWitness, craftToSpendTx, ArkAddress, isVirtualCoin, getArkPsbtFields, CosignerPublicKey, ServerResponseMismatchError, OP_RETURN_EMPTY_PKSCRIPT, sequenceToTimelock, decodeTapscript, scriptFromTapLeafScript, CLTVMultisigTapscript, VtxoTaprootTree, timelockToSequence, baseFetch, Intent, rateGate, DEFAULT_NETWORK_NAME, normalizeVtxo, getSequence, toBatchExpiry, maybeArkError, isArkError, ArkErrorName, toOffchainInputFeeParams, canRecoverOnchain, getNetwork, MultisigTapscript, isEventSourceError, isEventSourceUnavailableError, isRetryableProviderError, getAllNormalizedVtxos, DEFAULT_PAGE_SIZE, RestArkProvider, toVirtualStatus, ArkError, TapTreeCoder, resolveTimeHeight, canSpendOffchain, parseLegacyExpiry, isExpired, DEFAULT_ARKADE_SERVER_URL, ProviderUnavailableError, networks as networks$1, isPastExpiry, fetchVtxoCreatedAtByTxid } from './chunk-J33ZEM3A.js';
4
4
  import { __export } from './chunk-NSBPE2FW.js';
5
5
  import { sha256 as sha256$1, equalBytes, hash160, sha256x2, concatBytes, randomPrivateKeyBytes, pubECDSA, pubSchnorr } from '@scure/btc-signer/utils.js';
6
6
  import { SigHash, Script, OP, OutScript, Address, RawWitness, p2tr, p2wpkh, TaprootControlBlock, DEFAULT_SEQUENCE, Transaction as Transaction$2 } from '@scure/btc-signer';
@@ -2796,8 +2796,7 @@ function selectedCoinsToAssetInputs(selectedCoins) {
2796
2796
  }
2797
2797
  function toXOnlySignerHex(pubkeyHex) {
2798
2798
  const bytes = hex.decode(pubkeyHex);
2799
- if (bytes.length === 33) return hex.encode(bytes.slice(1));
2800
- if (bytes.length === 32) return hex.encode(bytes);
2799
+ if (bytes.length === 32 || bytes.length === 33) return hex.encode(toXOnly(bytes, "signer key"));
2801
2800
  throw new Error(`invalid signer pubkey length: expected 32 or 33 bytes, got ${bytes.length}`);
2802
2801
  }
2803
2802
  function signerSetFromInfo(info) {
@@ -3267,9 +3266,7 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
3267
3266
  );
3268
3267
  }
3269
3268
  const finalArkTx = Transaction.fromPSBT(base64.decode(response.finalArkTx));
3270
- const serverPubkeyHex = hex.encode(
3271
- verify.serverPubkey.length === 33 ? verify.serverPubkey.subarray(1) : verify.serverPubkey
3272
- );
3269
+ const serverPubkeyHex = hex.encode(toXOnly(verify.serverPubkey, "server key"));
3273
3270
  for (let i = 0; i < offchainTx.arkTx.inputsLength; i++) {
3274
3271
  assertServerSignedLeaf(
3275
3272
  finalArkTx,
@@ -6129,6 +6126,8 @@ function serializeArkInfoSnapshot(info, savedAt) {
6129
6126
  unilateralExitDelay: info.unilateralExitDelay.toString(),
6130
6127
  boardingExitDelay: info.boardingExitDelay.toString(),
6131
6128
  vtxoTreeExpiry: info.vtxoTreeExpiry?.toString(),
6129
+ maxTxWeight: info.maxTxWeight?.toString(),
6130
+ maxOpReturnOutputs: info.maxOpReturnOutputs?.toString(),
6132
6131
  sessionDuration: info.sessionDuration.toString(),
6133
6132
  dust: info.dust.toString(),
6134
6133
  fees: info.fees,
@@ -6179,6 +6178,8 @@ function hydrateArkInfo(snapshot) {
6179
6178
  signerPubkey: a.signerPubkey,
6180
6179
  unilateralExitDelay: BigInt(a.unilateralExitDelay),
6181
6180
  vtxoTreeExpiry: a.vtxoTreeExpiry !== void 0 ? BigInt(a.vtxoTreeExpiry) : void 0,
6181
+ maxTxWeight: a.maxTxWeight !== void 0 ? BigInt(a.maxTxWeight) : void 0,
6182
+ maxOpReturnOutputs: a.maxOpReturnOutputs !== void 0 ? BigInt(a.maxOpReturnOutputs) : void 0,
6182
6183
  utxoMaxAmount: BigInt(a.utxoMaxAmount),
6183
6184
  utxoMinAmount: BigInt(a.utxoMinAmount),
6184
6185
  version: a.version,
@@ -6251,8 +6252,10 @@ function parseStoredArkInfoSnapshot(raw) {
6251
6252
  ]) {
6252
6253
  assertDecimalString(a[field], `arkInfo.${field}`);
6253
6254
  }
6254
- if (a.vtxoTreeExpiry !== void 0) {
6255
- assertDecimalString(a.vtxoTreeExpiry, "arkInfo.vtxoTreeExpiry");
6255
+ for (const field of ["vtxoTreeExpiry", "maxTxWeight", "maxOpReturnOutputs"]) {
6256
+ if (a[field] !== void 0) {
6257
+ assertDecimalString(a[field], `arkInfo.${field}`);
6258
+ }
6256
6259
  }
6257
6260
  assertFeeInfo(a.fees, "arkInfo.fees");
6258
6261
  if (!Array.isArray(a.deprecatedSigners)) {
@@ -7547,6 +7550,22 @@ var awaitTransaction = (transaction) => new Promise((resolve, reject) => {
7547
7550
  transaction.onerror = () => reject(transaction.error);
7548
7551
  transaction.onabort = () => reject(transaction.error ?? new Error("transaction aborted"));
7549
7552
  });
7553
+ var deleteByIndex = (store, indexName, value) => {
7554
+ const request = store.index(indexName).openCursor(IDBKeyRange.only(value));
7555
+ request.onsuccess = () => {
7556
+ const cursor = request.result;
7557
+ if (!cursor) return;
7558
+ cursor.delete();
7559
+ cursor.continue();
7560
+ };
7561
+ };
7562
+ var getAllByIndexValues = (store, indexName, values) => {
7563
+ if (values.length === 0) return Promise.resolve([]);
7564
+ const index = store.index(indexName);
7565
+ return Promise.all(values.map((value) => promisifyRequest(index.getAll(value)))).then(
7566
+ (results) => results.flat()
7567
+ );
7568
+ };
7550
7569
 
7551
7570
  // src/repositories/indexedDB/manager.ts
7552
7571
  function getGlobalObject() {
@@ -7561,8 +7580,24 @@ function getGlobalObject() {
7561
7580
  }
7562
7581
  throw new Error("Global object not found");
7563
7582
  }
7583
+ var BLOCKED_UPGRADE_TIMEOUT_MS = 1e4;
7584
+ var DatabaseUpgradeBlockedError = class extends Error {
7585
+ constructor(dbName) {
7586
+ super(
7587
+ `database "${dbName}" upgrade blocked by another connection for ${BLOCKED_UPGRADE_TIMEOUT_MS}ms; close other tabs and retry`
7588
+ );
7589
+ this.dbName = dbName;
7590
+ }
7591
+ dbName;
7592
+ name = "DatabaseUpgradeBlockedError";
7593
+ };
7564
7594
  var dbCache = /* @__PURE__ */ new Map();
7565
7595
  var refCounts = /* @__PURE__ */ new Map();
7596
+ function forget(dbName, promise) {
7597
+ if (dbCache.get(dbName)?.promise !== promise) return;
7598
+ dbCache.delete(dbName);
7599
+ refCounts.delete(dbName);
7600
+ }
7566
7601
  async function openDatabase(dbName, dbVersion, initDatabase2) {
7567
7602
  const { globalObject } = getGlobalObject();
7568
7603
  if (!globalObject.indexedDB) {
@@ -7580,26 +7615,47 @@ async function openDatabase(dbName, dbVersion, initDatabase2) {
7580
7615
  }
7581
7616
  const dbPromise = new Promise((resolve, reject) => {
7582
7617
  const request = globalObject.indexedDB.open(dbName, dbVersion);
7618
+ let settled = false;
7619
+ let blockedTimer;
7620
+ const clearBlockedTimer = () => {
7621
+ if (blockedTimer !== void 0) clearTimeout(blockedTimer);
7622
+ blockedTimer = void 0;
7623
+ };
7583
7624
  request.onerror = () => {
7584
- dbCache.delete(dbName);
7585
- refCounts.delete(dbName);
7625
+ clearBlockedTimer();
7626
+ if (settled) return;
7627
+ settled = true;
7628
+ forget(dbName, dbPromise);
7586
7629
  reject(request.error);
7587
7630
  };
7588
7631
  request.onsuccess = () => {
7632
+ clearBlockedTimer();
7589
7633
  const db = request.result;
7634
+ if (settled) {
7635
+ db.close();
7636
+ return;
7637
+ }
7638
+ settled = true;
7590
7639
  db.onversionchange = () => {
7591
7640
  db.close();
7592
- dbCache.delete(dbName);
7593
- refCounts.delete(dbName);
7641
+ forget(dbName, dbPromise);
7594
7642
  };
7643
+ db.addEventListener("close", () => forget(dbName, dbPromise));
7595
7644
  resolve(db);
7596
7645
  };
7597
7646
  request.onupgradeneeded = (event) => {
7647
+ clearBlockedTimer();
7598
7648
  const db = request.result;
7599
7649
  initDatabase2(db, event.oldVersion, request.transaction);
7600
7650
  };
7601
7651
  request.onblocked = () => {
7602
7652
  console.warn("Database upgrade blocked - close other tabs/connections");
7653
+ blockedTimer = setTimeout(() => {
7654
+ if (settled) return;
7655
+ settled = true;
7656
+ forget(dbName, dbPromise);
7657
+ reject(new DatabaseUpgradeBlockedError(dbName));
7658
+ }, BLOCKED_UPGRADE_TIMEOUT_MS);
7603
7659
  };
7604
7660
  });
7605
7661
  dbCache.set(dbName, { version: dbVersion, promise: dbPromise });
@@ -7623,6 +7679,46 @@ async function closeDatabase(dbName) {
7623
7679
  }
7624
7680
  return true;
7625
7681
  }
7682
+
7683
+ // src/repositories/indexedDB/managedConnection.ts
7684
+ var ConnectionDisposedError = class extends Error {
7685
+ constructor(dbName) {
7686
+ super(`connection to database "${dbName}" was disposed`);
7687
+ this.dbName = dbName;
7688
+ }
7689
+ dbName;
7690
+ name = "ConnectionDisposedError";
7691
+ };
7692
+ function createManagedConnection(dbName, version, initDatabase2) {
7693
+ let current = null;
7694
+ let disposed = false;
7695
+ return {
7696
+ get() {
7697
+ if (disposed) return Promise.reject(new ConnectionDisposedError(dbName));
7698
+ if (current) return current;
7699
+ const opening = openDatabase(dbName, version, initDatabase2).then((db) => {
7700
+ const forget2 = () => {
7701
+ if (current === opening) current = null;
7702
+ };
7703
+ db.addEventListener("versionchange", forget2);
7704
+ db.addEventListener("close", forget2);
7705
+ return db;
7706
+ }).catch((err) => {
7707
+ if (current === opening) current = null;
7708
+ throw err;
7709
+ });
7710
+ current = opening;
7711
+ return opening;
7712
+ },
7713
+ async [Symbol.asyncDispose]() {
7714
+ if (disposed) return;
7715
+ disposed = true;
7716
+ if (!current) return;
7717
+ current = null;
7718
+ await closeDatabase(dbName);
7719
+ }
7720
+ };
7721
+ }
7626
7722
  function scriptFromArkAddress(address) {
7627
7723
  return hex.encode(ArkAddress.decode(address).pkScript);
7628
7724
  }
@@ -7906,16 +8002,17 @@ async function setupServiceWorker(pathOrOptions) {
7906
8002
 
7907
8003
  // src/repositories/indexedDB/virtualTxRepository.ts
7908
8004
  var IndexedDBVirtualTxRepository = class {
8005
+ version = 1;
8006
+ connection;
7909
8007
  constructor(dbName = DEFAULT_DB_NAME) {
7910
- this.dbName = dbName;
8008
+ this.connection = createManagedConnection(
8009
+ dbName,
8010
+ INTENT_DB_VERSION,
8011
+ initDatabaseWithIntents
8012
+ );
7911
8013
  }
7912
- dbName;
7913
- version = 1;
7914
- db = null;
7915
- async getDB() {
7916
- if (!this.db)
7917
- this.db = await openDatabase(this.dbName, INTENT_DB_VERSION, initDatabaseWithIntents);
7918
- return this.db;
8014
+ getDB() {
8015
+ return this.connection.get();
7919
8016
  }
7920
8017
  async clear() {
7921
8018
  const db = await this.getDB();
@@ -8028,24 +8125,23 @@ var IndexedDBVirtualTxRepository = class {
8028
8125
  await awaitTransaction(transaction);
8029
8126
  }
8030
8127
  async [Symbol.asyncDispose]() {
8031
- if (!this.db) return;
8032
- await closeDatabase(this.dbName);
8033
- this.db = null;
8128
+ await this.connection[Symbol.asyncDispose]();
8034
8129
  }
8035
8130
  };
8036
8131
 
8037
8132
  // src/repositories/indexedDB/intentRepository.ts
8038
8133
  var IndexedDBIntentRepository = class {
8134
+ version = 1;
8135
+ connection;
8039
8136
  constructor(dbName = DEFAULT_DB_NAME) {
8040
- this.dbName = dbName;
8137
+ this.connection = createManagedConnection(
8138
+ dbName,
8139
+ INTENT_DB_VERSION,
8140
+ initDatabaseWithIntents
8141
+ );
8041
8142
  }
8042
- dbName;
8043
- version = 1;
8044
- db = null;
8045
- async getDB() {
8046
- if (!this.db)
8047
- this.db = await openDatabase(this.dbName, INTENT_DB_VERSION, initDatabaseWithIntents);
8048
- return this.db;
8143
+ getDB() {
8144
+ return this.connection.get();
8049
8145
  }
8050
8146
  async clear() {
8051
8147
  const db = await this.getDB();
@@ -8078,9 +8174,7 @@ var IndexedDBIntentRepository = class {
8078
8174
  return out;
8079
8175
  }
8080
8176
  async [Symbol.asyncDispose]() {
8081
- if (!this.db) return;
8082
- await closeDatabase(this.dbName);
8083
- this.db = null;
8177
+ await this.connection[Symbol.asyncDispose]();
8084
8178
  }
8085
8179
  };
8086
8180
 
@@ -10382,33 +10476,17 @@ var deserializeTransaction = (o) => ({
10382
10476
 
10383
10477
  // src/repositories/indexedDB/contractRepository.ts
10384
10478
  var IndexedDBContractRepository = class {
10479
+ version = 2;
10480
+ connection;
10385
10481
  constructor(dbName = DEFAULT_DB_NAME) {
10386
- this.dbName = dbName;
10482
+ this.connection = createManagedConnection(dbName, DB_VERSION, initDatabase);
10387
10483
  }
10388
- dbName;
10389
- version = 2;
10390
- db = null;
10391
10484
  async clear() {
10392
10485
  try {
10393
10486
  const db = await this.getDB();
10394
- return new Promise((resolve, reject) => {
10395
- const transaction = db.transaction([STORE_CONTRACTS], "readwrite");
10396
- const contractDataStore = transaction.objectStore(STORE_CONTRACTS);
10397
- const contractsStore = transaction.objectStore(STORE_CONTRACTS);
10398
- const contractDataRequest = contractDataStore.clear();
10399
- const contractsRequest = contractsStore.clear();
10400
- let completed = 0;
10401
- const checkComplete = () => {
10402
- completed++;
10403
- if (completed === 2) {
10404
- resolve();
10405
- }
10406
- };
10407
- contractDataRequest.onsuccess = checkComplete;
10408
- contractsRequest.onsuccess = checkComplete;
10409
- contractDataRequest.onerror = () => reject(contractDataRequest.error);
10410
- contractsRequest.onerror = () => reject(contractsRequest.error);
10411
- });
10487
+ const transaction = db.transaction([STORE_CONTRACTS], "readwrite");
10488
+ transaction.objectStore(STORE_CONTRACTS).clear();
10489
+ await awaitTransaction(transaction);
10412
10490
  } catch (error) {
10413
10491
  console.error("Failed to clear contract data:", error);
10414
10492
  throw error;
@@ -10419,28 +10497,20 @@ var IndexedDBContractRepository = class {
10419
10497
  const db = await this.getDB();
10420
10498
  const store = db.transaction([STORE_CONTRACTS], "readonly").objectStore(STORE_CONTRACTS);
10421
10499
  if (!filter || Object.keys(filter).length === 0) {
10422
- return new Promise((resolve, reject) => {
10423
- const request = store.getAll();
10424
- request.onerror = () => reject(request.error);
10425
- request.onsuccess = () => resolve(request.result ?? []);
10426
- });
10500
+ return await promisifyRequest(store.getAll()) ?? [];
10427
10501
  }
10428
10502
  const normalizedFilter = normalizeFilter(filter);
10429
10503
  if (normalizedFilter.has("script")) {
10430
10504
  const scripts = normalizedFilter.get("script");
10431
10505
  const contracts = await Promise.all(
10432
10506
  scripts.map(
10433
- (script) => new Promise((resolve, reject) => {
10434
- const req = store.get(script);
10435
- req.onerror = () => reject(req.error);
10436
- req.onsuccess = () => resolve(req.result);
10437
- })
10507
+ (script) => promisifyRequest(store.get(script))
10438
10508
  )
10439
10509
  );
10440
10510
  return this.applyContractFilter(contracts, normalizedFilter);
10441
10511
  }
10442
10512
  if (normalizedFilter.has("state")) {
10443
- const contracts = await this.getContractsByIndexValues(
10513
+ const contracts = await getAllByIndexValues(
10444
10514
  store,
10445
10515
  "state",
10446
10516
  normalizedFilter.get("state")
@@ -10448,18 +10518,14 @@ var IndexedDBContractRepository = class {
10448
10518
  return this.applyContractFilter(contracts, normalizedFilter);
10449
10519
  }
10450
10520
  if (normalizedFilter.has("type")) {
10451
- const contracts = await this.getContractsByIndexValues(
10521
+ const contracts = await getAllByIndexValues(
10452
10522
  store,
10453
10523
  "type",
10454
10524
  normalizedFilter.get("type")
10455
10525
  );
10456
10526
  return this.applyContractFilter(contracts, normalizedFilter);
10457
10527
  }
10458
- const allContracts = await new Promise((resolve, reject) => {
10459
- const request = store.getAll();
10460
- request.onerror = () => reject(request.error);
10461
- request.onsuccess = () => resolve(request.result ?? []);
10462
- });
10528
+ const allContracts = await promisifyRequest(store.getAll()) ?? [];
10463
10529
  return this.applyContractFilter(allContracts, normalizedFilter);
10464
10530
  } catch (error) {
10465
10531
  console.error("Failed to get contracts:", error);
@@ -10469,13 +10535,9 @@ var IndexedDBContractRepository = class {
10469
10535
  async saveContract(contract) {
10470
10536
  try {
10471
10537
  const db = await this.getDB();
10472
- return new Promise((resolve, reject) => {
10473
- const transaction = db.transaction([STORE_CONTRACTS], "readwrite");
10474
- const store = transaction.objectStore(STORE_CONTRACTS);
10475
- const request = store.put(contract);
10476
- request.onerror = () => reject(request.error);
10477
- request.onsuccess = () => resolve();
10478
- });
10538
+ const transaction = db.transaction([STORE_CONTRACTS], "readwrite");
10539
+ transaction.objectStore(STORE_CONTRACTS).put(contract);
10540
+ await awaitTransaction(transaction);
10479
10541
  } catch (error) {
10480
10542
  console.error("Failed to save contract:", error);
10481
10543
  throw error;
@@ -10484,34 +10546,14 @@ var IndexedDBContractRepository = class {
10484
10546
  async deleteContract(script) {
10485
10547
  try {
10486
10548
  const db = await this.getDB();
10487
- return new Promise((resolve, reject) => {
10488
- const transaction = db.transaction([STORE_CONTRACTS], "readwrite");
10489
- const store = transaction.objectStore(STORE_CONTRACTS);
10490
- const getRequest = store.get(script);
10491
- getRequest.onerror = () => reject(getRequest.error);
10492
- getRequest.onsuccess = () => {
10493
- const request = store.delete(script);
10494
- request.onerror = () => reject(request.error);
10495
- request.onsuccess = () => resolve();
10496
- };
10497
- });
10549
+ const transaction = db.transaction([STORE_CONTRACTS], "readwrite");
10550
+ transaction.objectStore(STORE_CONTRACTS).delete(script);
10551
+ await awaitTransaction(transaction);
10498
10552
  } catch (error) {
10499
10553
  console.error(`Failed to delete contract ${script}:`, error);
10500
10554
  throw error;
10501
10555
  }
10502
10556
  }
10503
- getContractsByIndexValues(store, indexName, values) {
10504
- if (values.length === 0) return Promise.resolve([]);
10505
- const index = store.index(indexName);
10506
- const requests = values.map(
10507
- (value) => new Promise((resolve, reject) => {
10508
- const request = index.getAll(value);
10509
- request.onerror = () => reject(request.error);
10510
- request.onsuccess = () => resolve(request.result ?? []);
10511
- })
10512
- );
10513
- return Promise.all(requests).then((results) => results.flatMap((result) => result));
10514
- }
10515
10557
  applyContractFilter(contracts, filter) {
10516
10558
  return contracts.filter((contract) => {
10517
10559
  if (contract === void 0) return false;
@@ -10524,15 +10566,11 @@ var IndexedDBContractRepository = class {
10524
10566
  return true;
10525
10567
  });
10526
10568
  }
10527
- async getDB() {
10528
- if (this.db) return this.db;
10529
- this.db = await openDatabase(this.dbName, DB_VERSION, initDatabase);
10530
- return this.db;
10569
+ getDB() {
10570
+ return this.connection.get();
10531
10571
  }
10532
10572
  async [Symbol.asyncDispose]() {
10533
- if (!this.db) return;
10534
- await closeDatabase(this.dbName);
10535
- this.db = null;
10573
+ await this.connection[Symbol.asyncDispose]();
10536
10574
  }
10537
10575
  };
10538
10576
  var FILTER_FIELDS = ["script", "state", "type", "watch"];
@@ -10551,70 +10589,34 @@ function normalizeFilter(filter) {
10551
10589
 
10552
10590
  // src/repositories/indexedDB/walletRepository.ts
10553
10591
  var IndexedDBWalletRepository = class {
10592
+ version = 1;
10593
+ connection;
10554
10594
  constructor(dbName = DEFAULT_DB_NAME) {
10555
- this.dbName = dbName;
10595
+ this.connection = createManagedConnection(dbName, DB_VERSION, initDatabase);
10556
10596
  }
10557
- dbName;
10558
- version = 1;
10559
- db = null;
10560
10597
  async clear() {
10561
10598
  try {
10562
10599
  const db = await this.getDB();
10563
- return new Promise((resolve, reject) => {
10564
- const transaction = db.transaction(
10565
- [STORE_VTXOS, STORE_UTXOS, STORE_TRANSACTIONS, STORE_WALLET_STATE],
10566
- "readwrite"
10567
- );
10568
- const vtxosStore = transaction.objectStore(STORE_VTXOS);
10569
- const utxosStore = transaction.objectStore(STORE_UTXOS);
10570
- const transactionsStore = transaction.objectStore(STORE_TRANSACTIONS);
10571
- const walletStateStore = transaction.objectStore(STORE_WALLET_STATE);
10572
- const requests = [
10573
- vtxosStore.clear(),
10574
- utxosStore.clear(),
10575
- transactionsStore.clear(),
10576
- walletStateStore.clear()
10577
- ];
10578
- let completed = 0;
10579
- const checkComplete = () => {
10580
- completed++;
10581
- if (completed === requests.length) {
10582
- resolve();
10583
- }
10584
- };
10585
- requests.forEach((request) => {
10586
- request.onsuccess = checkComplete;
10587
- request.onerror = () => reject(request.error);
10588
- });
10589
- });
10600
+ const stores = [STORE_VTXOS, STORE_UTXOS, STORE_TRANSACTIONS, STORE_WALLET_STATE];
10601
+ const transaction = db.transaction(stores, "readwrite");
10602
+ for (const name of stores) transaction.objectStore(name).clear();
10603
+ await awaitTransaction(transaction);
10590
10604
  } catch (error) {
10591
10605
  console.error("Failed to clear wallet data:", error);
10592
10606
  throw error;
10593
10607
  }
10594
10608
  }
10595
10609
  async [Symbol.asyncDispose]() {
10596
- if (!this.db) return;
10597
- await closeDatabase(this.dbName);
10598
- this.db = null;
10610
+ await this.connection[Symbol.asyncDispose]();
10599
10611
  }
10600
10612
  async getVtxos(address) {
10601
10613
  try {
10602
10614
  const db = await this.getDB();
10603
- return new Promise((resolve, reject) => {
10604
- const transaction = db.transaction([STORE_VTXOS], "readonly");
10605
- const store = transaction.objectStore(STORE_VTXOS);
10606
- const index = store.index("address");
10607
- const request = index.getAll(address);
10608
- request.onerror = () => reject(request.error);
10609
- request.onsuccess = () => {
10610
- const results = request.result || [];
10611
- try {
10612
- resolve(results.map(deserializeVtxoWithBackfill));
10613
- } catch (err) {
10614
- reject(err);
10615
- }
10616
- };
10617
- });
10615
+ const store = db.transaction([STORE_VTXOS], "readonly").objectStore(STORE_VTXOS);
10616
+ const results = await promisifyRequest(
10617
+ store.index("address").getAll(address)
10618
+ );
10619
+ return (results || []).map(deserializeVtxoWithBackfill);
10618
10620
  } catch (error) {
10619
10621
  console.error(`Failed to get VTXOs for address ${address}:`, error);
10620
10622
  return [];
@@ -10623,24 +10625,13 @@ var IndexedDBWalletRepository = class {
10623
10625
  async saveVtxos(address, vtxos) {
10624
10626
  try {
10625
10627
  const db = await this.getDB();
10626
- return new Promise((resolve, reject) => {
10627
- const transaction = db.transaction([STORE_VTXOS], "readwrite");
10628
- const store = transaction.objectStore(STORE_VTXOS);
10629
- const promises = vtxos.map((vtxo) => {
10630
- return new Promise((resolveItem, rejectItem) => {
10631
- const serialized = serializeVtxo(vtxo);
10632
- const item = {
10633
- address,
10634
- ...serialized
10635
- };
10636
- const request = store.put(item);
10637
- request.onerror = () => rejectItem(request.error);
10638
- request.onsuccess = () => resolveItem();
10639
- });
10640
- });
10641
- Promise.all(promises).then(() => resolve()).catch(reject);
10642
- transaction.onerror = () => reject(transaction.error);
10643
- });
10628
+ const transaction = db.transaction([STORE_VTXOS], "readwrite");
10629
+ const store = transaction.objectStore(STORE_VTXOS);
10630
+ for (const vtxo of vtxos) {
10631
+ const serialized = serializeVtxo(vtxo);
10632
+ store.put({ address, ...serialized });
10633
+ }
10634
+ await awaitTransaction(transaction);
10644
10635
  } catch (error) {
10645
10636
  console.error(`Failed to save VTXOs for address ${address}:`, error);
10646
10637
  throw error;
@@ -10649,22 +10640,9 @@ var IndexedDBWalletRepository = class {
10649
10640
  async deleteVtxos(address) {
10650
10641
  try {
10651
10642
  const db = await this.getDB();
10652
- return new Promise((resolve, reject) => {
10653
- const transaction = db.transaction([STORE_VTXOS], "readwrite");
10654
- const store = transaction.objectStore(STORE_VTXOS);
10655
- const index = store.index("address");
10656
- const request = index.openCursor(IDBKeyRange.only(address));
10657
- request.onerror = () => reject(request.error);
10658
- request.onsuccess = () => {
10659
- const cursor = request.result;
10660
- if (cursor) {
10661
- cursor.delete();
10662
- cursor.continue();
10663
- } else {
10664
- resolve();
10665
- }
10666
- };
10667
- });
10643
+ const transaction = db.transaction([STORE_VTXOS], "readwrite");
10644
+ deleteByIndex(transaction.objectStore(STORE_VTXOS), "address", address);
10645
+ await awaitTransaction(transaction);
10668
10646
  } catch (error) {
10669
10647
  console.error(`Failed to clear VTXOs for address ${address}:`, error);
10670
10648
  throw error;
@@ -10673,34 +10651,24 @@ var IndexedDBWalletRepository = class {
10673
10651
  async getVtxosForScript(script) {
10674
10652
  try {
10675
10653
  const db = await this.getDB();
10676
- return new Promise((resolve, reject) => {
10677
- const transaction = db.transaction([STORE_VTXOS], "readonly");
10678
- const store = transaction.objectStore(STORE_VTXOS);
10679
- const index = store.index("script");
10680
- const request = index.getAll(script);
10681
- request.onerror = () => reject(request.error);
10682
- request.onsuccess = () => {
10683
- const results = request.result || [];
10684
- try {
10685
- const matching = results.filter((r) => r.script === script);
10686
- const byOutpoint = /* @__PURE__ */ new Map();
10687
- for (const row of matching) {
10688
- const outpoint = `${row.txid}:${row.vout}`;
10689
- const existing = byOutpoint.get(outpoint);
10690
- if (!existing) {
10691
- byOutpoint.set(outpoint, row);
10692
- continue;
10693
- }
10694
- if (shouldReplaceVtxo(existing, row)) {
10695
- byOutpoint.set(outpoint, row);
10696
- }
10697
- }
10698
- resolve(Array.from(byOutpoint.values()).map(deserializeVtxoWithBackfill));
10699
- } catch (err) {
10700
- reject(err);
10701
- }
10702
- };
10703
- });
10654
+ const store = db.transaction([STORE_VTXOS], "readonly").objectStore(STORE_VTXOS);
10655
+ const results = await promisifyRequest(
10656
+ store.index("script").getAll(script)
10657
+ );
10658
+ const matching = (results || []).filter((r) => r.script === script);
10659
+ const byOutpoint = /* @__PURE__ */ new Map();
10660
+ for (const row of matching) {
10661
+ const outpoint = `${row.txid}:${row.vout}`;
10662
+ const existing = byOutpoint.get(outpoint);
10663
+ if (!existing) {
10664
+ byOutpoint.set(outpoint, row);
10665
+ continue;
10666
+ }
10667
+ if (shouldReplaceVtxo(existing, row)) {
10668
+ byOutpoint.set(outpoint, row);
10669
+ }
10670
+ }
10671
+ return Array.from(byOutpoint.values()).map(deserializeVtxoWithBackfill);
10704
10672
  } catch (error) {
10705
10673
  console.error(`Failed to get VTXOs for script ${script}:`, error);
10706
10674
  throw error;
@@ -10722,22 +10690,9 @@ var IndexedDBWalletRepository = class {
10722
10690
  async deleteVtxosForScript(script) {
10723
10691
  try {
10724
10692
  const db = await this.getDB();
10725
- return new Promise((resolve, reject) => {
10726
- const transaction = db.transaction([STORE_VTXOS], "readwrite");
10727
- const store = transaction.objectStore(STORE_VTXOS);
10728
- const index = store.index("script");
10729
- const request = index.openCursor(IDBKeyRange.only(script));
10730
- request.onerror = () => reject(request.error);
10731
- request.onsuccess = () => {
10732
- const cursor = request.result;
10733
- if (cursor) {
10734
- cursor.delete();
10735
- cursor.continue();
10736
- } else {
10737
- resolve();
10738
- }
10739
- };
10740
- });
10693
+ const transaction = db.transaction([STORE_VTXOS], "readwrite");
10694
+ deleteByIndex(transaction.objectStore(STORE_VTXOS), "script", script);
10695
+ await awaitTransaction(transaction);
10741
10696
  } catch (error) {
10742
10697
  console.error(`Failed to clear VTXOs for script ${script}:`, error);
10743
10698
  throw error;
@@ -10746,18 +10701,9 @@ var IndexedDBWalletRepository = class {
10746
10701
  async getUtxos(address) {
10747
10702
  try {
10748
10703
  const db = await this.getDB();
10749
- return new Promise((resolve, reject) => {
10750
- const transaction = db.transaction([STORE_UTXOS], "readonly");
10751
- const store = transaction.objectStore(STORE_UTXOS);
10752
- const index = store.index("address");
10753
- const request = index.getAll(address);
10754
- request.onerror = () => reject(request.error);
10755
- request.onsuccess = () => {
10756
- const results = request.result || [];
10757
- const utxos = results.map(deserializeUtxo);
10758
- resolve(utxos);
10759
- };
10760
- });
10704
+ const store = db.transaction([STORE_UTXOS], "readonly").objectStore(STORE_UTXOS);
10705
+ const results = await promisifyRequest(store.index("address").getAll(address));
10706
+ return (results || []).map(deserializeUtxo);
10761
10707
  } catch (error) {
10762
10708
  console.error(`Failed to get UTXOs for address ${address}:`, error);
10763
10709
  return [];
@@ -10766,24 +10712,10 @@ var IndexedDBWalletRepository = class {
10766
10712
  async saveUtxos(address, utxos) {
10767
10713
  try {
10768
10714
  const db = await this.getDB();
10769
- return new Promise((resolve, reject) => {
10770
- const transaction = db.transaction([STORE_UTXOS], "readwrite");
10771
- const store = transaction.objectStore(STORE_UTXOS);
10772
- const promises = utxos.map((utxo) => {
10773
- return new Promise((resolveItem, rejectItem) => {
10774
- const serialized = serializeUtxo(utxo);
10775
- const item = {
10776
- address,
10777
- ...serialized
10778
- };
10779
- const request = store.put(item);
10780
- request.onerror = () => rejectItem(request.error);
10781
- request.onsuccess = () => resolveItem();
10782
- });
10783
- });
10784
- Promise.all(promises).then(() => resolve()).catch(reject);
10785
- transaction.onerror = () => reject(transaction.error);
10786
- });
10715
+ const transaction = db.transaction([STORE_UTXOS], "readwrite");
10716
+ const store = transaction.objectStore(STORE_UTXOS);
10717
+ for (const utxo of utxos) store.put({ address, ...serializeUtxo(utxo) });
10718
+ await awaitTransaction(transaction);
10787
10719
  } catch (error) {
10788
10720
  console.error(`Failed to save UTXOs for address ${address}:`, error);
10789
10721
  throw error;
@@ -10792,22 +10724,9 @@ var IndexedDBWalletRepository = class {
10792
10724
  async deleteUtxos(address) {
10793
10725
  try {
10794
10726
  const db = await this.getDB();
10795
- return new Promise((resolve, reject) => {
10796
- const transaction = db.transaction([STORE_UTXOS], "readwrite");
10797
- const store = transaction.objectStore(STORE_UTXOS);
10798
- const index = store.index("address");
10799
- const request = index.openCursor(IDBKeyRange.only(address));
10800
- request.onerror = () => reject(request.error);
10801
- request.onsuccess = () => {
10802
- const cursor = request.result;
10803
- if (cursor) {
10804
- cursor.delete();
10805
- cursor.continue();
10806
- } else {
10807
- resolve();
10808
- }
10809
- };
10810
- });
10727
+ const transaction = db.transaction([STORE_UTXOS], "readwrite");
10728
+ deleteByIndex(transaction.objectStore(STORE_UTXOS), "address", address);
10729
+ await awaitTransaction(transaction);
10811
10730
  } catch (error) {
10812
10731
  console.error(`Failed to clear UTXOs for address ${address}:`, error);
10813
10732
  throw error;
@@ -10816,17 +10735,11 @@ var IndexedDBWalletRepository = class {
10816
10735
  async getTransactionHistory(address) {
10817
10736
  try {
10818
10737
  const db = await this.getDB();
10819
- return new Promise((resolve, reject) => {
10820
- const transaction = db.transaction([STORE_TRANSACTIONS], "readonly");
10821
- const store = transaction.objectStore(STORE_TRANSACTIONS);
10822
- const index = store.index("address");
10823
- const request = index.getAll(address);
10824
- request.onerror = () => reject(request.error);
10825
- request.onsuccess = () => {
10826
- const results = request.result || [];
10827
- resolve(results.sort((a, b) => a.createdAt - b.createdAt));
10828
- };
10829
- });
10738
+ const store = db.transaction([STORE_TRANSACTIONS], "readonly").objectStore(STORE_TRANSACTIONS);
10739
+ const results = await promisifyRequest(
10740
+ store.index("address").getAll(address)
10741
+ );
10742
+ return (results || []).sort((a, b) => a.createdAt - b.createdAt);
10830
10743
  } catch (error) {
10831
10744
  console.error(`Failed to get transaction history for address ${address}:`, error);
10832
10745
  return [];
@@ -10835,23 +10748,18 @@ var IndexedDBWalletRepository = class {
10835
10748
  async saveTransactions(address, txs) {
10836
10749
  try {
10837
10750
  const db = await this.getDB();
10838
- return new Promise((resolve, reject) => {
10839
- const transaction = db.transaction([STORE_TRANSACTIONS], "readwrite");
10840
- const store = transaction.objectStore(STORE_TRANSACTIONS);
10841
- txs.forEach((tx) => {
10842
- const item = {
10843
- address,
10844
- ...tx,
10845
- keyBoardingTxid: tx.key.boardingTxid,
10846
- keyCommitmentTxid: tx.key.commitmentTxid,
10847
- keyArkTxid: tx.key.arkTxid
10848
- };
10849
- store.put(item);
10751
+ const transaction = db.transaction([STORE_TRANSACTIONS], "readwrite");
10752
+ const store = transaction.objectStore(STORE_TRANSACTIONS);
10753
+ for (const tx of txs) {
10754
+ store.put({
10755
+ address,
10756
+ ...tx,
10757
+ keyBoardingTxid: tx.key.boardingTxid,
10758
+ keyCommitmentTxid: tx.key.commitmentTxid,
10759
+ keyArkTxid: tx.key.arkTxid
10850
10760
  });
10851
- transaction.oncomplete = () => resolve();
10852
- transaction.onerror = () => reject(transaction.error);
10853
- transaction.onabort = () => reject(new Error("Transaction aborted"));
10854
- });
10761
+ }
10762
+ await awaitTransaction(transaction);
10855
10763
  } catch (error) {
10856
10764
  console.error(`Failed to save transactions for address ${address}:`, error);
10857
10765
  throw error;
@@ -10860,22 +10768,9 @@ var IndexedDBWalletRepository = class {
10860
10768
  async deleteTransactions(address) {
10861
10769
  try {
10862
10770
  const db = await this.getDB();
10863
- return new Promise((resolve, reject) => {
10864
- const transaction = db.transaction([STORE_TRANSACTIONS], "readwrite");
10865
- const store = transaction.objectStore(STORE_TRANSACTIONS);
10866
- const index = store.index("address");
10867
- const request = index.openCursor(IDBKeyRange.only(address));
10868
- request.onerror = () => reject(request.error);
10869
- request.onsuccess = () => {
10870
- const cursor = request.result;
10871
- if (cursor) {
10872
- cursor.delete();
10873
- cursor.continue();
10874
- } else {
10875
- resolve();
10876
- }
10877
- };
10878
- });
10771
+ const transaction = db.transaction([STORE_TRANSACTIONS], "readwrite");
10772
+ deleteByIndex(transaction.objectStore(STORE_TRANSACTIONS), "address", address);
10773
+ await awaitTransaction(transaction);
10879
10774
  } catch (error) {
10880
10775
  console.error(`Failed to clear transactions for address ${address}:`, error);
10881
10776
  throw error;
@@ -10884,20 +10779,11 @@ var IndexedDBWalletRepository = class {
10884
10779
  async getWalletState() {
10885
10780
  try {
10886
10781
  const db = await this.getDB();
10887
- return new Promise((resolve, reject) => {
10888
- const transaction = db.transaction([STORE_WALLET_STATE], "readonly");
10889
- const store = transaction.objectStore(STORE_WALLET_STATE);
10890
- const request = store.get("state");
10891
- request.onerror = () => reject(request.error);
10892
- request.onsuccess = () => {
10893
- const result = request.result;
10894
- if (result && result.data) {
10895
- resolve(result.data);
10896
- } else {
10897
- resolve(null);
10898
- }
10899
- };
10900
- });
10782
+ const store = db.transaction([STORE_WALLET_STATE], "readonly").objectStore(STORE_WALLET_STATE);
10783
+ const result = await promisifyRequest(
10784
+ store.get("state")
10785
+ );
10786
+ return result?.data ?? null;
10901
10787
  } catch (error) {
10902
10788
  console.error("Failed to get wallet state:", error);
10903
10789
  return null;
@@ -10906,26 +10792,16 @@ var IndexedDBWalletRepository = class {
10906
10792
  async saveWalletState(state) {
10907
10793
  try {
10908
10794
  const db = await this.getDB();
10909
- return new Promise((resolve, reject) => {
10910
- const transaction = db.transaction([STORE_WALLET_STATE], "readwrite");
10911
- const store = transaction.objectStore(STORE_WALLET_STATE);
10912
- const item = {
10913
- key: "state",
10914
- data: state
10915
- };
10916
- const request = store.put(item);
10917
- request.onerror = () => reject(request.error);
10918
- request.onsuccess = () => resolve();
10919
- });
10795
+ const transaction = db.transaction([STORE_WALLET_STATE], "readwrite");
10796
+ transaction.objectStore(STORE_WALLET_STATE).put({ key: "state", data: state });
10797
+ await awaitTransaction(transaction);
10920
10798
  } catch (error) {
10921
10799
  console.error("Failed to save wallet state:", error);
10922
10800
  throw error;
10923
10801
  }
10924
10802
  }
10925
- async getDB() {
10926
- if (this.db) return this.db;
10927
- this.db = await openDatabase(this.dbName, DB_VERSION, initDatabase);
10928
- return this.db;
10803
+ getDB() {
10804
+ return this.connection.get();
10929
10805
  }
10930
10806
  };
10931
10807
  function deserializeVtxoWithBackfill(o) {
@@ -12068,11 +11944,6 @@ function extractArkProviderUrl(provider) {
12068
11944
  var DEFAULT_LOOK_AHEAD_WINDOW = 20;
12069
11945
  var MAX_USED_SIGNING_DESCRIPTORS_LOOK_AHEAD = 1e3;
12070
11946
  var MAINNET_UNILATERAL_EXIT_DELAY = 605184n;
12071
- function toXOnlyPubKey(pubkey) {
12072
- if (pubkey.length === 33) return pubkey.slice(1);
12073
- if (pubkey.length === 32) return pubkey;
12074
- throw new Error(`invalid signer pubkey length: expected 32 or 33, got ${pubkey.length}`);
12075
- }
12076
11947
  function delayToTimelock(delay) {
12077
11948
  return {
12078
11949
  value: delay,
@@ -12532,8 +12403,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
12532
12403
  value: info.boardingExitDelay,
12533
12404
  type: info.boardingExitDelay < 512n ? "blocks" : "seconds"
12534
12405
  };
12535
- const serverPubKey = hex.decode(info.signerPubkey).slice(1);
12536
- const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => hex.decode(info2.pubkey).slice(1)).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => hex.decode(info2.pubkey).slice(1)).catch(() => void 0) : void 0;
12406
+ const serverPubKey = toXOnly(hex.decode(info.signerPubkey), "ark signer key");
12407
+ const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => toXOnly(hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => toXOnly(hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
12537
12408
  const offchainOptions = {
12538
12409
  pubKey,
12539
12410
  serverPubKey,
@@ -13811,7 +13682,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13811
13682
  * the stable public API.
13812
13683
  */
13813
13684
  async rotateServerSigner(newServerPubKey, checkpointTapscript) {
13814
- const xonly = toXOnlyPubKey(newServerPubKey);
13685
+ const xonly = toXOnly(newServerPubKey, "ark signer key");
13815
13686
  const newServerUnrollScript = assertValidServerUnrollScript(
13816
13687
  checkpointTapscript,
13817
13688
  resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
@@ -13990,9 +13861,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13990
13861
  const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
13991
13862
  const delegatePubKey = this.offchainTapscript instanceof DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
13992
13863
  const arkInfo = await this.arkProvider.getInfo();
13993
- const currentSignerPubKey = toXOnlyPubKey(hex.decode(arkInfo.signerPubkey));
13864
+ const currentSignerPubKey = toXOnly(hex.decode(arkInfo.signerPubkey), "ark signer key");
13994
13865
  const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
13995
- (s) => toXOnlyPubKey(hex.decode(s.pubkey))
13866
+ (s) => toXOnly(hex.decode(s.pubkey), "deprecated signer key")
13996
13867
  );
13997
13868
  const deps = {
13998
13869
  indexerProvider: this.indexerProvider,
@@ -14121,7 +13992,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14121
13992
  throw new Error("Invalid configured public key");
14122
13993
  }
14123
13994
  const setup = await ReadonlyWallet.setupWalletConfig(config, pubkey);
14124
- const forfeitPubkey = hex.decode(setup.info.forfeitPubkey).slice(1);
13995
+ const forfeitPubkey = toXOnly(hex.decode(setup.info.forfeitPubkey), "forfeit key");
14125
13996
  const forfeitAddress = Address(setup.network).decode(setup.info.forfeitAddress);
14126
13997
  const forfeitOutputScript = OutScript.encode(forfeitAddress);
14127
13998
  const checkpointExitDelayOverrides = {
@@ -14791,9 +14662,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14791
14662
  if (!sweepTapTreeRoot) {
14792
14663
  throw new Error("Sweep tap tree root not set");
14793
14664
  }
14794
- const xOnlyPublicKeys = event.cosignersPublicKeys.map((k) => k.slice(2));
14665
+ const xOnlyPublicKeys = event.cosignersPublicKeys.map(
14666
+ (k) => hex.encode(toXOnly(hex.decode(k), "cosigner key"))
14667
+ );
14795
14668
  const signerPublicKey = await session.getPublicKey();
14796
- const xonlySignerPublicKey = signerPublicKey.subarray(1);
14669
+ const xonlySignerPublicKey = toXOnly(signerPublicKey, "signer key");
14797
14670
  if (!xOnlyPublicKeys.includes(hex.encode(xonlySignerPublicKey))) {
14798
14671
  return { skip: true };
14799
14672
  }
@@ -21783,15 +21656,17 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
21783
21656
  batchId = event.id;
21784
21657
  const sweepTapscript = CSVMultisigTapscript.encode({
21785
21658
  timelock,
21786
- pubkeys: [hex.decode(info.forfeitPubkey).subarray(1)]
21659
+ pubkeys: [toXOnly(hex.decode(info.forfeitPubkey), "forfeit key")]
21787
21660
  }).script;
21788
21661
  sweepTapTreeRoot = tapLeafHash(sweepTapscript);
21789
21662
  return { skip: false };
21790
21663
  },
21791
21664
  onTreeSigningStarted: async (event, vtxoTree) => {
21792
21665
  const signerPubKey = await session.getPublicKey();
21793
- const xonlySignerPubKey = signerPubKey.subarray(1);
21794
- const xOnlyPubkeys = event.cosignersPublicKeys.map((k) => k.slice(2));
21666
+ const xonlySignerPubKey = toXOnly(signerPubKey, "signer key");
21667
+ const xOnlyPubkeys = event.cosignersPublicKeys.map(
21668
+ (k) => hex.encode(toXOnly(hex.decode(k), "cosigner key"))
21669
+ );
21795
21670
  if (!xOnlyPubkeys.includes(hex.encode(xonlySignerPubKey))) {
21796
21671
  return { skip: true };
21797
21672
  }
@@ -21974,7 +21849,7 @@ var Arkade = class _Arkade {
21974
21849
  /** Connect and resolve the server key, checkpoint closure and (if present) the co-signer key. */
21975
21850
  static async connect(opts) {
21976
21851
  const info = await opts.arkade.getInfo();
21977
- const serverKey = hex.decode(info.signerPubkey).slice(1);
21852
+ const serverKey = toXOnly(hex.decode(info.signerPubkey), "ark signer key");
21978
21853
  const checkpoint = CSVMultisigTapscript.decode(hex.decode(info.checkpointTapscript));
21979
21854
  const network = opts.network ?? DEFAULT_NETWORK;
21980
21855
  let emulatorKey;
@@ -21983,8 +21858,7 @@ var Arkade = class _Arkade {
21983
21858
  }
21984
21859
  let userKey;
21985
21860
  if (opts.identity) {
21986
- const pub = await opts.identity.xOnlyPublicKey();
21987
- userKey = pub.length === 33 ? pub.slice(1) : pub;
21861
+ userKey = toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
21988
21862
  }
21989
21863
  return new _Arkade({
21990
21864
  arkProvider: opts.arkade,
@@ -22759,6 +22633,6 @@ function createDefaultPaymentRouter(wallet) {
22759
22633
  (*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
22760
22634
  */
22761
22635
 
22762
- export { ARKADE_MAGIC, ARKADE_SALTED_PREIMAGE_TAG, ARKADE_SWAP_PREIMAGE_TAG, ActivityRegistry, AmbiguousRouteError, ArkNote, ArkadeCash, ArkadeCashCreateError, AssetManager, BIP21, BIP21Error, BIP322, Batch, ChainedTxType, ContractManager, ContractRepositoryImpl, ContractWatcher, DB_VERSION, DEFAULT_MESSAGE_TIMEOUTS, DEFAULT_MIN_BATCH_EXPIRY_SECONDS, DEFAULT_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, DelegateManagerImpl, DelegateNotConfiguredError, DelegatorManagerImpl, DelegatorNotConfiguredError, DescriptorIdentity, DescriptorSigningProviderMissingError, DustChangeError, ELECTRUM_TCP_HOST, ELECTRUM_WS_URL, ESPLORA_URL, ElectrumOnchainProvider, EmulatorPacket, EsploraProvider, Estimator, Extension, ExtensionNotFoundError, ForeignDescriptorError, HDDescriptorProvider, INTENT_TERMINAL_STATES, InMemoryContractRepository, InMemoryIntentRepository, InMemoryVirtualTxRepository, InMemoryWalletRepository, IndexedDBContractRepository, IndexedDBIntentRepository, IndexedDBVirtualTxRepository, IndexedDBWalletRepository, MAX_USED_SIGNING_DESCRIPTORS_LOOK_AHEAD, MESSAGE_BUS_INITIALIZING, MESSAGE_BUS_NOT_INITIALIZED, MIGRATION_KEY, MUTINYNET_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, MessageBus, MessageBusInitializingError, MessageBusNotInitializedError, MissingSigningDescriptorError, MnemonicIdentity, OnchainWallet, P2A, PaymentRouter, REGTEST_MIN_BATCH_EXPIRY_SECONDS, REGTEST_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, Ramps, ReadonlyAssetManager, ReadonlyDescriptorIdentity, ReadonlySingleKey, ReadonlyWallet, ReadonlyWalletError, RestDelegateProvider, RestDelegatorProvider, RestEmulatorProvider, SIGNET_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, SeedIdentity, ServiceWorkerReadonlyWallet, ServiceWorkerTimeoutError, ServiceWorkerWallet, SingleKey, TxTree, TxType, TxWeightEstimator, UnannotatableInputError, UnilateralExit, UnknownPacket, Unroll, VtxoManager, Wallet2 as Wallet, WalletCannotSignError, WalletMessageHandler, WalletNotInitializedError, WalletRepositoryImpl, WsElectrumChainSource, adoptContractDescriptor, arkRail, arkTarget, arkade_exports, assertFinalCommitmentMatchesValidated, assertIntentIdUnique, assertSendableAmount, assertSubmittedArkTxid, assertValidBatchExpiry, assertValidServerUnrollScript, assetMintResolver, boardingResolver, btcTarget, buildForfeitTx, buildOffchainTx, buildPreimageMessage, buildSaltedPreimageMessage, claimWithPreimageIdentity, classifyAgainstSignerSet, classifyContractSigner, closeDatabase, collabExitResolver, combineTapscriptSigs, contractFromArkContract, contractFromArkContractWithAddress, contractPreimage, contractSigner, createAssetPacket, createDefaultActivityRegistry, createDefaultPaymentRouter, createExitChainResolver, decodeArkContract, defaultBatchExpiryPolicy, defaultCheckpointExitDelayPolicy, deserializeAssets, deserializeExitPackage, deserializeUtxo, deserializeVtxo, encodeArkContract, extendVirtualCoinForContract, gateExclusion, gatedContracts, getMigrationStatus, getRandomId, hasBoardingTxExpired, hasCandidates, intentMatchesFilter, intentPageBounds, invoiceTarget, isArkContract, isBatchSignable, isBtcAddress, isContractGenericallySpendable, isCooperativelyMigratable, isDeterministicSigner, isDiscoverable, isHDAllocationCapable, isHDDeterministicSignCapable, isHDWalletCapable, isLightningInvoice, isLnurl, isMessageBusInitializingError, isMessageBusNotInitializedError, isPerArtifactDescriptor, isSigningIdentity, isSubdust, isTerminalIntentState, isValidArkAddress, isVtxoExpiringSoon, isVtxoForScript, isWatchedContract, logExcludedVtxos, makeHandle, matchServerCheckpoints, mergeChainedTxType, migrateWalletRepository, onchainRail, openDatabase, outpointExclusion, outpointReasons, provisionClaimSecret, provisionRefundKey, requiresMigration, resolveBatchExpiryPolicy, resolveCheckpointExitDelayPolicy, resolveDescriptorSigner, resolveSendAmount, rollbackMigration, saveVtxosForContract, scriptFromArkAddress, selectCoinsWithAsset, selectVirtualCoins, serializeAssets, serializeExitPackage, serializeUtxo, serializeVtxo, setupServiceWorker, signAndSubmitOffchainTx, signerSetFromInfo, signingDescriptorIndex, strictSigningDescriptorIndex, toXOnlySignerHex, tryResolveSendAmount, validateBatchRecipients, validateConnectorsTxGraph, validateVtxoTxGraph, verifyTapscriptSignatures, waitForIncomingFunds, warnAndFilterVtxosForScript };
22763
- //# sourceMappingURL=chunk-WJN2BLEI.js.map
22764
- //# sourceMappingURL=chunk-WJN2BLEI.js.map
22636
+ export { ARKADE_MAGIC, ARKADE_SALTED_PREIMAGE_TAG, ARKADE_SWAP_PREIMAGE_TAG, ActivityRegistry, AmbiguousRouteError, ArkNote, ArkadeCash, ArkadeCashCreateError, AssetManager, BIP21, BIP21Error, BIP322, BLOCKED_UPGRADE_TIMEOUT_MS, Batch, ChainedTxType, ConnectionDisposedError, ContractManager, ContractRepositoryImpl, ContractWatcher, DB_VERSION, DEFAULT_MESSAGE_TIMEOUTS, DEFAULT_MIN_BATCH_EXPIRY_SECONDS, DEFAULT_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, DatabaseUpgradeBlockedError, DelegateManagerImpl, DelegateNotConfiguredError, DelegatorManagerImpl, DelegatorNotConfiguredError, DescriptorIdentity, DescriptorSigningProviderMissingError, DustChangeError, ELECTRUM_TCP_HOST, ELECTRUM_WS_URL, ESPLORA_URL, ElectrumOnchainProvider, EmulatorPacket, EsploraProvider, Estimator, Extension, ExtensionNotFoundError, ForeignDescriptorError, HDDescriptorProvider, INTENT_TERMINAL_STATES, InMemoryContractRepository, InMemoryIntentRepository, InMemoryVirtualTxRepository, InMemoryWalletRepository, IndexedDBContractRepository, IndexedDBIntentRepository, IndexedDBVirtualTxRepository, IndexedDBWalletRepository, MAX_USED_SIGNING_DESCRIPTORS_LOOK_AHEAD, MESSAGE_BUS_INITIALIZING, MESSAGE_BUS_NOT_INITIALIZED, MIGRATION_KEY, MUTINYNET_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, MessageBus, MessageBusInitializingError, MessageBusNotInitializedError, MissingSigningDescriptorError, MnemonicIdentity, OnchainWallet, P2A, PaymentRouter, REGTEST_MIN_BATCH_EXPIRY_SECONDS, REGTEST_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, Ramps, ReadonlyAssetManager, ReadonlyDescriptorIdentity, ReadonlySingleKey, ReadonlyWallet, ReadonlyWalletError, RestDelegateProvider, RestDelegatorProvider, RestEmulatorProvider, SIGNET_MIN_CHECKPOINT_EXIT_DELAY_SECONDS, SeedIdentity, ServiceWorkerReadonlyWallet, ServiceWorkerTimeoutError, ServiceWorkerWallet, SingleKey, TxTree, TxType, TxWeightEstimator, UnannotatableInputError, UnilateralExit, UnknownPacket, Unroll, VtxoManager, Wallet2 as Wallet, WalletCannotSignError, WalletMessageHandler, WalletNotInitializedError, WalletRepositoryImpl, WsElectrumChainSource, adoptContractDescriptor, arkRail, arkTarget, arkade_exports, assertFinalCommitmentMatchesValidated, assertIntentIdUnique, assertSendableAmount, assertSubmittedArkTxid, assertValidBatchExpiry, assertValidServerUnrollScript, assetMintResolver, awaitTransaction, boardingResolver, btcTarget, buildForfeitTx, buildOffchainTx, buildPreimageMessage, buildSaltedPreimageMessage, claimWithPreimageIdentity, classifyAgainstSignerSet, classifyContractSigner, closeDatabase, collabExitResolver, combineTapscriptSigs, contractFromArkContract, contractFromArkContractWithAddress, contractPreimage, contractSigner, createAssetPacket, createDefaultActivityRegistry, createDefaultPaymentRouter, createExitChainResolver, createManagedConnection, decodeArkContract, defaultBatchExpiryPolicy, defaultCheckpointExitDelayPolicy, deleteByIndex, deserializeAssets, deserializeExitPackage, deserializeUtxo, deserializeVtxo, encodeArkContract, extendVirtualCoinForContract, gateExclusion, gatedContracts, getAllByIndexValues, getMigrationStatus, getRandomId, hasBoardingTxExpired, hasCandidates, intentMatchesFilter, intentPageBounds, invoiceTarget, isArkContract, isBatchSignable, isBtcAddress, isContractGenericallySpendable, isCooperativelyMigratable, isDeterministicSigner, isDiscoverable, isHDAllocationCapable, isHDDeterministicSignCapable, isHDWalletCapable, isLightningInvoice, isLnurl, isMessageBusInitializingError, isMessageBusNotInitializedError, isPerArtifactDescriptor, isSigningIdentity, isSubdust, isTerminalIntentState, isValidArkAddress, isVtxoExpiringSoon, isVtxoForScript, isWatchedContract, logExcludedVtxos, makeHandle, matchServerCheckpoints, mergeChainedTxType, migrateWalletRepository, onchainRail, openDatabase, outpointExclusion, outpointReasons, promisifyRequest, provisionClaimSecret, provisionRefundKey, requiresMigration, resolveBatchExpiryPolicy, resolveCheckpointExitDelayPolicy, resolveDescriptorSigner, resolveSendAmount, rollbackMigration, saveVtxosForContract, scriptFromArkAddress, selectCoinsWithAsset, selectVirtualCoins, serializeAssets, serializeExitPackage, serializeUtxo, serializeVtxo, setupServiceWorker, signAndSubmitOffchainTx, signerSetFromInfo, signingDescriptorIndex, strictSigningDescriptorIndex, toXOnlySignerHex, tryResolveSendAmount, validateBatchRecipients, validateConnectorsTxGraph, validateVtxoTxGraph, verifyTapscriptSignatures, waitForIncomingFunds, warnAndFilterVtxosForScript };
22637
+ //# sourceMappingURL=chunk-DSC3G6QZ.js.map
22638
+ //# sourceMappingURL=chunk-DSC3G6QZ.js.map