@arkade-os/sdk 0.5.0-rc.25 → 0.5.0-rc.26

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 (80) hide show
  1. package/README.md +65 -0
  2. package/dist/adapters/expo.cjs +5 -5
  3. package/dist/adapters/expo.d.cts +3 -3
  4. package/dist/adapters/expo.d.ts +3 -3
  5. package/dist/adapters/expo.js +3 -3
  6. package/dist/{asyncStorageTaskQueue-ww9Xeiia.d.cts → asyncStorageTaskQueue-CFWscYpG.d.cts} +2 -2
  7. package/dist/{asyncStorageTaskQueue-Cvk3eGnj.d.ts → asyncStorageTaskQueue-DrFapzPg.d.ts} +2 -2
  8. package/dist/{chunk-X4O26KCE.js → chunk-5JQ5EOYE.js} +22 -4
  9. package/dist/chunk-5JQ5EOYE.js.map +1 -0
  10. package/dist/{chunk-IX5XSR74.cjs → chunk-B2YMUJD5.cjs} +1000 -653
  11. package/dist/chunk-B2YMUJD5.cjs.map +1 -0
  12. package/dist/{chunk-EBCWETZM.cjs → chunk-CFOIHLON.cjs} +48 -48
  13. package/dist/{chunk-EBCWETZM.cjs.map → chunk-CFOIHLON.cjs.map} +1 -1
  14. package/dist/{chunk-FN27VWDK.cjs → chunk-FEBAG2K2.cjs} +37 -19
  15. package/dist/chunk-FEBAG2K2.cjs.map +1 -0
  16. package/dist/{chunk-HPLK4G7D.js → chunk-HPUKFTZV.js} +4 -4
  17. package/dist/{chunk-HPLK4G7D.js.map → chunk-HPUKFTZV.js.map} +1 -1
  18. package/dist/{chunk-ONTSMS6N.js → chunk-HTCIPDVW.js} +23 -7
  19. package/dist/chunk-HTCIPDVW.js.map +1 -0
  20. package/dist/{chunk-ZRZT2WPT.cjs → chunk-K2YTDYQF.cjs} +17 -17
  21. package/dist/chunk-K2YTDYQF.cjs.map +1 -0
  22. package/dist/{chunk-CF3PCS6K.js → chunk-N2VM6V6K.js} +3 -3
  23. package/dist/{chunk-CF3PCS6K.js.map → chunk-N2VM6V6K.js.map} +1 -1
  24. package/dist/{chunk-KLPIHGQY.cjs → chunk-QCD3SJOL.cjs} +10 -10
  25. package/dist/{chunk-KLPIHGQY.cjs.map → chunk-QCD3SJOL.cjs.map} +1 -1
  26. package/dist/{chunk-TAVS7Q3H.js → chunk-U5ZRDVVB.js} +520 -176
  27. package/dist/chunk-U5ZRDVVB.js.map +1 -0
  28. package/dist/{chunk-3LDVNVBW.cjs → chunk-VVFCCNU2.cjs} +23 -6
  29. package/dist/chunk-VVFCCNU2.cjs.map +1 -0
  30. package/dist/{chunk-FXFRRKKF.js → chunk-Y5VSJURH.js} +6 -6
  31. package/dist/chunk-Y5VSJURH.js.map +1 -0
  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-KiOcI_Pj.d.ts → delegate-Cz8FnLqi.d.ts} +1 -1
  37. package/dist/{delegate-D28BopQQ.d.cts → delegate-r3jh7UcH.d.cts} +1 -1
  38. package/dist/{index-U45fubju.d.cts → index-BfvbSL0W.d.cts} +56 -6
  39. package/dist/{index-U45fubju.d.ts → index-BfvbSL0W.d.ts} +56 -6
  40. package/dist/{index-DvHEUboO.d.ts → index-Chgwl4dO.d.ts} +2 -2
  41. package/dist/{index-BMFb9viE.d.cts → index-DOION7Ta.d.cts} +2 -2
  42. package/dist/index.cjs +328 -312
  43. package/dist/index.d.cts +129 -87
  44. package/dist/index.d.ts +129 -87
  45. package/dist/index.js +4 -4
  46. package/dist/repositories/realm/index.cjs +35 -35
  47. package/dist/repositories/realm/index.d.cts +2 -2
  48. package/dist/repositories/realm/index.d.ts +2 -2
  49. package/dist/repositories/realm/index.js +5 -5
  50. package/dist/repositories/sqlite/index.cjs +33 -33
  51. package/dist/repositories/sqlite/index.d.cts +2 -2
  52. package/dist/repositories/sqlite/index.d.ts +2 -2
  53. package/dist/repositories/sqlite/index.js +5 -5
  54. package/dist/{taskRunner-D2ZvkPoN.d.cts → taskRunner-BO8a-SQh.d.cts} +2 -2
  55. package/dist/{taskRunner-D0Z_yl0z.d.ts → taskRunner-CXAcjtdU.d.ts} +2 -2
  56. package/dist/wallet/expo/background.cjs +14 -14
  57. package/dist/wallet/expo/background.d.cts +3 -3
  58. package/dist/wallet/expo/background.d.ts +3 -3
  59. package/dist/wallet/expo/background.js +6 -6
  60. package/dist/wallet/expo/index.cjs +19 -15
  61. package/dist/wallet/expo/index.cjs.map +1 -1
  62. package/dist/wallet/expo/index.d.cts +6 -4
  63. package/dist/wallet/expo/index.d.ts +6 -4
  64. package/dist/wallet/expo/index.js +9 -5
  65. package/dist/wallet/expo/index.js.map +1 -1
  66. package/dist/{wallet-SotLSq3X.d.cts → wallet-CFIfUlQP.d.ts} +72 -4
  67. package/dist/{wallet-B3RVL47q.d.ts → wallet-s90p-vIk.d.cts} +72 -4
  68. package/dist/worker/expo/index.cjs +9 -9
  69. package/dist/worker/expo/index.d.cts +4 -4
  70. package/dist/worker/expo/index.d.ts +4 -4
  71. package/dist/worker/expo/index.js +5 -5
  72. package/package.json +1 -1
  73. package/dist/chunk-3LDVNVBW.cjs.map +0 -1
  74. package/dist/chunk-FN27VWDK.cjs.map +0 -1
  75. package/dist/chunk-FXFRRKKF.js.map +0 -1
  76. package/dist/chunk-IX5XSR74.cjs.map +0 -1
  77. package/dist/chunk-ONTSMS6N.js.map +0 -1
  78. package/dist/chunk-TAVS7Q3H.js.map +0 -1
  79. package/dist/chunk-X4O26KCE.js.map +0 -1
  80. package/dist/chunk-ZRZT2WPT.cjs.map +0 -1
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkFN27VWDK_cjs = require('./chunk-FN27VWDK.cjs');
4
- var chunkEBCWETZM_cjs = require('./chunk-EBCWETZM.cjs');
5
- var chunk3LDVNVBW_cjs = require('./chunk-3LDVNVBW.cjs');
3
+ var chunkFEBAG2K2_cjs = require('./chunk-FEBAG2K2.cjs');
4
+ var chunkCFOIHLON_cjs = require('./chunk-CFOIHLON.cjs');
5
+ var chunkVVFCCNU2_cjs = require('./chunk-VVFCCNU2.cjs');
6
6
  var utils_js = require('@scure/btc-signer/utils.js');
7
7
  var btcSigner = require('@scure/btc-signer');
8
8
  var base = require('@scure/base');
@@ -187,7 +187,7 @@ var TreeSignerSession = class _TreeSignerSession {
187
187
  noncesByPubkey.set(base.hex.encode(myPublicKey.subarray(1)), myNonce);
188
188
  const tx = this.graph.find(txid);
189
189
  if (!tx) throw new Error(`missing tx for txid ${txid}`);
190
- const cosigners = chunk3LDVNVBW_cjs.getArkPsbtFields(tx.root, 0, chunk3LDVNVBW_cjs.CosignerPublicKey).map(
190
+ const cosigners = chunkVVFCCNU2_cjs.getArkPsbtFields(tx.root, 0, chunkVVFCCNU2_cjs.CosignerPublicKey).map(
191
191
  (c) => base.hex.encode(c.key.subarray(1))
192
192
  // xonly pubkey
193
193
  );
@@ -239,7 +239,7 @@ var TreeSignerSession = class _TreeSignerSession {
239
239
  if (!aggNonce) throw new Error("missing aggregate nonce");
240
240
  const prevoutAmounts = [];
241
241
  const prevoutScripts = [];
242
- const cosigners = chunk3LDVNVBW_cjs.getArkPsbtFields(g.root, 0, chunk3LDVNVBW_cjs.CosignerPublicKey).map((c) => c.key);
242
+ const cosigners = chunkVVFCCNU2_cjs.getArkPsbtFields(g.root, 0, chunkVVFCCNU2_cjs.CosignerPublicKey).map((c) => c.key);
243
243
  const { finalKey } = aggregateKeys(cosigners, true, {
244
244
  taprootTweak: this.scriptRoot
245
245
  });
@@ -322,7 +322,7 @@ var SingleKey = class _SingleKey {
322
322
  async sign(tx, inputIndexes) {
323
323
  const txCpy = tx.clone();
324
324
  if (!inputIndexes) {
325
- chunk3LDVNVBW_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH);
325
+ chunkVVFCCNU2_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH);
326
326
  try {
327
327
  if (!txCpy.sign(this.key, ALLOWED_SIGHASH)) {
328
328
  throw new Error("Failed to sign transaction");
@@ -422,7 +422,7 @@ var SeedIdentity = class _SeedIdentity {
422
422
  let network;
423
423
  if ("descriptor" in opts && typeof opts.descriptor === "string") {
424
424
  descriptor = opts.descriptor;
425
- network = chunkEBCWETZM_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
425
+ network = chunkCFOIHLON_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
426
426
  } else {
427
427
  network = opts.isMainnet ?? true ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
428
428
  descriptor = descriptorsScure.scriptExpressions.trBIP32({
@@ -499,7 +499,7 @@ var SeedIdentity = class _SeedIdentity {
499
499
  }
500
500
  /** Returns true when `descriptor` is derived from this identity's seed. */
501
501
  ownsDescriptor(descriptor) {
502
- return chunkEBCWETZM_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
502
+ return chunkCFOIHLON_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
503
503
  }
504
504
  /**
505
505
  * Signs each request with the key derived from its descriptor.
@@ -538,7 +538,7 @@ var SeedIdentity = class _SeedIdentity {
538
538
  }
539
539
  // ── internal helpers ─────────────────────────────────────────────
540
540
  derivePrivateKeyForDescriptor(descriptor) {
541
- const network = chunkEBCWETZM_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
541
+ const network = chunkCFOIHLON_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
542
542
  const expansion = descriptorsScure.expand({ descriptor, network });
543
543
  if (expansion.isRanged) {
544
544
  throw new Error(
@@ -563,7 +563,7 @@ var SeedIdentity = class _SeedIdentity {
563
563
  signTxWithKey(tx, key, inputIndexes) {
564
564
  const txCpy = tx.clone();
565
565
  if (!inputIndexes) {
566
- chunk3LDVNVBW_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH2);
566
+ chunkVVFCCNU2_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH2);
567
567
  try {
568
568
  if (!txCpy.sign(key, ALLOWED_SIGHASH2)) {
569
569
  throw new Error("Failed to sign transaction");
@@ -615,7 +615,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
615
615
  /** Wildcard account-descriptor template (e.g. `tr([fp/86'/0'/0']xpub/0/*)`). */
616
616
  descriptor;
617
617
  constructor(descriptor) {
618
- const network = chunkEBCWETZM_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
618
+ const network = chunkCFOIHLON_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
619
619
  let expansion;
620
620
  try {
621
621
  expansion = descriptorsScure.expand({ descriptor, network, index: 0 });
@@ -650,7 +650,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
650
650
  }
651
651
  /** Returns true when `descriptor` derives from this identity's xpub. */
652
652
  ownsDescriptor(descriptor) {
653
- return chunkEBCWETZM_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
653
+ return chunkCFOIHLON_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
654
654
  }
655
655
  };
656
656
  function serializeSeedOwnedSigningIdentity(identity) {
@@ -793,10 +793,10 @@ var DescriptorIdentity = class {
793
793
  this.base = base;
794
794
  }
795
795
  async xOnlyPublicKey() {
796
- return chunkEBCWETZM_cjs.deriveDescriptorLeafPubKey(this.descriptor);
796
+ return chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(this.descriptor);
797
797
  }
798
798
  async compressedPublicKey() {
799
- return chunkEBCWETZM_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
799
+ return chunkCFOIHLON_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
800
800
  }
801
801
  async sign(tx, inputIndexes) {
802
802
  const [signed] = await this.signer.signWithDescriptor([
@@ -856,8 +856,8 @@ var StaticDescriptorProvider = class _StaticDescriptorProvider {
856
856
  }
857
857
  isOurs(descriptor) {
858
858
  try {
859
- const normalized = chunkEBCWETZM_cjs.normalizeToDescriptor(descriptor);
860
- const pubKey = chunkEBCWETZM_cjs.extractPubKey(normalized);
859
+ const normalized = chunkCFOIHLON_cjs.normalizeToDescriptor(descriptor);
860
+ const pubKey = chunkCFOIHLON_cjs.extractPubKey(normalized);
861
861
  return pubKey.toLowerCase() === this.pubKeyHex.toLowerCase();
862
862
  } catch {
863
863
  return false;
@@ -1194,7 +1194,7 @@ function unwrapKeyring(provider) {
1194
1194
  }
1195
1195
  function keyOf(descriptor) {
1196
1196
  try {
1197
- return chunkEBCWETZM_cjs.extractPubKey(chunkEBCWETZM_cjs.normalizeToDescriptor(descriptor)).toLowerCase();
1197
+ return chunkCFOIHLON_cjs.extractPubKey(chunkCFOIHLON_cjs.normalizeToDescriptor(descriptor)).toLowerCase();
1198
1198
  } catch {
1199
1199
  return void 0;
1200
1200
  }
@@ -1285,12 +1285,12 @@ async function resolveDescriptorSigner(descriptor, identity, provider) {
1285
1285
  signMessageWithDescriptor: (ownedDescriptor, message, signatureType) => identity.signDescriptorMessage(ownedDescriptor, message, signatureType)
1286
1286
  } : void 0;
1287
1287
  const owner = providerOwner ?? identityOwner;
1288
- if (owner && chunkEBCWETZM_cjs.parseHDDescriptor(descriptor)) {
1288
+ if (owner && chunkCFOIHLON_cjs.parseHDDescriptor(descriptor)) {
1289
1289
  return new DescriptorIdentity({ descriptor, signer: owner, base: identity });
1290
1290
  }
1291
1291
  let key;
1292
1292
  try {
1293
- key = chunkEBCWETZM_cjs.deriveDescriptorLeafPubKey(descriptor);
1293
+ key = chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(descriptor);
1294
1294
  } catch {
1295
1295
  throw new ForeignDescriptorError(descriptor);
1296
1296
  }
@@ -1343,14 +1343,14 @@ function buildSaltedPreimageMessage(xonly, salt) {
1343
1343
  }
1344
1344
  var PREIMAGE_INDEX = 0;
1345
1345
  function isPerArtifactDescriptor(descriptor) {
1346
- return chunkEBCWETZM_cjs.parseHDDescriptor(descriptor) !== null;
1346
+ return chunkCFOIHLON_cjs.parseHDDescriptor(descriptor) !== null;
1347
1347
  }
1348
1348
  async function provisionDescriptor(wallet) {
1349
1349
  const allocated = isHDAllocationCapable(wallet) ? await wallet.getNextSigningDescriptor() : void 0;
1350
- return allocated ?? await chunkEBCWETZM_cjs.identityDescriptor(wallet.identity);
1350
+ return allocated ?? await chunkCFOIHLON_cjs.identityDescriptor(wallet.identity);
1351
1351
  }
1352
1352
  async function provisionRefundKey(wallet) {
1353
- const descriptor = await chunkEBCWETZM_cjs.identityDescriptor(wallet.identity);
1353
+ const descriptor = await chunkCFOIHLON_cjs.identityDescriptor(wallet.identity);
1354
1354
  const signer = await contractSigner(wallet, descriptor);
1355
1355
  const pubkey = await signer.xOnlyPublicKey();
1356
1356
  const identityPubkey = await wallet.identity.xOnlyPublicKey();
@@ -1360,7 +1360,7 @@ async function provisionRefundKey(wallet) {
1360
1360
  );
1361
1361
  }
1362
1362
  const address = await wallet.getAddress();
1363
- const { pkScript } = chunk3LDVNVBW_cjs.ArkAddress.decode(address);
1363
+ const { pkScript } = chunkVVFCCNU2_cjs.ArkAddress.decode(address);
1364
1364
  return { descriptor, pubkey, pkScript, address };
1365
1365
  }
1366
1366
  async function provisionClaimSecret(wallet, opts = {}) {
@@ -1406,7 +1406,7 @@ async function contractSigner(wallet, descriptor) {
1406
1406
  const signer = isHDWalletCapable(wallet) ? await wallet.signerForDescriptor(descriptor) : wallet.identity;
1407
1407
  let expected;
1408
1408
  try {
1409
- expected = chunkEBCWETZM_cjs.deriveDescriptorLeafPubKey(descriptor);
1409
+ expected = chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(descriptor);
1410
1410
  } catch (cause) {
1411
1411
  throw new ForeignDescriptorError(descriptor, { cause });
1412
1412
  }
@@ -1488,7 +1488,7 @@ function debugLog(debug, ...args) {
1488
1488
  }
1489
1489
  function normalizeOptions(pathOrOptions) {
1490
1490
  const o = typeof pathOrOptions === "string" ? { path: pathOrOptions } : pathOrOptions;
1491
- chunk3LDVNVBW_cjs.assertTimerMs("activationTimeoutMs", o.activationTimeoutMs);
1491
+ chunkVVFCCNU2_cjs.assertTimerMs("activationTimeoutMs", o.activationTimeoutMs);
1492
1492
  return {
1493
1493
  path: o.path,
1494
1494
  updateViaCache: o.updateViaCache ?? "none",
@@ -1611,14 +1611,14 @@ var RestDelegateProvider = class {
1611
1611
  */
1612
1612
  async delegate(intent, forfeitTxs, options) {
1613
1613
  const url = `${this.url}/v1/delegate`;
1614
- const response = await chunk3LDVNVBW_cjs.baseFetch(url, {
1614
+ const response = await chunkVVFCCNU2_cjs.baseFetch(url, {
1615
1615
  method: "POST",
1616
1616
  headers: {
1617
1617
  "Content-Type": "application/json"
1618
1618
  },
1619
1619
  body: JSON.stringify({
1620
1620
  intent: {
1621
- message: chunk3LDVNVBW_cjs.Intent.encodeMessage(intent.message),
1621
+ message: chunkVVFCCNU2_cjs.Intent.encodeMessage(intent.message),
1622
1622
  proof: intent.proof
1623
1623
  },
1624
1624
  forfeit_txs: forfeitTxs,
@@ -1637,7 +1637,7 @@ var RestDelegateProvider = class {
1637
1637
  */
1638
1638
  async getDelegateInfo() {
1639
1639
  const url = `${this.url}/v1/delegator/info`;
1640
- const response = await chunk3LDVNVBW_cjs.rateGate.runHttp(url, () => chunk3LDVNVBW_cjs.baseFetch(url));
1640
+ const response = await chunkVVFCCNU2_cjs.rateGate.runHttp(url, () => chunkVVFCCNU2_cjs.baseFetch(url));
1641
1641
  if (!response.ok) {
1642
1642
  const errorText2 = await response.text();
1643
1643
  throw new Error(`Failed to get delegate info: ${errorText2}`);
@@ -1693,7 +1693,7 @@ async function collectPages(read) {
1693
1693
  return items;
1694
1694
  }
1695
1695
  function scriptFromArkAddress(address) {
1696
- return base.hex.encode(chunk3LDVNVBW_cjs.ArkAddress.decode(address).pkScript);
1696
+ return base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(address).pkScript);
1697
1697
  }
1698
1698
 
1699
1699
  // src/repositories/walletRepository.ts
@@ -1755,9 +1755,9 @@ async function collectScriptVtxos(repository, script, options) {
1755
1755
  return [...byOutpoint.values()].map((row) => row.vtxo);
1756
1756
  }
1757
1757
  function unspentScriptVtxos(rows, copies) {
1758
- const spent = copies.filter((copy) => chunk3LDVNVBW_cjs.isVtxoSpent(copy.vtxo));
1758
+ const spent = copies.filter((copy) => chunkVVFCCNU2_cjs.isVtxoSpent(copy.vtxo));
1759
1759
  return rows.filter(
1760
- (row) => !chunk3LDVNVBW_cjs.isVtxoSpent(row.vtxo) && !spent.some(
1760
+ (row) => !chunkVVFCCNU2_cjs.isVtxoSpent(row.vtxo) && !spent.some(
1761
1761
  (copy) => copy.address !== row.address && copy.vtxo.txid === row.vtxo.txid && copy.vtxo.vout === row.vtxo.vout && shouldReplaceScriptVtxo(row, copy)
1762
1762
  )
1763
1763
  );
@@ -1840,7 +1840,7 @@ var ESPLORA_URL = {
1840
1840
  regtest: "http://localhost:3000/api"
1841
1841
  };
1842
1842
  var EsploraProvider = class {
1843
- constructor(baseUrl = ESPLORA_URL[chunk3LDVNVBW_cjs.DEFAULT_NETWORK_NAME], opts) {
1843
+ constructor(baseUrl = ESPLORA_URL[chunkVVFCCNU2_cjs.DEFAULT_NETWORK_NAME], opts) {
1844
1844
  this.baseUrl = baseUrl;
1845
1845
  this.pollingInterval = opts?.pollingInterval ?? 15e3;
1846
1846
  this.forcePolling = opts?.forcePolling ?? false;
@@ -1855,7 +1855,7 @@ var EsploraProvider = class {
1855
1855
  */
1856
1856
  addressWatches = /* @__PURE__ */ new Map();
1857
1857
  async getCoins(address) {
1858
- const response = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1858
+ const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1859
1859
  if (!response.ok) {
1860
1860
  throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
1861
1861
  }
@@ -1864,12 +1864,12 @@ var EsploraProvider = class {
1864
1864
  async getFeeRate() {
1865
1865
  let url = `${this.baseUrl}/fee-estimates`;
1866
1866
  let key = "1";
1867
- let response = await chunk3LDVNVBW_cjs.baseFetch(url);
1867
+ let response = await chunkVVFCCNU2_cjs.baseFetch(url);
1868
1868
  if (response.status === 404) {
1869
1869
  await response.body?.cancel();
1870
1870
  url = `${this.baseUrl}/v1/fees/recommended`;
1871
1871
  key = "fastestFee";
1872
- response = await chunk3LDVNVBW_cjs.baseFetch(url);
1872
+ response = await chunkVVFCCNU2_cjs.baseFetch(url);
1873
1873
  }
1874
1874
  if (response.status === 404) {
1875
1875
  await response.body?.cancel();
@@ -1906,7 +1906,7 @@ var EsploraProvider = class {
1906
1906
  }
1907
1907
  }
1908
1908
  async getTxOutspends(txid) {
1909
- const response = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1909
+ const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1910
1910
  if (!response.ok) {
1911
1911
  const error = await response.text();
1912
1912
  throw new Error(`Failed to get transaction outspends: ${error}`);
@@ -1914,7 +1914,7 @@ var EsploraProvider = class {
1914
1914
  return response.json();
1915
1915
  }
1916
1916
  async getTransactions(address) {
1917
- const response = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1917
+ const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1918
1918
  if (!response.ok) {
1919
1919
  const error = await response.text();
1920
1920
  throw new Error(`Failed to get transactions: ${error}`);
@@ -1923,14 +1923,14 @@ var EsploraProvider = class {
1923
1923
  }
1924
1924
  /** Orders of magnitude smaller than `/address/{addr}/txs`: the polling fallback's probe. */
1925
1925
  async getAddressStats(address) {
1926
- const response = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/address/${address}`);
1926
+ const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/address/${address}`);
1927
1927
  if (!response.ok) {
1928
1928
  throw new Error(`Failed to get address stats: ${response.statusText}`);
1929
1929
  }
1930
1930
  return response.json();
1931
1931
  }
1932
1932
  async getRawTransaction(txid) {
1933
- const response = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
1933
+ const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
1934
1934
  if (!response.ok) {
1935
1935
  const error = await response.text();
1936
1936
  throw new Error(`Failed to get raw transaction ${txid}: ${error}`);
@@ -1938,7 +1938,7 @@ var EsploraProvider = class {
1938
1938
  return base.hex.decode((await response.text()).trim());
1939
1939
  }
1940
1940
  async getTxStatus(txid) {
1941
- const txresponse = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1941
+ const txresponse = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1942
1942
  if (!txresponse.ok) {
1943
1943
  throw new Error(txresponse.statusText);
1944
1944
  }
@@ -1946,7 +1946,7 @@ var EsploraProvider = class {
1946
1946
  if (!tx.status.confirmed) {
1947
1947
  return { confirmed: false };
1948
1948
  }
1949
- const response = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1949
+ const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1950
1950
  if (!response.ok) {
1951
1951
  throw new Error(`Failed to get transaction status: ${response.statusText}`);
1952
1952
  }
@@ -2220,9 +2220,9 @@ var EsploraProvider = class {
2220
2220
  return { subscribers, teardown, started };
2221
2221
  }
2222
2222
  async getChainTip() {
2223
- let tipBlocks = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/blocks`);
2223
+ let tipBlocks = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/blocks`);
2224
2224
  if (tipBlocks.status === 404) {
2225
- tipBlocks = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/v1/blocks`);
2225
+ tipBlocks = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/v1/blocks`);
2226
2226
  }
2227
2227
  if (!tipBlocks.ok) {
2228
2228
  throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
@@ -2243,7 +2243,7 @@ var EsploraProvider = class {
2243
2243
  };
2244
2244
  }
2245
2245
  async broadcastPackage(parent, child) {
2246
- const response = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
2246
+ const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
2247
2247
  method: "POST",
2248
2248
  headers: {
2249
2249
  "Content-Type": "application/json"
@@ -2259,7 +2259,7 @@ var EsploraProvider = class {
2259
2259
  return result;
2260
2260
  }
2261
2261
  async broadcastTx(tx) {
2262
- const response = await chunk3LDVNVBW_cjs.baseFetch(`${this.baseUrl}/tx`, {
2262
+ const response = await chunkVVFCCNU2_cjs.baseFetch(`${this.baseUrl}/tx`, {
2263
2263
  method: "POST",
2264
2264
  headers: {
2265
2265
  "Content-Type": "text/plain"
@@ -2431,7 +2431,7 @@ function findP2AOutput(tx) {
2431
2431
  var CHILD_DUST_AMOUNT = 546;
2432
2432
  function buildAnchorChild(params) {
2433
2433
  const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
2434
- const child = new chunk3LDVNVBW_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
2434
+ const child = new chunkVVFCCNU2_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
2435
2435
  const anchor = findP2AOutput(parent);
2436
2436
  child.addInput(anchor);
2437
2437
  const estimator = TxWeightEstimator.create().addP2AInput();
@@ -2480,7 +2480,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
2480
2480
  );
2481
2481
  }
2482
2482
  function buildForfeitTxWithOutput(inputs, output, txLocktime) {
2483
- const tx = new chunk3LDVNVBW_cjs.Transaction({
2483
+ const tx = new chunkVVFCCNU2_cjs.Transaction({
2484
2484
  version: 3,
2485
2485
  lockTime: txLocktime
2486
2486
  });
@@ -2507,7 +2507,7 @@ function validateConnectorsTxGraph(settlementTxB64, connectorsGraph) {
2507
2507
  connectorsGraph.validate();
2508
2508
  if (connectorsGraph.root.inputsLength !== 1) throw ErrNumberOfInputs;
2509
2509
  const rootInput = connectorsGraph.root.getInput(0);
2510
- const settlementTx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(settlementTxB64));
2510
+ const settlementTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(settlementTxB64));
2511
2511
  if (settlementTx.outputsLength <= BATCH_OUTPUT_CONNECTORS_INDEX)
2512
2512
  throw ErrInvalidSettlementTxOutputs;
2513
2513
  const expectedRootTxid = settlementTx.id;
@@ -2556,7 +2556,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
2556
2556
  if (previousScriptKey.length !== 32) {
2557
2557
  throw new Error(`parent output ${childIndex} has invalid script`);
2558
2558
  }
2559
- const cosigners = chunk3LDVNVBW_cjs.getArkPsbtFields(child.root, 0, chunk3LDVNVBW_cjs.CosignerPublicKey);
2559
+ const cosigners = chunkVVFCCNU2_cjs.getArkPsbtFields(child.root, 0, chunkVVFCCNU2_cjs.CosignerPublicKey);
2560
2560
  if (cosigners.length === 0) {
2561
2561
  throw ErrMissingCosignersPublicKeys;
2562
2562
  }
@@ -2614,7 +2614,7 @@ var EmulatorPacket = class _EmulatorPacket {
2614
2614
  return new _EmulatorPacket(entries);
2615
2615
  }
2616
2616
  static fromBytes(data) {
2617
- const reader = new chunkFN27VWDK_cjs.BufferReader(data);
2617
+ const reader = new chunkFEBAG2K2_cjs.BufferReader(data);
2618
2618
  const entryCount = reader.readCompactSize();
2619
2619
  const entries = [];
2620
2620
  for (let i = 0; i < entryCount; i++) {
@@ -2632,7 +2632,7 @@ var EmulatorPacket = class _EmulatorPacket {
2632
2632
  return _EmulatorPacket.PACKET_TYPE;
2633
2633
  }
2634
2634
  serialize() {
2635
- const writer = new chunkFN27VWDK_cjs.BufferWriter();
2635
+ const writer = new chunkFEBAG2K2_cjs.BufferWriter();
2636
2636
  writer.writeCompactSize(this.entries.length);
2637
2637
  for (const entry of this.entries) {
2638
2638
  writer.writeUint16LE(entry.vin);
@@ -2719,7 +2719,7 @@ var Extension = class _Extension {
2719
2719
  `expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
2720
2720
  );
2721
2721
  }
2722
- const reader = new chunkFN27VWDK_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
2722
+ const reader = new chunkFEBAG2K2_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
2723
2723
  const packets = [];
2724
2724
  while (reader.remaining() > 0) {
2725
2725
  const packetType = reader.readByte();
@@ -2792,7 +2792,7 @@ var Extension = class _Extension {
2792
2792
  * getAssetPacket returns the embedded Packet, or null if not present.
2793
2793
  */
2794
2794
  getAssetPacket() {
2795
- return this.packets.find((p) => p instanceof chunkFN27VWDK_cjs.Packet) ?? null;
2795
+ return this.packets.find((p) => p instanceof chunkFEBAG2K2_cjs.Packet) ?? null;
2796
2796
  }
2797
2797
  /**
2798
2798
  * getEmulatorPacket returns the embedded EmulatorPacket, or null if not present.
@@ -2816,8 +2816,8 @@ var Extension = class _Extension {
2816
2816
  };
2817
2817
  function parsePacket(packetType, data) {
2818
2818
  switch (packetType) {
2819
- case chunkFN27VWDK_cjs.Packet.PACKET_TYPE:
2820
- return chunkFN27VWDK_cjs.Packet.fromBytes(data);
2819
+ case chunkFEBAG2K2_cjs.Packet.PACKET_TYPE:
2820
+ return chunkFEBAG2K2_cjs.Packet.fromBytes(data);
2821
2821
  case EmulatorPacket.PACKET_TYPE:
2822
2822
  return EmulatorPacket.fromBytes(data);
2823
2823
  default:
@@ -2864,22 +2864,22 @@ function buildOpReturnScript(data) {
2864
2864
  }
2865
2865
  return script;
2866
2866
  }
2867
- var ErrOffchainOutputNotFound = (address) => new chunk3LDVNVBW_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
2868
- var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
2867
+ var ErrOffchainOutputNotFound = (address) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
2868
+ var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
2869
2869
  `invalid asset output amount for ${assetId}: got ${got}, want ${want}`
2870
2870
  );
2871
- var ErrAssetGroupNotFound = (assetId) => new chunk3LDVNVBW_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
2872
- var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
2871
+ var ErrAssetGroupNotFound = (assetId) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
2872
+ var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
2873
2873
  `asset output not found in asset group ${assetId} at index ${outputIndex}`
2874
2874
  );
2875
- var ErrOnchainOutputNotFound = (address) => new chunk3LDVNVBW_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
2876
- var ErrUnvalidatedOffchainOutput = (address) => new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
2875
+ var ErrOnchainOutputNotFound = (address) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
2876
+ var ErrUnvalidatedOffchainOutput = (address) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
2877
2877
  `offchain output ${address} cannot be validated: virtual output tree signing did not run`
2878
2878
  );
2879
- var ErrIntentOutputNotFound = (index, kind) => new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
2879
+ var ErrIntentOutputNotFound = (index, kind) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
2880
2880
  `${kind} output ${index} of the intent proof is not present in what the server built`
2881
2881
  );
2882
- var ErrUnvalidatedIntentOutput = (index) => new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
2882
+ var ErrUnvalidatedIntentOutput = (index) => new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
2883
2883
  `offchain output ${index} of the intent proof cannot be validated: virtual output tree signing did not run`
2884
2884
  );
2885
2885
  var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
@@ -2888,7 +2888,7 @@ var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain ou
2888
2888
  function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
2889
2889
  if (!validatedCommitmentTxid) return;
2890
2890
  if (finalCommitmentTx.id === validatedCommitmentTxid) return;
2891
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
2891
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
2892
2892
  `${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
2893
2893
  );
2894
2894
  }
@@ -2898,7 +2898,7 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
2898
2898
  for (const recipient of recipients) {
2899
2899
  let arkAddress;
2900
2900
  try {
2901
- arkAddress = chunk3LDVNVBW_cjs.ArkAddress.decode(recipient.address);
2901
+ arkAddress = chunkVVFCCNU2_cjs.ArkAddress.decode(recipient.address);
2902
2902
  } catch {
2903
2903
  validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
2904
2904
  continue;
@@ -2910,7 +2910,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
2910
2910
  const usedOnchainOutputs = /* @__PURE__ */ new Set();
2911
2911
  for (const recipient of recipients) {
2912
2912
  try {
2913
- chunk3LDVNVBW_cjs.ArkAddress.decode(recipient.address);
2913
+ chunkVVFCCNU2_cjs.ArkAddress.decode(recipient.address);
2914
2914
  } catch {
2915
2915
  validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
2916
2916
  continue;
@@ -2919,7 +2919,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
2919
2919
  }
2920
2920
  }
2921
2921
  function declaredIntentOutputs(signedProof, onchainOutputIndexes) {
2922
- const proof = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(signedProof));
2922
+ const proof = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(signedProof));
2923
2923
  const onchain = new Set(onchainOutputIndexes);
2924
2924
  const declared = [];
2925
2925
  for (let i = 0; i < proof.outputsLength; i++) {
@@ -3211,7 +3211,7 @@ function assetMintResolver() {
3211
3211
  if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
3212
3212
  const minted = tx.assets.filter((a) => {
3213
3213
  try {
3214
- return base.hex.encode(chunkFN27VWDK_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
3214
+ return base.hex.encode(chunkFEBAG2K2_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
3215
3215
  } catch {
3216
3216
  return false;
3217
3217
  }
@@ -3288,7 +3288,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
3288
3288
  const existing = inputsByAssetId.get(asset.assetId);
3289
3289
  inputsByAssetId.set(asset.assetId, [
3290
3290
  ...existing ?? [],
3291
- chunkFN27VWDK_cjs.AssetInput.create(inputIndex, asset.amount)
3291
+ chunkFEBAG2K2_cjs.AssetInput.create(inputIndex, asset.amount)
3292
3292
  ]);
3293
3293
  }
3294
3294
  }
@@ -3300,7 +3300,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
3300
3300
  const existing = outputsByAssetId.get(asset.assetId);
3301
3301
  outputsByAssetId.set(asset.assetId, [
3302
3302
  ...existing ?? [],
3303
- chunkFN27VWDK_cjs.AssetOutput.create(outputIndex, asset.amount)
3303
+ chunkFEBAG2K2_cjs.AssetOutput.create(outputIndex, asset.amount)
3304
3304
  ]);
3305
3305
  }
3306
3306
  }
@@ -3311,7 +3311,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
3311
3311
  const existing = outputsByAssetId.get(asset.assetId);
3312
3312
  outputsByAssetId.set(asset.assetId, [
3313
3313
  ...existing ?? [],
3314
- chunkFN27VWDK_cjs.AssetOutput.create(outputIndex, asset.amount)
3314
+ chunkFEBAG2K2_cjs.AssetOutput.create(outputIndex, asset.amount)
3315
3315
  ]);
3316
3316
  }
3317
3317
  }
@@ -3320,11 +3320,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
3320
3320
  for (const assetIdStr of allAssetIds) {
3321
3321
  const inputs = inputsByAssetId.get(assetIdStr);
3322
3322
  const outputs = outputsByAssetId.get(assetIdStr);
3323
- const assetId = chunkFN27VWDK_cjs.AssetId.fromString(assetIdStr);
3324
- const group = chunkFN27VWDK_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
3323
+ const assetId = chunkFEBAG2K2_cjs.AssetId.fromString(assetIdStr);
3324
+ const group = chunkFEBAG2K2_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
3325
3325
  groups.push(group);
3326
3326
  }
3327
- return chunkFN27VWDK_cjs.Packet.create(groups);
3327
+ return chunkFEBAG2K2_cjs.Packet.create(groups);
3328
3328
  }
3329
3329
  function selectCoinsWithAsset(coins, assetId, requiredAmount) {
3330
3330
  const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
@@ -3408,7 +3408,7 @@ function meetsInputExpiryFloor(coin, floor) {
3408
3408
  }
3409
3409
  function toXOnlySignerHex(pubkeyHex) {
3410
3410
  const bytes = base.hex.decode(pubkeyHex);
3411
- if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunkEBCWETZM_cjs.toXOnly(bytes, "signer key"));
3411
+ if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunkCFOIHLON_cjs.toXOnly(bytes, "signer key"));
3412
3412
  throw new Error(`invalid signer pubkey length: expected 32 or 33 bytes, got ${bytes.length}`);
3413
3413
  }
3414
3414
  function signerSetFromInfo(info) {
@@ -3455,13 +3455,13 @@ var toTimelock = (value) => ({
3455
3455
  var toSeconds = (t) => t.type === "seconds" ? t.value : t.value * NOMINAL_BLOCK_SECONDS;
3456
3456
  function assertTimelockInPolicy(timelock, policy, label, overrideOption) {
3457
3457
  if (policy.requireSeconds && timelock.type === "blocks") {
3458
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3458
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3459
3459
  `${label} rejected: block-typed timelocks are not accepted (got ${timelock.value})`
3460
3460
  );
3461
3461
  }
3462
3462
  const seconds = toSeconds(timelock);
3463
3463
  if (seconds < policy.minSeconds) {
3464
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3464
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3465
3465
  `${label} rejected: ${timelock.value} ${timelock.type} is below the ${policy.minSeconds}s floor; pass ${overrideOption}: ${seconds}n to Wallet.create to lower it`
3466
3466
  );
3467
3467
  }
@@ -3482,7 +3482,7 @@ function resolveBatchExpiryPolicy(network, overrides) {
3482
3482
  }
3483
3483
  function assertValidBatchExpiry(batchExpiry, policy) {
3484
3484
  if (policy.advertisedVtxoTreeExpiry !== void 0 && batchExpiry !== policy.advertisedVtxoTreeExpiry) {
3485
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3485
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3486
3486
  `batch expiry rejected: ${batchExpiry} does not match the advertised vtxoTreeExpiry ${policy.advertisedVtxoTreeExpiry}`
3487
3487
  );
3488
3488
  }
@@ -3512,21 +3512,21 @@ function resolveCheckpointExitDelayPolicy(network, overrides) {
3512
3512
  function assertValidServerUnrollScript(checkpointTapscript, policy) {
3513
3513
  let script;
3514
3514
  try {
3515
- script = chunk3LDVNVBW_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
3515
+ script = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
3516
3516
  } catch (e) {
3517
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3517
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3518
3518
  `checkpoint exit delay rejected: invalid checkpointTapscript from server (${e instanceof Error ? e.message : String(e)})`
3519
3519
  );
3520
3520
  }
3521
3521
  if (policy.advertisedForfeitPubkey !== void 0) {
3522
3522
  const { pubkeys } = script.params;
3523
3523
  if (pubkeys.length !== 1) {
3524
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3524
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3525
3525
  `checkpoint exit delay rejected: checkpointTapscript must commit to exactly one pubkey, got ${pubkeys.length} [${pubkeys.map(base.hex.encode).join(", ")}]`
3526
3526
  );
3527
3527
  }
3528
3528
  if (!utils_js.equalBytes(pubkeys[0], policy.advertisedForfeitPubkey)) {
3529
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3529
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3530
3530
  `checkpoint exit delay rejected: checkpointTapscript pubkey ${base.hex.encode(pubkeys[0])} does not match the advertised forfeitPubkey ${base.hex.encode(policy.advertisedForfeitPubkey)}`
3531
3531
  );
3532
3532
  }
@@ -3570,8 +3570,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
3570
3570
  function buildVirtualTx(inputs, outputs) {
3571
3571
  let lockTime = 0n;
3572
3572
  for (const input of inputs) {
3573
- const tapscript = chunk3LDVNVBW_cjs.decodeTapscript(chunk3LDVNVBW_cjs.scriptFromTapLeafScript(input.tapLeafScript));
3574
- if (chunk3LDVNVBW_cjs.CLTVMultisigTapscript.is(tapscript)) {
3573
+ const tapscript = chunkVVFCCNU2_cjs.decodeTapscript(chunkVVFCCNU2_cjs.scriptFromTapLeafScript(input.tapLeafScript));
3574
+ if (chunkVVFCCNU2_cjs.CLTVMultisigTapscript.is(tapscript)) {
3575
3575
  if (lockTime !== 0n) {
3576
3576
  if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
3577
3577
  throw new Error("cannot mix seconds and blocks locktime");
@@ -3582,7 +3582,7 @@ function buildVirtualTx(inputs, outputs) {
3582
3582
  }
3583
3583
  }
3584
3584
  }
3585
- const tx = new chunk3LDVNVBW_cjs.Transaction({
3585
+ const tx = new chunkVVFCCNU2_cjs.Transaction({
3586
3586
  version: 3,
3587
3587
  lockTime: Number(lockTime)
3588
3588
  });
@@ -3592,12 +3592,12 @@ function buildVirtualTx(inputs, outputs) {
3592
3592
  index: input.vout,
3593
3593
  sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
3594
3594
  witnessUtxo: {
3595
- script: chunk3LDVNVBW_cjs.VtxoScript.decode(input.tapTree).pkScript,
3595
+ script: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript,
3596
3596
  amount: BigInt(input.value)
3597
3597
  },
3598
3598
  tapLeafScript: [input.tapLeafScript]
3599
3599
  });
3600
- chunk3LDVNVBW_cjs.setArkPsbtField(tx, i, chunk3LDVNVBW_cjs.VtxoTaprootTree, input.tapTree);
3600
+ chunkVVFCCNU2_cjs.setArkPsbtField(tx, i, chunkVVFCCNU2_cjs.VtxoTaprootTree, input.tapTree);
3601
3601
  }
3602
3602
  for (const output of outputs) {
3603
3603
  tx.addOutput(output);
@@ -3608,8 +3608,8 @@ function buildVirtualTx(inputs, outputs) {
3608
3608
  return tx;
3609
3609
  }
3610
3610
  function buildCheckpointTx(vtxo, serverUnrollScript) {
3611
- const collaborativeClosure = chunk3LDVNVBW_cjs.decodeTapscript(chunk3LDVNVBW_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
3612
- const checkpointVtxoScript = new chunk3LDVNVBW_cjs.VtxoScript([
3611
+ const collaborativeClosure = chunkVVFCCNU2_cjs.decodeTapscript(chunkVVFCCNU2_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
3612
+ const checkpointVtxoScript = new chunkVVFCCNU2_cjs.VtxoScript([
3613
3613
  serverUnrollScript.script,
3614
3614
  collaborativeClosure.script
3615
3615
  ]);
@@ -3685,7 +3685,7 @@ function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubke
3685
3685
  const sighashType = signature.length === 65 ? signature[64] : btcSigner.SigHash.DEFAULT;
3686
3686
  const sig = signature.subarray(0, 64);
3687
3687
  if (!allowedSighashTypes.includes(sighashType)) {
3688
- const sighashName = chunk3LDVNVBW_cjs.formatSighash(sighashType);
3688
+ const sighashName = chunkVVFCCNU2_cjs.formatSighash(sighashType);
3689
3689
  throw new Error(
3690
3690
  `Unallowed sighash type ${sighashName} for input ${inputIndex}, pubkey ${pubKeyHex}.`
3691
3691
  );
@@ -3759,7 +3759,7 @@ function combineTapscriptSigs(signedTx, originalTx) {
3759
3759
  }
3760
3760
  function isValidArkAddress(address) {
3761
3761
  try {
3762
- chunk3LDVNVBW_cjs.ArkAddress.decode(address);
3762
+ chunkVVFCCNU2_cjs.ArkAddress.decode(address);
3763
3763
  return true;
3764
3764
  } catch (e) {
3765
3765
  return false;
@@ -3767,16 +3767,16 @@ function isValidArkAddress(address) {
3767
3767
  }
3768
3768
  function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
3769
3769
  if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
3770
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3770
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3771
3771
  `${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
3772
3772
  );
3773
3773
  }
3774
3774
  const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
3775
3775
  return serverCheckpointTxs.map((encoded, index) => {
3776
- const server = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
3776
+ const server = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
3777
3777
  const local = byTxid.get(server.id);
3778
3778
  if (!local) {
3779
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3779
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3780
3780
  `${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
3781
3781
  );
3782
3782
  }
@@ -3786,14 +3786,14 @@ function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, contex
3786
3786
  }
3787
3787
  function assertSubmittedArkTxid(response, signedArkTx, context) {
3788
3788
  if (response.arkTxid !== signedArkTx.id) {
3789
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3789
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3790
3790
  `${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
3791
3791
  );
3792
3792
  }
3793
3793
  if (response.finalArkTx === void 0) return;
3794
- const finalTxid = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
3794
+ const finalTxid = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
3795
3795
  if (finalTxid !== signedArkTx.id) {
3796
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3796
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3797
3797
  `${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
3798
3798
  );
3799
3799
  }
@@ -3805,20 +3805,20 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeys, co
3805
3805
  `${context}: input ${inputIndex} carries no spend leaf to verify the server signature against`
3806
3806
  );
3807
3807
  }
3808
- const script = chunk3LDVNVBW_cjs.scriptFromTapLeafScript(leaf);
3808
+ const script = chunkVVFCCNU2_cjs.scriptFromTapLeafScript(leaf);
3809
3809
  let leafPubkeys;
3810
3810
  try {
3811
- leafPubkeys = chunk3LDVNVBW_cjs.decodeTapscript(script).params.pubkeys.map(
3812
- (key) => base.hex.encode(chunkEBCWETZM_cjs.toXOnly(key, "leaf key"))
3811
+ leafPubkeys = chunkVVFCCNU2_cjs.decodeTapscript(script).params.pubkeys.map(
3812
+ (key) => base.hex.encode(chunkCFOIHLON_cjs.toXOnly(key, "leaf key"))
3813
3813
  );
3814
3814
  } catch (error) {
3815
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3815
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3816
3816
  `${context}: input ${inputIndex} spend leaf cannot be decoded (${error instanceof Error ? error.message : String(error)})`
3817
3817
  );
3818
3818
  }
3819
3819
  const signer = leafPubkeys.find((key) => serverPubkeys.has(key));
3820
3820
  if (!signer) {
3821
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3821
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3822
3822
  `${context}: input ${inputIndex} spend leaf names no signer key the server advertises`
3823
3823
  );
3824
3824
  }
@@ -3832,7 +3832,7 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeys, co
3832
3832
  payment_js.tapLeafHash(script)
3833
3833
  );
3834
3834
  } catch (error) {
3835
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3835
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3836
3836
  `${context}: input ${inputIndex} is not signed by the server on the leaf being spent (${error instanceof Error ? error.message : String(error)})`
3837
3837
  );
3838
3838
  }
@@ -3841,20 +3841,20 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
3841
3841
  const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
3842
3842
  for (const [index, checkpoint] of checkpoints.entries()) {
3843
3843
  if (checkpoint.inputsLength !== 1) {
3844
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3844
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3845
3845
  `${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
3846
3846
  );
3847
3847
  }
3848
3848
  const spent = checkpoint.getInput(0);
3849
3849
  if (!spent.txid || spent.index === void 0) {
3850
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3850
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3851
3851
  `${context}: checkpoint ${index} has no input outpoint`
3852
3852
  );
3853
3853
  }
3854
3854
  const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
3855
3855
  const input = byOutpoint.get(outpoint);
3856
3856
  if (!input) {
3857
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3857
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3858
3858
  `${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
3859
3859
  );
3860
3860
  }
@@ -3862,7 +3862,7 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
3862
3862
  (unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
3863
3863
  );
3864
3864
  if (!rebuilt) {
3865
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3865
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3866
3866
  `${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
3867
3867
  );
3868
3868
  }
@@ -3888,9 +3888,9 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
3888
3888
  const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
3889
3889
  matched.forEach(({ server }, index) => {
3890
3890
  try {
3891
- chunk3LDVNVBW_cjs.assertAllowedSighashTypes(server);
3891
+ chunkVVFCCNU2_cjs.assertAllowedSighashTypes(server);
3892
3892
  } catch (error) {
3893
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3893
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3894
3894
  `submitTx checkpoint ${index}: ${error instanceof Error ? error.message : String(error)}`
3895
3895
  );
3896
3896
  }
@@ -3898,14 +3898,14 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
3898
3898
  const verify = options?.verifyServerSignatures;
3899
3899
  if (verify) {
3900
3900
  if (response.finalArkTx === void 0) {
3901
- throw new chunk3LDVNVBW_cjs.ServerResponseMismatchError(
3901
+ throw new chunkVVFCCNU2_cjs.ServerResponseMismatchError(
3902
3902
  "submitTx: server returned no final ark tx to verify its signatures against"
3903
3903
  );
3904
3904
  }
3905
- const finalArkTx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
3905
+ const finalArkTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
3906
3906
  const serverPubkeys = new Set(
3907
3907
  [verify.serverPubkey, ...verify.deprecatedServerPubkeys ?? []].map(
3908
- (key) => base.hex.encode(chunkEBCWETZM_cjs.toXOnly(key, "server key"))
3908
+ (key) => base.hex.encode(chunkCFOIHLON_cjs.toXOnly(key, "server key"))
3909
3909
  )
3910
3910
  );
3911
3911
  for (let i = 0; i < offchainTx.arkTx.inputsLength; i++) {
@@ -3953,16 +3953,36 @@ async function signAndSubmitOffchainTx(params) {
3953
3953
  });
3954
3954
  return arkTxid;
3955
3955
  }
3956
+ async function submitViaEmulator(emulator, offchainTx, signer, opts) {
3957
+ const { inputIndexes } = opts;
3958
+ let { arkTx, checkpoints } = offchainTx;
3959
+ if (inputIndexes.length > 0) {
3960
+ if (!signer) {
3961
+ throw new Error(`this spend requires an \`identity\` to sign inputs ${inputIndexes}`);
3962
+ }
3963
+ arkTx = await signer.sign(arkTx, inputIndexes);
3964
+ checkpoints = await Promise.all(
3965
+ checkpoints.map((c, i) => inputIndexes.includes(i) ? signer.sign(c, [0]) : c)
3966
+ );
3967
+ }
3968
+ const res = await emulator.submitTx(
3969
+ base.base64.encode(arkTx.toPSBT()),
3970
+ checkpoints.map((c) => base.base64.encode(c.toPSBT()))
3971
+ );
3972
+ const txid = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(res.signedArkTx)).id;
3973
+ assertSubmittedArkTxid({ arkTxid: txid }, arkTx, "emulator submitTx");
3974
+ return { txid, signedArkTx: res.signedArkTx, signedCheckpointTxs: res.signedCheckpointTxs };
3975
+ }
3956
3976
  function claimWithPreimageIdentity(identity, preimage) {
3957
3977
  return {
3958
3978
  ...identity,
3959
3979
  sign: async (tx, inputIndexes) => {
3960
- const signed = chunk3LDVNVBW_cjs.Transaction.fromPSBT(
3980
+ const signed = chunkVVFCCNU2_cjs.Transaction.fromPSBT(
3961
3981
  (await identity.sign(tx.clone(), inputIndexes)).toPSBT()
3962
3982
  );
3963
3983
  const indexes = inputIndexes ?? Array.from({ length: signed.inputsLength }, (_, i) => i);
3964
3984
  for (const index of indexes) {
3965
- chunk3LDVNVBW_cjs.setArkPsbtField(signed, index, chunk3LDVNVBW_cjs.ConditionWitness, [preimage]);
3985
+ chunkVVFCCNU2_cjs.setArkPsbtField(signed, index, chunkVVFCCNU2_cjs.ConditionWitness, [preimage]);
3966
3986
  }
3967
3987
  return signed;
3968
3988
  }
@@ -4145,7 +4165,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
4145
4165
  };
4146
4166
  }
4147
4167
  function deriveContractTapscripts(contract) {
4148
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(contract.type);
4168
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
4149
4169
  if (!handler) {
4150
4170
  throw new Error(`No handler for contract type '${contract.type}'`);
4151
4171
  }
@@ -4214,6 +4234,18 @@ function getRandomId() {
4214
4234
  const randomValue = crypto.getRandomValues(new Uint8Array(16));
4215
4235
  return base.hex.encode(randomValue);
4216
4236
  }
4237
+ var sdkPicked = /* @__PURE__ */ new WeakSet();
4238
+ function markSdkPicked(params) {
4239
+ sdkPicked.add(params);
4240
+ return params;
4241
+ }
4242
+ function isSdkPicked(params) {
4243
+ return params !== void 0 && sdkPicked.has(params);
4244
+ }
4245
+ function getSelectableBoardingUtxos(wallet) {
4246
+ const selectable = wallet.getSelectableBoardingUtxos;
4247
+ return typeof selectable === "function" ? selectable.call(wallet) : wallet.getBoardingUtxos();
4248
+ }
4217
4249
  function assertRecipientArkadeAddress(encoded, address, context) {
4218
4250
  if (address.hrp !== context.hrp) {
4219
4251
  throw new Error(
@@ -4236,7 +4268,7 @@ function assertRecipientArkadeAddress(encoded, address, context) {
4236
4268
  function assertTapTreeDerivesAddress(encoded, tapTree, address) {
4237
4269
  let derived;
4238
4270
  try {
4239
- derived = chunk3LDVNVBW_cjs.VtxoScript.decode(tapTree).pkScript;
4271
+ derived = chunkVVFCCNU2_cjs.VtxoScript.decode(tapTree).pkScript;
4240
4272
  } catch (e) {
4241
4273
  throw new Error(
4242
4274
  `Invalid tapTree for ${encoded}: ${e instanceof Error ? e.message : String(e)}`
@@ -4253,7 +4285,7 @@ function validateRecipients(recipients, dustAmount, context) {
4253
4285
  for (const recipient of recipients) {
4254
4286
  let address;
4255
4287
  try {
4256
- address = chunk3LDVNVBW_cjs.ArkAddress.decode(recipient.address);
4288
+ address = chunkVVFCCNU2_cjs.ArkAddress.decode(recipient.address);
4257
4289
  } catch (e) {
4258
4290
  throw new Error(`Invalid Arkade address: ${recipient.address}`);
4259
4291
  }
@@ -4278,7 +4310,7 @@ function validateRecipients(recipients, dustAmount, context) {
4278
4310
 
4279
4311
  // src/contracts/spendability.ts
4280
4312
  function isContractGenericallySpendable(contract) {
4281
- return chunkEBCWETZM_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
4313
+ return chunkCFOIHLON_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
4282
4314
  }
4283
4315
  function gatedContracts(contracts) {
4284
4316
  const gated = /* @__PURE__ */ new Map();
@@ -4300,7 +4332,7 @@ function gateExclusion(gated) {
4300
4332
  return (vtxo) => {
4301
4333
  const type = gatedTypeOf(vtxo, gated);
4302
4334
  if (type === void 0) return void 0;
4303
- if (!chunkEBCWETZM_cjs.contractHandlers.has(type)) {
4335
+ if (!chunkCFOIHLON_cjs.contractHandlers.has(type)) {
4304
4336
  return `at ${vtxo.script} (contract type '${type}') has no handler registered in this build`;
4305
4337
  }
4306
4338
  return `at ${vtxo.script} (contract type '${type}') is not generically spendable`;
@@ -4336,7 +4368,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
4336
4368
  continue;
4337
4369
  }
4338
4370
  for (const v of vtxos) {
4339
- if (!chunk3LDVNVBW_cjs.isVtxoSpent(v) && !v.isSwept && !v.isUnrolled) {
4371
+ if (!chunkVVFCCNU2_cjs.isVtxoSpent(v) && !v.isSwept && !v.isUnrolled) {
4340
4372
  out.add(`${v.txid}:${v.vout}`);
4341
4373
  }
4342
4374
  }
@@ -4372,10 +4404,14 @@ function byValueDescending(vtxos) {
4372
4404
  return [...vtxos].sort((a, b) => b.value - a.value);
4373
4405
  }
4374
4406
  async function fetchTimeHeight(wallet) {
4375
- return chunk3LDVNVBW_cjs.resolveTimeHeight(wallet.onchainProvider);
4407
+ return chunkVVFCCNU2_cjs.resolveTimeHeight(wallet.onchainProvider);
4408
+ }
4409
+ function heldVtxosOf(wallet) {
4410
+ const held = wallet.getHeldVtxos;
4411
+ return typeof held === "function" ? held.call(wallet) : Promise.resolve([]);
4376
4412
  }
4377
4413
  function canMigrateBySend(vtxo, now) {
4378
- if (!chunk3LDVNVBW_cjs.canSpendOffchain(vtxo, now)) return false;
4414
+ if (!chunkVVFCCNU2_cjs.canSpendOffchain(vtxo, now)) return false;
4379
4415
  return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
4380
4416
  }
4381
4417
  function byExpiryAscending(vtxos, now) {
@@ -4383,7 +4419,7 @@ function byExpiryAscending(vtxos, now) {
4383
4419
  if (vtxo.isSwept) return -Infinity;
4384
4420
  if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
4385
4421
  if (vtxo.expiresAtHeight !== void 0) {
4386
- return chunk3LDVNVBW_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
4422
+ return chunkVVFCCNU2_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
4387
4423
  }
4388
4424
  return Infinity;
4389
4425
  };
@@ -4410,7 +4446,7 @@ function priceSettlementInputs(vtxos, estimator) {
4410
4446
  const payable = [];
4411
4447
  const net = /* @__PURE__ */ new Map();
4412
4448
  for (const vtxo of vtxos) {
4413
- const inputFee = estimator.evalOffchainInput(chunk3LDVNVBW_cjs.toOffchainInputFeeParams(vtxo));
4449
+ const inputFee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo));
4414
4450
  if (inputFee.satoshis >= vtxo.value) {
4415
4451
  continue;
4416
4452
  }
@@ -4439,7 +4475,7 @@ function offchainOutputFee(amount, estimator, arkAddress) {
4439
4475
  }
4440
4476
  const outputFee = estimator.evalOffchainOutput({
4441
4477
  amount,
4442
- script: base.hex.encode(chunk3LDVNVBW_cjs.ArkAddress.decode(arkAddress).pkScript)
4478
+ script: base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(arkAddress).pkScript)
4443
4479
  });
4444
4480
  return BigInt(outputFee.satoshis);
4445
4481
  }
@@ -4490,10 +4526,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
4490
4526
  };
4491
4527
  function getRecoverableVtxos(vtxos, dustAmount, now) {
4492
4528
  return vtxos.filter((vtxo) => {
4493
- if (chunk3LDVNVBW_cjs.canRecoverOnchain(vtxo, now)) {
4529
+ if (chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now)) {
4494
4530
  return true;
4495
4531
  }
4496
- if (chunk3LDVNVBW_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
4532
+ if (chunkVVFCCNU2_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
4497
4533
  return true;
4498
4534
  }
4499
4535
  return false;
@@ -4525,7 +4561,7 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
4525
4561
  function isVtxoExpiringSoon(vtxo, thresholdMs) {
4526
4562
  if (vtxo.isUnrolled) return false;
4527
4563
  const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
4528
- const expiresAt = chunk3LDVNVBW_cjs.normalizeVtxo(vtxo).expiresAt;
4564
+ const expiresAt = chunkVVFCCNU2_cjs.normalizeVtxo(vtxo).expiresAt;
4529
4565
  if (expiresAt === void 0) return false;
4530
4566
  const now = Date.now();
4531
4567
  const batchExpiry = expiresAt.getTime();
@@ -4536,7 +4572,7 @@ function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
4536
4572
  return vtxos.filter(
4537
4573
  // The leading exclusion covers the `isSubdust` arm too, which is a value
4538
4574
  // property and would otherwise re-admit an exited coin on its own.
4539
- (vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunk3LDVNVBW_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
4575
+ (vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
4540
4576
  );
4541
4577
  }
4542
4578
  function isMigrationCapable(wallet) {
@@ -4596,7 +4632,7 @@ var VtxoManager = class _VtxoManager {
4596
4632
  constructor(wallet, settlementConfig) {
4597
4633
  this.wallet = wallet;
4598
4634
  if (settlementConfig !== false) {
4599
- chunk3LDVNVBW_cjs.assertTimerMs("pollIntervalMs", settlementConfig?.pollIntervalMs);
4635
+ chunkVVFCCNU2_cjs.assertTimerMs("pollIntervalMs", settlementConfig?.pollIntervalMs);
4600
4636
  }
4601
4637
  this.settlementConfig = settlementConfig !== void 0 ? settlementConfig : { ...DEFAULT_SETTLEMENT_CONFIG };
4602
4638
  this.contractEventsSubscriptionReady = this.initializeSubscription();
@@ -4903,7 +4939,7 @@ var VtxoManager = class _VtxoManager {
4903
4939
  * {@link recoverImportedContracts}).
4904
4940
  */
4905
4941
  async recoverOneImportedContract(wallet, contract, vtxos, info, dustAmount) {
4906
- const recoverable = vtxos.filter((vtxo) => vtxo.isSwept && !chunk3LDVNVBW_cjs.isVtxoSpent(vtxo));
4942
+ const recoverable = vtxos.filter((vtxo) => vtxo.isSwept && !chunkVVFCCNU2_cjs.isVtxoSpent(vtxo));
4907
4943
  const estimator = new Estimator(info?.fees.intentFee ?? {});
4908
4944
  const { payable, net } = priceSettlementInputs(recoverable, estimator);
4909
4945
  const vtxoMaxAmount = info?.vtxoMaxAmount ?? -1n;
@@ -4925,7 +4961,7 @@ var VtxoManager = class _VtxoManager {
4925
4961
  if (vtxos.length === 0) return;
4926
4962
  const spent = new Set(batch.map((vtxo) => `${vtxo.txid}:${vtxo.vout}`));
4927
4963
  const stillSpendable = vtxos.some(
4928
- (vtxo) => !chunk3LDVNVBW_cjs.isVtxoSpent(vtxo) && !spent.has(`${vtxo.txid}:${vtxo.vout}`)
4964
+ (vtxo) => !chunkVVFCCNU2_cjs.isVtxoSpent(vtxo) && !spent.has(`${vtxo.txid}:${vtxo.vout}`)
4929
4965
  );
4930
4966
  if (!stillSpendable) {
4931
4967
  await wallet.removeRecoveryContract(contract.script);
@@ -4974,12 +5010,37 @@ var VtxoManager = class _VtxoManager {
4974
5010
  genericallySpendableOnly: true
4975
5011
  });
4976
5012
  const threshold = thresholdMs !== void 0 ? thresholdMs : this.configuredThresholdMs();
4977
- return getExpiringAndRecoverableVtxos(
4978
- vtxos,
4979
- threshold,
4980
- getDustAmount(this.wallet),
4981
- now ?? await fetchTimeHeight(this.wallet)
4982
- );
5013
+ const tip = now ?? await fetchTimeHeight(this.wallet);
5014
+ await this.warnHeldExpiring(threshold, tip);
5015
+ return getExpiringAndRecoverableVtxos(vtxos, threshold, getDustAmount(this.wallet), tip);
5016
+ }
5017
+ /** Outpoints {@link warnHeldExpiring} last reported, so each is reported once while held. */
5018
+ heldExpiringWarned = /* @__PURE__ */ new Set();
5019
+ /**
5020
+ * A hold outranks renewal: renewing would change the outpoint under the holder, whose spend
5021
+ * by name would then fail. So the VTXO is skipped, and only this warning says it is drifting
5022
+ * toward a sweep. Best-effort: a failed read never blocks renewal.
5023
+ */
5024
+ async warnHeldExpiring(threshold, now) {
5025
+ let keys;
5026
+ try {
5027
+ const held = await heldVtxosOf(this.wallet);
5028
+ keys = getExpiringAndRecoverableVtxos(
5029
+ held,
5030
+ threshold,
5031
+ getDustAmount(this.wallet),
5032
+ now
5033
+ ).map((vtxo) => `${vtxo.txid}:${vtxo.vout}`);
5034
+ } catch {
5035
+ return;
5036
+ }
5037
+ const fresh = keys.filter((key) => !this.heldExpiringWarned.has(key));
5038
+ this.heldExpiringWarned = new Set(keys);
5039
+ if (fresh.length > 0) {
5040
+ console.warn(
5041
+ `Renewal: ${fresh.length} VTXO(s) due for renewal are held by reserveVtxos and will not be renewed; spend or release them before they expire: ${fresh.join(", ")}`
5042
+ );
5043
+ }
4983
5044
  }
4984
5045
  /**
4985
5046
  * Renew expiring virtual outputs (including recoverable ones) by settling them back to the
@@ -5089,10 +5150,10 @@ var VtxoManager = class _VtxoManager {
5089
5150
  }
5090
5151
  }
5091
5152
  const txid = await this.wallet.settle(
5092
- {
5153
+ markSdkPicked({
5093
5154
  inputs: vtxos,
5094
5155
  outputs: amounts.map((amount) => ({ address: arkAddress, amount }))
5095
- },
5156
+ }),
5096
5157
  eventCallback
5097
5158
  );
5098
5159
  return txid;
@@ -5192,11 +5253,11 @@ var VtxoManager = class _VtxoManager {
5192
5253
  `Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
5193
5254
  );
5194
5255
  }
5195
- const tx = new chunk3LDVNVBW_cjs.Transaction();
5256
+ const tx = new chunkVVFCCNU2_cjs.Transaction();
5196
5257
  for (const utxo of expiredUtxos) {
5197
- const utxoScript = chunk3LDVNVBW_cjs.VtxoScript.decode(utxo.tapTree);
5258
+ const utxoScript = chunkVVFCCNU2_cjs.VtxoScript.decode(utxo.tapTree);
5198
5259
  const utxoExitLeaf = utxoScript.leaves.find(
5199
- (leaf) => chunk3LDVNVBW_cjs.CSVMultisigTapscript.isScriptValid(chunk3LDVNVBW_cjs.scriptFromTapLeafScript(leaf)) === true
5260
+ (leaf) => chunkVVFCCNU2_cjs.CSVMultisigTapscript.isScriptValid(chunkVVFCCNU2_cjs.scriptFromTapLeafScript(leaf)) === true
5200
5261
  );
5201
5262
  if (!utxoExitLeaf) {
5202
5263
  throw new Error(
@@ -5211,7 +5272,7 @@ var VtxoManager = class _VtxoManager {
5211
5272
  amount: BigInt(utxo.value)
5212
5273
  },
5213
5274
  tapLeafScript: [utxoExitLeaf],
5214
- sequence: chunk3LDVNVBW_cjs.getSequence(utxoExitLeaf)
5275
+ sequence: chunkVVFCCNU2_cjs.getSequence(utxoExitLeaf)
5215
5276
  });
5216
5277
  }
5217
5278
  tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
@@ -5437,8 +5498,8 @@ var VtxoManager = class _VtxoManager {
5437
5498
  const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
5438
5499
  if (cls.status === "CURRENT") continue;
5439
5500
  const live = vtxos.filter((v) => !v.isUnrolled);
5440
- const recoverable = live.filter((v) => v.isSwept && !chunk3LDVNVBW_cjs.isVtxoSpent(v));
5441
- const spendable = live.filter((v) => !chunk3LDVNVBW_cjs.isVtxoSpent(v) && !v.isSwept);
5501
+ const recoverable = live.filter((v) => v.isSwept && !chunkVVFCCNU2_cjs.isVtxoSpent(v));
5502
+ const spendable = live.filter((v) => !chunkVVFCCNU2_cjs.isVtxoSpent(v) && !v.isSwept);
5442
5503
  const value = spendable.reduce((sum, v) => sum + v.value, 0);
5443
5504
  let recoverableCount = 0;
5444
5505
  let recoverableValue = 0;
@@ -5678,7 +5739,7 @@ var VtxoManager = class _VtxoManager {
5678
5739
  }
5679
5740
  getBoardingTimelock() {
5680
5741
  const wallet = this.getSweepWallet();
5681
- const exitScript = chunk3LDVNVBW_cjs.CSVMultisigTapscript.decode(
5742
+ const exitScript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(
5682
5743
  base.hex.decode(wallet.boardingTapscript.exitScript)
5683
5744
  );
5684
5745
  return exitScript.params.timelock;
@@ -5728,7 +5789,7 @@ var VtxoManager = class _VtxoManager {
5728
5789
  if (e.message.includes("is below dust threshold")) {
5729
5790
  return;
5730
5791
  }
5731
- if (e.message.includes("VTXO_ALREADY_REGISTERED") || e.message.includes("duplicated input")) {
5792
+ if (e.name === "VtxoReservedError" || e.message.includes("VTXO_ALREADY_REGISTERED") || e.message.includes("duplicated input")) {
5732
5793
  return;
5733
5794
  }
5734
5795
  if (e.message.includes("VTXO_ALREADY_SPENT")) {
@@ -5786,8 +5847,8 @@ var VtxoManager = class _VtxoManager {
5786
5847
  }
5787
5848
  /** The outpoint a `VTXO_ALREADY_SPENT` error carries in `metadata.vtxo_outpoint`, if any. */
5788
5849
  extractSpentOutpoint(error) {
5789
- const ark = chunk3LDVNVBW_cjs.maybeArkError(error);
5790
- if (!chunk3LDVNVBW_cjs.isArkError(ark, chunk3LDVNVBW_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
5850
+ const ark = chunkVVFCCNU2_cjs.maybeArkError(error);
5851
+ if (!chunkVVFCCNU2_cjs.isArkError(ark, chunkVVFCCNU2_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
5791
5852
  const raw = ark.metadata?.vtxo_outpoint;
5792
5853
  if (typeof raw !== "string") return void 0;
5793
5854
  const [txid, voutStr] = raw.split(":");
@@ -5856,7 +5917,7 @@ var VtxoManager = class _VtxoManager {
5856
5917
  let hadError = false;
5857
5918
  try {
5858
5919
  await runWithCrossInstanceLock(BOARDING_POLL_LOCK_NAME, async () => {
5859
- const boardingUtxos = await this.wallet.getBoardingUtxos();
5920
+ const boardingUtxos = await getSelectableBoardingUtxos(this.wallet);
5860
5921
  try {
5861
5922
  await this.runPeriodicSettle(boardingUtxos);
5862
5923
  } catch (e) {
@@ -5961,7 +6022,7 @@ var VtxoManager = class _VtxoManager {
5961
6022
  if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
5962
6023
  break;
5963
6024
  }
5964
- const inputFee = estimator.evalOffchainInput(chunk3LDVNVBW_cjs.toOffchainInputFeeParams(v));
6025
+ const inputFee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(v));
5965
6026
  if (inputFee.satoshis >= v.value) {
5966
6027
  continue;
5967
6028
  }
@@ -5981,7 +6042,7 @@ var VtxoManager = class _VtxoManager {
5981
6042
  const arkAddress = await this.wallet.getAddress();
5982
6043
  const outputFee = estimator.evalOffchainOutput({
5983
6044
  amount: totalAmount,
5984
- script: base.hex.encode(chunk3LDVNVBW_cjs.ArkAddress.decode(arkAddress).pkScript)
6045
+ script: base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(arkAddress).pkScript)
5985
6046
  });
5986
6047
  totalAmount -= BigInt(outputFee.satoshis);
5987
6048
  if (totalAmount < dustAmount) return;
@@ -5990,20 +6051,24 @@ var VtxoManager = class _VtxoManager {
5990
6051
  this.renewalInProgress = true;
5991
6052
  }
5992
6053
  let success = false;
5993
- let staleCacheSkip = false;
6054
+ let skipWithoutBackoff = false;
5994
6055
  try {
5995
6056
  try {
5996
- await this.wallet.settle({
5997
- inputs: [...filteredBoarding, ...filteredVtxos],
5998
- outputs: [{ address: arkAddress, amount: totalAmount }]
5999
- });
6057
+ await this.wallet.settle(
6058
+ markSdkPicked({
6059
+ inputs: [...filteredBoarding, ...filteredVtxos],
6060
+ outputs: [{ address: arkAddress, amount: totalAmount }]
6061
+ })
6062
+ );
6000
6063
  for (const u of filteredBoarding) {
6001
6064
  this.knownBoardingUtxos.add(`${u.txid}:${u.vout}`);
6002
6065
  }
6003
6066
  success = true;
6004
6067
  } catch (e) {
6005
- if (e instanceof Error && e.message.includes("VTXO_ALREADY_SPENT")) {
6006
- staleCacheSkip = true;
6068
+ if (e instanceof Error && e.name === "VtxoReservedError") {
6069
+ skipWithoutBackoff = true;
6070
+ } else if (e instanceof Error && e.message.includes("VTXO_ALREADY_SPENT")) {
6071
+ skipWithoutBackoff = true;
6007
6072
  void this.maybeRefreshAfterVtxoSpent(this.extractSpentOutpoint(e));
6008
6073
  } else {
6009
6074
  throw e;
@@ -6017,7 +6082,7 @@ var VtxoManager = class _VtxoManager {
6017
6082
  }
6018
6083
  if (success) {
6019
6084
  this.consecutivePeriodicSettleFailures = 0;
6020
- } else if (!staleCacheSkip) {
6085
+ } else if (!skipWithoutBackoff) {
6021
6086
  this.consecutivePeriodicSettleFailures++;
6022
6087
  }
6023
6088
  }
@@ -6061,7 +6126,7 @@ var ArkNote = class _ArkNote {
6061
6126
  this.value = value;
6062
6127
  this.HRP = HRP;
6063
6128
  const preimageHash = utils_js.sha256(this.preimage);
6064
- this.vtxoScript = new chunk3LDVNVBW_cjs.VtxoScript([noteTapscript(preimageHash)]);
6129
+ this.vtxoScript = new chunkVVFCCNU2_cjs.VtxoScript([noteTapscript(preimageHash)]);
6065
6130
  const leaf = this.vtxoScript.leaves[0];
6066
6131
  this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
6067
6132
  this.tapTree = this.vtxoScript.encode();
@@ -6234,7 +6299,7 @@ var ArkadeCash = class _ArkadeCash {
6234
6299
  const privateKey = data.slice(1, 33);
6235
6300
  const serverPubKey = data.slice(33, 65);
6236
6301
  const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
6237
- const csvTimelock2 = chunk3LDVNVBW_cjs.sequenceToTimelock(sequence);
6302
+ const csvTimelock2 = chunkVVFCCNU2_cjs.sequenceToTimelock(sequence);
6238
6303
  return new _ArkadeCash(privateKey, serverPubKey, csvTimelock2, decoded.prefix);
6239
6304
  }
6240
6305
  toString() {
@@ -6242,7 +6307,7 @@ var ArkadeCash = class _ArkadeCash {
6242
6307
  data[0] = _ArkadeCash.Version;
6243
6308
  data.set(this._privateKey, 1);
6244
6309
  data.set(this._serverPubKey, 33);
6245
- const sequence = chunk3LDVNVBW_cjs.timelockToSequence(this.csvTimelock);
6310
+ const sequence = chunkVVFCCNU2_cjs.timelockToSequence(this.csvTimelock);
6246
6311
  new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
6247
6312
  const words = base.bech32m.toWords(data);
6248
6313
  return base.bech32m.encode(this.hrp, words, 1023);
@@ -6251,7 +6316,7 @@ var ArkadeCash = class _ArkadeCash {
6251
6316
  return SingleKey.fromPrivateKey(this._privateKey);
6252
6317
  }
6253
6318
  get vtxoScript() {
6254
- return new chunkEBCWETZM_cjs.DefaultVtxo.Script({
6319
+ return new chunkCFOIHLON_cjs.DefaultVtxo.Script({
6255
6320
  pubKey: this._publicKey,
6256
6321
  serverPubKey: this._serverPubKey,
6257
6322
  csvTimelock: this.csvTimelock
@@ -6267,7 +6332,7 @@ var NON_TERMINAL_INTENT_STATES = ALL_INTENT_STATES.filter(
6267
6332
  (s) => !isTerminalIntentState(s)
6268
6333
  );
6269
6334
  function isConsumed(vtxo) {
6270
- return vtxo !== void 0 && chunk3LDVNVBW_cjs.isVtxoSpent(vtxo);
6335
+ return vtxo !== void 0 && chunkVVFCCNU2_cjs.isVtxoSpent(vtxo);
6271
6336
  }
6272
6337
  async function classifyIntent(intent, vtxosByOutpoint, now) {
6273
6338
  if (isTerminalIntentState(intent.state)) return void 0;
@@ -6310,7 +6375,7 @@ async function reconcileIntents(deps) {
6310
6375
  let vtxosByOutpoint = /* @__PURE__ */ new Map();
6311
6376
  if (outpoints.length > 0) {
6312
6377
  try {
6313
- const { vtxos } = await chunk3LDVNVBW_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
6378
+ const { vtxos } = await chunkVVFCCNU2_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
6314
6379
  vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
6315
6380
  } catch (e) {
6316
6381
  console.error("reconcileIntents: failed to fetch input VTXO state", e);
@@ -6370,7 +6435,7 @@ async function releaseFromServer(intent, deps, now) {
6370
6435
  });
6371
6436
  }
6372
6437
  function isNoMatchingIntentsError(e) {
6373
- return chunk3LDVNVBW_cjs.isArkError(e, chunk3LDVNVBW_cjs.ArkErrorName.INVALID_INTENT_PROOF) && e.message.includes("no matching intents found");
6438
+ return chunkVVFCCNU2_cjs.isArkError(e, chunkVVFCCNU2_cjs.ArkErrorName.INVALID_INTENT_PROOF) && e.message.includes("no matching intents found");
6374
6439
  }
6375
6440
  function terminal(intent, state, now, patch) {
6376
6441
  return { ...intent, ...patch, state, updatedAt: now };
@@ -6589,7 +6654,7 @@ async function captureExitBranch(params) {
6589
6654
  const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
6590
6655
  if (nonCommitment.length > 0) {
6591
6656
  for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
6592
- psbtByTxid.set(chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6657
+ psbtByTxid.set(chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6593
6658
  }
6594
6659
  }
6595
6660
  }
@@ -6632,10 +6697,10 @@ var IndexerExitDataSource = class {
6632
6697
  while (hasMore) {
6633
6698
  const { chain: page, page: meta } = await this.indexer.getVtxoChain(
6634
6699
  { txid: vtxo.txid, vout: vtxo.vout },
6635
- { pageIndex, pageSize: chunk3LDVNVBW_cjs.DEFAULT_PAGE_SIZE }
6700
+ { pageIndex, pageSize: chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE }
6636
6701
  );
6637
6702
  chain.push(...page);
6638
- hasMore = meta ? page.length === chunk3LDVNVBW_cjs.DEFAULT_PAGE_SIZE : false;
6703
+ hasMore = meta ? page.length === chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE : false;
6639
6704
  pageIndex++;
6640
6705
  }
6641
6706
  return chain;
@@ -6647,12 +6712,12 @@ var IndexerExitDataSource = class {
6647
6712
  while (hasMore) {
6648
6713
  const { txs, page } = await this.indexer.getVirtualTxs(txids, {
6649
6714
  pageIndex,
6650
- pageSize: chunk3LDVNVBW_cjs.DEFAULT_PAGE_SIZE
6715
+ pageSize: chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE
6651
6716
  });
6652
6717
  for (const psbt of txs) {
6653
- out.set(chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6718
+ out.set(chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6654
6719
  }
6655
- hasMore = page ? txs.length === chunk3LDVNVBW_cjs.DEFAULT_PAGE_SIZE : false;
6720
+ hasMore = page ? txs.length === chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE : false;
6656
6721
  pageIndex++;
6657
6722
  }
6658
6723
  return out;
@@ -6673,7 +6738,7 @@ function chainedTxTypeToChainTxType(t) {
6673
6738
  }
6674
6739
  }
6675
6740
  function psbtInputTxids(psbtBase64) {
6676
- return txInputTxids(chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64)));
6741
+ return txInputTxids(chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64)));
6677
6742
  }
6678
6743
  function txInputTxids(tx) {
6679
6744
  const ids = [];
@@ -6977,10 +7042,10 @@ async function resolveArkInfo(arkProvider, walletRepository, opts) {
6977
7042
  try {
6978
7043
  info = await arkProvider.getInfo();
6979
7044
  } catch (err) {
6980
- if (opts?.requireLive || !chunk3LDVNVBW_cjs.isRetryableProviderError(err)) throw err;
7045
+ if (opts?.requireLive || !chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
6981
7046
  const snapshot = await loadArkInfoSnapshot(walletRepository);
6982
7047
  if (!snapshot) {
6983
- throw new chunk3LDVNVBW_cjs.ProviderUnavailableError(
7048
+ throw new chunkVVFCCNU2_cjs.ProviderUnavailableError(
6984
7049
  "Arkade server info is unavailable and no cached snapshot exists",
6985
7050
  { cause: err }
6986
7051
  );
@@ -7172,7 +7237,7 @@ function buildGraph(rootTxid, chunksByTxid) {
7172
7237
  return new TxTree(rootTx, children);
7173
7238
  }
7174
7239
  function decodeNode(chunk) {
7175
- const tx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(chunk.tx));
7240
+ const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(chunk.tx));
7176
7241
  return { tx, children: chunk.children };
7177
7242
  }
7178
7243
  exports.Batch = void 0;
@@ -7375,7 +7440,7 @@ function collectArkTxidsNeedingCreatedAt(vtxos, localCreatedAt) {
7375
7440
  return [...txids];
7376
7441
  }
7377
7442
  async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt, gatedScripts = /* @__PURE__ */ new Map()) {
7378
- const normalized = vtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
7443
+ const normalized = vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
7379
7444
  const localCreatedAt = localCreatedAtByTxid(normalized);
7380
7445
  const gatedVtxos = normalized.filter((vtxo) => isGatedVtxo(vtxo, gatedScripts));
7381
7446
  const ownVtxos = normalized.filter((vtxo) => !isGatedVtxo(vtxo, gatedScripts));
@@ -7542,6 +7607,9 @@ var AssetManager = class extends ReadonlyAssetManager {
7542
7607
  * ```
7543
7608
  */
7544
7609
  async issue(params) {
7610
+ return this.wallet.withSpendLock((submit) => this.issueWith(params, submit));
7611
+ }
7612
+ async issueWith(params, submit) {
7545
7613
  if (params.amount <= 0n) {
7546
7614
  throw new Error(`Issue amount must be greater than 0, got ${params.amount}`);
7547
7615
  }
@@ -7550,7 +7618,7 @@ var AssetManager = class extends ReadonlyAssetManager {
7550
7618
  withRecoverable: false,
7551
7619
  genericallySpendableOnly: true
7552
7620
  });
7553
- const controlAssetRef = params.controlAssetId ? chunkFN27VWDK_cjs.AssetRef.fromId(chunkFN27VWDK_cjs.AssetId.fromString(params.controlAssetId)) : null;
7621
+ const controlAssetRef = params.controlAssetId ? chunkFEBAG2K2_cjs.AssetRef.fromId(chunkFEBAG2K2_cjs.AssetId.fromString(params.controlAssetId)) : null;
7554
7622
  const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
7555
7623
  let totalBtcSelected = 0n;
7556
7624
  const assetChanges = /* @__PURE__ */ new Map();
@@ -7563,8 +7631,8 @@ var AssetManager = class extends ReadonlyAssetManager {
7563
7631
  }
7564
7632
  }
7565
7633
  const groups = [];
7566
- const issuedAssetOutput = chunkFN27VWDK_cjs.AssetOutput.create(0, params.amount);
7567
- const issuedAssetGroup = chunkFN27VWDK_cjs.AssetGroup.create(
7634
+ const issuedAssetOutput = chunkFEBAG2K2_cjs.AssetOutput.create(0, params.amount);
7635
+ const issuedAssetGroup = chunkFEBAG2K2_cjs.AssetGroup.create(
7568
7636
  null,
7569
7637
  controlAssetRef,
7570
7638
  [],
@@ -7577,17 +7645,18 @@ var AssetManager = class extends ReadonlyAssetManager {
7577
7645
  for (const [assetId, amount] of assetChanges) {
7578
7646
  const changeInputs = inputsForAsset(assetInputs, assetId);
7579
7647
  groups.push(
7580
- chunkFN27VWDK_cjs.AssetGroup.create(
7581
- chunkFN27VWDK_cjs.AssetId.fromString(assetId),
7648
+ chunkFEBAG2K2_cjs.AssetGroup.create(
7649
+ chunkFEBAG2K2_cjs.AssetId.fromString(assetId),
7582
7650
  null,
7583
7651
  changeInputs,
7584
- [chunkFN27VWDK_cjs.AssetOutput.create(0, amount)],
7652
+ [chunkFEBAG2K2_cjs.AssetOutput.create(0, amount)],
7585
7653
  []
7586
7654
  )
7587
7655
  );
7588
7656
  }
7589
7657
  }
7590
7658
  const arkTxid = await submitToSelf(
7659
+ submit,
7591
7660
  this.wallet,
7592
7661
  coinSelection.inputs,
7593
7662
  totalBtcSelected,
@@ -7595,7 +7664,7 @@ var AssetManager = class extends ReadonlyAssetManager {
7595
7664
  );
7596
7665
  return {
7597
7666
  arkTxId: arkTxid,
7598
- assetId: chunkFN27VWDK_cjs.AssetId.create(arkTxid, 0).toString()
7667
+ assetId: chunkFEBAG2K2_cjs.AssetId.create(arkTxid, 0).toString()
7599
7668
  };
7600
7669
  }
7601
7670
  /**
@@ -7616,6 +7685,9 @@ var AssetManager = class extends ReadonlyAssetManager {
7616
7685
  * ```
7617
7686
  */
7618
7687
  async reissue(params) {
7688
+ return this.wallet.withSpendLock((submit) => this.reissueWith(params, submit));
7689
+ }
7690
+ async reissueWith(params, submit) {
7619
7691
  if (params.amount <= 0n) {
7620
7692
  throw new Error(`Reissuance amount must be greater than 0, got ${params.amount}`);
7621
7693
  }
@@ -7666,28 +7738,28 @@ var AssetManager = class extends ReadonlyAssetManager {
7666
7738
  const assetInputs = selectedCoinsToAssetInputs(selectedCoins);
7667
7739
  const reissueInputs = inputsForAsset(assetInputs, params.assetId);
7668
7740
  const totalAssetAmount = assetToReissueAmount + params.amount;
7669
- const reissueAssetIdObj = chunkFN27VWDK_cjs.AssetId.fromString(params.assetId);
7670
- const reissueAssetGroup = chunkFN27VWDK_cjs.AssetGroup.create(
7741
+ const reissueAssetIdObj = chunkFEBAG2K2_cjs.AssetId.fromString(params.assetId);
7742
+ const reissueAssetGroup = chunkFEBAG2K2_cjs.AssetGroup.create(
7671
7743
  reissueAssetIdObj,
7672
7744
  null,
7673
7745
  reissueInputs,
7674
- [chunkFN27VWDK_cjs.AssetOutput.create(0, totalAssetAmount)],
7746
+ [chunkFEBAG2K2_cjs.AssetOutput.create(0, totalAssetAmount)],
7675
7747
  []
7676
7748
  );
7677
7749
  const groups = [reissueAssetGroup];
7678
7750
  for (const [assetId, amount] of assetChanges) {
7679
7751
  const changeInputs = inputsForAsset(assetInputs, assetId);
7680
7752
  groups.push(
7681
- chunkFN27VWDK_cjs.AssetGroup.create(
7682
- chunkFN27VWDK_cjs.AssetId.fromString(assetId),
7753
+ chunkFEBAG2K2_cjs.AssetGroup.create(
7754
+ chunkFEBAG2K2_cjs.AssetId.fromString(assetId),
7683
7755
  null,
7684
7756
  changeInputs,
7685
- [chunkFN27VWDK_cjs.AssetOutput.create(0, amount)],
7757
+ [chunkFEBAG2K2_cjs.AssetOutput.create(0, amount)],
7686
7758
  []
7687
7759
  )
7688
7760
  );
7689
7761
  }
7690
- return submitToSelf(this.wallet, selectedCoins, totalBtcSelected, groups);
7762
+ return submitToSelf(submit, this.wallet, selectedCoins, totalBtcSelected, groups);
7691
7763
  }
7692
7764
  /**
7693
7765
  * Burn assets.
@@ -7705,6 +7777,9 @@ var AssetManager = class extends ReadonlyAssetManager {
7705
7777
  * ```
7706
7778
  */
7707
7779
  async burn(params) {
7780
+ return this.wallet.withSpendLock((submit) => this.burnWith(params, submit));
7781
+ }
7782
+ async burnWith(params, submit) {
7708
7783
  if (params.amount <= 0n) {
7709
7784
  throw new Error(`Burn amount must be greater than 0, got ${params.amount}`);
7710
7785
  }
@@ -7750,16 +7825,16 @@ var AssetManager = class extends ReadonlyAssetManager {
7750
7825
  for (const [assetId, amount] of assetChanges) {
7751
7826
  const changeInputs = inputsForAsset(assetInputs, assetId);
7752
7827
  groups.push(
7753
- chunkFN27VWDK_cjs.AssetGroup.create(
7754
- chunkFN27VWDK_cjs.AssetId.fromString(assetId),
7828
+ chunkFEBAG2K2_cjs.AssetGroup.create(
7829
+ chunkFEBAG2K2_cjs.AssetId.fromString(assetId),
7755
7830
  null,
7756
7831
  changeInputs,
7757
- amount > 0n ? [chunkFN27VWDK_cjs.AssetOutput.create(0, amount)] : [],
7832
+ amount > 0n ? [chunkFEBAG2K2_cjs.AssetOutput.create(0, amount)] : [],
7758
7833
  []
7759
7834
  )
7760
7835
  );
7761
7836
  }
7762
- return submitToSelf(this.wallet, selectedCoins, totalBtcSelected, groups);
7837
+ return submitToSelf(submit, this.wallet, selectedCoins, totalBtcSelected, groups);
7763
7838
  }
7764
7839
  };
7765
7840
  function inputsForAsset(assetInputs, assetId) {
@@ -7767,18 +7842,18 @@ function inputsForAsset(assetInputs, assetId) {
7767
7842
  for (const [inputIndex, assets] of assetInputs) {
7768
7843
  for (const asset of assets) {
7769
7844
  if (asset.assetId !== assetId) continue;
7770
- inputs.push(chunkFN27VWDK_cjs.AssetInput.create(inputIndex, asset.amount));
7845
+ inputs.push(chunkFEBAG2K2_cjs.AssetInput.create(inputIndex, asset.amount));
7771
7846
  }
7772
7847
  }
7773
7848
  return inputs;
7774
7849
  }
7775
- async function submitToSelf(wallet, inputs, amount, groups) {
7776
- const outputAddress = chunk3LDVNVBW_cjs.ArkAddress.decode(await wallet.getAddress());
7850
+ async function submitToSelf(submit, wallet, inputs, amount, groups) {
7851
+ const outputAddress = chunkVVFCCNU2_cjs.ArkAddress.decode(await wallet.getAddress());
7777
7852
  const outputs = [
7778
7853
  { script: outputAddress.pkScript, amount: BigInt(amount) },
7779
- Extension.create([chunkFN27VWDK_cjs.Packet.create(groups)]).txOut()
7854
+ Extension.create([chunkFEBAG2K2_cjs.Packet.create(groups)]).txOut()
7780
7855
  ];
7781
- const { arkTxid } = await wallet.buildAndSubmitOffchainTx(inputs, outputs);
7856
+ const { arkTxid } = await submit(inputs, outputs);
7782
7857
  return arkTxid;
7783
7858
  }
7784
7859
  function castMetadata(metadata) {
@@ -7800,7 +7875,7 @@ function castMetadata(metadata) {
7800
7875
  } else {
7801
7876
  throw new Error("Invalid metadata value type");
7802
7877
  }
7803
- md.push(chunkFN27VWDK_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
7878
+ md.push(chunkFEBAG2K2_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
7804
7879
  }
7805
7880
  return md;
7806
7881
  }
@@ -7821,10 +7896,10 @@ var DelegateManagerImpl = class {
7821
7896
  if (vtxos.length === 0) {
7822
7897
  return { delegated: [], failed: [] };
7823
7898
  }
7824
- const destinationScript = chunk3LDVNVBW_cjs.ArkAddress.decode(destination).pkScript;
7899
+ const destinationScript = chunkVVFCCNU2_cjs.ArkAddress.decode(destination).pkScript;
7825
7900
  const arkInfo = await this.arkInfoProvider.getInfo();
7826
7901
  const delegateInfo = await this.delegateProvider.getDelegateInfo();
7827
- const eligible = vtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo).filter(
7902
+ const eligible = vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo).filter(
7828
7903
  (v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
7829
7904
  );
7830
7905
  if (eligible.length === 0) {
@@ -7856,7 +7931,7 @@ var DelegateManagerImpl = class {
7856
7931
  const groupByExpiry = /* @__PURE__ */ new Map();
7857
7932
  let recoverableVtxos = [];
7858
7933
  for (const vtxo of eligible) {
7859
- if (chunk3LDVNVBW_cjs.canRecoverOnchain(vtxo, now)) {
7934
+ if (chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now)) {
7860
7935
  recoverableVtxos.push(vtxo);
7861
7936
  continue;
7862
7937
  }
@@ -7908,7 +7983,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7908
7983
  }
7909
7984
  if (!delegateAt) {
7910
7985
  const now = { timestamp: /* @__PURE__ */ new Date() };
7911
- const expiryTimestamp = vtxos.filter((coin) => !chunk3LDVNVBW_cjs.canRecoverOnchain(coin, now) && coin.expiresAt).reduce(
7986
+ const expiryTimestamp = vtxos.filter((coin) => !chunkVVFCCNU2_cjs.canRecoverOnchain(coin, now) && coin.expiresAt).reduce(
7912
7987
  (min, coin) => Math.min(min, coin.expiresAt.getTime()),
7913
7988
  Number.MAX_SAFE_INTEGER
7914
7989
  );
@@ -7935,7 +8010,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7935
8010
  let amount = 0n;
7936
8011
  for (const coin of vtxos) {
7937
8012
  const inputFee = estimator.evalOffchainInput({
7938
- ...chunk3LDVNVBW_cjs.toOffchainInputFeeParams(coin),
8013
+ ...chunkVVFCCNU2_cjs.toOffchainInputFeeParams(coin),
7939
8014
  type: "vtxo"
7940
8015
  });
7941
8016
  if (inputFee.satoshis >= coin.value) {
@@ -7949,7 +8024,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7949
8024
  const delegateFee = BigInt(Number(fee));
7950
8025
  if (delegateFee > 0n) {
7951
8026
  outputs.push({
7952
- script: chunk3LDVNVBW_cjs.ArkAddress.decode(delegateAddress).pkScript,
8027
+ script: chunkVVFCCNU2_cjs.ArkAddress.decode(delegateAddress).pkScript,
7953
8028
  amount: delegateFee
7954
8029
  });
7955
8030
  }
@@ -7982,10 +8057,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7982
8057
  destinationScript
7983
8058
  );
7984
8059
  const forfeitOutputScript = btcSigner.OutScript.encode(
7985
- btcSigner.Address(chunk3LDVNVBW_cjs.getNetwork(network)).decode(forfeitAddress)
8060
+ btcSigner.Address(chunkVVFCCNU2_cjs.getNetwork(network)).decode(forfeitAddress)
7986
8061
  );
7987
8062
  const forfeits = await Promise.all(
7988
- vtxos.filter((v) => chunk3LDVNVBW_cjs.requiresForfeit(v)).map(async (coin) => {
8063
+ vtxos.filter((v) => chunkVVFCCNU2_cjs.requiresForfeit(v)).map(async (coin) => {
7989
8064
  const forfeit = await makeDelegateForfeitTx(
7990
8065
  coin,
7991
8066
  dust,
@@ -8010,7 +8085,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
8010
8085
  index: input.vout,
8011
8086
  witnessUtxo: {
8012
8087
  amount: BigInt(input.value),
8013
- script: chunk3LDVNVBW_cjs.VtxoScript.decode(input.tapTree).pkScript
8088
+ script: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
8014
8089
  },
8015
8090
  sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
8016
8091
  tapLeafScript: [delegateTapLeaf]
@@ -8068,7 +8143,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
8068
8143
  expire_at: 0,
8069
8144
  cosigners_public_keys: cosignerPubKeys
8070
8145
  };
8071
- const proof = chunk3LDVNVBW_cjs.Intent.create(message, coins, outputs);
8146
+ const proof = chunkVVFCCNU2_cjs.Intent.create(message, coins, outputs);
8072
8147
  const signedProof = await identity.sign(proof);
8073
8148
  return {
8074
8149
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -8094,10 +8169,10 @@ function getDayTimestamp(timestamp) {
8094
8169
  function findDelegateTapLeaf(vtxo, delegatePubkey) {
8095
8170
  if (!vtxo.tapTree) return void 0;
8096
8171
  const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
8097
- const vtxoScript = chunk3LDVNVBW_cjs.VtxoScript.decode(vtxo.tapTree);
8172
+ const vtxoScript = chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree);
8098
8173
  return vtxoScript.leaves.find((tapLeaf) => {
8099
- const arkTapscript = chunk3LDVNVBW_cjs.decodeTapscript(chunk3LDVNVBW_cjs.scriptFromTapLeafScript(tapLeaf));
8100
- if (!chunk3LDVNVBW_cjs.MultisigTapscript.is(arkTapscript)) return false;
8174
+ const arkTapscript = chunkVVFCCNU2_cjs.decodeTapscript(chunkVVFCCNU2_cjs.scriptFromTapLeafScript(tapLeaf));
8175
+ if (!chunkVVFCCNU2_cjs.MultisigTapscript.is(arkTapscript)) return false;
8101
8176
  return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
8102
8177
  });
8103
8178
  }
@@ -8653,8 +8728,8 @@ function checkSaveVtxosForScript(backend, key, vtxos) {
8653
8728
  }
8654
8729
  async function getVtxosForContract(repo, contract, options) {
8655
8730
  const vtxos = repo.getVtxosForScriptPage ? await collectScriptVtxos(repo, contract.script, options) : filterVtxosForScript(await collectVtxos(repo, contract.address), contract.script);
8656
- const normalized = vtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo);
8657
- return options?.unspentOnly ? normalized.filter((vtxo) => !chunk3LDVNVBW_cjs.isVtxoSpent(vtxo)) : normalized;
8731
+ const normalized = vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
8732
+ return options?.unspentOnly ? normalized.filter((vtxo) => !chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)) : normalized;
8658
8733
  }
8659
8734
  async function hasVtxosForContract(repo, contract) {
8660
8735
  if (repo.getVtxosForScriptPage) {
@@ -8885,7 +8960,7 @@ function decodeArkContract(encoded) {
8885
8960
  }
8886
8961
  function contractFromArkContract(encoded, options = {}) {
8887
8962
  const parsed = decodeArkContract(encoded);
8888
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(parsed.type);
8963
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(parsed.type);
8889
8964
  if (!handler) {
8890
8965
  throw new Error(`No handler registered for contract type '${parsed.type}'`);
8891
8966
  }
@@ -8899,9 +8974,9 @@ function contractFromArkContract(encoded, options = {}) {
8899
8974
  metadata: options.metadata
8900
8975
  };
8901
8976
  }
8902
- function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunk3LDVNVBW_cjs.DEFAULT_NETWORK.hrp, options = {}) {
8977
+ function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunkVVFCCNU2_cjs.DEFAULT_NETWORK.hrp, options = {}) {
8903
8978
  const parsed = decodeArkContract(encoded);
8904
- const handler = chunkEBCWETZM_cjs.contractHandlers.getOrThrow(parsed.type);
8979
+ const handler = chunkCFOIHLON_cjs.contractHandlers.getOrThrow(parsed.type);
8905
8980
  const params = parsed.data;
8906
8981
  const vtxoScript = handler.createScript(params);
8907
8982
  return {
@@ -8958,10 +9033,10 @@ var ContractWatcher = class {
8958
9033
  eventSourceReported = false;
8959
9034
  /** @see ContractWatcherConfig */
8960
9035
  constructor(config) {
8961
- chunk3LDVNVBW_cjs.assertTimerMs("failsafePollIntervalMs", config.failsafePollIntervalMs);
8962
- chunk3LDVNVBW_cjs.assertTimerMs("reconnectDelayMs", config.reconnectDelayMs);
8963
- chunk3LDVNVBW_cjs.assertTimerMs("maxReconnectDelayMs", config.maxReconnectDelayMs);
8964
- chunk3LDVNVBW_cjs.assertTimerMs("subscriptionRequestTimeoutMs", config.subscriptionRequestTimeoutMs);
9036
+ chunkVVFCCNU2_cjs.assertTimerMs("failsafePollIntervalMs", config.failsafePollIntervalMs);
9037
+ chunkVVFCCNU2_cjs.assertTimerMs("reconnectDelayMs", config.reconnectDelayMs);
9038
+ chunkVVFCCNU2_cjs.assertTimerMs("maxReconnectDelayMs", config.maxReconnectDelayMs);
9039
+ chunkVVFCCNU2_cjs.assertTimerMs("subscriptionRequestTimeoutMs", config.subscriptionRequestTimeoutMs);
8965
9040
  if (config.subscriptionRequestTimeoutMs === 0) {
8966
9041
  throw new Error("subscriptionRequestTimeoutMs must be greater than 0");
8967
9042
  }
@@ -9184,9 +9259,9 @@ var ContractWatcher = class {
9184
9259
  this.reconnectAttempts = 0;
9185
9260
  this.listenLoop().catch((e) => {
9186
9261
  if (!this.isWatching || signal?.aborted) return;
9187
- if (chunk3LDVNVBW_cjs.isEventSourceError(e)) {
9262
+ if (chunkVVFCCNU2_cjs.isEventSourceError(e)) {
9188
9263
  console.debug("ContractWatcher subscription disconnected; reconnecting");
9189
- } else if (!chunk3LDVNVBW_cjs.isEventSourceUnavailableError(e)) {
9264
+ } else if (!chunkVVFCCNU2_cjs.isEventSourceUnavailableError(e)) {
9190
9265
  console.error(e);
9191
9266
  }
9192
9267
  this.connectionState = "disconnected";
@@ -9196,7 +9271,7 @@ var ContractWatcher = class {
9196
9271
  });
9197
9272
  } catch (error) {
9198
9273
  if (!this.isWatching || signal?.aborted) return;
9199
- if (!chunk3LDVNVBW_cjs.isEventSourceUnavailableError(error)) {
9274
+ if (!chunkVVFCCNU2_cjs.isEventSourceUnavailableError(error)) {
9200
9275
  console.error("ContractWatcher connection failed:", error);
9201
9276
  }
9202
9277
  this.connectionState = "disconnected";
@@ -9212,7 +9287,7 @@ var ContractWatcher = class {
9212
9287
  * few seconds.
9213
9288
  */
9214
9289
  reportEventSourceUnavailable(error) {
9215
- if (!chunk3LDVNVBW_cjs.isEventSourceUnavailableError(error)) return false;
9290
+ if (!chunkVVFCCNU2_cjs.isEventSourceUnavailableError(error)) return false;
9216
9291
  if (!this.eventSourceReported) {
9217
9292
  this.eventSourceReported = true;
9218
9293
  console.warn(
@@ -9277,7 +9352,7 @@ var ContractWatcher = class {
9277
9352
  const now = Date.now();
9278
9353
  let current;
9279
9354
  try {
9280
- current = await chunk3LDVNVBW_cjs.getAllNormalizedVtxos(this.config.indexerProvider, scripts, {
9355
+ current = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(this.config.indexerProvider, scripts, {
9281
9356
  spendableOnly: true
9282
9357
  });
9283
9358
  } catch (error) {
@@ -9559,14 +9634,14 @@ var ContractWatcher = class {
9559
9634
  const timestamp = Date.now();
9560
9635
  if (update.newVtxos?.length) {
9561
9636
  this.processSubscriptionVtxos(
9562
- update.newVtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo),
9637
+ update.newVtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo),
9563
9638
  "vtxo_received",
9564
9639
  timestamp
9565
9640
  );
9566
9641
  }
9567
9642
  if (update.spentVtxos?.length) {
9568
9643
  this.processSubscriptionVtxos(
9569
- update.spentVtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo),
9644
+ update.spentVtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo),
9570
9645
  "vtxo_spent",
9571
9646
  timestamp
9572
9647
  );
@@ -9591,8 +9666,8 @@ var ContractWatcher = class {
9591
9666
  continue;
9592
9667
  }
9593
9668
  if (target === byWatchedScript && eventType === "vtxo_received") {
9594
- const n = chunk3LDVNVBW_cjs.normalizeVtxo(vtxo);
9595
- if (chunk3LDVNVBW_cjs.isVtxoSpent(n) || n.isSwept || chunk3LDVNVBW_cjs.isPastExpiry(n, now)) continue;
9669
+ const n = chunkVVFCCNU2_cjs.normalizeVtxo(vtxo);
9670
+ if (chunkVVFCCNU2_cjs.isVtxoSpent(n) || n.isSwept || chunkVVFCCNU2_cjs.isPastExpiry(n, now)) continue;
9596
9671
  }
9597
9672
  let bucket = target.get(vtxo.script);
9598
9673
  if (!bucket) {
@@ -9729,7 +9804,7 @@ function annotatableIn(scriptToContract, vtxos, memo) {
9729
9804
  if (!contract) continue;
9730
9805
  try {
9731
9806
  const key = `${contract.type}\0${script}\0${JSON.stringify(contract.params)}`;
9732
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(contract.type);
9807
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
9733
9808
  const hit = memo?.get(script);
9734
9809
  let tapscripts;
9735
9810
  if (hit && hit.key === key && hit.handler === handler) {
@@ -9757,6 +9832,11 @@ function annotatableIn(scriptToContract, vtxos, memo) {
9757
9832
  }
9758
9833
  return { scripts, cache, failures };
9759
9834
  }
9835
+ function annotateAgainst(vtxos, byScript, tapscripts = /* @__PURE__ */ new Map()) {
9836
+ return vtxos.map(
9837
+ (vtxo) => extendVirtualCoinForContract(chunkVVFCCNU2_cjs.normalizeVtxo(vtxo), byScript, tapscripts)
9838
+ );
9839
+ }
9760
9840
  var SCAN_MAX_INDEX = 1e4;
9761
9841
  var DEFAULT_SCAN_BATCH = 10;
9762
9842
  var CHAIN_TIP_TTL_MS = 3e4;
@@ -9798,8 +9878,8 @@ var ContractManager = class _ContractManager {
9798
9878
  * `dispose()`, so it re-checks this at every await rather than run on a torn-down watcher. */
9799
9879
  disposed = false;
9800
9880
  constructor(config) {
9801
- chunk3LDVNVBW_cjs.assertNonNegativeMs("vtxoSyncMaxAgeMs", config.vtxoSyncMaxAgeMs);
9802
- chunk3LDVNVBW_cjs.assertNonNegativeMs("vtxoSyncOverlapMs", config.vtxoSyncOverlapMs);
9881
+ chunkVVFCCNU2_cjs.assertNonNegativeMs("vtxoSyncMaxAgeMs", config.vtxoSyncMaxAgeMs);
9882
+ chunkVVFCCNU2_cjs.assertNonNegativeMs("vtxoSyncOverlapMs", config.vtxoSyncOverlapMs);
9803
9883
  this.config = { ...config };
9804
9884
  this.watcher = new ContractWatcher({
9805
9885
  indexerProvider: config.indexerProvider,
@@ -9835,12 +9915,12 @@ var ContractManager = class _ContractManager {
9835
9915
  }
9836
9916
  /** @see ContractManagerConfig.vtxoSyncMaxAgeMs — for factory-built managers. */
9837
9917
  setVtxoSyncMaxAge(maxAgeMs) {
9838
- chunk3LDVNVBW_cjs.assertNonNegativeMs("vtxoSyncMaxAgeMs", maxAgeMs);
9918
+ chunkVVFCCNU2_cjs.assertNonNegativeMs("vtxoSyncMaxAgeMs", maxAgeMs);
9839
9919
  this.config.vtxoSyncMaxAgeMs = maxAgeMs;
9840
9920
  }
9841
9921
  /** @see ContractManagerConfig.vtxoSyncOverlapMs — for factory-built managers. */
9842
9922
  setVtxoSyncOverlap(overlapMs) {
9843
- chunk3LDVNVBW_cjs.assertNonNegativeMs("vtxoSyncOverlapMs", overlapMs);
9923
+ chunkVVFCCNU2_cjs.assertNonNegativeMs("vtxoSyncOverlapMs", overlapMs);
9844
9924
  this.config.vtxoSyncOverlapMs = overlapMs;
9845
9925
  }
9846
9926
  markSyncOnline() {
@@ -9888,7 +9968,7 @@ var ContractManager = class _ContractManager {
9888
9968
  this.markSyncOnline();
9889
9969
  return void 0;
9890
9970
  } catch (err) {
9891
- if (!chunk3LDVNVBW_cjs.isRetryableProviderError(err)) throw err;
9971
+ if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
9892
9972
  this.markSyncDegraded(err);
9893
9973
  return err;
9894
9974
  }
@@ -9911,7 +9991,7 @@ var ContractManager = class _ContractManager {
9911
9991
  try {
9912
9992
  await this.scheduleLookAheadDrain();
9913
9993
  } catch (err) {
9914
- if (!chunk3LDVNVBW_cjs.isRetryableProviderError(err)) throw err;
9994
+ if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
9915
9995
  this.lookAheadRefillOwed = true;
9916
9996
  this.markSyncDegraded(err);
9917
9997
  }
@@ -9974,7 +10054,7 @@ var ContractManager = class _ContractManager {
9974
10054
  /** No throw: construction returned long ago, so the state is the channel. */
9975
10055
  reportBackgroundFailure(stage, err) {
9976
10056
  this.markSyncDegraded(err);
9977
- if (!chunk3LDVNVBW_cjs.isRetryableProviderError(err)) {
10057
+ if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) {
9978
10058
  console.error(`[contracts] background ${stage} failed`, err);
9979
10059
  }
9980
10060
  }
@@ -10076,7 +10156,7 @@ var ContractManager = class _ContractManager {
10076
10156
  const from = Math.max(0, watermark - lookAhead.size);
10077
10157
  const to = watermark + lookAhead.size;
10078
10158
  const deps = lookAhead.candidateDeps();
10079
- const handlers = chunkEBCWETZM_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkEBCWETZM_cjs.contractHandlers.get(t)).filter(hasCandidates);
10159
+ const handlers = chunkCFOIHLON_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkCFOIHLON_cjs.contractHandlers.get(t)).filter(hasCandidates);
10080
10160
  const band = /* @__PURE__ */ new Map();
10081
10161
  for (let index = from; index <= to; index++) {
10082
10162
  const descriptor = lookAhead.materialize(index);
@@ -10087,7 +10167,7 @@ var ContractManager = class _ContractManager {
10087
10167
  index,
10088
10168
  params: {
10089
10169
  ...candidate,
10090
- ...chunkEBCWETZM_cjs.speculativeReceiveMetadata(descriptor)
10170
+ ...chunkCFOIHLON_cjs.speculativeReceiveMetadata(descriptor)
10091
10171
  }
10092
10172
  });
10093
10173
  }
@@ -10146,7 +10226,7 @@ var ContractManager = class _ContractManager {
10146
10226
  });
10147
10227
  for (const entry of pending) entry.catchUpPending = false;
10148
10228
  } catch (err) {
10149
- if (!chunk3LDVNVBW_cjs.isRetryableProviderError(err)) throw err;
10229
+ if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
10150
10230
  this.markSyncDegraded(err);
10151
10231
  }
10152
10232
  }
@@ -10237,7 +10317,7 @@ var ContractManager = class _ContractManager {
10237
10317
  return result;
10238
10318
  }
10239
10319
  async upsertContractRow(params) {
10240
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(params.type);
10320
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(params.type);
10241
10321
  if (!handler) {
10242
10322
  throw new Error(`No handler registered for contract type '${params.type}'`);
10243
10323
  }
@@ -10305,7 +10385,7 @@ var ContractManager = class _ContractManager {
10305
10385
  `scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
10306
10386
  );
10307
10387
  }
10308
- const registered = chunkEBCWETZM_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkEBCWETZM_cjs.contractHandlers.get(t)).filter(isDiscoverable);
10388
+ const registered = chunkCFOIHLON_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkCFOIHLON_cjs.contractHandlers.get(t)).filter(isDiscoverable);
10309
10389
  const discoverables = [
10310
10390
  ...registered.filter((h) => h.type === "boarding"),
10311
10391
  ...registered.filter((h) => h.type !== "boarding")
@@ -10431,7 +10511,7 @@ var ContractManager = class _ContractManager {
10431
10511
  return await collectContracts(this.config.contractRepository, dbFilter);
10432
10512
  }
10433
10513
  async getContractsWithVtxos(filter, pageSize, options) {
10434
- chunk3LDVNVBW_cjs.assertNonNegativeMs("maxSyncAgeMs", options?.maxSyncAgeMs);
10514
+ chunkVVFCCNU2_cjs.assertNonNegativeMs("maxSyncAgeMs", options?.maxSyncAgeMs);
10435
10515
  const contracts = await this.getContracts(filter);
10436
10516
  if (this.syncedWithin(
10437
10517
  contracts,
@@ -10494,10 +10574,7 @@ var ContractManager = class _ContractManager {
10494
10574
  for (const contract of contracts) {
10495
10575
  byScript.set(contract.script, contract);
10496
10576
  }
10497
- const tapscriptCache = tapscripts ?? /* @__PURE__ */ new Map();
10498
- return vtxos.map(
10499
- (vtxo) => extendVirtualCoinForContract(chunk3LDVNVBW_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
10500
- );
10577
+ return annotateAgainst(vtxos, byScript, tapscripts);
10501
10578
  }
10502
10579
  /** @inheritdoc */
10503
10580
  async assertAnnotatable(vtxos) {
@@ -10541,14 +10618,14 @@ var ContractManager = class _ContractManager {
10541
10618
  const byScript = new Map(contracts.map((contract) => [contract.script, contract]));
10542
10619
  const asking = vtxos.filter((vtxo) => {
10543
10620
  const contract = byScript.get(vtxo.script);
10544
- return contract !== void 0 && chunkEBCWETZM_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
10621
+ return contract !== void 0 && chunkCFOIHLON_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
10545
10622
  });
10546
10623
  if (asking.length === 0) return refused;
10547
10624
  const tip = await this.currentChainTip();
10548
10625
  const walletDescriptorValue = await walletDescriptor?.();
10549
10626
  for (const vtxo of asking) {
10550
10627
  const contract = byScript.get(vtxo.script);
10551
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(contract.type);
10628
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
10552
10629
  if (!handler?.assertSpendableNow) continue;
10553
10630
  const context = {
10554
10631
  collaborative: true,
@@ -10558,7 +10635,7 @@ var ContractManager = class _ContractManager {
10558
10635
  walletDescriptor: walletDescriptorValue,
10559
10636
  // `isVirtualCoin` only checks `script`, which every input has; `isCsvSpendable`
10560
10637
  // reads `vtxo.status.block_time` unguarded, so require `status` too.
10561
- vtxo: chunk3LDVNVBW_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
10638
+ vtxo: chunkVVFCCNU2_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
10562
10639
  };
10563
10640
  try {
10564
10641
  await handler.assertSpendableNow(
@@ -10671,7 +10748,7 @@ var ContractManager = class _ContractManager {
10671
10748
  const { contractScript, collaborative = true, walletDescriptor, vtxo } = options;
10672
10749
  const [contract] = await this.getContracts({ script: contractScript });
10673
10750
  if (!contract) return [];
10674
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(contract.type);
10751
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
10675
10752
  if (!handler) return [];
10676
10753
  const script = handler.createScript(contract.params);
10677
10754
  const tip = await this.currentChainTip();
@@ -10693,7 +10770,7 @@ var ContractManager = class _ContractManager {
10693
10770
  const { contractScript, collaborative = true, walletDescriptor } = options;
10694
10771
  const [contract] = await this.getContracts({ script: contractScript });
10695
10772
  if (!contract) return [];
10696
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(contract.type);
10773
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
10697
10774
  if (!handler) return [];
10698
10775
  const script = handler.createScript(contract.params);
10699
10776
  const context = {
@@ -10739,7 +10816,7 @@ var ContractManager = class _ContractManager {
10739
10816
  }
10740
10817
  async refreshOutpoints(outpoints) {
10741
10818
  if (outpoints.length === 0) return;
10742
- const { vtxos } = await chunk3LDVNVBW_cjs.getNormalizedVtxos(this.config.indexerProvider, {
10819
+ const { vtxos } = await chunkVVFCCNU2_cjs.getNormalizedVtxos(this.config.indexerProvider, {
10743
10820
  outpoints
10744
10821
  });
10745
10822
  if (vtxos.length === 0) return;
@@ -10748,9 +10825,15 @@ var ContractManager = class _ContractManager {
10748
10825
  script: scripts
10749
10826
  });
10750
10827
  const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
10751
- const owned = vtxos.filter((v) => scriptToContract.has(v.script));
10828
+ const {
10829
+ scripts: annotatable,
10830
+ cache,
10831
+ failures
10832
+ } = annotatableIn(scriptToContract, vtxos, this.tapscriptMemo);
10833
+ this.recordAnnotationFailures(annotatable, failures);
10834
+ const owned = vtxos.filter((v) => annotatable.has(v.script));
10752
10835
  if (owned.length === 0) return;
10753
- const annotated = await this.annotateVtxos(owned);
10836
+ const annotated = annotateAgainst(owned, scriptToContract, cache);
10754
10837
  const byAddress = /* @__PURE__ */ new Map();
10755
10838
  for (const vtxo of annotated) {
10756
10839
  const contract = scriptToContract.get(vtxo.script);
@@ -10834,7 +10917,7 @@ var ContractManager = class _ContractManager {
10834
10917
  break;
10835
10918
  }
10836
10919
  } catch (err) {
10837
- if (!chunk3LDVNVBW_cjs.isRetryableProviderError(err)) throw err;
10920
+ if (!chunkVVFCCNU2_cjs.isRetryableProviderError(err)) throw err;
10838
10921
  this.markSyncDegraded(err);
10839
10922
  synced = false;
10840
10923
  }
@@ -10922,7 +11005,7 @@ var ContractManager = class _ContractManager {
10922
11005
  */
10923
11006
  async reconcilePendingFrontier(contracts) {
10924
11007
  const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
10925
- const vtxos = await chunk3LDVNVBW_cjs.getAllNormalizedVtxos(
11008
+ const vtxos = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(
10926
11009
  this.config.indexerProvider,
10927
11010
  contracts.map((c) => c.script),
10928
11011
  { pendingOnly: true }
@@ -10937,7 +11020,7 @@ var ContractManager = class _ContractManager {
10937
11020
  } = annotatableIn(scriptToContract, vtxos, this.tapscriptMemo);
10938
11021
  this.recordAnnotationFailures(annotatable, failures);
10939
11022
  const owned = vtxos.filter((v) => annotatable.has(v.script));
10940
- const annotated = await this.annotateVtxos(owned, cache);
11023
+ const annotated = annotateAgainst(owned, scriptToContract, cache);
10941
11024
  const byContract = /* @__PURE__ */ new Map();
10942
11025
  const contractByAddress = /* @__PURE__ */ new Map();
10943
11026
  for (const vtxo of annotated) {
@@ -10996,7 +11079,7 @@ var ContractManager = class _ContractManager {
10996
11079
  }
10997
11080
  return result;
10998
11081
  }
10999
- async fetchContractVtxosBulk(contracts, pageSize = chunk3LDVNVBW_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
11082
+ async fetchContractVtxosBulk(contracts, pageSize = chunkVVFCCNU2_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
11000
11083
  if (contracts.length === 0) {
11001
11084
  return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
11002
11085
  }
@@ -11012,7 +11095,7 @@ var ContractManager = class _ContractManager {
11012
11095
  before: syncWindow.before
11013
11096
  }
11014
11097
  } : {};
11015
- const vtxos = await chunk3LDVNVBW_cjs.getAllNormalizedVtxos(
11098
+ const vtxos = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(
11016
11099
  this.config.indexerProvider,
11017
11100
  contracts.map((c) => c.script),
11018
11101
  { ...windowOpts, pageSize }
@@ -11028,7 +11111,7 @@ var ContractManager = class _ContractManager {
11028
11111
  } = annotatableIn(scriptToContract, vtxos, this.tapscriptMemo);
11029
11112
  this.recordAnnotationFailures(annotatable, failures);
11030
11113
  const owned = vtxos.filter((v) => annotatable.has(v.script));
11031
- const annotated = await this.annotateVtxos(owned, cache);
11114
+ const annotated = annotateAgainst(owned, scriptToContract, cache);
11032
11115
  for (const vtxo of annotated) {
11033
11116
  result.get(vtxo.script).push({
11034
11117
  ...vtxo,
@@ -11114,7 +11197,7 @@ function parseLegacyExpiry(batchExpiry) {
11114
11197
  if (typeof batchExpiry !== "number" || !Number.isFinite(batchExpiry) || batchExpiry <= 0) {
11115
11198
  return {};
11116
11199
  }
11117
- if (batchExpiry >= chunk3LDVNVBW_cjs.EXPIRY_MIN_PLAUSIBLE_MS) return { expiresAt: new Date(batchExpiry) };
11200
+ if (batchExpiry >= chunkVVFCCNU2_cjs.EXPIRY_MIN_PLAUSIBLE_MS) return { expiresAt: new Date(batchExpiry) };
11118
11201
  return { expiresAtHeight: batchExpiry / 1e3 };
11119
11202
  }
11120
11203
  function legacyVtxoFacts(status) {
@@ -11352,7 +11435,7 @@ function backfillContractWatchState(store) {
11352
11435
  };
11353
11436
  readPage();
11354
11437
  }
11355
- var unspentFlag = (vtxo) => chunk3LDVNVBW_cjs.isVtxoSpent(vtxo) ? {} : { unspent: 1 };
11438
+ var unspentFlag = (vtxo) => chunkVVFCCNU2_cjs.isVtxoSpent(vtxo) ? {} : { unspent: 1 };
11356
11439
  function backfillVtxoIndexFields(transaction) {
11357
11440
  const store = transaction.objectStore(STORE_VTXOS);
11358
11441
  const pageSize = 1e3;
@@ -11383,7 +11466,7 @@ var DEFAULT_DB_NAME = "arkade-service-worker";
11383
11466
  var DEFAULT_SERVICE_WORKER_ACTIVATION_TIMEOUT_MS = 1e4;
11384
11467
  function normalizeOptions2(pathOrOptions) {
11385
11468
  const o = typeof pathOrOptions === "string" ? { path: pathOrOptions } : pathOrOptions;
11386
- chunk3LDVNVBW_cjs.assertTimerMs("activationTimeoutMs", o.activationTimeoutMs);
11469
+ chunkVVFCCNU2_cjs.assertTimerMs("activationTimeoutMs", o.activationTimeoutMs);
11387
11470
  return {
11388
11471
  path: o.path,
11389
11472
  activationTimeoutMs: o.activationTimeoutMs ?? DEFAULT_SERVICE_WORKER_ACTIVATION_TIMEOUT_MS
@@ -11602,7 +11685,7 @@ var deserializeTapLeaf = (t) => {
11602
11685
  const s = base.hex.decode(t.s);
11603
11686
  return [cb, s];
11604
11687
  };
11605
- var deserializeVtxo = (o) => chunk3LDVNVBW_cjs.normalizeVtxo({
11688
+ var deserializeVtxo = (o) => chunkVVFCCNU2_cjs.normalizeVtxo({
11606
11689
  ...o,
11607
11690
  createdAt: new Date(o.createdAt),
11608
11691
  tapTree: base.hex.decode(o.tapTree),
@@ -12026,7 +12109,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
12026
12109
  */
12027
12110
  materializeDescriptorAt(index) {
12028
12111
  const descriptor = this.identity.descriptor;
12029
- const network = chunkEBCWETZM_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
12112
+ const network = chunkCFOIHLON_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
12030
12113
  const expansion = descriptorsScure.expand({ descriptor, network, index });
12031
12114
  const keyInfo = expansion.expansionMap?.["@0"];
12032
12115
  if (!keyInfo?.keyExpression) {
@@ -12094,7 +12177,7 @@ function signingDescriptorIndex(descriptor) {
12094
12177
  }
12095
12178
  function newestWalletReceiveContract(contracts, serverPubKeyHex) {
12096
12179
  return contracts.filter(
12097
- (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkEBCWETZM_cjs.WALLET_RECEIVE_SOURCE
12180
+ (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkCFOIHLON_cjs.WALLET_RECEIVE_SOURCE
12098
12181
  ).sort((a, b) => {
12099
12182
  if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
12100
12183
  return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
@@ -12145,7 +12228,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
12145
12228
  const provider = await resolveDescriptorProvider(config, setup.walletRepository);
12146
12229
  if (!provider) return void 0;
12147
12230
  const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
12148
- const expectedContractType = setup.offchainTapscript instanceof chunkEBCWETZM_cjs.DelegateVtxo.Script ? "delegate" : "default";
12231
+ const expectedContractType = setup.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? "delegate" : "default";
12149
12232
  const factoryOpts = {
12150
12233
  walletRepository: setup.walletRepository,
12151
12234
  contractRepository: setup.contractRepository,
@@ -12302,7 +12385,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
12302
12385
  };
12303
12386
  function deriveLeafPubkey(descriptor) {
12304
12387
  try {
12305
- return chunkEBCWETZM_cjs.deriveDescriptorLeafPubKey(descriptor);
12388
+ return chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(descriptor);
12306
12389
  } catch (e) {
12307
12390
  throw new NonRangeableDescriptorError(
12308
12391
  "Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
@@ -12314,7 +12397,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
12314
12397
  const pubKey = deriveLeafPubkey(descriptor);
12315
12398
  const tapscript = rebuildTapscript(current, pubKey);
12316
12399
  const serverPubKey = tapscript.options.serverPubKey;
12317
- const csvTimelock2 = chunk3LDVNVBW_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
12400
+ const csvTimelock2 = chunkVVFCCNU2_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
12318
12401
  const base$1 = {
12319
12402
  script: base.hex.encode(tapscript.pkScript),
12320
12403
  address: tapscript.address(hrp, serverPubKey).encode(),
@@ -12322,11 +12405,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
12322
12405
  // Read at sign time to route rotated-pubkey inputs through `signWithDescriptor`; without
12323
12406
  // it spends are rejected with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
12324
12407
  metadata: {
12325
- ...tagSource && { source: chunkEBCWETZM_cjs.WALLET_RECEIVE_SOURCE },
12408
+ ...tagSource && { source: chunkCFOIHLON_cjs.WALLET_RECEIVE_SOURCE },
12326
12409
  signingDescriptor: descriptor
12327
12410
  }
12328
12411
  };
12329
- const params = tapscript instanceof chunkEBCWETZM_cjs.DelegateVtxo.Script ? {
12412
+ const params = tapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? {
12330
12413
  ...base$1,
12331
12414
  type: "delegate",
12332
12415
  params: {
@@ -12347,10 +12430,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
12347
12430
  return { tapscript, params };
12348
12431
  }
12349
12432
  function rebuildTapscript(current, pubKey) {
12350
- if (current instanceof chunkEBCWETZM_cjs.DelegateVtxo.Script) {
12351
- return new chunkEBCWETZM_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
12433
+ if (current instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script) {
12434
+ return new chunkCFOIHLON_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
12352
12435
  }
12353
- return new chunkEBCWETZM_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
12436
+ return new chunkCFOIHLON_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
12354
12437
  }
12355
12438
  async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
12356
12439
  const candidates = await collectContracts(contractRepository, {
@@ -12391,12 +12474,13 @@ async function resolveDescriptorProvider(config, walletRepository) {
12391
12474
 
12392
12475
  // src/wallet/balance.ts
12393
12476
  function computeOffchainBalance(vtxos, caps) {
12394
- const { now, isPendingRecovery, isGenericallySpendable, isUnlocked, dustCarrier } = caps;
12477
+ const { now, isPendingRecovery, isGenericallySpendable, isUnlocked, isReserved, dustCarrier } = caps;
12395
12478
  let settled = 0;
12396
12479
  let preconfirmed = 0;
12397
12480
  let available = 0;
12398
12481
  let gated = 0;
12399
12482
  let intentLocked = 0;
12483
+ let reserved = 0;
12400
12484
  let recoverable = 0;
12401
12485
  let pendingRecovery = 0;
12402
12486
  let unrolled = 0;
@@ -12408,7 +12492,7 @@ function computeOffchainBalance(vtxos, caps) {
12408
12492
  }
12409
12493
  };
12410
12494
  for (const vtxo of vtxos) {
12411
- if (chunk3LDVNVBW_cjs.isVtxoSpent(vtxo)) continue;
12495
+ if (chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)) continue;
12412
12496
  addAssets(owned, vtxo);
12413
12497
  if (vtxo.isUnrolled) {
12414
12498
  unrolled += vtxo.value;
@@ -12418,11 +12502,11 @@ function computeOffchainBalance(vtxos, caps) {
12418
12502
  pendingRecovery += vtxo.value;
12419
12503
  continue;
12420
12504
  }
12421
- if (chunk3LDVNVBW_cjs.canRecoverOnchain(vtxo, now)) {
12505
+ if (chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now)) {
12422
12506
  recoverable += vtxo.value;
12423
12507
  continue;
12424
12508
  }
12425
- if (!chunk3LDVNVBW_cjs.canSpendOffchain(vtxo, now)) continue;
12509
+ if (!chunkVVFCCNU2_cjs.canSpendOffchain(vtxo, now)) continue;
12426
12510
  if (vtxo.isPreconfirmed) {
12427
12511
  preconfirmed += vtxo.value;
12428
12512
  } else {
@@ -12432,6 +12516,8 @@ function computeOffchainBalance(vtxos, caps) {
12432
12516
  gated += vtxo.value;
12433
12517
  } else if (!isUnlocked(vtxo)) {
12434
12518
  intentLocked += vtxo.value;
12519
+ } else if (isReserved?.(vtxo)) {
12520
+ reserved += vtxo.value;
12435
12521
  } else {
12436
12522
  available += vtxo.value;
12437
12523
  addAssets(spendable, vtxo);
@@ -12447,6 +12533,7 @@ function computeOffchainBalance(vtxos, caps) {
12447
12533
  available,
12448
12534
  gated,
12449
12535
  intentLocked,
12536
+ reserved,
12450
12537
  recoverable,
12451
12538
  pendingRecovery,
12452
12539
  unrolled,
@@ -12477,6 +12564,7 @@ function toWalletBalance(boardingUtxos, offchain) {
12477
12564
  available: offchain.available,
12478
12565
  gated: offchain.gated,
12479
12566
  intentLocked: offchain.intentLocked,
12567
+ reserved: offchain.reserved,
12480
12568
  recoverable: offchain.recoverable,
12481
12569
  pendingRecovery: offchain.pendingRecovery,
12482
12570
  unrolled: offchain.unrolled,
@@ -12633,7 +12721,7 @@ function intentProofJobs(coins) {
12633
12721
  if (coins.length === 0) return [];
12634
12722
  const coinJobs = coins.map((coin, i) => ({
12635
12723
  index: i + 1,
12636
- lookupScript: chunk3LDVNVBW_cjs.VtxoScript.decode(coin.tapTree).pkScript
12724
+ lookupScript: chunkVVFCCNU2_cjs.VtxoScript.decode(coin.tapTree).pkScript
12637
12725
  }));
12638
12726
  return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
12639
12727
  }
@@ -12659,7 +12747,7 @@ function dedupeTimelocks(timelocks) {
12659
12747
  const seen = /* @__PURE__ */ new Set();
12660
12748
  const deduped = [];
12661
12749
  for (const timelock of timelocks) {
12662
- const sequence = chunk3LDVNVBW_cjs.timelockToSequence(timelock).toString();
12750
+ const sequence = chunkVVFCCNU2_cjs.timelockToSequence(timelock).toString();
12663
12751
  if (seen.has(sequence)) continue;
12664
12752
  seen.add(sequence);
12665
12753
  deduped.push(timelock);
@@ -12675,7 +12763,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
12675
12763
  if (!newest?.params.pubKey) return baseline;
12676
12764
  try {
12677
12765
  const pubKey = base.hex.decode(newest.params.pubKey);
12678
- return new chunkEBCWETZM_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
12766
+ return new chunkCFOIHLON_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
12679
12767
  } catch (e) {
12680
12768
  console.warn("Skipping malformed boarding contract at boot", newest.script, e);
12681
12769
  return baseline;
@@ -12707,21 +12795,21 @@ function filterFlatVtxos(vtxos, filter, pendingSpendOutpoints) {
12707
12795
  if (vtxo.isUnrolled) {
12708
12796
  return !!f.withUnrolled;
12709
12797
  }
12710
- if (chunk3LDVNVBW_cjs.isVtxoSpent(vtxo)) {
12798
+ if (chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)) {
12711
12799
  return false;
12712
12800
  }
12713
- if (!f.withRecoverable && chunk3LDVNVBW_cjs.canRecoverOnchain(vtxo, now)) {
12801
+ if (!f.withRecoverable && chunkVVFCCNU2_cjs.canRecoverOnchain(vtxo, now)) {
12714
12802
  return false;
12715
12803
  }
12716
12804
  return true;
12717
12805
  });
12718
12806
  }
12719
12807
  async function refreshSweptStateOfExpiredInputs(wallet, inputs) {
12720
- const candidates = inputs.filter(chunk3LDVNVBW_cjs.isVirtualCoin).map(chunk3LDVNVBW_cjs.normalizeVtxo).filter((v) => !v.isSwept);
12808
+ const candidates = inputs.filter(chunkVVFCCNU2_cjs.isVirtualCoin).map(chunkVVFCCNU2_cjs.normalizeVtxo).filter((v) => !v.isSwept);
12721
12809
  if (candidates.length === 0) return inputs;
12722
- const now = candidates.some((v) => v.expiresAtHeight !== void 0) ? await chunk3LDVNVBW_cjs.resolveTimeHeight(wallet.onchainProvider) : { timestamp: /* @__PURE__ */ new Date() };
12810
+ const now = candidates.some((v) => v.expiresAtHeight !== void 0) ? await chunkVVFCCNU2_cjs.resolveTimeHeight(wallet.onchainProvider) : { timestamp: /* @__PURE__ */ new Date() };
12723
12811
  const suspects = candidates.filter(
12724
- (v) => chunk3LDVNVBW_cjs.isPastExpiry(v, now) || v.expiresAtHeight !== void 0 && now.height === void 0
12812
+ (v) => chunkVVFCCNU2_cjs.isPastExpiry(v, now) || v.expiresAtHeight !== void 0 && now.height === void 0
12725
12813
  );
12726
12814
  if (suspects.length === 0) return inputs;
12727
12815
  let sweptNow;
@@ -12735,12 +12823,12 @@ async function refreshSweptStateOfExpiredInputs(wallet, inputs) {
12735
12823
  );
12736
12824
  } catch (e) {
12737
12825
  const message = "could not confirm the swept state of expired settlement inputs; retry the settlement";
12738
- throw chunk3LDVNVBW_cjs.isRetryableProviderError(e) ? new chunk3LDVNVBW_cjs.ProviderUnavailableError(message, { cause: e }) : new Error(message, { cause: e });
12826
+ throw chunkVVFCCNU2_cjs.isRetryableProviderError(e) ? new chunkVVFCCNU2_cjs.ProviderUnavailableError(message, { cause: e }) : new Error(message, { cause: e });
12739
12827
  }
12740
12828
  if (sweptNow.size === 0) return inputs;
12741
12829
  return inputs.map((input) => {
12742
- if (!chunk3LDVNVBW_cjs.isVirtualCoin(input) || !sweptNow.has(`${input.txid}:${input.vout}`)) return input;
12743
- return { ...chunk3LDVNVBW_cjs.normalizeVtxo(input), isSwept: true };
12830
+ if (!chunkVVFCCNU2_cjs.isVirtualCoin(input) || !sweptNow.has(`${input.txid}:${input.vout}`)) return input;
12831
+ return { ...chunkVVFCCNU2_cjs.normalizeVtxo(input), isSwept: true };
12744
12832
  });
12745
12833
  }
12746
12834
  var PENDING_RECOVERY_REASON = "is past its operator signer's rotation cutoff \u2014 the operator will not co-sign it until it recovers";
@@ -12752,6 +12840,9 @@ function omittedOutpoints(before, after) {
12752
12840
  before.map((vtxo) => `${vtxo.txid}:${vtxo.vout}`).filter((outpoint) => !kept.has(outpoint))
12753
12841
  );
12754
12842
  }
12843
+ function coinKeys(inputs) {
12844
+ return inputs.filter((input) => typeof input === "object" && input !== null).map((input) => `${input.txid}:${input.vout}`);
12845
+ }
12755
12846
  function excludeLockedOutpoints(vtxos, locked) {
12756
12847
  if (locked.length === 0) return vtxos;
12757
12848
  const lockedKeys = new Set(locked.map((o) => `${o.txid}:${o.vout}`));
@@ -12786,6 +12877,18 @@ var ArkadeCashCreateError = class extends Error {
12786
12877
  cash;
12787
12878
  cause;
12788
12879
  };
12880
+ var ArkadeCashOperatorMismatchError = class extends Error {
12881
+ constructor(cashSignerPubKey, activeSignerPubKey) {
12882
+ super(
12883
+ `ArkadeCash comes from another operator: its signer ${cashSignerPubKey} is not the active signer ${activeSignerPubKey} of the connected operator, and not one of its deprecated signers. Connect to the operator that issued it to claim it.`
12884
+ );
12885
+ this.cashSignerPubKey = cashSignerPubKey;
12886
+ this.activeSignerPubKey = activeSignerPubKey;
12887
+ this.name = "ArkadeCashOperatorMismatchError";
12888
+ }
12889
+ cashSignerPubKey;
12890
+ activeSignerPubKey;
12891
+ };
12789
12892
  var ReadonlyWallet = class _ReadonlyWallet {
12790
12893
  constructor(identity, network, onchainProvider, arkProvider, indexerProvider, arkServerPublicKey, offchainTapscript, boardingTapscript, dustAmount, walletRepository, contractRepository, delegateProvider, watcherConfig, walletContractTimelocks) {
12791
12894
  this.identity = identity;
@@ -12846,6 +12949,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12846
12949
  // Outpoints committed to an in-flight settle/send, filtered from getVtxos() so concurrent
12847
12950
  // callers can't reselect them. In-memory only: a stale entry only hides a VTXO.
12848
12951
  _pendingSpendOutpoints = /* @__PURE__ */ new Set();
12952
+ _heldOutpoints = /* @__PURE__ */ new Set();
12849
12953
  /** Activity resolvers consumed by {@link getActivityHistory}. */
12850
12954
  activity = createDefaultActivityRegistry();
12851
12955
  get assetManager() {
@@ -13013,7 +13117,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13013
13117
  async getArkadeReader() {
13014
13118
  const indexer = this.indexerProvider;
13015
13119
  return {
13016
- getVtxos: (opts) => chunk3LDVNVBW_cjs.getNormalizedVtxos(indexer, opts),
13120
+ getVtxos: (opts) => chunkVVFCCNU2_cjs.getNormalizedVtxos(indexer, opts),
13017
13121
  getVirtualTxs: (txids, opts) => indexer.getVirtualTxs(txids, opts)
13018
13122
  };
13019
13123
  }
@@ -13048,7 +13152,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13048
13152
  }
13049
13153
  /** Shared setup for ReadonlyWallet.create() and Wallet.create(). */
13050
13154
  static async setupWalletConfig(config, pubKey) {
13051
- const arkProvider = config.arkProvider || new chunk3LDVNVBW_cjs.RestArkProvider();
13155
+ const arkProvider = config.arkProvider || new chunkVVFCCNU2_cjs.RestArkProvider();
13052
13156
  let indexerProvider = config.indexerProvider;
13053
13157
  if (!indexerProvider) {
13054
13158
  const derived = extractArkProviderUrl(arkProvider);
@@ -13057,7 +13161,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13057
13161
  "indexerProvider is required when arkProvider is provided without a discoverable serverUrl"
13058
13162
  );
13059
13163
  }
13060
- indexerProvider = new chunkFN27VWDK_cjs.RestIndexerProvider(derived ?? chunk3LDVNVBW_cjs.DEFAULT_ARKADE_SERVER_URL);
13164
+ indexerProvider = new chunkFEBAG2K2_cjs.RestIndexerProvider(derived ?? chunkVVFCCNU2_cjs.DEFAULT_ARKADE_SERVER_URL);
13061
13165
  }
13062
13166
  const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
13063
13167
  const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
@@ -13066,7 +13170,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13066
13170
  source: serverInfoSource,
13067
13171
  lastOnlineAt: serverInfoLastOnlineAt
13068
13172
  } = await resolveArkInfo(arkProvider, walletRepository);
13069
- const network = chunk3LDVNVBW_cjs.networkFromArkadeInfo(info);
13173
+ const network = chunkVVFCCNU2_cjs.networkFromArkadeInfo(info);
13070
13174
  if ("descriptor" in config.identity) {
13071
13175
  const descriptor = config.identity.descriptor;
13072
13176
  const identityIsMainnet = !descriptor.includes("tpub");
@@ -13102,18 +13206,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
13102
13206
  }
13103
13207
  }
13104
13208
  const boardingTimelock = config.boardingTimelock ?? toTimelock(info.boardingExitDelay);
13105
- const serverPubKey = chunkEBCWETZM_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
13106
- const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunkEBCWETZM_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
13209
+ const serverPubKey = chunkCFOIHLON_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
13210
+ const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunkCFOIHLON_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
13107
13211
  const offchainOptions = {
13108
13212
  pubKey,
13109
13213
  serverPubKey,
13110
13214
  csvTimelock: exitTimelock
13111
13215
  };
13112
- const offchainTapscript = !delegatePubKey ? new chunkEBCWETZM_cjs.DefaultVtxo.Script(offchainOptions) : new chunkEBCWETZM_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
13113
- const boardingTapscript = chunkEBCWETZM_cjs.BoardingContractHandler.createScript({
13216
+ const offchainTapscript = !delegatePubKey ? new chunkCFOIHLON_cjs.DefaultVtxo.Script(offchainOptions) : new chunkCFOIHLON_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
13217
+ const boardingTapscript = chunkCFOIHLON_cjs.BoardingContractHandler.createScript({
13114
13218
  pubKey: base.hex.encode(pubKey),
13115
13219
  serverPubKey: base.hex.encode(serverPubKey),
13116
- csvTimelock: chunk3LDVNVBW_cjs.timelockToSequence(boardingTimelock).toString()
13220
+ csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(boardingTimelock).toString()
13117
13221
  });
13118
13222
  return {
13119
13223
  arkProvider,
@@ -13246,6 +13350,16 @@ var ReadonlyWallet = class _ReadonlyWallet {
13246
13350
  this._pendingSpendOutpoints
13247
13351
  );
13248
13352
  }
13353
+ /**
13354
+ * @internal The stored VTXOs {@link reserveVtxos} holds, minus any being spent: for renewal,
13355
+ * which skips them, to report the ones it would have renewed. No sync.
13356
+ */
13357
+ async getHeldVtxos() {
13358
+ if (this._heldOutpoints.size === 0) return [];
13359
+ return (await this.getStoredVtxos()).filter(
13360
+ (vtxo) => this._heldOutpoints.has(`${vtxo.txid}:${vtxo.vout}`)
13361
+ );
13362
+ }
13249
13363
  /** @inheritdoc */
13250
13364
  async getSpendableVtxos(filter) {
13251
13365
  const snapshot = await this.contractSnapshot(filter, {
@@ -13254,12 +13368,13 @@ var ReadonlyWallet = class _ReadonlyWallet {
13254
13368
  const vtxos = filterSnapshotVtxos(snapshot, filter, this._pendingSpendOutpoints);
13255
13369
  const { gated, pendingRecovery } = this.spendabilityView(snapshot);
13256
13370
  const selectable = vtxos.filter(
13257
- (vtxo) => !isGatedVtxo(vtxo, gated) && !pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`)
13371
+ (vtxo) => !isGatedVtxo(vtxo, gated) && !pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`) && !this._heldOutpoints.has(`${vtxo.txid}:${vtxo.vout}`)
13258
13372
  );
13259
13373
  const unlocked = await spendableVtxosExcludingLocked(selectable, this.intentRepository);
13260
13374
  logExcludedVtxos("getSpendableVtxos", vtxos, [
13261
13375
  gateExclusion(gated),
13262
13376
  outpointExclusion(pendingRecovery, PENDING_RECOVERY_REASON),
13377
+ outpointExclusion(this._heldOutpoints, "is held by reserveVtxos"),
13263
13378
  outpointExclusion(
13264
13379
  omittedOutpoints(selectable, unlocked),
13265
13380
  "is locked by an in-flight settlement intent"
@@ -13268,7 +13383,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13268
13383
  if (!filter?.withUnrolled) {
13269
13384
  logExcludedVtxos(
13270
13385
  "getSpendableVtxos",
13271
- snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunk3LDVNVBW_cjs.isVtxoSpent(vtxo)),
13386
+ snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)),
13272
13387
  [() => UNROLLED_REASON]
13273
13388
  );
13274
13389
  }
@@ -13352,7 +13467,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13352
13467
  }
13353
13468
  async contractSnapshotStored() {
13354
13469
  const contractManager = await this.getContractManager();
13355
- return contractManager.getStoredContractsWithVtxos ? contractManager.getStoredContractsWithVtxos() : contractManager.getContractsWithVtxos();
13470
+ return contractManager.getStoredContractsWithVtxos();
13356
13471
  }
13357
13472
  /**
13358
13473
  * The two exclusion sets the gate is made of, derived from one snapshot so
@@ -13377,6 +13492,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13377
13492
  isPendingRecovery: (vtxo) => pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`),
13378
13493
  isGenericallySpendable: (vtxo) => !isGatedVtxo(vtxo, gated),
13379
13494
  isUnlocked: (vtxo) => unlocked.has(`${vtxo.txid}:${vtxo.vout}`),
13495
+ isReserved: (vtxo) => this._heldOutpoints.has(`${vtxo.txid}:${vtxo.vout}`),
13380
13496
  dustCarrier: getDustAmount(this)
13381
13497
  };
13382
13498
  }
@@ -13410,7 +13526,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13410
13526
  this.getBoardingTxs()
13411
13527
  ]);
13412
13528
  const allVtxos = snapshot.flatMap((_) => _.vtxos);
13413
- const resolveTxCreatedAt = (txids) => chunk3LDVNVBW_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
13529
+ const resolveTxCreatedAt = (txids) => chunkVVFCCNU2_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
13414
13530
  return buildTransactionHistory(
13415
13531
  allVtxos,
13416
13532
  boardingTxs,
@@ -13564,9 +13680,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
13564
13680
  async getBoardingTapscripts(allowedSigners) {
13565
13681
  const byScript = /* @__PURE__ */ new Map();
13566
13682
  const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
13567
- const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkEBCWETZM_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13683
+ const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13568
13684
  add(
13569
- new chunkEBCWETZM_cjs.DefaultVtxo.Script({
13685
+ new chunkCFOIHLON_cjs.DefaultVtxo.Script({
13570
13686
  pubKey: await this.identity.xOnlyPublicKey(),
13571
13687
  serverPubKey: this.boardingTapscript.options.serverPubKey,
13572
13688
  csvTimelock: boardingCsv
@@ -13581,7 +13697,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13581
13697
  for (const c of boardingContracts) {
13582
13698
  if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
13583
13699
  try {
13584
- add(chunkEBCWETZM_cjs.BoardingContractHandler.createScript(c.params));
13700
+ add(chunkCFOIHLON_cjs.BoardingContractHandler.createScript(c.params));
13585
13701
  } catch (e) {
13586
13702
  console.warn("Skipping malformed boarding contract", c.script, e);
13587
13703
  }
@@ -13610,7 +13726,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13610
13726
  // Per-row CSV delay decoded from THIS tapscript's exit leaf —
13611
13727
  // not the wallet's current boarding timelock, which a signer
13612
13728
  // rotation may have changed.
13613
- csvTimelock: chunk3LDVNVBW_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
13729
+ csvTimelock: chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
13614
13730
  coins: utxos
13615
13731
  };
13616
13732
  })
@@ -13642,6 +13758,16 @@ var ReadonlyWallet = class _ReadonlyWallet {
13642
13758
  this.boardingLoaded = true;
13643
13759
  return groups.flatMap((g) => g.coins);
13644
13760
  }
13761
+ /**
13762
+ * @internal {@link getBoardingUtxos} minus those an in-flight settle is spending, for SDK
13763
+ * picks. The getter itself lists them: callers that mirror it (the worker's cache and
13764
+ * broadcasts, balances) must not see a settle's inputs vanish, and then stay gone if it fails.
13765
+ */
13766
+ async getSelectableBoardingUtxos() {
13767
+ return (await this.getBoardingUtxos()).filter(
13768
+ (coin) => !this._pendingSpendOutpoints.has(`${coin.txid}:${coin.vout}`)
13769
+ );
13770
+ }
13645
13771
  async getStoredBoardingUtxos() {
13646
13772
  const currentOnly = /* @__PURE__ */ new Set([
13647
13773
  toXOnlySignerHex(base.hex.encode(this.boardingTapscript.options.serverPubKey))
@@ -13756,7 +13882,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13756
13882
  /** Fetch Arkade transaction ids that are still pending final settlement. */
13757
13883
  async fetchPendingTxs() {
13758
13884
  const scripts = await this.getWalletScripts();
13759
- const vtxos = await chunk3LDVNVBW_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
13885
+ const vtxos = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
13760
13886
  return vtxos.filter(
13761
13887
  (vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
13762
13888
  ).map((_) => _.arkTxId);
@@ -13787,7 +13913,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13787
13913
  });
13788
13914
  for (const contract of contracts) {
13789
13915
  if (map.has(contract.script)) continue;
13790
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(contract.type);
13916
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
13791
13917
  if (handler) {
13792
13918
  const script = handler.createScript(contract.params);
13793
13919
  map.set(contract.script, script);
@@ -13899,7 +14025,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13899
14025
  }
13900
14026
  });
13901
14027
  const baselinePubkey = await this.identity.xOnlyPublicKey();
13902
- const delegatePubKey = this.offchainTapscript instanceof chunkEBCWETZM_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
14028
+ const delegatePubKey = this.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
13903
14029
  const baselineSigners = [
13904
14030
  this.offchainTapscript.options.serverPubKey,
13905
14031
  ...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
@@ -13907,8 +14033,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
13907
14033
  const seenBaselineScripts = /* @__PURE__ */ new Set();
13908
14034
  for (const serverPubKey of baselineSigners) {
13909
14035
  for (const csvTimelock2 of this.walletContractTimelocks) {
13910
- const csvTimelockStr = chunk3LDVNVBW_cjs.timelockToSequence(csvTimelock2).toString();
13911
- const defaultScript = new chunkEBCWETZM_cjs.DefaultVtxo.Script({
14036
+ const csvTimelockStr = chunkVVFCCNU2_cjs.timelockToSequence(csvTimelock2).toString();
14037
+ const defaultScript = new chunkCFOIHLON_cjs.DefaultVtxo.Script({
13912
14038
  pubKey: baselinePubkey,
13913
14039
  serverPubKey,
13914
14040
  csvTimelock: csvTimelock2
@@ -13929,7 +14055,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13929
14055
  });
13930
14056
  }
13931
14057
  if (delegatePubKey) {
13932
- const delegateScript = new chunkEBCWETZM_cjs.DelegateVtxo.Script({
14058
+ const delegateScript = new chunkCFOIHLON_cjs.DelegateVtxo.Script({
13933
14059
  pubKey: baselinePubkey,
13934
14060
  serverPubKey,
13935
14061
  delegatePubKey,
@@ -13953,9 +14079,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
13953
14079
  }
13954
14080
  }
13955
14081
  }
13956
- const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkEBCWETZM_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14082
+ const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13957
14083
  for (const serverPubKey of baselineSigners) {
13958
- const baselineBoarding = new chunkEBCWETZM_cjs.DefaultVtxo.Script({
14084
+ const baselineBoarding = new chunkCFOIHLON_cjs.DefaultVtxo.Script({
13959
14085
  pubKey: baselinePubkey,
13960
14086
  serverPubKey,
13961
14087
  csvTimelock: boardingCsvTimelock
@@ -13968,7 +14094,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13968
14094
  params: {
13969
14095
  pubKey: base.hex.encode(baselineBoarding.options.pubKey),
13970
14096
  serverPubKey: base.hex.encode(serverPubKey),
13971
- csvTimelock: chunk3LDVNVBW_cjs.timelockToSequence(boardingCsvTimelock).toString()
14097
+ csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(boardingCsvTimelock).toString()
13972
14098
  },
13973
14099
  script: boardingScriptHex,
13974
14100
  address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
@@ -14155,7 +14281,7 @@ var Wallet2 = class extends ReadonlyWallet {
14155
14281
  serverPubKey: this.offchainTapscript.options.serverPubKey,
14156
14282
  deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
14157
14283
  csvTimelocks: this.walletContractTimelocks,
14158
- delegatePubKey: this.offchainTapscript instanceof chunkEBCWETZM_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
14284
+ delegatePubKey: this.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
14159
14285
  };
14160
14286
  }
14161
14287
  _signerRouter;
@@ -14315,7 +14441,7 @@ var Wallet2 = class extends ReadonlyWallet {
14315
14441
  const [row] = await manager.getContracts({ script: base.hex.encode(display.pkScript) });
14316
14442
  const persisted = row?.metadata?.signingDescriptor;
14317
14443
  if (typeof persisted === "string") return persisted;
14318
- return chunkEBCWETZM_cjs.identityDescriptor(this.identity);
14444
+ return chunkCFOIHLON_cjs.identityDescriptor(this.identity);
14319
14445
  }
14320
14446
  /**
14321
14447
  * Build, persist and shape one address of `type` owned by `descriptor`. The descriptor is the
@@ -14325,7 +14451,7 @@ var Wallet2 = class extends ReadonlyWallet {
14325
14451
  async mintAddress(manager, type, descriptor, tagSource, allocated) {
14326
14452
  if (type === "boarding") {
14327
14453
  const built2 = this.buildBoardingContract(
14328
- chunkEBCWETZM_cjs.deriveDescriptorLeafPubKey(descriptor),
14454
+ chunkCFOIHLON_cjs.deriveDescriptorLeafPubKey(descriptor),
14329
14455
  descriptor,
14330
14456
  tagSource
14331
14457
  );
@@ -14362,11 +14488,11 @@ var Wallet2 = class extends ReadonlyWallet {
14362
14488
  * (offchain analogue: {@link buildReceiveContract}).
14363
14489
  */
14364
14490
  buildBoardingContract(pubKey, descriptor, tagSource) {
14365
- const tapscript = new chunkEBCWETZM_cjs.DefaultVtxo.Script({
14491
+ const tapscript = new chunkCFOIHLON_cjs.DefaultVtxo.Script({
14366
14492
  ...this._boardingTapscript.options,
14367
14493
  pubKey
14368
14494
  });
14369
- const csvTimelock2 = tapscript.options.csvTimelock ?? chunkEBCWETZM_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14495
+ const csvTimelock2 = tapscript.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14370
14496
  return {
14371
14497
  tapscript,
14372
14498
  params: {
@@ -14374,13 +14500,13 @@ var Wallet2 = class extends ReadonlyWallet {
14374
14500
  params: {
14375
14501
  pubKey: base.hex.encode(pubKey),
14376
14502
  serverPubKey: base.hex.encode(tapscript.options.serverPubKey),
14377
- csvTimelock: chunk3LDVNVBW_cjs.timelockToSequence(csvTimelock2).toString()
14503
+ csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(csvTimelock2).toString()
14378
14504
  },
14379
14505
  script: base.hex.encode(tapscript.pkScript),
14380
14506
  address: tapscript.address(this.network.hrp, this.arkServerPublicKey).encode(),
14381
14507
  state: "active",
14382
14508
  metadata: {
14383
- ...tagSource && { source: chunkEBCWETZM_cjs.WALLET_RECEIVE_SOURCE },
14509
+ ...tagSource && { source: chunkCFOIHLON_cjs.WALLET_RECEIVE_SOURCE },
14384
14510
  signingDescriptor: descriptor
14385
14511
  }
14386
14512
  }
@@ -14402,7 +14528,7 @@ var Wallet2 = class extends ReadonlyWallet {
14402
14528
  if (this._hdProvider) {
14403
14529
  return (await this.getContractManager()).getNextSigningDescriptor();
14404
14530
  }
14405
- return chunkEBCWETZM_cjs.identityDescriptor(this.identity);
14531
+ return chunkCFOIHLON_cjs.identityDescriptor(this.identity);
14406
14532
  }
14407
14533
  /**
14408
14534
  * @see HDAllocationCapable.advanceSigningDescriptorWatermark
@@ -14478,7 +14604,7 @@ var Wallet2 = class extends ReadonlyWallet {
14478
14604
  * the stable public API.
14479
14605
  */
14480
14606
  async rotateServerSigner(newServerPubKey, checkpointTapscript) {
14481
- const xonly = chunkEBCWETZM_cjs.toXOnly(newServerPubKey, "ark signer key");
14607
+ const xonly = chunkCFOIHLON_cjs.toXOnly(newServerPubKey, "ark signer key");
14482
14608
  const newServerUnrollScript = assertValidServerUnrollScript(
14483
14609
  checkpointTapscript,
14484
14610
  resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
@@ -14507,21 +14633,21 @@ var Wallet2 = class extends ReadonlyWallet {
14507
14633
  const [currentBoardingRow] = await manager.getContracts({
14508
14634
  script: currentBoardingScript
14509
14635
  });
14510
- const newOffchain = this.offchainTapscript instanceof chunkEBCWETZM_cjs.DelegateVtxo.Script ? new chunkEBCWETZM_cjs.DelegateVtxo.Script({
14636
+ const newOffchain = this.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? new chunkCFOIHLON_cjs.DelegateVtxo.Script({
14511
14637
  ...this.offchainTapscript.options,
14512
14638
  serverPubKey: xonly
14513
- }) : new chunkEBCWETZM_cjs.DefaultVtxo.Script({
14639
+ }) : new chunkCFOIHLON_cjs.DefaultVtxo.Script({
14514
14640
  ...this.offchainTapscript.options,
14515
14641
  serverPubKey: xonly
14516
14642
  });
14517
- const newBoarding = new chunkEBCWETZM_cjs.DefaultVtxo.Script({
14643
+ const newBoarding = new chunkCFOIHLON_cjs.DefaultVtxo.Script({
14518
14644
  ...this._boardingTapscript.options,
14519
14645
  serverPubKey: xonly
14520
14646
  });
14521
- const offchainCsv = chunk3LDVNVBW_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
14647
+ const offchainCsv = chunkVVFCCNU2_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
14522
14648
  const newOffchainScript = base.hex.encode(newOffchain.pkScript);
14523
14649
  const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
14524
- if (newOffchain instanceof chunkEBCWETZM_cjs.DelegateVtxo.Script) {
14650
+ if (newOffchain instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script) {
14525
14651
  await manager.createContract({
14526
14652
  type: "delegate",
14527
14653
  params: {
@@ -14549,13 +14675,13 @@ var Wallet2 = class extends ReadonlyWallet {
14549
14675
  metadata: currentOffchainRow?.metadata
14550
14676
  });
14551
14677
  }
14552
- const boardingCsv = newBoarding.options.csvTimelock ?? chunkEBCWETZM_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14678
+ const boardingCsv = newBoarding.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14553
14679
  await manager.createContract({
14554
14680
  type: "boarding",
14555
14681
  params: {
14556
14682
  pubKey: base.hex.encode(newBoarding.options.pubKey),
14557
14683
  serverPubKey: base.hex.encode(xonly),
14558
- csvTimelock: chunk3LDVNVBW_cjs.timelockToSequence(boardingCsv).toString()
14684
+ csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(boardingCsv).toString()
14559
14685
  },
14560
14686
  script: base.hex.encode(newBoarding.pkScript),
14561
14687
  address: newBoarding.address(this.network.hrp, xonly).encode(),
@@ -14574,7 +14700,7 @@ var Wallet2 = class extends ReadonlyWallet {
14574
14700
  }
14575
14701
  /**
14576
14702
  * Serializes `settle`/`send` so VtxoManager's background renewal can't race user
14577
- * transactions for the same inputs.
14703
+ * transactions for the same inputs; with `concurrentSpending`, only until inputs are reserved.
14578
14704
  */
14579
14705
  _txLock = Promise.resolve();
14580
14706
  // Every input (boarding included) of an intent a live settle owns; reconciliation skips them.
@@ -14583,18 +14709,59 @@ var Wallet2 = class extends ReadonlyWallet {
14583
14709
  _restoreInFlight;
14584
14710
  _addPendingSpends(inputs) {
14585
14711
  for (const input of inputs) {
14586
- if (chunk3LDVNVBW_cjs.isVirtualCoin(input)) {
14712
+ if (chunkVVFCCNU2_cjs.isVirtualCoin(input)) {
14587
14713
  this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
14588
14714
  }
14589
14715
  }
14590
14716
  }
14591
14717
  _removePendingSpends(inputs) {
14592
14718
  for (const input of inputs) {
14593
- if (chunk3LDVNVBW_cjs.isVirtualCoin(input)) {
14719
+ if (chunkVVFCCNU2_cjs.isVirtualCoin(input)) {
14594
14720
  this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
14595
14721
  }
14596
14722
  }
14597
14723
  }
14724
+ /**
14725
+ * Hold VTXOs so no SDK-chosen spend picks them; the holder still spends them by naming them.
14726
+ * All-or-nothing: throws {@link VtxoReservedError} if any is held or already being spent.
14727
+ * In-memory, for this `Wallet` instance only.
14728
+ */
14729
+ reserveVtxos(outpoints) {
14730
+ const keys = outpoints.map((o) => `${o.txid}:${o.vout}`);
14731
+ const inFlight = keys.filter((k) => this._pendingSpendOutpoints.has(k));
14732
+ if (inFlight.length > 0) throw new VtxoReservedError(inFlight, "in-flight");
14733
+ const held = keys.filter((k) => this._heldOutpoints.has(k));
14734
+ if (held.length > 0) throw new VtxoReservedError(held, "held");
14735
+ for (const k of keys) this._heldOutpoints.add(k);
14736
+ let released = false;
14737
+ return {
14738
+ outpoints: [...outpoints],
14739
+ release: () => {
14740
+ if (released) return;
14741
+ released = true;
14742
+ for (const k of keys) this._heldOutpoints.delete(k);
14743
+ }
14744
+ };
14745
+ }
14746
+ /**
14747
+ * @internal For `AssetManager`: reserves what `fn` submits, hiding it from other picks until
14748
+ * the submit ends. With `concurrentSpending`, `fn` runs under the wallet lock, released once
14749
+ * the inputs are reserved; otherwise `fn` runs unlocked and only the submit takes the lock.
14750
+ */
14751
+ withSpendLock(fn) {
14752
+ const run = (release) => fn(async (inputs, outputs) => {
14753
+ this._assertNotHeld(inputs);
14754
+ if (release) this._assertNotInFlight(inputs);
14755
+ this._addPendingSpends(inputs);
14756
+ release?.();
14757
+ try {
14758
+ return await (release ? this._buildAndSubmitOffchainTx(inputs, outputs, this.serverUnrollScript) : this.buildAndSubmitOffchainTx(inputs, outputs));
14759
+ } finally {
14760
+ this._removePendingSpends(inputs);
14761
+ }
14762
+ });
14763
+ return this._concurrentSpending ? this._withTxLock(run) : run();
14764
+ }
14598
14765
  _withTxLock(fn) {
14599
14766
  let release;
14600
14767
  const lock = new Promise((r) => release = r);
@@ -14602,12 +14769,22 @@ var Wallet2 = class extends ReadonlyWallet {
14602
14769
  this._txLock = lock;
14603
14770
  return prev.then(async () => {
14604
14771
  try {
14605
- return await fn();
14772
+ return await fn(release);
14606
14773
  } finally {
14607
14774
  release();
14608
14775
  }
14609
14776
  });
14610
14777
  }
14778
+ _assertNotInFlight(inputs) {
14779
+ const clashing = coinKeys(inputs).filter((key) => this._pendingSpendOutpoints.has(key));
14780
+ if (clashing.length > 0) throw new VtxoReservedError(clashing, "in-flight");
14781
+ }
14782
+ _assertNotHeld(inputs) {
14783
+ const held = coinKeys(inputs.filter(chunkVVFCCNU2_cjs.isVirtualCoin)).filter(
14784
+ (key) => this._heldOutpoints.has(key)
14785
+ );
14786
+ if (held.length > 0) throw new VtxoReservedError(held, "held");
14787
+ }
14611
14788
  /**
14612
14789
  * Explicitly recover this wallet's contracts and balance on a fresh repo: a gap-limit scan
14613
14790
  * for HD wallets, the single default pubkey otherwise. Throws on operational failure (a
@@ -14641,13 +14818,13 @@ var Wallet2 = class extends ReadonlyWallet {
14641
14818
  const manager = await this.getContractManager();
14642
14819
  const provider = this._hdProvider;
14643
14820
  const hd = provider !== void 0;
14644
- const staticDescriptor = hd ? void 0 : await chunkEBCWETZM_cjs.identityDescriptor(this.identity);
14821
+ const staticDescriptor = hd ? void 0 : await chunkCFOIHLON_cjs.identityDescriptor(this.identity);
14645
14822
  const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
14646
- const delegatePubKey = this.offchainTapscript instanceof chunkEBCWETZM_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
14823
+ const delegatePubKey = this.offchainTapscript instanceof chunkCFOIHLON_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
14647
14824
  const arkInfo = await this.arkProvider.getInfo();
14648
- const currentSignerPubKey = chunkEBCWETZM_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
14825
+ const currentSignerPubKey = chunkCFOIHLON_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
14649
14826
  const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
14650
- (s) => chunkEBCWETZM_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
14827
+ (s) => chunkCFOIHLON_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
14651
14828
  );
14652
14829
  const deps = {
14653
14830
  indexerProvider: this.indexerProvider,
@@ -14659,7 +14836,7 @@ var Wallet2 = class extends ReadonlyWallet {
14659
14836
  deprecatedSignerPubKeys,
14660
14837
  csvTimelocks: this.walletContractTimelocks,
14661
14838
  // Boarding-exit CSV, distinct from the unilateral-exit matrix.
14662
- boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkEBCWETZM_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
14839
+ boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkCFOIHLON_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
14663
14840
  delegatePubKey
14664
14841
  };
14665
14842
  const result = await manager.scanContracts({
@@ -14690,6 +14867,12 @@ var Wallet2 = class extends ReadonlyWallet {
14690
14867
  }
14691
14868
  }
14692
14869
  settlementConfig;
14870
+ _concurrentSpending = false;
14871
+ _submitsAwaitingFinalize = 0;
14872
+ /** @see WalletConfig.concurrentSpending */
14873
+ get concurrentSpending() {
14874
+ return this._concurrentSpending;
14875
+ }
14693
14876
  /**
14694
14877
  * Broadcast access bound to this wallet's server, so a plugin needs only the wallet. Not on
14695
14878
  * {@link ReadonlyWallet}: a readonly wallet or `toReadonly()` view must not be able to submit.
@@ -14769,7 +14952,7 @@ var Wallet2 = class extends ReadonlyWallet {
14769
14952
  throw new Error("Invalid configured public key");
14770
14953
  }
14771
14954
  const setup = await ReadonlyWallet.setupWalletConfig(config, pubkey);
14772
- const forfeitPubkey = chunkEBCWETZM_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
14955
+ const forfeitPubkey = chunkCFOIHLON_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
14773
14956
  const forfeitAddress = btcSigner.Address(setup.network).decode(setup.info.forfeitAddress);
14774
14957
  const forfeitOutputScript = btcSigner.OutScript.encode(forfeitAddress);
14775
14958
  const checkpointExitDelayOverrides = {
@@ -14855,6 +15038,7 @@ var Wallet2 = class extends ReadonlyWallet {
14855
15038
  wallet.intentRepository = config.storage?.intentRepository;
14856
15039
  wallet.virtualTxRepository = config.storage?.virtualTxRepository;
14857
15040
  wallet.exitDataCapture = config.storage?.exitDataCapture;
15041
+ wallet._concurrentSpending = config.concurrentSpending === true;
14858
15042
  await wallet.getVtxoManager();
14859
15043
  return wallet;
14860
15044
  }
@@ -14914,13 +15098,19 @@ var Wallet2 = class extends ReadonlyWallet {
14914
15098
  * @returns The finalized Arkade transaction id
14915
15099
  */
14916
15100
  async settle(params, eventCallback, hooks) {
14917
- return this._withTxLock(() => {
15101
+ return this._withTxLock((release) => {
14918
15102
  hooks?.onPhase?.("preparing");
14919
15103
  const onRegistrationAttempt = hooks?.onPhase ? () => hooks.onPhase?.("registration_attempt") : void 0;
14920
- return this._settleImpl(params, eventCallback, onRegistrationAttempt);
15104
+ return this._settleImpl(
15105
+ params,
15106
+ eventCallback,
15107
+ this._concurrentSpending ? release : void 0,
15108
+ onRegistrationAttempt
15109
+ );
14921
15110
  });
14922
15111
  }
14923
- async _settleImpl(params, eventCallback, onRegistrationAttempt) {
15112
+ async _settleImpl(params, eventCallback, onReserved, onRegistrationAttempt) {
15113
+ const picked = params === void 0 || isSdkPicked(params);
14924
15114
  if (params?.inputs) {
14925
15115
  for (const input of params.inputs) {
14926
15116
  if (typeof input === "string") {
@@ -14934,13 +15124,13 @@ var Wallet2 = class extends ReadonlyWallet {
14934
15124
  void this.logUngatedInputs("settle({ inputs })", params.inputs);
14935
15125
  }
14936
15126
  const offchainAddress = await this.getAddress();
14937
- const offchainPkScript = chunk3LDVNVBW_cjs.ArkAddress.decode(offchainAddress).pkScript;
15127
+ const offchainPkScript = chunkVVFCCNU2_cjs.ArkAddress.decode(offchainAddress).pkScript;
14938
15128
  const offchainOutputScript = base.hex.encode(offchainPkScript);
14939
15129
  if (!params) {
14940
15130
  const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
14941
15131
  const estimator = new Estimator(fees.intentFee);
14942
15132
  let amount = 0;
14943
- const exitScript = chunk3LDVNVBW_cjs.CSVMultisigTapscript.decode(
15133
+ const exitScript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(
14944
15134
  base.hex.decode(this.boardingTapscript.exitScript)
14945
15135
  );
14946
15136
  const boardingTimelock = exitScript.params.timelock;
@@ -14949,7 +15139,7 @@ var Wallet2 = class extends ReadonlyWallet {
14949
15139
  const tip = await this.onchainProvider.getChainTip();
14950
15140
  chainTipHeight = tip.height;
14951
15141
  }
14952
- const boardingUtxos = (await this.getBoardingUtxos()).filter(
15142
+ const boardingUtxos = (await this.getSelectableBoardingUtxos()).filter(
14953
15143
  (utxo) => utxo.status.confirmed && !hasBoardingTxExpired(utxo, boardingTimelock, chainTipHeight)
14954
15144
  );
14955
15145
  const filteredBoardingUtxos = [];
@@ -14972,7 +15162,7 @@ var Wallet2 = class extends ReadonlyWallet {
14972
15162
  if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
14973
15163
  break;
14974
15164
  }
14975
- const inputFee = estimator.evalOffchainInput(chunk3LDVNVBW_cjs.toOffchainInputFeeParams(vtxo));
15165
+ const inputFee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo));
14976
15166
  if (inputFee.satoshis >= vtxo.value) {
14977
15167
  continue;
14978
15168
  }
@@ -15015,6 +15205,7 @@ var Wallet2 = class extends ReadonlyWallet {
15015
15205
  ...params,
15016
15206
  inputs: await refreshSweptStateOfExpiredInputs(this, params.inputs)
15017
15207
  };
15208
+ if (onReserved) this._assertNotInFlight(params.inputs);
15018
15209
  const onchainOutputIndexes = [];
15019
15210
  const outputs = [];
15020
15211
  let hasOffchainOutputs = false;
@@ -15023,7 +15214,7 @@ var Wallet2 = class extends ReadonlyWallet {
15023
15214
  let script;
15024
15215
  let arkAddress;
15025
15216
  try {
15026
- arkAddress = chunk3LDVNVBW_cjs.ArkAddress.decode(output.address);
15217
+ arkAddress = chunkVVFCCNU2_cjs.ArkAddress.decode(output.address);
15027
15218
  } catch {
15028
15219
  arkAddress = void 0;
15029
15220
  }
@@ -15095,20 +15286,24 @@ var Wallet2 = class extends ReadonlyWallet {
15095
15286
  ]);
15096
15287
  let intentTxId;
15097
15288
  try {
15098
- intentTxId = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(intent.proof)).id;
15289
+ intentTxId = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(intent.proof)).id;
15099
15290
  } catch {
15100
15291
  intentTxId = params.inputs.map((i) => `${i.txid}:${i.vout}`).sort().join("|");
15101
15292
  }
15102
- const settleInputVtxos = params.inputs.filter(chunk3LDVNVBW_cjs.isVirtualCoin);
15293
+ const settleInputVtxos = params.inputs.filter(chunkVVFCCNU2_cjs.isVirtualCoin);
15103
15294
  const contractManager = await this.getContractManager();
15104
15295
  await contractManager.assertAnnotatable(settleInputVtxos);
15105
15296
  await contractManager.assertSpendableNow?.(
15106
15297
  settleInputVtxos,
15107
15298
  async () => base.hex.encode(await this.identity.xOnlyPublicKey())
15108
15299
  );
15300
+ if (picked) this._assertNotHeld(params.inputs);
15109
15301
  this._addPendingSpends(params.inputs);
15302
+ const boardingKeys = onReserved ? coinKeys(params.inputs.filter((i) => !chunkVVFCCNU2_cjs.isVirtualCoin(i))) : [];
15303
+ for (const key of boardingKeys) this._pendingSpendOutpoints.add(key);
15110
15304
  const settlingKeys = params.inputs.map((i) => `${i.txid}:${i.vout}`);
15111
15305
  for (const key of settlingKeys) this._settlingOutpoints.add(key);
15306
+ onReserved?.();
15112
15307
  await this.persistIntentSnapshot(
15113
15308
  intentTxId,
15114
15309
  "waiting_to_submit",
@@ -15122,6 +15317,7 @@ var Wallet2 = class extends ReadonlyWallet {
15122
15317
  ];
15123
15318
  const abortController = new AbortController();
15124
15319
  let stream;
15320
+ let registering = false;
15125
15321
  let committedTxid;
15126
15322
  try {
15127
15323
  stream = this.arkProvider.getEventStream(abortController.signal, topics);
@@ -15135,6 +15331,7 @@ var Wallet2 = class extends ReadonlyWallet {
15135
15331
  }
15136
15332
  yield* stream;
15137
15333
  })();
15334
+ registering = true;
15138
15335
  onRegistrationAttempt?.();
15139
15336
  const intentId = await this.safeRegisterIntent(intent, params.inputs);
15140
15337
  await this.persistIntentSnapshot(
@@ -15175,13 +15372,15 @@ var Wallet2 = class extends ReadonlyWallet {
15175
15372
  throw error;
15176
15373
  }
15177
15374
  const inputIds = params.inputs.map((i) => `${i.txid}:${i.vout}`).join(",");
15178
- await this.arkProvider.deleteIntent(deleteIntent).catch((e) => {
15179
- if (isNoMatchingIntentsError(e)) return;
15180
- console.warn(
15181
- `Failed to delete intent after settle failure for inputs [${inputIds}]; intent may linger on server and cause 'duplicated input' on next settle`,
15182
- e
15183
- );
15184
- });
15375
+ if (registering) {
15376
+ await this.arkProvider.deleteIntent(deleteIntent).catch((e) => {
15377
+ if (isNoMatchingIntentsError(e)) return;
15378
+ console.warn(
15379
+ `Failed to delete intent after settle failure for inputs [${inputIds}]; intent may linger on server and cause 'duplicated input' on next settle`,
15380
+ e
15381
+ );
15382
+ });
15383
+ }
15185
15384
  await this.persistIntentSnapshot(
15186
15385
  intentTxId,
15187
15386
  "cancelled",
@@ -15195,6 +15394,7 @@ var Wallet2 = class extends ReadonlyWallet {
15195
15394
  throw error;
15196
15395
  } finally {
15197
15396
  this._removePendingSpends(params.inputs);
15397
+ for (const key of boardingKeys) this._pendingSpendOutpoints.delete(key);
15198
15398
  for (const key of settlingKeys) this._settlingOutpoints.delete(key);
15199
15399
  abortController.abort();
15200
15400
  await stream?.return?.().catch(() => {
@@ -15210,7 +15410,7 @@ var Wallet2 = class extends ReadonlyWallet {
15210
15410
  async maybeRotateBoardingAfterBoard(inputs) {
15211
15411
  if (!this._descriptorProvider) return;
15212
15412
  const consumedBoarding = inputs.some(
15213
- (input) => typeof input !== "string" && !chunk3LDVNVBW_cjs.isVirtualCoin(input)
15413
+ (input) => typeof input !== "string" && !chunkVVFCCNU2_cjs.isVirtualCoin(input)
15214
15414
  );
15215
15415
  if (!consumedBoarding) return;
15216
15416
  try {
@@ -15221,7 +15421,7 @@ var Wallet2 = class extends ReadonlyWallet {
15221
15421
  }
15222
15422
  async handleSettlementFinalizationEvent(event, inputs, forfeitOutputScript, expectedRecipients, connectorsGraph, validatedCommitmentTxid) {
15223
15423
  const signedForfeits = [];
15224
- let settlementPsbt = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
15424
+ let settlementPsbt = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
15225
15425
  assertFinalCommitmentMatchesValidated(
15226
15426
  settlementPsbt,
15227
15427
  validatedCommitmentTxid,
@@ -15234,7 +15434,7 @@ var Wallet2 = class extends ReadonlyWallet {
15234
15434
  let connectorIndex = 0;
15235
15435
  const connectorsLeaves = connectorsGraph?.leaves() || [];
15236
15436
  for (const input of inputs) {
15237
- if (!chunk3LDVNVBW_cjs.isVirtualCoin(input)) {
15437
+ if (!chunkVVFCCNU2_cjs.isVirtualCoin(input)) {
15238
15438
  let matched = false;
15239
15439
  for (let i = 0; i < settlementPsbt.inputsLength; i++) {
15240
15440
  const settlementInput = settlementPsbt.getInput(i);
@@ -15272,7 +15472,7 @@ var Wallet2 = class extends ReadonlyWallet {
15272
15472
  }
15273
15473
  continue;
15274
15474
  }
15275
- if (!chunk3LDVNVBW_cjs.requiresForfeit(input) || isSubdust({ value: input.value }, this.dustAmount)) {
15475
+ if (!chunkVVFCCNU2_cjs.requiresForfeit(input) || isSubdust({ value: input.value }, this.dustAmount)) {
15276
15476
  continue;
15277
15477
  }
15278
15478
  if (connectorsLeaves.length === 0) {
@@ -15300,7 +15500,7 @@ var Wallet2 = class extends ReadonlyWallet {
15300
15500
  index: input.vout,
15301
15501
  witnessUtxo: {
15302
15502
  amount: BigInt(input.value),
15303
- script: chunk3LDVNVBW_cjs.VtxoScript.decode(input.tapTree).pkScript
15503
+ script: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
15304
15504
  },
15305
15505
  sighashType: btcSigner.SigHash.DEFAULT,
15306
15506
  tapLeafScript: [input.forfeitTapLeafScript]
@@ -15319,7 +15519,7 @@ var Wallet2 = class extends ReadonlyWallet {
15319
15519
  forfeitTx = await this._signerRouter.sign(forfeitTx, [
15320
15520
  {
15321
15521
  index: 0,
15322
- lookupScript: chunk3LDVNVBW_cjs.VtxoScript.decode(input.tapTree).pkScript
15522
+ lookupScript: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
15323
15523
  }
15324
15524
  ]);
15325
15525
  signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
@@ -15377,7 +15577,7 @@ var Wallet2 = class extends ReadonlyWallet {
15377
15577
  resolveBatchExpiryPolicy(this.network, this.batchExpiryPolicy)
15378
15578
  );
15379
15579
  await this.arkProvider.confirmRegistration(intentId);
15380
- const sweepTapscript = chunk3LDVNVBW_cjs.CSVMultisigTapscript.encode({
15580
+ const sweepTapscript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({
15381
15581
  timelock,
15382
15582
  pubkeys: [this.forfeitPubkey]
15383
15583
  }).script;
@@ -15392,14 +15592,14 @@ var Wallet2 = class extends ReadonlyWallet {
15392
15592
  throw new Error("Sweep tap tree root not set");
15393
15593
  }
15394
15594
  const xOnlyPublicKeys = event.cosignersPublicKeys.map(
15395
- (k) => base.hex.encode(chunkEBCWETZM_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
15595
+ (k) => base.hex.encode(chunkCFOIHLON_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
15396
15596
  );
15397
15597
  const signerPublicKey = await session.getPublicKey();
15398
- const xonlySignerPublicKey = chunkEBCWETZM_cjs.toXOnly(signerPublicKey, "signer key");
15598
+ const xonlySignerPublicKey = chunkCFOIHLON_cjs.toXOnly(signerPublicKey, "signer key");
15399
15599
  if (!xOnlyPublicKeys.includes(base.hex.encode(xonlySignerPublicKey))) {
15400
15600
  return { skip: true };
15401
15601
  }
15402
- const commitmentTx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(
15602
+ const commitmentTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(
15403
15603
  base.base64.decode(event.unsignedCommitmentTx)
15404
15604
  );
15405
15605
  validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
@@ -15481,9 +15681,9 @@ var Wallet2 = class extends ReadonlyWallet {
15481
15681
  ...existing ?? {},
15482
15682
  intentTxId,
15483
15683
  registerProof: intent.proof,
15484
- registerProofMessage: chunk3LDVNVBW_cjs.Intent.encodeMessage(intent.message),
15684
+ registerProofMessage: chunkVVFCCNU2_cjs.Intent.encodeMessage(intent.message),
15485
15685
  deleteProof: deleteIntent.proof,
15486
- deleteProofMessage: chunk3LDVNVBW_cjs.Intent.encodeMessage(deleteIntent.message),
15686
+ deleteProofMessage: chunkVVFCCNU2_cjs.Intent.encodeMessage(deleteIntent.message),
15487
15687
  intentVtxos: inputs.map((i) => ({
15488
15688
  txid: i.txid,
15489
15689
  vout: i.vout
@@ -15516,7 +15716,7 @@ var Wallet2 = class extends ReadonlyWallet {
15516
15716
  try {
15517
15717
  return await this.arkProvider.registerIntent(intent);
15518
15718
  } catch (error) {
15519
- if (error instanceof chunk3LDVNVBW_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
15719
+ if (error instanceof chunkVVFCCNU2_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
15520
15720
  const deleteIntent = await this.makeDeleteIntentSignature(inputs);
15521
15721
  await this.arkProvider.deleteIntent(deleteIntent);
15522
15722
  return this.arkProvider.registerIntent(intent);
@@ -15532,7 +15732,7 @@ var Wallet2 = class extends ReadonlyWallet {
15532
15732
  expire_at: 0,
15533
15733
  cosigners_public_keys: cosignerPubKeys
15534
15734
  };
15535
- const proof = chunk3LDVNVBW_cjs.Intent.create(message, coins, outputs);
15735
+ const proof = chunkVVFCCNU2_cjs.Intent.create(message, coins, outputs);
15536
15736
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
15537
15737
  return {
15538
15738
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -15544,7 +15744,7 @@ var Wallet2 = class extends ReadonlyWallet {
15544
15744
  type: "delete",
15545
15745
  expire_at: 0
15546
15746
  };
15547
- const proof = chunk3LDVNVBW_cjs.Intent.create(message, coins, []);
15747
+ const proof = chunkVVFCCNU2_cjs.Intent.create(message, coins, []);
15548
15748
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
15549
15749
  return {
15550
15750
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -15556,7 +15756,7 @@ var Wallet2 = class extends ReadonlyWallet {
15556
15756
  type: "get-pending-tx",
15557
15757
  expire_at: 0
15558
15758
  };
15559
- const proof = chunk3LDVNVBW_cjs.Intent.create(message, coins, []);
15759
+ const proof = chunkVVFCCNU2_cjs.Intent.create(message, coins, []);
15560
15760
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
15561
15761
  return {
15562
15762
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -15577,7 +15777,7 @@ var Wallet2 = class extends ReadonlyWallet {
15577
15777
  if (!vtxos || vtxos.length === 0) {
15578
15778
  const scriptMap = await this.getScriptMap();
15579
15779
  const allExtended = [];
15580
- const fetchedVtxos = await chunk3LDVNVBW_cjs.getAllNormalizedVtxos(this.indexerProvider, [
15780
+ const fetchedVtxos = await chunkVVFCCNU2_cjs.getAllNormalizedVtxos(this.indexerProvider, [
15581
15781
  ...scriptMap.keys()
15582
15782
  ]);
15583
15783
  for (const vtxo of fetchedVtxos) {
@@ -15620,8 +15820,8 @@ var Wallet2 = class extends ReadonlyWallet {
15620
15820
  batchPending.push(pendingTx.arkTxid);
15621
15821
  try {
15622
15822
  const checkpointTxs = pendingTx.signedCheckpointTxs.map((c) => {
15623
- const tx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(c));
15624
- chunk3LDVNVBW_cjs.assertAllowedSighashTypes(tx);
15823
+ const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(c));
15824
+ chunkVVFCCNU2_cjs.assertAllowedSighashTypes(tx);
15625
15825
  return tx;
15626
15826
  });
15627
15827
  assertCheckpointsMatchInputs(
@@ -15690,11 +15890,11 @@ var Wallet2 = class extends ReadonlyWallet {
15690
15890
  * and one per deprecated signer — else a pre-rotation tx would stay pending forever.
15691
15891
  */
15692
15892
  checkpointUnrollCandidates(info) {
15693
- const current = chunk3LDVNVBW_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
15893
+ const current = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
15694
15894
  const candidates = [this._serverUnrollScript, current];
15695
15895
  for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
15696
15896
  candidates.push(
15697
- chunk3LDVNVBW_cjs.CSVMultisigTapscript.encode({
15897
+ chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({
15698
15898
  ...current.params,
15699
15899
  pubkeys: [base.hex.decode(deprecated)]
15700
15900
  })
@@ -15776,6 +15976,12 @@ var Wallet2 = class extends ReadonlyWallet {
15776
15976
  */
15777
15977
  async claimCash(cashStr) {
15778
15978
  const cash = ArkadeCash.fromString(cashStr);
15979
+ const info = await this.arkProvider.getInfo();
15980
+ const signerSet = signerSetFromInfo(info);
15981
+ const signer = classifyAgainstSignerSet(base.hex.encode(cash.serverPubKey), signerSet);
15982
+ if (signer.status === "UNKNOWN_SIGNER") {
15983
+ throw new ArkadeCashOperatorMismatchError(signer.signerPubKey, signerSet.active);
15984
+ }
15779
15985
  const cashScript = cash.vtxoScript;
15780
15986
  const cashPkScript = base.hex.encode(cashScript.pkScript);
15781
15987
  const scripts = [cashPkScript];
@@ -15783,7 +15989,7 @@ var Wallet2 = class extends ReadonlyWallet {
15783
15989
  if (vtxos.length === 0) {
15784
15990
  throw new Error("No VTXOs found for this arkadeCash");
15785
15991
  }
15786
- const myPkScript = chunk3LDVNVBW_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
15992
+ const myPkScript = chunkVVFCCNU2_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
15787
15993
  let { spendable, recoverable, unclaimed } = this.classifyCashVtxos(vtxos);
15788
15994
  let swept = 0;
15789
15995
  const drainable = vtxos.filter(
@@ -15811,7 +16017,6 @@ var Wallet2 = class extends ReadonlyWallet {
15811
16017
  }
15812
16018
  }
15813
16019
  if (spendable.length > 0) {
15814
- const info = await this.arkProvider.getInfo();
15815
16020
  const serverUnrollScript = assertValidServerUnrollScript(
15816
16021
  info.checkpointTapscript,
15817
16022
  resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
@@ -15910,7 +16115,7 @@ var Wallet2 = class extends ReadonlyWallet {
15910
16115
  params: {
15911
16116
  pubKey: base.hex.encode(cash.publicKey),
15912
16117
  serverPubKey: base.hex.encode(cash.serverPubKey),
15913
- csvTimelock: chunk3LDVNVBW_cjs.timelockToSequence(cash.csvTimelock).toString()
16118
+ csvTimelock: chunkVVFCCNU2_cjs.timelockToSequence(cash.csvTimelock).toString()
15914
16119
  },
15915
16120
  script: base.hex.encode(cashScript.pkScript),
15916
16121
  address: cashAddress.encode(),
@@ -15991,7 +16196,7 @@ var Wallet2 = class extends ReadonlyWallet {
15991
16196
  const recoverable = [];
15992
16197
  const unclaimed = [];
15993
16198
  for (const vtxo of vtxos) {
15994
- if (chunk3LDVNVBW_cjs.isVtxoSpent(vtxo)) {
16199
+ if (chunkVVFCCNU2_cjs.isVtxoSpent(vtxo)) {
15995
16200
  unclaimed.push(cashReport(vtxo, "already-spent"));
15996
16201
  } else if (vtxo.isUnrolled) {
15997
16202
  unclaimed.push(cashReport(vtxo, "exited"));
@@ -16013,7 +16218,7 @@ var Wallet2 = class extends ReadonlyWallet {
16013
16218
  const all = [];
16014
16219
  const seen = /* @__PURE__ */ new Set();
16015
16220
  for (let pageIndex = 0; ; pageIndex++) {
16016
- const { vtxos, page } = await chunk3LDVNVBW_cjs.getNormalizedVtxos(this.indexerProvider, {
16221
+ const { vtxos, page } = await chunkVVFCCNU2_cjs.getNormalizedVtxos(this.indexerProvider, {
16017
16222
  scripts,
16018
16223
  pageIndex,
16019
16224
  pageSize
@@ -16051,7 +16256,7 @@ var Wallet2 = class extends ReadonlyWallet {
16051
16256
  for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
16052
16257
  const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
16053
16258
  const message = { type: "get-pending-tx", expire_at: 0 };
16054
- const proof = chunk3LDVNVBW_cjs.Intent.create(message, batch, []);
16259
+ const proof = chunkVVFCCNU2_cjs.Intent.create(message, batch, []);
16055
16260
  const signedProof = await identity.sign(
16056
16261
  proof,
16057
16262
  Array.from({ length: batch.length + 1 }, (_, j) => j)
@@ -16072,8 +16277,8 @@ var Wallet2 = class extends ReadonlyWallet {
16072
16277
  for (const pendingTx of pendingTxs) {
16073
16278
  try {
16074
16279
  const checkpointTxs = pendingTx.signedCheckpointTxs.map((checkpoint) => {
16075
- const tx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(checkpoint));
16076
- chunk3LDVNVBW_cjs.assertAllowedSighashTypes(tx);
16280
+ const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(checkpoint));
16281
+ chunkVVFCCNU2_cjs.assertAllowedSighashTypes(tx);
16077
16282
  return tx;
16078
16283
  });
16079
16284
  assertCheckpointsMatchInputs(
@@ -16113,7 +16318,7 @@ var Wallet2 = class extends ReadonlyWallet {
16113
16318
  }
16114
16319
  /** Sum the outputs of an ark tx PSBT that pay the given scriptPubKey. */
16115
16320
  arkTxAmountPaidTo(arkTxPsbt, pkScriptHex) {
16116
- const arkTx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(arkTxPsbt));
16321
+ const arkTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(arkTxPsbt));
16117
16322
  let total = 0;
16118
16323
  for (let i = 0; i < arkTx.outputsLength; i++) {
16119
16324
  const output = arkTx.getOutput(i);
@@ -16151,9 +16356,16 @@ var Wallet2 = class extends ReadonlyWallet {
16151
16356
  const validUntil = captureSendDeadline(params.validUntil);
16152
16357
  const inputExpiryFloor = captureInputExpiryFloor(params.inputExpiryFloor);
16153
16358
  assertSendDeadline(validUntil);
16154
- return this._withTxLock(() => this._sendImpl(params, validUntil, inputExpiryFloor));
16359
+ return this._withTxLock(
16360
+ (release) => this._sendImpl(
16361
+ params,
16362
+ validUntil,
16363
+ inputExpiryFloor,
16364
+ this._concurrentSpending ? release : void 0
16365
+ )
16366
+ );
16155
16367
  }
16156
- async _sendImpl({ recipients: args, selectedVtxos, maxChangeFee }, validUntil, inputExpiryFloor) {
16368
+ async _sendImpl({ recipients: args, selectedVtxos, maxChangeFee }, validUntil, inputExpiryFloor, onReserved) {
16157
16369
  assertSendDeadline(validUntil);
16158
16370
  if (args.length === 0) {
16159
16371
  throw new Error("At least one receiver is required");
@@ -16165,7 +16377,7 @@ var Wallet2 = class extends ReadonlyWallet {
16165
16377
  throw new Error("send({ maxChangeFee }): expected a non-negative safe integer");
16166
16378
  }
16167
16379
  if (selectedVtxos) {
16168
- if (inputExpiryFloor) selectedVtxos = selectedVtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo);
16380
+ if (inputExpiryFloor) selectedVtxos = selectedVtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
16169
16381
  if (inputExpiryFloor && selectedVtxos.some((coin) => !meetsInputExpiryFloor(coin, inputExpiryFloor))) {
16170
16382
  throw new Error("send({ selectedVtxos }): input expiry floor not met");
16171
16383
  }
@@ -16300,7 +16512,7 @@ var Wallet2 = class extends ReadonlyWallet {
16300
16512
  script: recipient.script,
16301
16513
  amount: BigInt(recipient.amount),
16302
16514
  // Already checked against the recipient address in `validateRecipients`.
16303
- ...recipient.tapTree ? { tapTree: chunk3LDVNVBW_cjs.toBIP371TapTree(recipient.tapTree) } : {}
16515
+ ...recipient.tapTree ? { tapTree: chunkVVFCCNU2_cjs.toBIP371TapTree(recipient.tapTree) } : {}
16304
16516
  }));
16305
16517
  const totalBtcOutput = outputs.reduce((sum, o) => sum + Number(o.amount), 0);
16306
16518
  let changeAmount = totalBtcSelected - totalBtcOutput;
@@ -16438,6 +16650,8 @@ var Wallet2 = class extends ReadonlyWallet {
16438
16650
  serverUnrollScript,
16439
16651
  changeAssets: changeReceiver?.assets
16440
16652
  },
16653
+ onReserved,
16654
+ !selectedVtxos,
16441
16655
  { validUntil }
16442
16656
  );
16443
16657
  }
@@ -16445,8 +16659,11 @@ var Wallet2 = class extends ReadonlyWallet {
16445
16659
  * Shared submit/persist tail of `send` and {@link sendSelectedVtxosToSelf}; callers own coin
16446
16660
  * selection, outputs and the synchronous epoch snapshot.
16447
16661
  */
16448
- async _submitOffchainSpend(inputs, outputs, persist, options) {
16662
+ async _submitOffchainSpend(inputs, outputs, persist, onReserved, picked = false, options) {
16663
+ if (picked) this._assertNotHeld(inputs);
16664
+ if (onReserved) this._assertNotInFlight(inputs);
16449
16665
  this._addPendingSpends(inputs);
16666
+ onReserved?.();
16450
16667
  try {
16451
16668
  const { arkTxid, signedCheckpointTxs } = await this._buildAndSubmitOffchainTx(
16452
16669
  inputs,
@@ -16482,15 +16699,15 @@ var Wallet2 = class extends ReadonlyWallet {
16482
16699
  if (inputs.length === 0) {
16483
16700
  throw new Error("sendSelectedVtxosToSelf: no inputs");
16484
16701
  }
16485
- return this._withTxLock(async () => {
16702
+ return this._withTxLock(async (release) => {
16486
16703
  const offchainTapscript = this.offchainTapscript;
16487
16704
  const serverPubKey = this.arkServerPublicKey;
16488
16705
  const serverUnrollScript = this.serverUnrollScript;
16489
16706
  const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
16490
- const normalizedInputs = inputs.map(chunk3LDVNVBW_cjs.normalizeVtxo);
16491
- const at = now ?? await chunk3LDVNVBW_cjs.resolveTimeHeight(this.onchainProvider);
16707
+ const normalizedInputs = inputs.map(chunkVVFCCNU2_cjs.normalizeVtxo);
16708
+ const at = now ?? await chunkVVFCCNU2_cjs.resolveTimeHeight(this.onchainProvider);
16492
16709
  for (const input of normalizedInputs) {
16493
- if (!chunk3LDVNVBW_cjs.canSpendOffchain(input, at)) {
16710
+ if (!chunkVVFCCNU2_cjs.canSpendOffchain(input, at)) {
16494
16711
  throw new Error(
16495
16712
  `sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
16496
16713
  );
@@ -16525,16 +16742,21 @@ var Wallet2 = class extends ReadonlyWallet {
16525
16742
  const packet = createAssetPacket(assetInputs, [], selfReceiver);
16526
16743
  outputs.push(Extension.create([packet]).txOut());
16527
16744
  }
16528
- return this._submitOffchainSpend(normalizedInputs, outputs, {
16529
- sentAmount: 0,
16530
- changeAmount: total,
16531
- changeVout: 0,
16532
- offchainTapscript,
16533
- serverPubKey,
16534
- changeAssets: selfAssets,
16535
- recordSentHistory: false,
16536
- serverUnrollScript
16537
- });
16745
+ return this._submitOffchainSpend(
16746
+ normalizedInputs,
16747
+ outputs,
16748
+ {
16749
+ sentAmount: 0,
16750
+ changeAmount: total,
16751
+ changeVout: 0,
16752
+ offchainTapscript,
16753
+ serverPubKey,
16754
+ changeAssets: selfAssets,
16755
+ recordSentHistory: false,
16756
+ serverUnrollScript
16757
+ },
16758
+ this._concurrentSpending ? release : void 0
16759
+ );
16538
16760
  });
16539
16761
  }
16540
16762
  /**
@@ -16569,7 +16791,7 @@ var Wallet2 = class extends ReadonlyWallet {
16569
16791
  );
16570
16792
  const arkTxJobs = inputs.map((input, index) => ({
16571
16793
  index,
16572
- lookupScript: chunk3LDVNVBW_cjs.VtxoScript.decode(input.tapTree).pkScript
16794
+ lookupScript: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
16573
16795
  }));
16574
16796
  const identity = this.identity;
16575
16797
  const signer = {
@@ -16605,51 +16827,63 @@ var Wallet2 = class extends ReadonlyWallet {
16605
16827
  this.inputSigningJobsFromWitnessUtxos(checkpoint)
16606
16828
  )
16607
16829
  };
16608
- return submitOffchainTx(
16609
- this.arkProvider,
16610
- offchainTx,
16611
- signer,
16612
- {
16613
- // Mark pending before submitting — if we crash between submit and
16614
- // finalize, the next init recovers via finalizePendingTxs.
16615
- beforeSubmit: async () => {
16616
- const ownsPendingFlag = validUntil !== void 0 && !await this.hasPendingTxFlag();
16617
- await this.setPendingTxFlag(true);
16618
- try {
16619
- assertSendDeadline(validUntil);
16620
- } catch (error) {
16621
- if (ownsPendingFlag) {
16622
- try {
16623
- await this.setPendingTxFlag(false);
16624
- } catch (clearError) {
16625
- console.error(
16626
- "Failed to clear pending tx flag after deadline expiry:",
16627
- clearError
16628
- );
16830
+ let awaitingFinalize = false;
16831
+ try {
16832
+ return await submitOffchainTx(
16833
+ this.arkProvider,
16834
+ offchainTx,
16835
+ signer,
16836
+ {
16837
+ // Mark pending before submitting — if we crash between submit and
16838
+ // finalize, the next init recovers via finalizePendingTxs.
16839
+ beforeSubmit: async () => {
16840
+ const ownsPendingFlag = validUntil !== void 0 && !await this.hasPendingTxFlag();
16841
+ this._submitsAwaitingFinalize++;
16842
+ awaitingFinalize = true;
16843
+ await this.setPendingTxFlag(true);
16844
+ try {
16845
+ assertSendDeadline(validUntil);
16846
+ } catch (error) {
16847
+ this._submitsAwaitingFinalize--;
16848
+ awaitingFinalize = false;
16849
+ if (ownsPendingFlag && this._submitsAwaitingFinalize === 0) {
16850
+ try {
16851
+ await this.setPendingTxFlag(false);
16852
+ } catch (clearError) {
16853
+ console.error(
16854
+ "Failed to clear pending tx flag after deadline expiry:",
16855
+ clearError
16856
+ );
16857
+ }
16629
16858
  }
16859
+ throw error;
16860
+ }
16861
+ },
16862
+ afterFinalize: async () => {
16863
+ this._submitsAwaitingFinalize--;
16864
+ awaitingFinalize = false;
16865
+ if (this._submitsAwaitingFinalize > 0) return;
16866
+ try {
16867
+ await this.setPendingTxFlag(false);
16868
+ } catch (error) {
16869
+ console.error("Failed to clear pending tx flag:", error);
16630
16870
  }
16631
- throw error;
16632
16871
  }
16633
16872
  },
16634
- afterFinalize: async () => {
16635
- try {
16636
- await this.setPendingTxFlag(false);
16637
- } catch (error) {
16638
- console.error("Failed to clear pending tx flag:", error);
16873
+ {
16874
+ // Deprecated keys too: a vtxo built before a rotation is still
16875
+ // spent under the signer its leaf names.
16876
+ verifyServerSignatures: {
16877
+ serverPubkey: this._arkServerPublicKey,
16878
+ deprecatedServerPubkeys: [...this._deprecatedSigners.keys()].map(
16879
+ (h) => base.hex.decode(h)
16880
+ )
16639
16881
  }
16640
16882
  }
16641
- },
16642
- {
16643
- // Deprecated keys too: a vtxo built before a rotation is still
16644
- // spent under the signer its leaf names.
16645
- verifyServerSignatures: {
16646
- serverPubkey: this._arkServerPublicKey,
16647
- deprecatedServerPubkeys: [...this._deprecatedSigners.keys()].map(
16648
- (h) => base.hex.decode(h)
16649
- )
16650
- }
16651
- }
16652
- );
16883
+ );
16884
+ } finally {
16885
+ if (awaitingFinalize) this._submitsAwaitingFinalize--;
16886
+ }
16653
16887
  }
16654
16888
  // Mark inputs spent and save change. `offchainTapscript`/`serverPubKey` are the caller's epoch
16655
16889
  // snapshot, so the record matches what the server saw even if a rotation lands mid-flight.
@@ -16666,7 +16900,7 @@ var Wallet2 = class extends ReadonlyWallet {
16666
16900
  }
16667
16901
  const checkpointIdByOutpoint = /* @__PURE__ */ new Map();
16668
16902
  for (const encoded of signedCheckpointTxs) {
16669
- const checkpoint = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
16903
+ const checkpoint = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
16670
16904
  for (let i = 0; i < checkpoint.inputsLength; i++) {
16671
16905
  const input = checkpoint.getInput(i);
16672
16906
  if (!input.txid) continue;
@@ -16782,12 +17016,12 @@ var Wallet2 = class extends ReadonlyWallet {
16782
17016
  const spentVtxos = [];
16783
17017
  const inputArkTxIds = /* @__PURE__ */ new Set();
16784
17018
  const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
16785
- const vtxoInputs = inputs.filter(chunk3LDVNVBW_cjs.isVirtualCoin);
17019
+ const vtxoInputs = inputs.filter(chunkVVFCCNU2_cjs.isVirtualCoin);
16786
17020
  const cm = await this.getContractManager();
16787
17021
  const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
16788
17022
  const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
16789
17023
  for (const input of inputs) {
16790
- if (chunk3LDVNVBW_cjs.isVirtualCoin(input)) {
17024
+ if (chunkVVFCCNU2_cjs.isVirtualCoin(input)) {
16791
17025
  const outpoint = `${input.txid}:${input.vout}`;
16792
17026
  const vtxo = annotatedByKey.get(outpoint);
16793
17027
  if (!vtxo) {
@@ -16804,7 +17038,7 @@ var Wallet2 = class extends ReadonlyWallet {
16804
17038
  } else {
16805
17039
  let sourceAddress;
16806
17040
  try {
16807
- sourceAddress = chunk3LDVNVBW_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
17041
+ sourceAddress = chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
16808
17042
  this.network
16809
17043
  );
16810
17044
  } catch {
@@ -16847,13 +17081,19 @@ var Wallet2 = class extends ReadonlyWallet {
16847
17081
  );
16848
17082
  }
16849
17083
  }
16850
- for (const [address, toRemove] of boardingRemovalsByAddress) {
16851
- const currentUtxos = await collectUtxos(this.walletRepository, address);
16852
- const filtered = currentUtxos.filter((u) => !toRemove.has(`${u.txid}:${u.vout}`));
16853
- await this.walletRepository.deleteUtxos(address);
16854
- if (filtered.length > 0) {
16855
- await this.walletRepository.saveUtxos(address, filtered);
16856
- }
17084
+ if (boardingRemovalsByAddress.size > 0) {
17085
+ await inVtxoWriteOrder(this.walletRepository, async () => {
17086
+ for (const [address, toRemove] of boardingRemovalsByAddress) {
17087
+ const currentUtxos = await collectUtxos(this.walletRepository, address);
17088
+ const filtered = currentUtxos.filter(
17089
+ (u) => !toRemove.has(`${u.txid}:${u.vout}`)
17090
+ );
17091
+ await this.walletRepository.deleteUtxos(address);
17092
+ if (filtered.length > 0) {
17093
+ await this.walletRepository.saveUtxos(address, filtered);
17094
+ }
17095
+ }
17096
+ });
16857
17097
  }
16858
17098
  } catch (e) {
16859
17099
  console.warn("error updating repository after settle", e);
@@ -16861,15 +17101,16 @@ var Wallet2 = class extends ReadonlyWallet {
16861
17101
  }
16862
17102
  }
16863
17103
  };
17104
+ function bySelectionOrder(a, b) {
17105
+ const expiryA = a.expiresAt?.getTime() || Number.MAX_SAFE_INTEGER;
17106
+ const expiryB = b.expiresAt?.getTime() || Number.MAX_SAFE_INTEGER;
17107
+ if (expiryA !== expiryB) {
17108
+ return expiryA - expiryB;
17109
+ }
17110
+ return b.value - a.value;
17111
+ }
16864
17112
  function selectVirtualCoins(coins, targetAmount) {
16865
- const sortedCoins = coins.map(chunk3LDVNVBW_cjs.normalizeVtxo).sort((a, b) => {
16866
- const expiryA = a.expiresAt?.getTime() || Number.MAX_SAFE_INTEGER;
16867
- const expiryB = b.expiresAt?.getTime() || Number.MAX_SAFE_INTEGER;
16868
- if (expiryA !== expiryB) {
16869
- return expiryA - expiryB;
16870
- }
16871
- return b.value - a.value;
16872
- });
17113
+ const sortedCoins = coins.map(chunkVVFCCNU2_cjs.normalizeVtxo).sort(bySelectionOrder);
16873
17114
  const selectedCoins = [];
16874
17115
  let selectedAmount = 0;
16875
17116
  for (const coin of sortedCoins) {
@@ -16897,6 +17138,18 @@ var AbortError = class extends Error {
16897
17138
  this.name = "AbortError";
16898
17139
  }
16899
17140
  };
17141
+ var VtxoReservedError = class extends Error {
17142
+ constructor(outpoints, holder) {
17143
+ super(
17144
+ `${outpoints.join(", ")} ${holder === "held" ? "held by reserveVtxos" : "already being spent by another operation"}`
17145
+ );
17146
+ this.outpoints = outpoints;
17147
+ this.holder = holder;
17148
+ }
17149
+ outpoints;
17150
+ holder;
17151
+ name = "VtxoReservedError";
17152
+ };
16900
17153
  function abortReason(signal) {
16901
17154
  const { reason } = signal;
16902
17155
  if (reason instanceof Error) return reason;
@@ -16974,7 +17227,7 @@ function assertTimeoutMap(name, timeouts) {
16974
17227
  if (value === void 0) {
16975
17228
  throw new Error(`${name}.${key} must be a non-negative safe integer`);
16976
17229
  }
16977
- chunk3LDVNVBW_cjs.assertTimerMs(`${name}.${key}`, value);
17230
+ chunkVVFCCNU2_cjs.assertTimerMs(`${name}.${key}`, value);
16978
17231
  }
16979
17232
  }
16980
17233
  var MessageBus = class {
@@ -16990,8 +17243,8 @@ var MessageBus = class {
16990
17243
  }) {
16991
17244
  this.walletRepository = walletRepository;
16992
17245
  this.contractRepository = contractRepository;
16993
- chunk3LDVNVBW_cjs.assertTimerMs("tickIntervalMs", tickIntervalMs);
16994
- chunk3LDVNVBW_cjs.assertTimerMs("messageTimeoutMs", messageTimeoutMs);
17246
+ chunkVVFCCNU2_cjs.assertTimerMs("tickIntervalMs", tickIntervalMs);
17247
+ chunkVVFCCNU2_cjs.assertTimerMs("messageTimeoutMs", messageTimeoutMs);
16995
17248
  assertTimeoutMap("messageTimeoutOverrides", messageTimeoutOverrides);
16996
17249
  this.intentRepository = intentRepository;
16997
17250
  this.handlers = new Map(messageHandlers.map((u) => [u.messageTag, u]));
@@ -17245,14 +17498,14 @@ var MessageBus = class {
17245
17498
  this.initialized = true;
17246
17499
  }
17247
17500
  async buildServices(config) {
17248
- const arkProvider = new chunk3LDVNVBW_cjs.RestArkProvider(config.arkServer.url);
17501
+ const arkProvider = new chunkVVFCCNU2_cjs.RestArkProvider(config.arkServer.url);
17249
17502
  const storage = {
17250
17503
  walletRepository: this.walletRepository,
17251
17504
  contractRepository: this.contractRepository,
17252
17505
  ...this.intentRepository && { intentRepository: this.intentRepository }
17253
17506
  };
17254
17507
  const delegateProvider = config.delegateUrl ? new RestDelegateProvider(config.delegateUrl) : void 0;
17255
- const indexerProvider = new chunkFN27VWDK_cjs.RestIndexerProvider(config.arkServer.url);
17508
+ const indexerProvider = new chunkFEBAG2K2_cjs.RestIndexerProvider(config.arkServer.url);
17256
17509
  const serialized = normalizeSerializedIdentity(config.wallet);
17257
17510
  if (isSigningSerialized(serialized)) {
17258
17511
  const identity2 = hydrateIdentity(serialized);
@@ -17264,6 +17517,7 @@ var MessageBus = class {
17264
17517
  storage,
17265
17518
  delegateProvider,
17266
17519
  settlementConfig: config.settlementConfig,
17520
+ concurrentSpending: config.concurrentSpending,
17267
17521
  walletMode: config.walletMode,
17268
17522
  lazyInitialization: config.lazyInitialization,
17269
17523
  watcherConfig: config.watcherConfig,
@@ -17592,7 +17846,7 @@ var offboardNetworkNames = [
17592
17846
  function offboardDestinationScript(destinationAddress) {
17593
17847
  for (const networkName of offboardNetworkNames) {
17594
17848
  try {
17595
- const network = chunk3LDVNVBW_cjs.networks[networkName];
17849
+ const network = chunkVVFCCNU2_cjs.networks[networkName];
17596
17850
  const addr = btcSigner.Address(network).decode(destinationAddress);
17597
17851
  return btcSigner.OutScript.encode(addr);
17598
17852
  } catch {
@@ -17623,12 +17877,16 @@ function reportUngatedInputs(wallet, inputs) {
17623
17877
  const logger = wallet;
17624
17878
  void logger.logUngatedInputs("Ramps.offboard({ vtxos })", inputs);
17625
17879
  }
17880
+ var MAX_EXIT_PICKS = 3;
17881
+ function picksCovering(wallet) {
17882
+ return wallet.concurrentSpending === true;
17883
+ }
17626
17884
  function filterOffboardInputs(vtxos, feeInfo, named) {
17627
17885
  const estimator = new Estimator(feeInfo?.intentFee ?? {});
17628
17886
  const inputs = [];
17629
17887
  let subtotal = 0n;
17630
17888
  for (const vtxo of vtxos) {
17631
- const inputFee = estimator.evalOffchainInput(chunk3LDVNVBW_cjs.toOffchainInputFeeParams(vtxo));
17889
+ const inputFee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo));
17632
17890
  if (inputFee.satoshis >= vtxo.value) {
17633
17891
  if (named) {
17634
17892
  throw new Error(
@@ -17686,7 +17944,7 @@ var Ramps = class {
17686
17944
  * ```
17687
17945
  */
17688
17946
  async onboard(feeInfo, boardingUtxos, amount, eventCallback) {
17689
- boardingUtxos = boardingUtxos ?? await this.wallet.getBoardingUtxos();
17947
+ boardingUtxos = boardingUtxos ?? await getSelectableBoardingUtxos(this.wallet);
17690
17948
  const estimator = new Estimator(feeInfo?.intentFee ?? {});
17691
17949
  const filteredBoardingUtxos = [];
17692
17950
  let totalAmount = 0n;
@@ -17725,7 +17983,7 @@ var Ramps = class {
17725
17983
  }
17726
17984
  amount = amount ?? totalAmount;
17727
17985
  const offchainAddress = await this.wallet.getAddress();
17728
- const offchainAddr = chunk3LDVNVBW_cjs.ArkAddress.decode(offchainAddress);
17986
+ const offchainAddr = chunkVVFCCNU2_cjs.ArkAddress.decode(offchainAddress);
17729
17987
  const offchainScript = base.hex.encode(offchainAddr.pkScript);
17730
17988
  const outputFee = estimator.evalOffchainOutput({
17731
17989
  amount,
@@ -17780,29 +18038,39 @@ var Ramps = class {
17780
18038
  * ```
17781
18039
  */
17782
18040
  async offboard(destinationAddress, feeInfo, amount, eventCallback, vtxos) {
17783
- const { estimator, inputs, subtotal } = await this.offboardInputs(feeInfo, vtxos);
17784
- if (amount && amount > subtotal) {
17785
- throw new Error("Amount is greater than total amount of vtxos after fees");
17786
- }
17787
- const handed = amount || subtotal;
17788
- const { change, changeAddress } = await this.fundChange(
17789
- amount ? subtotal - handed : 0n,
17790
- estimator
17791
- );
17792
- const outputFee = estimator.evalOnchainOutput({
17793
- amount: handed,
17794
- script: base.hex.encode(offboardDestinationScript(destinationAddress))
17795
- });
17796
- if (BigInt(outputFee.satoshis) > handed) {
17797
- throw new Error(
17798
- `can't deduct fees from offboard amount (${outputFee.satoshis} > ${handed})`
18041
+ return this.withRepick(vtxos !== void 0, async () => {
18042
+ const {
18043
+ estimator,
18044
+ inputs: candidates,
18045
+ subtotal
18046
+ } = await this.offboardInputs(feeInfo, vtxos);
18047
+ if (amount && amount > subtotal) {
18048
+ throw new Error("Amount is greater than total amount of vtxos after fees");
18049
+ }
18050
+ const handed = amount || subtotal;
18051
+ const { inputs, change, changeAddress } = await this.fundExit(
18052
+ candidates,
18053
+ subtotal,
18054
+ handed,
18055
+ estimator,
18056
+ Boolean(amount) && vtxos === void 0
17799
18057
  );
17800
- }
17801
- const outputs = [
17802
- { address: destinationAddress, amount: handed - BigInt(outputFee.satoshis) }
17803
- ];
17804
- if (change > 0n) outputs.push({ address: changeAddress, amount: change });
17805
- return this.wallet.settle({ inputs, outputs }, eventCallback);
18058
+ const outputFee = estimator.evalOnchainOutput({
18059
+ amount: handed,
18060
+ script: base.hex.encode(offboardDestinationScript(destinationAddress))
18061
+ });
18062
+ if (BigInt(outputFee.satoshis) > handed) {
18063
+ throw new Error(
18064
+ `can't deduct fees from offboard amount (${outputFee.satoshis} > ${handed})`
18065
+ );
18066
+ }
18067
+ const outputs = [
18068
+ { address: destinationAddress, amount: handed - BigInt(outputFee.satoshis) }
18069
+ ];
18070
+ if (change > 0n) outputs.push({ address: changeAddress, amount: change });
18071
+ const params = { inputs, outputs };
18072
+ return this.wallet.settle(vtxos ? params : markSdkPicked(params), eventCallback);
18073
+ });
17806
18074
  }
17807
18075
  /**
17808
18076
  * Collaboratively exit with the DESTINATION paid exactly `amount`, pricing the
@@ -17815,23 +18083,36 @@ var Ramps = class {
17815
18083
  if (amount <= 0n) {
17816
18084
  throw new Error(`offboard amount must be positive, got ${amount}`);
17817
18085
  }
17818
- const { estimator, inputs, subtotal } = await this.offboardInputs(feeInfo, vtxos);
17819
- const outputFee = BigInt(
17820
- estimator.evalOnchainOutput({
17821
- amount,
17822
- script: base.hex.encode(offboardDestinationScript(destinationAddress))
17823
- }).satoshis
17824
- );
17825
- const needed = amount + outputFee;
17826
- if (needed > subtotal) {
17827
- throw new Error(
17828
- `selected vtxos net ${subtotal} sats, ${needed} needed to deliver ${amount} exactly (${amount} + a ${outputFee} sat exit fee)`
18086
+ return this.withRepick(vtxos !== void 0, async () => {
18087
+ const {
18088
+ estimator,
18089
+ inputs: candidates,
18090
+ subtotal
18091
+ } = await this.offboardInputs(feeInfo, vtxos);
18092
+ const outputFee = BigInt(
18093
+ estimator.evalOnchainOutput({
18094
+ amount,
18095
+ script: base.hex.encode(offboardDestinationScript(destinationAddress))
18096
+ }).satoshis
17829
18097
  );
17830
- }
17831
- const { change, changeAddress } = await this.fundChange(subtotal - needed, estimator);
17832
- const outputs = [{ address: destinationAddress, amount }];
17833
- if (change > 0n) outputs.push({ address: changeAddress, amount: change });
17834
- return this.wallet.settle({ inputs, outputs }, eventCallback);
18098
+ const needed = amount + outputFee;
18099
+ if (needed > subtotal) {
18100
+ throw new Error(
18101
+ `selected vtxos net ${subtotal} sats, ${needed} needed to deliver ${amount} exactly (${amount} + a ${outputFee} sat exit fee)`
18102
+ );
18103
+ }
18104
+ const { inputs, change, changeAddress } = await this.fundExit(
18105
+ candidates,
18106
+ subtotal,
18107
+ needed,
18108
+ estimator,
18109
+ vtxos === void 0
18110
+ );
18111
+ const outputs = [{ address: destinationAddress, amount }];
18112
+ if (change > 0n) outputs.push({ address: changeAddress, amount: change });
18113
+ const params2 = { inputs, outputs };
18114
+ return this.wallet.settle(vtxos ? params2 : markSdkPicked(params2), eventCallback);
18115
+ });
17835
18116
  }
17836
18117
  async offboardInputs(feeInfo, vtxos) {
17837
18118
  const named = vtxos !== void 0;
@@ -17844,12 +18125,49 @@ var Ramps = class {
17844
18125
  const estimator = new Estimator(feeInfo?.intentFee ?? {});
17845
18126
  return { estimator, ...filterOffboardInputs(spendable, feeInfo, named) };
17846
18127
  }
18128
+ /** Every candidate, or with `concurrentSpending` the shortest covering prefix in send order. */
18129
+ async fundExit(candidates, subtotal, needed, estimator, cover) {
18130
+ if (!cover || !picksCovering(this.wallet)) {
18131
+ return { inputs: candidates, ...await this.fundChange(subtotal - needed, estimator) };
18132
+ }
18133
+ const ordered = [...candidates].sort(bySelectionOrder);
18134
+ let covered = 0n;
18135
+ for (let i = 0; i < ordered.length && i < MAX_VTXOS_PER_SETTLEMENT; i++) {
18136
+ const fee = estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(ordered[i])).satoshis;
18137
+ covered += BigInt(ordered[i].value) - BigInt(fee);
18138
+ if (covered < needed) continue;
18139
+ try {
18140
+ return {
18141
+ inputs: ordered.slice(0, i + 1),
18142
+ ...await this.fundChange(covered - needed, estimator)
18143
+ };
18144
+ } catch (error) {
18145
+ if (!(error instanceof DustChangeError) || i + 1 === ordered.length) throw error;
18146
+ }
18147
+ }
18148
+ throw new Error(
18149
+ `this exit needs more than ${MAX_VTXOS_PER_SETTLEMENT} inputs; exit less, or consolidate first`
18150
+ );
18151
+ }
18152
+ /** Re-runs an SDK-picked exit that lost a coin to a concurrent spend. */
18153
+ async withRepick(named, exit) {
18154
+ for (let attempt = 1; ; attempt++) {
18155
+ try {
18156
+ return await exit();
18157
+ } catch (error) {
18158
+ const lostRace = error?.name === "VtxoReservedError";
18159
+ if (named || !lostRace || !picksCovering(this.wallet) || attempt >= MAX_EXIT_PICKS) {
18160
+ throw error;
18161
+ }
18162
+ }
18163
+ }
18164
+ }
17847
18165
  /** Fund the change output: pay its own fee, then judge it against both
17848
18166
  * server-side bounds. `0n` in is `0n` out — no change output at all. */
17849
18167
  async fundChange(left, estimator) {
17850
18168
  if (left <= 0n) return { change: 0n };
17851
18169
  const changeAddress = await this.wallet.getAddress();
17852
- const changeScript = base.hex.encode(chunk3LDVNVBW_cjs.ArkAddress.decode(changeAddress).pkScript);
18170
+ const changeScript = base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(changeAddress).pkScript);
17853
18171
  const { change } = changeAfterOutputFee(
17854
18172
  left,
17855
18173
  (amount) => BigInt(estimator.evalOffchainOutput({ amount, script: changeScript }).satoshis)
@@ -18340,6 +18658,17 @@ var WalletMessageHandler = class {
18340
18658
  payload: { contracts, filterApplied: true }
18341
18659
  });
18342
18660
  }
18661
+ case "GET_STORED_CONTRACTS_WITH_VTXOS": {
18662
+ const manager = await this.readonlyWallet.getContractManager();
18663
+ const contracts = await manager.getStoredContractsWithVtxos(
18664
+ message.payload.filter
18665
+ );
18666
+ return this.tagged({
18667
+ id,
18668
+ type: "STORED_CONTRACTS_WITH_VTXOS",
18669
+ payload: { contracts }
18670
+ });
18671
+ }
18343
18672
  case "WATCH_SCRIPT": {
18344
18673
  const manager = await this.readonlyWallet.getContractManager();
18345
18674
  if (!manager.watchScript) throw unsupportedByManager("watchScript");
@@ -18763,7 +19092,7 @@ var WalletMessageHandler = class {
18763
19092
  this.lazyBoardingInit = payload.lazyBoarding ?? false;
18764
19093
  this.boardingEpoch++;
18765
19094
  this.boardingLoaded = false;
18766
- this.indexerProvider = new chunkFN27VWDK_cjs.RestIndexerProvider(arkServerUrl);
19095
+ this.indexerProvider = new chunkFEBAG2K2_cjs.RestIndexerProvider(arkServerUrl);
18767
19096
  await this.onWalletInitialized();
18768
19097
  }
18769
19098
  /** @see RequestInitWallet.payload.lazyBoarding */
@@ -19185,7 +19514,7 @@ var WalletMessageHandler = class {
19185
19514
  this.readonlyWallet.getBoardingTxs()
19186
19515
  ]);
19187
19516
  const indexerProvider = this.indexerProvider;
19188
- const resolveTxCreatedAt = indexerProvider ? (txids) => chunk3LDVNVBW_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
19517
+ const resolveTxCreatedAt = indexerProvider ? (txids) => chunkVVFCCNU2_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
19189
19518
  return buildTransactionHistory(
19190
19519
  vtxos,
19191
19520
  boardingTxs,
@@ -19254,7 +19583,7 @@ var DEFAULT_MESSAGE_TIMEOUTS = {
19254
19583
  // budget so the worker's snapshot fallback stays reachable before this
19255
19584
  // page deadline fires — lowering it below the budget would time the page
19256
19585
  // out while the worker is still seconds from answering from cache.
19257
- GET_ARKADE_INFO: chunk3LDVNVBW_cjs.INFO_FETCH_TIMEOUT_MS + 8e3,
19586
+ GET_ARKADE_INFO: chunkVVFCCNU2_cjs.INFO_FETCH_TIMEOUT_MS + 8e3,
19258
19587
  INDEXER_GET_VTXOS: 2e4,
19259
19588
  INDEXER_GET_VIRTUAL_TXS: 2e4,
19260
19589
  GET_VTXOS: 2e4,
@@ -19263,6 +19592,7 @@ var DEFAULT_MESSAGE_TIMEOUTS = {
19263
19592
  GET_TRANSACTION_HISTORY: 2e4,
19264
19593
  GET_CONTRACTS: 2e4,
19265
19594
  GET_CONTRACTS_WITH_VTXOS: 2e4,
19595
+ GET_STORED_CONTRACTS_WITH_VTXOS: 2e4,
19266
19596
  GET_WATCHED_SCRIPTS: 1e4,
19267
19597
  ANNOTATE_VTXOS: 2e4,
19268
19598
  GET_SPENDABLE_PATHS: 2e4,
@@ -19332,6 +19662,7 @@ var DEDUPABLE_REQUEST_TYPES = /* @__PURE__ */ new Set([
19332
19662
  "GET_SPENDABLE_VTXOS",
19333
19663
  "GET_CONTRACTS",
19334
19664
  "GET_CONTRACTS_WITH_VTXOS",
19665
+ "GET_STORED_CONTRACTS_WITH_VTXOS",
19335
19666
  "GET_WATCHED_SCRIPTS",
19336
19667
  "ANNOTATE_VTXOS",
19337
19668
  "GET_SPENDABLE_PATHS",
@@ -19395,7 +19726,7 @@ var ServiceWorkerAssetManager = class extends ServiceWorkerReadonlyAssetManager
19395
19726
  }
19396
19727
  };
19397
19728
  var initializeMessageBus = (serviceWorker, config, timeoutMs = 2e3) => {
19398
- chunk3LDVNVBW_cjs.assertTimerMs("messageBusTimeoutMs", timeoutMs);
19729
+ chunkVVFCCNU2_cjs.assertTimerMs("messageBusTimeoutMs", timeoutMs);
19399
19730
  const initCmd = {
19400
19731
  tag: "INITIALIZE_MESSAGE_BUS",
19401
19732
  id: getRandomId(),
@@ -19483,7 +19814,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
19483
19814
  }
19484
19815
  /** Shared tail of both `create()` factories: boot the bus, INIT_WALLET, cache for reinit. */
19485
19816
  static async bootstrap(wallet, options, serializedWallet, busConfig) {
19486
- const arkServer = options.arkServer ?? { url: chunk3LDVNVBW_cjs.DEFAULT_ARKADE_SERVER_URL };
19817
+ const arkServer = options.arkServer ?? { url: chunkVVFCCNU2_cjs.DEFAULT_ARKADE_SERVER_URL };
19487
19818
  const initWalletPayload = {
19488
19819
  lazyBoarding: options.lazyBoarding,
19489
19820
  arkServerUrl: arkServer.url,
@@ -19493,7 +19824,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
19493
19824
  Object.entries(options.messageTimeouts ?? {}).filter(([, ms]) => ms !== void 0)
19494
19825
  );
19495
19826
  for (const [key, value] of Object.entries(overrides)) {
19496
- chunk3LDVNVBW_cjs.assertTimerMs(`messageTimeouts.${key}`, value);
19827
+ chunkVVFCCNU2_cjs.assertTimerMs(`messageTimeouts.${key}`, value);
19497
19828
  }
19498
19829
  const messageTimeouts = {
19499
19830
  ...DEFAULT_MESSAGE_TIMEOUTS,
@@ -19833,7 +20164,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
19833
20164
  try {
19834
20165
  const response = await this.sendMessage(message);
19835
20166
  const { vtxos, page } = response.payload;
19836
- return { vtxos: vtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo), page: page && { ...page } };
20167
+ return { vtxos: vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo), page: page && { ...page } };
19837
20168
  } catch (cause) {
19838
20169
  throw new Error(`Failed to get vtxos: ${cause}`, { cause });
19839
20170
  }
@@ -19937,7 +20268,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
19937
20268
  };
19938
20269
  try {
19939
20270
  const response = await this.sendMessage(message);
19940
- return response.payload.vtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo);
20271
+ return response.payload.vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
19941
20272
  } catch (error) {
19942
20273
  throw new Error(`Failed to get vtxos: ${error}`);
19943
20274
  }
@@ -19968,7 +20299,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
19968
20299
  "Service worker does not support the requested contract scope or freshness check"
19969
20300
  );
19970
20301
  }
19971
- return payload.vtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo);
20302
+ return payload.vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
19972
20303
  } catch (error) {
19973
20304
  throw new Error(`Failed to get spendable vtxos: ${error}`);
19974
20305
  }
@@ -20075,6 +20406,23 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
20075
20406
  });
20076
20407
  }
20077
20408
  },
20409
+ async getStoredContractsWithVtxos(filter) {
20410
+ const message = {
20411
+ type: "GET_STORED_CONTRACTS_WITH_VTXOS",
20412
+ id: getRandomId(),
20413
+ tag: messageTag,
20414
+ payload: { filter }
20415
+ };
20416
+ try {
20417
+ const response = await sendContractMessage(message);
20418
+ await refreshSyncState();
20419
+ return response.payload.contracts;
20420
+ } catch (cause) {
20421
+ throw new Error(`Failed to get stored contracts with vtxos: ${cause}`, {
20422
+ cause
20423
+ });
20424
+ }
20425
+ },
20078
20426
  async watchScript(script, options) {
20079
20427
  const message = {
20080
20428
  type: "WATCH_SCRIPT",
@@ -20146,7 +20494,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
20146
20494
  };
20147
20495
  try {
20148
20496
  const response = await sendContractMessage(message);
20149
- return response.payload.vtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo);
20497
+ return response.payload.vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
20150
20498
  } catch (cause) {
20151
20499
  throw new Error(`Failed to annotate vtxos: ${cause}`, { cause });
20152
20500
  }
@@ -20349,6 +20697,11 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
20349
20697
  _assetManager;
20350
20698
  hasDelegate;
20351
20699
  _restoreInFlight;
20700
+ _concurrentSpending = false;
20701
+ /** @see WalletConfig.concurrentSpending */
20702
+ get concurrentSpending() {
20703
+ return this._concurrentSpending;
20704
+ }
20352
20705
  get assetManager() {
20353
20706
  return this._assetManager;
20354
20707
  }
@@ -20376,9 +20729,11 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
20376
20729
  messageTag,
20377
20730
  !!options.delegateUrl
20378
20731
  );
20732
+ wallet._concurrentSpending = options.concurrentSpending === true;
20379
20733
  return _ServiceWorkerWallet.bootstrap(wallet, options, serializedWallet, {
20380
20734
  delegateUrl: options.delegateUrl,
20381
20735
  settlementConfig: options.settlementConfig,
20736
+ concurrentSpending: options.concurrentSpending,
20382
20737
  walletMode: options.walletMode,
20383
20738
  lazyInitialization: options.lazyInitialization,
20384
20739
  watcherConfig: options.watcherConfig,
@@ -20572,6 +20927,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
20572
20927
  });
20573
20928
  return response.payload.txid;
20574
20929
  } catch (error) {
20930
+ if (error instanceof Error && error.name === "VtxoReservedError") throw error;
20575
20931
  throw new Error(`Settlement failed: ${error}`);
20576
20932
  }
20577
20933
  }
@@ -20662,6 +21018,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
20662
21018
  const response = await this.sendMessage(message);
20663
21019
  return response.payload.txid;
20664
21020
  } catch (error) {
21021
+ if (error instanceof Error && error.name === "VtxoReservedError") throw error;
20665
21022
  if (error instanceof SendDeadlineExceededError) throw error;
20666
21023
  throw new Error(`Send failed: ${error}`);
20667
21024
  }
@@ -20765,7 +21122,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
20765
21122
  };
20766
21123
  try {
20767
21124
  const response = await wallet.sendMessage(message);
20768
- return response.payload.vtxos.map(chunk3LDVNVBW_cjs.normalizeVtxo);
21125
+ return response.payload.vtxos.map(chunkVVFCCNU2_cjs.normalizeVtxo);
20769
21126
  } catch (e) {
20770
21127
  throw new Error(`Failed to get expiring vtxos: ${e}`);
20771
21128
  }
@@ -20882,12 +21239,12 @@ var OnchainWallet = class _OnchainWallet {
20882
21239
  * @returns Configured onchain wallet
20883
21240
  * @throws Error if the configured identity cannot produce a valid x-only public key
20884
21241
  */
20885
- static async create(identity, networkName = chunk3LDVNVBW_cjs.DEFAULT_NETWORK_NAME, provider) {
21242
+ static async create(identity, networkName = chunkVVFCCNU2_cjs.DEFAULT_NETWORK_NAME, provider) {
20886
21243
  const pubkey = await identity.xOnlyPublicKey();
20887
21244
  if (!pubkey) {
20888
21245
  throw new Error("Invalid configured public key");
20889
21246
  }
20890
- const network = chunk3LDVNVBW_cjs.getNetwork(networkName);
21247
+ const network = chunkVVFCCNU2_cjs.getNetwork(networkName);
20891
21248
  const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
20892
21249
  const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
20893
21250
  return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
@@ -20987,7 +21344,7 @@ var OnchainWallet = class _OnchainWallet {
20987
21344
  feeRate,
20988
21345
  params.address
20989
21346
  );
20990
- let tx = new chunk3LDVNVBW_cjs.Transaction();
21347
+ let tx = new chunkVVFCCNU2_cjs.Transaction();
20991
21348
  for (const input of inputs) {
20992
21349
  tx.addInput({
20993
21350
  txid: input.txid,
@@ -21045,7 +21402,7 @@ var OnchainWallet = class _OnchainWallet {
21045
21402
  * @throws If the parent has no anchor, or funding cannot be selected/signed
21046
21403
  */
21047
21404
  async bumpAnchor(parentHex, feeRate) {
21048
- const parent = chunk3LDVNVBW_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
21405
+ const parent = chunkVVFCCNU2_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
21049
21406
  const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
21050
21407
  const child = await this.buildBumpPackage(parent, feeRate, coins);
21051
21408
  return [parent.hex, child.hex];
@@ -21861,7 +22218,7 @@ var CachingArkProvider = class {
21861
22218
  constructor(inner, ttlMs = DEFAULT_TTL_MS) {
21862
22219
  this.inner = inner;
21863
22220
  this.ttlMs = ttlMs;
21864
- chunk3LDVNVBW_cjs.assertNonNegativeMs("ttlMs", ttlMs);
22221
+ chunkVVFCCNU2_cjs.assertNonNegativeMs("ttlMs", ttlMs);
21865
22222
  this.unsubscribe = inner.onServerInfoChanged?.((info) => {
21866
22223
  this.cached = info;
21867
22224
  this.expiresAt = Date.now() + this.ttlMs;
@@ -21953,7 +22310,7 @@ async function resolvePrevTxs(txids, source, onchain) {
21953
22310
  try {
21954
22311
  const { txs } = await source.getVirtualTxs(wanted);
21955
22312
  for (const psbt of txs) {
21956
- const tx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
22313
+ const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
21957
22314
  resolved.set(tx.id, tx.toBytes());
21958
22315
  }
21959
22316
  } catch (err) {
@@ -21986,7 +22343,7 @@ async function resolvePrevTxs(txids, source, onchain) {
21986
22343
  async function attachPrevArkTxs(tx, txids, source, onchain) {
21987
22344
  const pending = [];
21988
22345
  for (let i = 0; i < tx.inputsLength; i++) {
21989
- if (chunk3LDVNVBW_cjs.getArkPsbtFields(tx, i, chunk3LDVNVBW_cjs.PrevArkTxField).length === 0) pending.push(i);
22346
+ if (chunkVVFCCNU2_cjs.getArkPsbtFields(tx, i, chunkVVFCCNU2_cjs.PrevArkTxField).length === 0) pending.push(i);
21990
22347
  }
21991
22348
  if (pending.length === 0) return;
21992
22349
  const resolved = await resolvePrevTxs(
@@ -21995,13 +22352,13 @@ async function attachPrevArkTxs(tx, txids, source, onchain) {
21995
22352
  onchain
21996
22353
  );
21997
22354
  for (const i of pending) {
21998
- chunk3LDVNVBW_cjs.setArkPsbtField(tx, i, chunk3LDVNVBW_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
22355
+ chunkVVFCCNU2_cjs.setArkPsbtField(tx, i, chunkVVFCCNU2_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
21999
22356
  }
22000
22357
  }
22001
22358
  async function attachPrevoutTxs(tx, source) {
22002
22359
  const pending = [];
22003
22360
  for (let i = 0; i < tx.inputsLength; i++) {
22004
- if (chunk3LDVNVBW_cjs.getArkPsbtFields(tx, i, chunk3LDVNVBW_cjs.PrevoutTxField).length > 0) continue;
22361
+ if (chunkVVFCCNU2_cjs.getArkPsbtFields(tx, i, chunkVVFCCNU2_cjs.PrevoutTxField).length > 0) continue;
22005
22362
  const input = tx.getInput(i);
22006
22363
  if (!input?.txid) throw new PrevTxUnavailableError(`input ${i} has no outpoint`);
22007
22364
  pending.push({ index: i, txid: base.hex.encode(input.txid) });
@@ -22012,7 +22369,7 @@ async function attachPrevoutTxs(tx, source) {
22012
22369
  resolved.set(txid, await source.getRawTransaction(txid));
22013
22370
  }
22014
22371
  for (const { index, txid } of pending) {
22015
- chunk3LDVNVBW_cjs.setArkPsbtField(tx, index, chunk3LDVNVBW_cjs.PrevoutTxField, resolved.get(txid));
22372
+ chunkVVFCCNU2_cjs.setArkPsbtField(tx, index, chunkVVFCCNU2_cjs.PrevoutTxField, resolved.get(txid));
22016
22373
  }
22017
22374
  }
22018
22375
  async function withPrevTxs(coins, source, onchain) {
@@ -22038,7 +22395,7 @@ exports.BIP322 = void 0;
22038
22395
  async function sign2(message, identity, network) {
22039
22396
  const xOnlyPubKey = await identity.xOnlyPublicKey();
22040
22397
  const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
22041
- const toSpend = chunk3LDVNVBW_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
22398
+ const toSpend = chunkVVFCCNU2_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
22042
22399
  const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
22043
22400
  const signed = await identity.sign(toSign, [0]);
22044
22401
  signed.finalizeIdx(0);
@@ -22096,7 +22453,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
22096
22453
  if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
22097
22454
  return false;
22098
22455
  }
22099
- const toSpend = chunk3LDVNVBW_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
22456
+ const toSpend = chunkVVFCCNU2_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
22100
22457
  const toSign = craftBIP322ToSignP2TR(toSpend, pkScript);
22101
22458
  const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
22102
22459
  const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
@@ -22117,7 +22474,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
22117
22474
  }
22118
22475
  const sighashType = sigWithHash[sigWithHash.length - 1];
22119
22476
  const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
22120
- const toSpend = chunk3LDVNVBW_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
22477
+ const toSpend = chunkVVFCCNU2_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
22121
22478
  const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
22122
22479
  const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
22123
22480
  const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
@@ -22170,7 +22527,7 @@ function encodeCompactSize(n) {
22170
22527
  return buf;
22171
22528
  }
22172
22529
  function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
22173
- const tx = new chunk3LDVNVBW_cjs.Transaction({ version: 0 });
22530
+ const tx = new chunkVVFCCNU2_cjs.Transaction({ version: 0 });
22174
22531
  tx.addInput({
22175
22532
  txid: toSpend.id,
22176
22533
  index: 0,
@@ -22184,12 +22541,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
22184
22541
  });
22185
22542
  tx.addOutput({
22186
22543
  amount: 0n,
22187
- script: chunk3LDVNVBW_cjs.OP_RETURN_EMPTY_PKSCRIPT
22544
+ script: chunkVVFCCNU2_cjs.OP_RETURN_EMPTY_PKSCRIPT
22188
22545
  });
22189
22546
  return tx;
22190
22547
  }
22191
22548
  function craftBIP322ToSignSimple(toSpend, pkScript) {
22192
- const tx = new chunk3LDVNVBW_cjs.Transaction({ version: 0 });
22549
+ const tx = new chunkVVFCCNU2_cjs.Transaction({ version: 0 });
22193
22550
  tx.addInput({
22194
22551
  txid: toSpend.id,
22195
22552
  index: 0,
@@ -22201,7 +22558,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
22201
22558
  });
22202
22559
  tx.addOutput({
22203
22560
  amount: 0n,
22204
- script: chunk3LDVNVBW_cjs.OP_RETURN_EMPTY_PKSCRIPT
22561
+ script: chunkVVFCCNU2_cjs.OP_RETURN_EMPTY_PKSCRIPT
22205
22562
  });
22206
22563
  return tx;
22207
22564
  }
@@ -22214,7 +22571,7 @@ var RestEmulatorProvider = class {
22214
22571
  serverUrl;
22215
22572
  async getInfo() {
22216
22573
  const url = `${this.serverUrl}/v1/info`;
22217
- const response = await chunk3LDVNVBW_cjs.baseFetch(url);
22574
+ const response = await chunkVVFCCNU2_cjs.baseFetch(url);
22218
22575
  if (!response.ok) {
22219
22576
  const errorText2 = await response.text();
22220
22577
  throw new Error(`Failed to get emulator info: ${errorText2}`);
@@ -22332,7 +22689,7 @@ var RestEmulatorProvider = class {
22332
22689
  }
22333
22690
  };
22334
22691
  function finalizeVirtualTx(type, psbtBase64) {
22335
- const tx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
22692
+ const tx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
22336
22693
  if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
22337
22694
  const input = tx.getInput(0);
22338
22695
  if (!input) {
@@ -22359,14 +22716,14 @@ var ExitPathError = class extends Error {
22359
22716
  reason;
22360
22717
  };
22361
22718
  function delayWeight(sequence) {
22362
- const t = chunk3LDVNVBW_cjs.sequenceToTimelock(sequence);
22719
+ const t = chunkVVFCCNU2_cjs.sequenceToTimelock(sequence);
22363
22720
  return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
22364
22721
  }
22365
22722
  async function resolveUnilateralPath(params) {
22366
22723
  const { vtxo, scriptHex, contractRepository } = params;
22367
22724
  const contract = contractRepository ? (await collectContracts(contractRepository, { script: scriptHex }))[0] : void 0;
22368
22725
  if (contract) {
22369
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(contract.type);
22726
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
22370
22727
  if (!handler) {
22371
22728
  throw new ExitPathError(
22372
22729
  "no-handler",
@@ -22388,12 +22745,12 @@ async function resolveUnilateralPath(params) {
22388
22745
  paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
22389
22746
  return { selection: paths[0], label: `${contract.type}:unilateral` };
22390
22747
  }
22391
- const decoded = chunk3LDVNVBW_cjs.VtxoScript.decode(vtxo.tapTree);
22748
+ const decoded = chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree);
22392
22749
  let best;
22393
22750
  for (const exit of decoded.exitPaths()) {
22394
22751
  const leaf = decoded.findLeaf(base.hex.encode(exit.script));
22395
22752
  if (!leaf) continue;
22396
- const sequence = chunk3LDVNVBW_cjs.timelockToSequence(exit.params.timelock);
22753
+ const sequence = chunkVVFCCNU2_cjs.timelockToSequence(exit.params.timelock);
22397
22754
  const weight = delayWeight(sequence);
22398
22755
  if (!best || weight < best.weight) {
22399
22756
  best = { selection: { leaf, sequence }, weight };
@@ -22600,7 +22957,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
22600
22957
  const txWeightEstimator = TxWeightEstimator.create();
22601
22958
  const walletDescriptor = base.hex.encode(await wallet.identity.xOnlyPublicKey());
22602
22959
  for (const vtxo of vtxos) {
22603
- if (!chunk3LDVNVBW_cjs.canSweepOnchain(vtxo)) {
22960
+ if (!chunkVVFCCNU2_cjs.canSweepOnchain(vtxo)) {
22604
22961
  throw new Error(
22605
22962
  `Vtxo ${vtxo.txid}:${vtxo.vout} cannot be swept onchain: it is not fully unrolled (use unroll first), or its exit output was already spent`
22606
22963
  );
@@ -22611,14 +22968,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
22611
22968
  }
22612
22969
  const resolved = await resolveUnilateralPath({
22613
22970
  vtxo,
22614
- scriptHex: base.hex.encode(chunk3LDVNVBW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
22971
+ scriptHex: base.hex.encode(chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
22615
22972
  contractRepository: wallet.contractRepository,
22616
22973
  walletDescriptor,
22617
22974
  currentTime: Date.now()
22618
22975
  });
22619
22976
  const spendingLeaf = resolved.selection.leaf;
22620
22977
  const sequence = resolved.selection.sequence;
22621
- const timelock = chunk3LDVNVBW_cjs.sequenceToTimelock(sequence);
22978
+ const timelock = chunkVVFCCNU2_cjs.sequenceToTimelock(sequence);
22622
22979
  const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
22623
22980
  if (!elapsed) {
22624
22981
  throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
@@ -22631,7 +22988,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
22631
22988
  sequence,
22632
22989
  witnessUtxo: {
22633
22990
  amount: BigInt(vtxo.value),
22634
- script: chunk3LDVNVBW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
22991
+ script: chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
22635
22992
  },
22636
22993
  sighashType: btcSigner.SigHash.DEFAULT
22637
22994
  });
@@ -22641,7 +22998,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
22641
22998
  btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
22642
22999
  );
22643
23000
  }
22644
- const tx = new chunk3LDVNVBW_cjs.Transaction({ version: 2 });
23001
+ const tx = new chunkVVFCCNU2_cjs.Transaction({ version: 2 });
22645
23002
  for (const input of inputs) {
22646
23003
  tx.addInput(input);
22647
23004
  }
@@ -22724,7 +23081,7 @@ async function buildSignedSweep(params) {
22724
23081
  `uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
22725
23082
  );
22726
23083
  }
22727
- const tx = new chunk3LDVNVBW_cjs.Transaction({ version: 2 });
23084
+ const tx = new chunkVVFCCNU2_cjs.Transaction({ version: 2 });
22728
23085
  tx.addInput({
22729
23086
  txid: vtxo.txid,
22730
23087
  index: vtxo.vout,
@@ -22749,7 +23106,7 @@ async function buildSignedSweep(params) {
22749
23106
  finalScriptWitness: [
22750
23107
  tapScriptSig[0][1],
22751
23108
  ...path.extraWitness,
22752
- chunk3LDVNVBW_cjs.scriptFromTapLeafScript(path.leaf),
23109
+ chunkVVFCCNU2_cjs.scriptFromTapLeafScript(path.leaf),
22753
23110
  btcSigner.TaprootControlBlock.encode(controlBlock)
22754
23111
  ]
22755
23112
  });
@@ -22779,7 +23136,7 @@ async function resolveFeeRate(opts) {
22779
23136
  }
22780
23137
  async function selectExitVtxos(opts) {
22781
23138
  if (!opts.vtxos) return opts.wallet.getVtxos();
22782
- const res = await chunk3LDVNVBW_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
23139
+ const res = await chunkVVFCCNU2_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
22783
23140
  const tapTrees = /* @__PURE__ */ new Map();
22784
23141
  const out = [];
22785
23142
  for (const vtxo of res.vtxos) {
@@ -22794,7 +23151,7 @@ async function selectExitVtxos(opts) {
22794
23151
  `no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
22795
23152
  );
22796
23153
  }
22797
- const handler = chunkEBCWETZM_cjs.contractHandlers.get(contract.type);
23154
+ const handler = chunkCFOIHLON_cjs.contractHandlers.get(contract.type);
22798
23155
  if (!handler) {
22799
23156
  throw new Error(`no contract handler registered for type '${contract.type}'`);
22800
23157
  }
@@ -22824,7 +23181,7 @@ async function computeExitLayout(opts, feeRate) {
22824
23181
  if (pendingNodes.length > 0) {
22825
23182
  const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
22826
23183
  for (const psbt of txs) {
22827
- psbts.set(chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
23184
+ psbts.set(chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
22828
23185
  }
22829
23186
  }
22830
23187
  const childVsize = Number(
@@ -22852,7 +23209,7 @@ async function computeExitLayout(opts, feeRate) {
22852
23209
  try {
22853
23210
  const resolved = await resolveUnilateralPath({
22854
23211
  vtxo,
22855
- scriptHex: base.hex.encode(chunk3LDVNVBW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
23212
+ scriptHex: base.hex.encode(chunkVVFCCNU2_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
22856
23213
  contractRepository: wallet.contractRepository,
22857
23214
  walletDescriptor,
22858
23215
  currentTime: Date.now()
@@ -22871,7 +23228,7 @@ async function computeExitLayout(opts, feeRate) {
22871
23228
  });
22872
23229
  continue;
22873
23230
  }
22874
- const t = chunk3LDVNVBW_cjs.sequenceToTimelock(resolved.selection.sequence);
23231
+ const t = chunkVVFCCNU2_cjs.sequenceToTimelock(resolved.selection.sequence);
22875
23232
  const delay = { type: t.type, value: Number(t.value) };
22876
23233
  infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
22877
23234
  sweeps.push({ vtxo, resolved, sweepFee, delay });
@@ -22978,7 +23335,7 @@ var Executor = class {
22978
23335
  constructor(pkg, provider, opts) {
22979
23336
  this.pkg = pkg;
22980
23337
  this.provider = provider;
22981
- chunk3LDVNVBW_cjs.assertTimerMs("pollIntervalMs", opts?.pollIntervalMs);
23338
+ chunkVVFCCNU2_cjs.assertTimerMs("pollIntervalMs", opts?.pollIntervalMs);
22982
23339
  this.pollIntervalMs = opts?.pollIntervalMs ?? 5e3;
22983
23340
  this.feeWallet = opts?.feeWallet;
22984
23341
  this.signal = opts?.signal;
@@ -23273,7 +23630,7 @@ async function prepare(opts) {
23273
23630
  txid: sweep.vtxo.txid,
23274
23631
  vout: sweep.vtxo.vout,
23275
23632
  value: sweep.vtxo.value,
23276
- pkScript: chunk3LDVNVBW_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
23633
+ pkScript: chunkVVFCCNU2_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
23277
23634
  },
23278
23635
  path: sweep.resolved.selection,
23279
23636
  outputAddress: opts.sweepAddress,
@@ -23362,7 +23719,7 @@ async function prepare(opts) {
23362
23719
  if (newFee <= splitterFee) break;
23363
23720
  splitterFee = newFee;
23364
23721
  }
23365
- const splitter = new chunk3LDVNVBW_cjs.Transaction({ version: 2 });
23722
+ const splitter = new chunkVVFCCNU2_cjs.Transaction({ version: 2 });
23366
23723
  for (const coin of selected.inputs) {
23367
23724
  splitter.addInput({
23368
23725
  txid: coin.txid,
@@ -23501,44 +23858,44 @@ var UnilateralExit = {
23501
23858
 
23502
23859
  // src/arkade/index.ts
23503
23860
  var arkade_exports = {};
23504
- chunk3LDVNVBW_cjs.__export(arkade_exports, {
23505
- ARKADE_OP: () => chunkEBCWETZM_cjs.ARKADE_OP,
23506
- ARKADE_OPCODES: () => chunkEBCWETZM_cjs.ARKADE_OPCODES,
23507
- ARKADE_OPCODE_NAMES: () => chunkEBCWETZM_cjs.ARKADE_OPCODE_NAMES,
23508
- ARKADE_OPCODE_VALUES: () => chunkEBCWETZM_cjs.ARKADE_OPCODE_VALUES,
23509
- ARKADE_OPS: () => chunkEBCWETZM_cjs.ARKADE_OPS,
23861
+ chunkVVFCCNU2_cjs.__export(arkade_exports, {
23862
+ ARKADE_OP: () => chunkCFOIHLON_cjs.ARKADE_OP,
23863
+ ARKADE_OPCODES: () => chunkCFOIHLON_cjs.ARKADE_OPCODES,
23864
+ ARKADE_OPCODE_NAMES: () => chunkCFOIHLON_cjs.ARKADE_OPCODE_NAMES,
23865
+ ARKADE_OPCODE_VALUES: () => chunkCFOIHLON_cjs.ARKADE_OPCODE_VALUES,
23866
+ ARKADE_OPS: () => chunkCFOIHLON_cjs.ARKADE_OPS,
23510
23867
  Arkade: () => Arkade,
23511
23868
  ArkadeContract: () => ArkadeContract,
23512
- ArkadeProgramScript: () => chunkEBCWETZM_cjs.ArkadeProgramScript,
23513
- ArkadeScript: () => chunkEBCWETZM_cjs.ArkadeScript,
23869
+ ArkadeProgramScript: () => chunkCFOIHLON_cjs.ArkadeProgramScript,
23870
+ ArkadeScript: () => chunkCFOIHLON_cjs.ArkadeScript,
23514
23871
  ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
23515
- BigNum: () => chunkEBCWETZM_cjs.bignum_exports,
23872
+ BigNum: () => chunkCFOIHLON_cjs.bignum_exports,
23516
23873
  OP: () => btcSigner.OP,
23517
- OPCODE_NAMES: () => chunkEBCWETZM_cjs.OPCODE_NAMES,
23518
- OPCODE_VALUES: () => chunkEBCWETZM_cjs.OPCODE_VALUES,
23519
- SUPPORTED_PROGRAM_VERSION: () => chunkEBCWETZM_cjs.SUPPORTED_PROGRAM_VERSION,
23874
+ OPCODE_NAMES: () => chunkCFOIHLON_cjs.OPCODE_NAMES,
23875
+ OPCODE_VALUES: () => chunkCFOIHLON_cjs.OPCODE_VALUES,
23876
+ SUPPORTED_PROGRAM_VERSION: () => chunkCFOIHLON_cjs.SUPPORTED_PROGRAM_VERSION,
23520
23877
  Script: () => btcSigner.Script,
23521
- arkadeScriptHash: () => chunkEBCWETZM_cjs.arkadeScriptHash,
23522
- arkadeWitnessHash: () => chunkEBCWETZM_cjs.arkadeWitnessHash,
23523
- asmToBytes: () => chunkEBCWETZM_cjs.asmToBytes,
23524
- bytesToASM: () => chunkEBCWETZM_cjs.bytesToASM,
23525
- computeArkadeScriptPublicKey: () => chunkEBCWETZM_cjs.computeArkadeScriptPublicKey,
23878
+ arkadeScriptHash: () => chunkCFOIHLON_cjs.arkadeScriptHash,
23879
+ arkadeWitnessHash: () => chunkCFOIHLON_cjs.arkadeWitnessHash,
23880
+ asmToBytes: () => chunkCFOIHLON_cjs.asmToBytes,
23881
+ bytesToASM: () => chunkCFOIHLON_cjs.bytesToASM,
23882
+ computeArkadeScriptPublicKey: () => chunkCFOIHLON_cjs.computeArkadeScriptPublicKey,
23526
23883
  createArkadeBatchHandler: () => createArkadeBatchHandler,
23527
- deserializeArkadeContractParams: () => chunkEBCWETZM_cjs.deserializeArkadeContractParams,
23528
- fromASM: () => chunkEBCWETZM_cjs.fromASM,
23529
- getOpcodeName: () => chunkEBCWETZM_cjs.getOpcodeName,
23530
- getOpcodeValue: () => chunkEBCWETZM_cjs.getOpcodeValue,
23884
+ deserializeArkadeContractParams: () => chunkCFOIHLON_cjs.deserializeArkadeContractParams,
23885
+ fromASM: () => chunkCFOIHLON_cjs.fromASM,
23886
+ getOpcodeName: () => chunkCFOIHLON_cjs.getOpcodeName,
23887
+ getOpcodeValue: () => chunkCFOIHLON_cjs.getOpcodeValue,
23531
23888
  isContractArtifact: () => isContractArtifact,
23532
- parseArtifact: () => chunkEBCWETZM_cjs.parseArtifact,
23889
+ parseArtifact: () => chunkCFOIHLON_cjs.parseArtifact,
23533
23890
  programFromArtifact: () => programFromArtifact,
23534
- resolveAsm: () => chunkEBCWETZM_cjs.resolveAsm,
23535
- serializeArkadeContractParams: () => chunkEBCWETZM_cjs.serializeArkadeContractParams,
23536
- stringifyArtifact: () => chunkEBCWETZM_cjs.stringifyArtifact,
23537
- toASM: () => chunkEBCWETZM_cjs.toASM,
23538
- validateProgram: () => chunkEBCWETZM_cjs.validateProgram,
23539
- witnessRefToBytes: () => chunkEBCWETZM_cjs.witnessRefToBytes
23891
+ resolveAsm: () => chunkCFOIHLON_cjs.resolveAsm,
23892
+ serializeArkadeContractParams: () => chunkCFOIHLON_cjs.serializeArkadeContractParams,
23893
+ stringifyArtifact: () => chunkCFOIHLON_cjs.stringifyArtifact,
23894
+ toASM: () => chunkCFOIHLON_cjs.toASM,
23895
+ validateProgram: () => chunkCFOIHLON_cjs.validateProgram,
23896
+ witnessRefToBytes: () => chunkCFOIHLON_cjs.witnessRefToBytes
23540
23897
  });
23541
- var isVtxoCoin = (input) => chunk3LDVNVBW_cjs.isVirtualCoin(input);
23898
+ var isVtxoCoin = (input) => chunkVVFCCNU2_cjs.isVirtualCoin(input);
23542
23899
  function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients, batchExpiryPolicy) {
23543
23900
  let batchId;
23544
23901
  let sweepTapTreeRoot;
@@ -23559,23 +23916,23 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
23559
23916
  );
23560
23917
  await arkProvider.confirmRegistration(intentId);
23561
23918
  batchId = event.id;
23562
- const sweepTapscript = chunk3LDVNVBW_cjs.CSVMultisigTapscript.encode({
23919
+ const sweepTapscript = chunkVVFCCNU2_cjs.CSVMultisigTapscript.encode({
23563
23920
  timelock,
23564
- pubkeys: [chunkEBCWETZM_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
23921
+ pubkeys: [chunkCFOIHLON_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
23565
23922
  }).script;
23566
23923
  sweepTapTreeRoot = payment_js.tapLeafHash(sweepTapscript);
23567
23924
  return { skip: false };
23568
23925
  },
23569
23926
  onTreeSigningStarted: async (event, vtxoTree) => {
23570
23927
  const signerPubKey = await session.getPublicKey();
23571
- const xonlySignerPubKey = chunkEBCWETZM_cjs.toXOnly(signerPubKey, "signer key");
23928
+ const xonlySignerPubKey = chunkCFOIHLON_cjs.toXOnly(signerPubKey, "signer key");
23572
23929
  const xOnlyPubkeys = event.cosignersPublicKeys.map(
23573
- (k) => base.hex.encode(chunkEBCWETZM_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
23930
+ (k) => base.hex.encode(chunkCFOIHLON_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
23574
23931
  );
23575
23932
  if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
23576
23933
  return { skip: true };
23577
23934
  }
23578
- const commitmentTx = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
23935
+ const commitmentTx = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
23579
23936
  validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
23580
23937
  if (recipients && recipients.length > 0) {
23581
23938
  validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
@@ -23613,7 +23970,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
23613
23970
  if (connectorTree) {
23614
23971
  validateConnectorsTxGraph(event.commitmentTx, connectorTree);
23615
23972
  }
23616
- let commitmentPsbt = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
23973
+ let commitmentPsbt = chunkVVFCCNU2_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
23617
23974
  assertFinalCommitmentMatchesValidated(
23618
23975
  commitmentPsbt,
23619
23976
  validatedCommitmentTxid,
@@ -23655,7 +24012,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
23655
24012
  boardingIndices.push(boardingIdx);
23656
24013
  continue;
23657
24014
  }
23658
- if (!chunk3LDVNVBW_cjs.requiresForfeit(input) || isSubdust(input, info.dust)) {
24015
+ if (!chunkVVFCCNU2_cjs.requiresForfeit(input) || isSubdust(input, info.dust)) {
23659
24016
  continue;
23660
24017
  }
23661
24018
  if (connectorIndex >= connectorLeaves.length) {
@@ -23676,7 +24033,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
23676
24033
  index: input.vout,
23677
24034
  witnessUtxo: {
23678
24035
  amount: BigInt(input.value),
23679
- script: chunk3LDVNVBW_cjs.VtxoScript.decode(input.tapTree).pkScript
24036
+ script: chunkVVFCCNU2_cjs.VtxoScript.decode(input.tapTree).pkScript
23680
24037
  },
23681
24038
  sighashType: btcSigner.SigHash.DEFAULT,
23682
24039
  tapLeafScript: [input.forfeitTapLeafScript]
@@ -23821,7 +24178,7 @@ function flatten(param, structs, stack = []) {
23821
24178
  function opcodeToken(token) {
23822
24179
  const base = token.slice(3);
23823
24180
  const name = base === "0" || /^([1-9]|1[0-6])$/.test(base) ? token : base;
23824
- if (!Object.hasOwn(chunkEBCWETZM_cjs.ARKADE_OPS, name)) {
24181
+ if (!Object.hasOwn(chunkCFOIHLON_cjs.ARKADE_OPS, name)) {
23825
24182
  fail(`opcode '${token}' is not in this SDK's table`);
23826
24183
  }
23827
24184
  return name;
@@ -23868,7 +24225,7 @@ function providedWitness(witness) {
23868
24225
  }
23869
24226
  function csvTimelock(leafName, operand) {
23870
24227
  if (typeof operand === "string") return { type: "sequence", value: operand };
23871
- const timelock = chunk3LDVNVBW_cjs.sequenceToCanonicalTimelock(operand);
24228
+ const timelock = chunkVVFCCNU2_cjs.sequenceToCanonicalTimelock(operand);
23872
24229
  if (!timelock) {
23873
24230
  fail(`leaf '${leafName}': CSV literal ${operand} is not a canonical BIP68 sequence`);
23874
24231
  }
@@ -23987,7 +24344,7 @@ function programFromArtifact(artifact) {
23987
24344
  const paramNames = /* @__PURE__ */ new Set();
23988
24345
  for (const param of params) claim(paramNames, param.name, "program parameter");
23989
24346
  return {
23990
- version: chunkEBCWETZM_cjs.SUPPORTED_PROGRAM_VERSION,
24347
+ version: chunkCFOIHLON_cjs.SUPPORTED_PROGRAM_VERSION,
23991
24348
  name: artifact.contractName,
23992
24349
  params,
23993
24350
  functions
@@ -24028,16 +24385,16 @@ var Arkade = class _Arkade {
24028
24385
  /** Connect and resolve the server key, checkpoint closure and (if present) the co-signer key. */
24029
24386
  static async connect(opts) {
24030
24387
  const info = await opts.arkade.getInfo();
24031
- const serverKey = chunkEBCWETZM_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
24032
- const checkpoint = chunk3LDVNVBW_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
24033
- const network = opts.network ?? (Object.hasOwn(chunk3LDVNVBW_cjs.networks, info.network) ? chunk3LDVNVBW_cjs.getNetwork(info.network) : chunk3LDVNVBW_cjs.DEFAULT_NETWORK);
24388
+ const serverKey = chunkCFOIHLON_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
24389
+ const checkpoint = chunkVVFCCNU2_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
24390
+ const network = opts.network ?? (Object.hasOwn(chunkVVFCCNU2_cjs.networks, info.network) ? chunkVVFCCNU2_cjs.getNetwork(info.network) : chunkVVFCCNU2_cjs.DEFAULT_NETWORK);
24034
24391
  let emulatorKey;
24035
24392
  if (opts.emulator) {
24036
- emulatorKey = base.hex.decode(chunk3LDVNVBW_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
24393
+ emulatorKey = base.hex.decode(chunkVVFCCNU2_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
24037
24394
  }
24038
24395
  let userKey;
24039
24396
  if (opts.identity) {
24040
- userKey = chunkEBCWETZM_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
24397
+ userKey = chunkCFOIHLON_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
24041
24398
  }
24042
24399
  return new _Arkade({
24043
24400
  arkProvider: opts.arkade,
@@ -24060,7 +24417,7 @@ var Arkade = class _Arkade {
24060
24417
  * explicit args win.
24061
24418
  */
24062
24419
  contract(program, args = {}) {
24063
- const declared = (program.params ?? []).map(chunkEBCWETZM_cjs.inputName);
24420
+ const declared = (program.params ?? []).map(chunkCFOIHLON_cjs.inputName);
24064
24421
  if (declared.includes("server") && args.server === void 0) {
24065
24422
  args = { ...args, server: this.serverKey };
24066
24423
  }
@@ -24080,7 +24437,7 @@ var ArkadeContract = class _ArkadeContract {
24080
24437
  userKey: client.userKey,
24081
24438
  emulatorKey: client.emulatorKey
24082
24439
  };
24083
- this.vtxoScript = new chunkEBCWETZM_cjs.ArkadeProgramScript(program, args, this.keys);
24440
+ this.vtxoScript = new chunkCFOIHLON_cjs.ArkadeProgramScript(program, args, this.keys);
24084
24441
  this.tapTree = this.vtxoScript.encode();
24085
24442
  this.compiled = this.vtxoScript.compiled;
24086
24443
  }
@@ -24105,7 +24462,7 @@ var ArkadeContract = class _ArkadeContract {
24105
24462
  `ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
24106
24463
  );
24107
24464
  }
24108
- const typed = chunkEBCWETZM_cjs.deserializeArkadeContractParams(contract.params);
24465
+ const typed = chunkCFOIHLON_cjs.deserializeArkadeContractParams(contract.params);
24109
24466
  return new _ArkadeContract(client, typed.program, typed.args, {
24110
24467
  serverKey: typed.serverKey,
24111
24468
  userKey: typed.userKey,
@@ -24141,7 +24498,7 @@ var ArkadeContract = class _ArkadeContract {
24141
24498
  toContractParams() {
24142
24499
  return {
24143
24500
  type: "arkade",
24144
- params: chunkEBCWETZM_cjs.serializeArkadeContractParams({
24501
+ params: chunkCFOIHLON_cjs.serializeArkadeContractParams({
24145
24502
  program: this.program,
24146
24503
  args: this.args,
24147
24504
  serverKey: this.keys.serverKey,
@@ -24181,17 +24538,17 @@ var ArkadeContract = class _ArkadeContract {
24181
24538
  const [registered] = await manager.getContracts({ script: scriptHex });
24182
24539
  if (registered) {
24183
24540
  const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
24184
- return (withVtxos?.vtxos ?? []).filter((v) => !chunk3LDVNVBW_cjs.isVtxoSpent(v) && !v.isUnrolled);
24541
+ return (withVtxos?.vtxos ?? []).filter((v) => !chunkVVFCCNU2_cjs.isVtxoSpent(v) && !v.isUnrolled);
24185
24542
  }
24186
24543
  }
24187
24544
  if (!this.client.indexer) {
24188
24545
  throw new Error("ArkadeContract.getUtxos: an indexer is required");
24189
24546
  }
24190
- const { vtxos } = await chunk3LDVNVBW_cjs.getNormalizedVtxos(this.client.indexer, {
24547
+ const { vtxos } = await chunkVVFCCNU2_cjs.getNormalizedVtxos(this.client.indexer, {
24191
24548
  scripts: [scriptHex],
24192
24549
  spendableOnly: true
24193
24550
  });
24194
- return vtxos.filter((v) => !chunk3LDVNVBW_cjs.isVtxoSpent(v) && !v.isUnrolled);
24551
+ return vtxos.filter((v) => !chunkVVFCCNU2_cjs.isVtxoSpent(v) && !v.isUnrolled);
24195
24552
  }
24196
24553
  /** Total spendable balance (requires an indexer). */
24197
24554
  async getBalance() {
@@ -24295,7 +24652,7 @@ var ArkadeTransactionBuilder = class {
24295
24652
  this.contract.client.checkpoint
24296
24653
  );
24297
24654
  if (coin.sourceTx) {
24298
- chunk3LDVNVBW_cjs.setArkPsbtField(arkTx, 0, chunk3LDVNVBW_cjs.PrevArkTxField, coin.sourceTx);
24655
+ chunkVVFCCNU2_cjs.setArkPsbtField(arkTx, 0, chunkVVFCCNU2_cjs.PrevArkTxField, coin.sourceTx);
24299
24656
  }
24300
24657
  if (this.fn.arkadeScript) {
24301
24658
  const indexer = this.contract.client.indexer;
@@ -24312,8 +24669,8 @@ var ArkadeTransactionBuilder = class {
24312
24669
  }
24313
24670
  const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
24314
24671
  if (condition.length > 0) {
24315
- chunk3LDVNVBW_cjs.setArkPsbtField(arkTx, 0, chunk3LDVNVBW_cjs.ConditionWitness, condition);
24316
- chunk3LDVNVBW_cjs.setArkPsbtField(checkpoints[0], 0, chunk3LDVNVBW_cjs.ConditionWitness, condition);
24672
+ chunkVVFCCNU2_cjs.setArkPsbtField(arkTx, 0, chunkVVFCCNU2_cjs.ConditionWitness, condition);
24673
+ chunkVVFCCNU2_cjs.setArkPsbtField(checkpoints[0], 0, chunkVVFCCNU2_cjs.ConditionWitness, condition);
24317
24674
  }
24318
24675
  const packets = [];
24319
24676
  if (this.assetSpecs.length > 0) {
@@ -24343,22 +24700,9 @@ var ArkadeTransactionBuilder = class {
24343
24700
  if (!client.emulator) {
24344
24701
  throw new Error("covenant spends require an `emulator` on the Arkade client");
24345
24702
  }
24346
- const signedArk2 = await this.signArk(arkTx, userInputs);
24347
- const signedCps = userInputs.length > 0 ? await Promise.all(
24348
- checkpoints.map(
24349
- (c, i) => userInputs.includes(i) ? client.identity.sign(c, [0]) : c
24350
- )
24351
- ) : checkpoints;
24352
- const res2 = await client.emulator.submitTx(
24353
- base.base64.encode(signedArk2.toPSBT()),
24354
- signedCps.map((c) => base.base64.encode(c.toPSBT()))
24355
- );
24356
- const txid = chunk3LDVNVBW_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
24357
- return {
24358
- txid,
24359
- signedArkTx: res2.signedArkTx,
24360
- signedCheckpointTxs: res2.signedCheckpointTxs
24361
- };
24703
+ return submitViaEmulator(client.emulator, { arkTx, checkpoints }, client.identity, {
24704
+ inputIndexes: userInputs
24705
+ });
24362
24706
  }
24363
24707
  if (!client.identity) {
24364
24708
  throw new Error("a signing identity is required for non-covenant spends");
@@ -24418,23 +24762,23 @@ var ArkadeTransactionBuilder = class {
24418
24762
  }
24419
24763
  buildAssetPacket() {
24420
24764
  const groups = this.assetSpecs.map((s) => {
24421
- const id = typeof s.assetId === "string" ? chunkFN27VWDK_cjs.AssetId.fromString(s.assetId) : chunkFN27VWDK_cjs.AssetId.fromBytes(s.assetId);
24422
- return chunkFN27VWDK_cjs.AssetGroup.create(
24765
+ const id = typeof s.assetId === "string" ? chunkFEBAG2K2_cjs.AssetId.fromString(s.assetId) : chunkFEBAG2K2_cjs.AssetId.fromBytes(s.assetId);
24766
+ return chunkFEBAG2K2_cjs.AssetGroup.create(
24423
24767
  id,
24424
24768
  null,
24425
- s.inputs.map((i) => chunkFN27VWDK_cjs.AssetInput.create(i.vin, i.amount)),
24426
- s.outputs.map((o) => chunkFN27VWDK_cjs.AssetOutput.create(o.vout, o.amount)),
24427
- (s.metadata ?? []).map((m) => chunkFN27VWDK_cjs.Metadata.create(m.key, m.value))
24769
+ s.inputs.map((i) => chunkFEBAG2K2_cjs.AssetInput.create(i.vin, i.amount)),
24770
+ s.outputs.map((o) => chunkFEBAG2K2_cjs.AssetOutput.create(o.vout, o.amount)),
24771
+ (s.metadata ?? []).map((m) => chunkFEBAG2K2_cjs.Metadata.create(m.key, m.value))
24428
24772
  );
24429
24773
  });
24430
- return chunkFN27VWDK_cjs.Packet.create(groups);
24774
+ return chunkFEBAG2K2_cjs.Packet.create(groups);
24431
24775
  }
24432
24776
  witnessBytes(ref) {
24433
- return chunkEBCWETZM_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
24777
+ return chunkCFOIHLON_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
24434
24778
  }
24435
24779
  };
24436
24780
  function bindInputs(fn, callArgs) {
24437
- const names = (fn.def.inputs ?? []).map(chunkEBCWETZM_cjs.inputName);
24781
+ const names = (fn.def.inputs ?? []).map(chunkCFOIHLON_cjs.inputName);
24438
24782
  if (callArgs.length !== names.length) {
24439
24783
  throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
24440
24784
  }
@@ -24848,17 +25192,17 @@ var walletFeeSource = (wallet) => async () => (await wallet.arkProvider.getInfo(
24848
25192
  function offchainInputFees(vtxos, fees) {
24849
25193
  const estimator = new Estimator(fees?.intentFee ?? {});
24850
25194
  return vtxos.reduce(
24851
- (total, vtxo) => total + estimator.evalOffchainInput(chunk3LDVNVBW_cjs.toOffchainInputFeeParams(vtxo)).satoshis,
25195
+ (total, vtxo) => total + estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo)).satoshis,
24852
25196
  0
24853
25197
  );
24854
25198
  }
24855
25199
  async function changeOutputFee(wallet, inputs, needed, fees) {
24856
25200
  const estimator = new Estimator(fees?.intentFee ?? {});
24857
25201
  const net = inputs.reduce(
24858
- (total, vtxo) => total + BigInt(vtxo.value) - BigInt(estimator.evalOffchainInput(chunk3LDVNVBW_cjs.toOffchainInputFeeParams(vtxo)).satoshis),
25202
+ (total, vtxo) => total + BigInt(vtxo.value) - BigInt(estimator.evalOffchainInput(chunkVVFCCNU2_cjs.toOffchainInputFeeParams(vtxo)).satoshis),
24859
25203
  0n
24860
25204
  );
24861
- const script = base.hex.encode(chunk3LDVNVBW_cjs.ArkAddress.decode(await wallet.getAddress()).pkScript);
25205
+ const script = base.hex.encode(chunkVVFCCNU2_cjs.ArkAddress.decode(await wallet.getAddress()).pkScript);
24862
25206
  return changeAfterOutputFee(
24863
25207
  net - needed,
24864
25208
  (amount) => BigInt(estimator.evalOffchainOutput({ amount, script }).satoshis)
@@ -24934,6 +25278,7 @@ exports.AmbiguousRouteError = AmbiguousRouteError;
24934
25278
  exports.ArkNote = ArkNote;
24935
25279
  exports.ArkadeCash = ArkadeCash;
24936
25280
  exports.ArkadeCashCreateError = ArkadeCashCreateError;
25281
+ exports.ArkadeCashOperatorMismatchError = ArkadeCashOperatorMismatchError;
24937
25282
  exports.AssetManager = AssetManager;
24938
25283
  exports.BIP21 = BIP21;
24939
25284
  exports.BIP21Error = BIP21Error;
@@ -25013,6 +25358,7 @@ exports.UnannotatableInputError = UnannotatableInputError;
25013
25358
  exports.UnilateralExit = UnilateralExit;
25014
25359
  exports.UnknownPacket = UnknownPacket;
25015
25360
  exports.VtxoManager = VtxoManager;
25361
+ exports.VtxoReservedError = VtxoReservedError;
25016
25362
  exports.Wallet = Wallet2;
25017
25363
  exports.WalletCannotAllocateAddressError = WalletCannotAllocateAddressError;
25018
25364
  exports.WalletCannotSignError = WalletCannotSignError;
@@ -25152,6 +25498,7 @@ exports.signAndSubmitOffchainTx = signAndSubmitOffchainTx;
25152
25498
  exports.signerSetFromInfo = signerSetFromInfo;
25153
25499
  exports.signingDescriptorIndex = signingDescriptorIndex;
25154
25500
  exports.strictSigningDescriptorIndex = strictSigningDescriptorIndex;
25501
+ exports.submitViaEmulator = submitViaEmulator;
25155
25502
  exports.toXOnlySignerHex = toXOnlySignerHex;
25156
25503
  exports.tryResolveSendAmount = tryResolveSendAmount;
25157
25504
  exports.utxoEntries = utxoEntries;
@@ -25163,5 +25510,5 @@ exports.waitForIncomingFunds = waitForIncomingFunds;
25163
25510
  exports.walletFeeSource = walletFeeSource;
25164
25511
  exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
25165
25512
  exports.withPrevTxs = withPrevTxs;
25166
- //# sourceMappingURL=chunk-IX5XSR74.cjs.map
25167
- //# sourceMappingURL=chunk-IX5XSR74.cjs.map
25513
+ //# sourceMappingURL=chunk-B2YMUJD5.cjs.map
25514
+ //# sourceMappingURL=chunk-B2YMUJD5.cjs.map