@arkade-os/sdk 0.4.67 → 0.4.69

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 (78) hide show
  1. package/README.md +38 -0
  2. package/dist/adapters/expo.cjs +5 -5
  3. package/dist/adapters/expo.d.cts +2 -2
  4. package/dist/adapters/expo.d.ts +2 -2
  5. package/dist/adapters/expo.js +3 -3
  6. package/dist/adapters/indexedDB.cjs +5 -5
  7. package/dist/adapters/indexedDB.js +4 -4
  8. package/dist/{asyncStorageTaskQueue-Za-e_zMk.d.ts → asyncStorageTaskQueue-BgUJN-3X.d.ts} +2 -2
  9. package/dist/{asyncStorageTaskQueue-LTpeXYaD.d.cts → asyncStorageTaskQueue-Cstx6hS7.d.cts} +2 -2
  10. package/dist/{chunk-6TAQF6EV.js → chunk-2PPL3O7Z.js} +72 -120
  11. package/dist/chunk-2PPL3O7Z.js.map +1 -0
  12. package/dist/{chunk-2JV4VQ7C.cjs → chunk-5MLC2HU3.cjs} +17 -3
  13. package/dist/chunk-5MLC2HU3.cjs.map +1 -0
  14. package/dist/{chunk-MJUTO3PY.cjs → chunk-EBYCTLET.cjs} +832 -488
  15. package/dist/chunk-EBYCTLET.cjs.map +1 -0
  16. package/dist/{chunk-CO3KKSWM.cjs → chunk-GVHUHTRH.cjs} +17 -17
  17. package/dist/{chunk-CO3KKSWM.cjs.map → chunk-GVHUHTRH.cjs.map} +1 -1
  18. package/dist/{chunk-YDRZDZPP.cjs → chunk-HQ4DMGA4.cjs} +10 -10
  19. package/dist/{chunk-YDRZDZPP.cjs.map → chunk-HQ4DMGA4.cjs.map} +1 -1
  20. package/dist/{chunk-3WIWNE4P.js → chunk-L5SCQYHF.js} +16 -4
  21. package/dist/chunk-L5SCQYHF.js.map +1 -0
  22. package/dist/{chunk-MZFUZUTQ.js → chunk-MNMPGEK2.js} +4 -4
  23. package/dist/{chunk-MZFUZUTQ.js.map → chunk-MNMPGEK2.js.map} +1 -1
  24. package/dist/{chunk-AEWJU6NZ.js → chunk-TA7XLEP2.js} +411 -68
  25. package/dist/chunk-TA7XLEP2.js.map +1 -0
  26. package/dist/{chunk-OIZ2V2VD.cjs → chunk-WIFL5QYZ.cjs} +118 -166
  27. package/dist/chunk-WIFL5QYZ.cjs.map +1 -0
  28. package/dist/{chunk-EALWOVHK.js → chunk-XLWDX7QZ.js} +4 -4
  29. package/dist/{chunk-EALWOVHK.js.map → chunk-XLWDX7QZ.js.map} +1 -1
  30. package/dist/{chunk-R2YAMONM.cjs → chunk-XQPN5YP2.cjs} +17 -17
  31. package/dist/{chunk-R2YAMONM.cjs.map → chunk-XQPN5YP2.cjs.map} +1 -1
  32. package/dist/{chunk-X3VEMUVV.js → chunk-YG7T6LI3.js} +3 -3
  33. package/dist/{chunk-X3VEMUVV.js.map → chunk-YG7T6LI3.js.map} +1 -1
  34. package/dist/contracts/handlers/index.cjs +9 -9
  35. package/dist/contracts/handlers/index.d.cts +3 -3
  36. package/dist/contracts/handlers/index.d.ts +3 -3
  37. package/dist/contracts/handlers/index.js +2 -2
  38. package/dist/{delegate-cdmzb2f9.d.ts → delegate-BPdzTbwN.d.ts} +1 -1
  39. package/dist/{delegate-Bz2e2zXY.d.cts → delegate-DrwIar11.d.cts} +1 -1
  40. package/dist/{hdWalletCapable-Hi12xjCJ.d.ts → hdWalletCapable-D4WH35z0.d.cts} +49 -5
  41. package/dist/{hdWalletCapable-BSjuUYOO.d.cts → hdWalletCapable-DyxCiNVE.d.ts} +49 -5
  42. package/dist/{index-BiACuWaf.d.ts → index-BqhpAqqj.d.cts} +96 -119
  43. package/dist/{index-D2GjZxBr.d.cts → index-TZJvbIaA.d.ts} +96 -119
  44. package/dist/{index-DU5o_hz7.d.cts → index-dWRqYSdS.d.cts} +70 -2
  45. package/dist/{index-DU5o_hz7.d.ts → index-dWRqYSdS.d.ts} +70 -2
  46. package/dist/index.cjs +297 -289
  47. package/dist/index.d.cts +29 -8
  48. package/dist/index.d.ts +29 -8
  49. package/dist/index.js +4 -4
  50. package/dist/repositories/realm/index.cjs +19 -19
  51. package/dist/repositories/realm/index.d.cts +2 -2
  52. package/dist/repositories/realm/index.d.ts +2 -2
  53. package/dist/repositories/realm/index.js +5 -5
  54. package/dist/repositories/sqlite/index.cjs +18 -18
  55. package/dist/repositories/sqlite/index.d.cts +2 -2
  56. package/dist/repositories/sqlite/index.d.ts +2 -2
  57. package/dist/repositories/sqlite/index.js +5 -5
  58. package/dist/{taskRunner-BZJMLQ6g.d.cts → taskRunner-CzYKyJ9c.d.cts} +2 -2
  59. package/dist/{taskRunner-DATaRQus.d.ts → taskRunner-D2fnbqYw.d.ts} +2 -2
  60. package/dist/wallet/expo/background.cjs +14 -14
  61. package/dist/wallet/expo/background.d.cts +3 -3
  62. package/dist/wallet/expo/background.d.ts +3 -3
  63. package/dist/wallet/expo/background.js +6 -6
  64. package/dist/wallet/expo/index.cjs +14 -14
  65. package/dist/wallet/expo/index.d.cts +4 -4
  66. package/dist/wallet/expo/index.d.ts +4 -4
  67. package/dist/wallet/expo/index.js +5 -5
  68. package/dist/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-2JV4VQ7C.cjs.map +0 -1
  74. package/dist/chunk-3WIWNE4P.js.map +0 -1
  75. package/dist/chunk-6TAQF6EV.js.map +0 -1
  76. package/dist/chunk-AEWJU6NZ.js.map +0 -1
  77. package/dist/chunk-MJUTO3PY.cjs.map +0 -1
  78. package/dist/chunk-OIZ2V2VD.cjs.map +0 -1
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkCO3KKSWM_cjs = require('./chunk-CO3KKSWM.cjs');
4
- var chunkOIZ2V2VD_cjs = require('./chunk-OIZ2V2VD.cjs');
5
- var chunk2JV4VQ7C_cjs = require('./chunk-2JV4VQ7C.cjs');
3
+ var chunkGVHUHTRH_cjs = require('./chunk-GVHUHTRH.cjs');
4
+ var chunkWIFL5QYZ_cjs = require('./chunk-WIFL5QYZ.cjs');
5
+ var chunk5MLC2HU3_cjs = require('./chunk-5MLC2HU3.cjs');
6
6
  var chunk5BLDMQED_cjs = require('./chunk-5BLDMQED.cjs');
7
7
  var utils_js = require('@scure/btc-signer/utils.js');
8
8
  var btcSigner = require('@scure/btc-signer');
@@ -188,7 +188,7 @@ var TreeSignerSession = class _TreeSignerSession {
188
188
  noncesByPubkey.set(base.hex.encode(myPublicKey.subarray(1)), myNonce);
189
189
  const tx = this.graph.find(txid);
190
190
  if (!tx) throw new Error(`missing tx for txid ${txid}`);
191
- const cosigners = chunk2JV4VQ7C_cjs.getArkPsbtFields(tx.root, 0, chunk2JV4VQ7C_cjs.CosignerPublicKey).map(
191
+ const cosigners = chunk5MLC2HU3_cjs.getArkPsbtFields(tx.root, 0, chunk5MLC2HU3_cjs.CosignerPublicKey).map(
192
192
  (c) => base.hex.encode(c.key.subarray(1))
193
193
  // xonly pubkey
194
194
  );
@@ -240,7 +240,7 @@ var TreeSignerSession = class _TreeSignerSession {
240
240
  if (!aggNonce) throw new Error("missing aggregate nonce");
241
241
  const prevoutAmounts = [];
242
242
  const prevoutScripts = [];
243
- const cosigners = chunk2JV4VQ7C_cjs.getArkPsbtFields(g.root, 0, chunk2JV4VQ7C_cjs.CosignerPublicKey).map((c) => c.key);
243
+ const cosigners = chunk5MLC2HU3_cjs.getArkPsbtFields(g.root, 0, chunk5MLC2HU3_cjs.CosignerPublicKey).map((c) => c.key);
244
244
  const { finalKey } = aggregateKeys(cosigners, true, {
245
245
  taprootTweak: this.scriptRoot
246
246
  });
@@ -294,7 +294,7 @@ function getPrevOutput(finalKey, graph, sharedOutputAmount, tx) {
294
294
  script: pkScript
295
295
  };
296
296
  }
297
- var ALL_SIGHASH = Object.values(btcSigner.SigHash).filter((x) => typeof x === "number");
297
+ var ALLOWED_SIGHASH = [btcSigner.SigHash.DEFAULT, btcSigner.SigHash.ALL, btcSigner.SigHash.ALL_ANYONECANPAY];
298
298
  var SingleKey = class _SingleKey {
299
299
  key;
300
300
  constructor(key) {
@@ -323,8 +323,9 @@ var SingleKey = class _SingleKey {
323
323
  async sign(tx, inputIndexes) {
324
324
  const txCpy = tx.clone();
325
325
  if (!inputIndexes) {
326
+ chunk5MLC2HU3_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH);
326
327
  try {
327
- if (!txCpy.sign(this.key, ALL_SIGHASH)) {
328
+ if (!txCpy.sign(this.key, ALLOWED_SIGHASH)) {
328
329
  throw new Error("Failed to sign transaction");
329
330
  }
330
331
  } catch (e) {
@@ -335,7 +336,7 @@ var SingleKey = class _SingleKey {
335
336
  return txCpy;
336
337
  }
337
338
  for (const inputIndex of inputIndexes) {
338
- if (!txCpy.signIdx(this.key, inputIndex, ALL_SIGHASH)) {
339
+ if (!txCpy.signIdx(this.key, inputIndex, ALLOWED_SIGHASH)) {
339
340
  throw new Error(`Failed to sign input #${inputIndex}`);
340
341
  }
341
342
  }
@@ -400,7 +401,7 @@ var ReadonlySingleKey = class _ReadonlySingleKey {
400
401
  return Promise.resolve(this.publicKey);
401
402
  }
402
403
  };
403
- var ALL_SIGHASH2 = Object.values(btcSigner.SigHash).filter((x) => typeof x === "number");
404
+ var ALLOWED_SIGHASH2 = [btcSigner.SigHash.DEFAULT, btcSigner.SigHash.ALL, btcSigner.SigHash.ALL_ANYONECANPAY];
404
405
  var seedBytes = /* @__PURE__ */ new WeakMap();
405
406
  var mnemonicMeta = /* @__PURE__ */ new WeakMap();
406
407
  var SeedIdentity = class _SeedIdentity {
@@ -431,7 +432,7 @@ var SeedIdentity = class _SeedIdentity {
431
432
  let network;
432
433
  if ("descriptor" in opts && typeof opts.descriptor === "string") {
433
434
  descriptor = opts.descriptor;
434
- network = chunkOIZ2V2VD_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
435
+ network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
435
436
  } else {
436
437
  network = opts.isMainnet ?? true ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
437
438
  descriptor = descriptorsScure.scriptExpressions.trBIP32({
@@ -529,7 +530,7 @@ var SeedIdentity = class _SeedIdentity {
529
530
  * `StaticDescriptorProvider` for legacy single-key wallets.
530
531
  */
531
532
  isOurs(descriptor) {
532
- return chunkOIZ2V2VD_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
533
+ return chunkWIFL5QYZ_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
533
534
  }
534
535
  /**
535
536
  * Signs each request with the key derived from its descriptor.
@@ -578,7 +579,7 @@ var SeedIdentity = class _SeedIdentity {
578
579
  }
579
580
  // ── internal helpers ─────────────────────────────────────────────
580
581
  derivePrivateKeyForDescriptor(descriptor) {
581
- const network = chunkOIZ2V2VD_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
582
+ const network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
582
583
  const expansion = descriptorsScure.expand({ descriptor, network });
583
584
  if (expansion.isRanged) {
584
585
  throw new Error(
@@ -603,8 +604,9 @@ var SeedIdentity = class _SeedIdentity {
603
604
  signTxWithKey(tx, key, inputIndexes) {
604
605
  const txCpy = tx.clone();
605
606
  if (!inputIndexes) {
607
+ chunk5MLC2HU3_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH2);
606
608
  try {
607
- if (!txCpy.sign(key, ALL_SIGHASH2)) {
609
+ if (!txCpy.sign(key, ALLOWED_SIGHASH2)) {
608
610
  throw new Error("Failed to sign transaction");
609
611
  }
610
612
  } catch (e) {
@@ -614,7 +616,7 @@ var SeedIdentity = class _SeedIdentity {
614
616
  }
615
617
  } else {
616
618
  for (const idx of inputIndexes) {
617
- if (!txCpy.signIdx(key, idx, ALL_SIGHASH2)) {
619
+ if (!txCpy.signIdx(key, idx, ALLOWED_SIGHASH2)) {
618
620
  throw new Error(`Failed to sign input #${idx}`);
619
621
  }
620
622
  }
@@ -664,7 +666,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
664
666
  */
665
667
  descriptor;
666
668
  constructor(descriptor) {
667
- const network = chunkOIZ2V2VD_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
669
+ const network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
668
670
  let expansion;
669
671
  try {
670
672
  expansion = descriptorsScure.expand({ descriptor, network, index: 0 });
@@ -714,7 +716,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
714
716
  * `StaticDescriptorProvider` for legacy single-key wallets.
715
717
  */
716
718
  isOurs(descriptor) {
717
- return chunkOIZ2V2VD_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
719
+ return chunkWIFL5QYZ_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
718
720
  }
719
721
  };
720
722
  function serializeSeedOwnedSigningIdentity(identity) {
@@ -876,10 +878,10 @@ var DescriptorIdentity = class {
876
878
  this.base = base;
877
879
  }
878
880
  async xOnlyPublicKey() {
879
- return chunkOIZ2V2VD_cjs.deriveDescriptorLeafPubKey(this.descriptor);
881
+ return chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(this.descriptor);
880
882
  }
881
883
  async compressedPublicKey() {
882
- return chunkOIZ2V2VD_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
884
+ return chunkWIFL5QYZ_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
883
885
  }
884
886
  async sign(tx, inputIndexes) {
885
887
  const [signed] = await this.signer.signWithDescriptor([
@@ -947,12 +949,12 @@ var WalletCannotAllocateAddressError = class extends Error {
947
949
  };
948
950
  async function resolveDescriptorSigner(descriptor, identity, provider) {
949
951
  const owner = provider?.isOurs(descriptor) ? provider : isHDCapableIdentity(identity) && identity.isOurs(descriptor) ? identity : void 0;
950
- if (owner && chunkOIZ2V2VD_cjs.parseHDDescriptor(descriptor)) {
952
+ if (owner && chunkWIFL5QYZ_cjs.parseHDDescriptor(descriptor)) {
951
953
  return new DescriptorIdentity({ descriptor, signer: owner, base: identity });
952
954
  }
953
955
  let key;
954
956
  try {
955
- key = chunkOIZ2V2VD_cjs.deriveDescriptorLeafPubKey(descriptor);
957
+ key = chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor);
956
958
  } catch {
957
959
  throw new ForeignDescriptorError(descriptor);
958
960
  }
@@ -1327,14 +1329,14 @@ function buildSaltedPreimageMessage(xonly, salt) {
1327
1329
  }
1328
1330
  var PREIMAGE_INDEX = 0;
1329
1331
  function isPerArtifactDescriptor(descriptor) {
1330
- return chunkOIZ2V2VD_cjs.parseHDDescriptor(descriptor) !== null;
1332
+ return chunkWIFL5QYZ_cjs.parseHDDescriptor(descriptor) !== null;
1331
1333
  }
1332
1334
  async function provisionDescriptor(wallet) {
1333
1335
  const allocated = isHDAllocationCapable(wallet) ? await wallet.getNextSigningDescriptor() : void 0;
1334
- return allocated ?? await chunkOIZ2V2VD_cjs.identityDescriptor(wallet.identity);
1336
+ return allocated ?? await chunkWIFL5QYZ_cjs.identityDescriptor(wallet.identity);
1335
1337
  }
1336
1338
  async function provisionRefundKey(wallet) {
1337
- const descriptor = await chunkOIZ2V2VD_cjs.identityDescriptor(wallet.identity);
1339
+ const descriptor = await chunkWIFL5QYZ_cjs.identityDescriptor(wallet.identity);
1338
1340
  const signer = await contractSigner(wallet, descriptor);
1339
1341
  const pubkey = await signer.xOnlyPublicKey();
1340
1342
  const identityPubkey = await wallet.identity.xOnlyPublicKey();
@@ -1344,7 +1346,7 @@ async function provisionRefundKey(wallet) {
1344
1346
  );
1345
1347
  }
1346
1348
  const address = await wallet.getAddress();
1347
- const { pkScript } = chunk2JV4VQ7C_cjs.ArkAddress.decode(address);
1349
+ const { pkScript } = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
1348
1350
  return { descriptor, pubkey, pkScript, address };
1349
1351
  }
1350
1352
  async function provisionClaimSecret(wallet, opts = {}) {
@@ -1390,7 +1392,7 @@ async function contractSigner(wallet, descriptor) {
1390
1392
  const signer = isHDWalletCapable(wallet) ? await wallet.signerForDescriptor(descriptor) : wallet.identity;
1391
1393
  let expected;
1392
1394
  try {
1393
- expected = chunkOIZ2V2VD_cjs.deriveDescriptorLeafPubKey(descriptor);
1395
+ expected = chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor);
1394
1396
  } catch (cause) {
1395
1397
  throw new ForeignDescriptorError(descriptor, { cause });
1396
1398
  }
@@ -1609,14 +1611,14 @@ var RestDelegateProvider = class {
1609
1611
  */
1610
1612
  async delegate(intent, forfeitTxs, options) {
1611
1613
  const url = `${this.url}/v1/delegate`;
1612
- const response = await chunk2JV4VQ7C_cjs.baseFetch(url, {
1614
+ const response = await chunk5MLC2HU3_cjs.baseFetch(url, {
1613
1615
  method: "POST",
1614
1616
  headers: {
1615
1617
  "Content-Type": "application/json"
1616
1618
  },
1617
1619
  body: JSON.stringify({
1618
1620
  intent: {
1619
- message: chunk2JV4VQ7C_cjs.Intent.encodeMessage(intent.message),
1621
+ message: chunk5MLC2HU3_cjs.Intent.encodeMessage(intent.message),
1620
1622
  proof: intent.proof
1621
1623
  },
1622
1624
  forfeit_txs: forfeitTxs,
@@ -1636,7 +1638,7 @@ var RestDelegateProvider = class {
1636
1638
  */
1637
1639
  async getDelegateInfo() {
1638
1640
  const url = `${this.url}/v1/delegator/info`;
1639
- const response = await chunk2JV4VQ7C_cjs.rateGate.runHttp(url, () => chunk2JV4VQ7C_cjs.baseFetch(url));
1641
+ const response = await chunk5MLC2HU3_cjs.rateGate.runHttp(url, () => chunk5MLC2HU3_cjs.baseFetch(url));
1640
1642
  if (!response.ok) {
1641
1643
  const errorText2 = await response.text();
1642
1644
  throw new Error(`Failed to get delegate info: ${errorText2}`);
@@ -1661,7 +1663,7 @@ var ESPLORA_URL = {
1661
1663
  regtest: "http://localhost:3000/api"
1662
1664
  };
1663
1665
  var EsploraProvider = class {
1664
- constructor(baseUrl = ESPLORA_URL[chunk2JV4VQ7C_cjs.DEFAULT_NETWORK_NAME], opts) {
1666
+ constructor(baseUrl = ESPLORA_URL[chunk5MLC2HU3_cjs.DEFAULT_NETWORK_NAME], opts) {
1665
1667
  this.baseUrl = baseUrl;
1666
1668
  this.pollingInterval = opts?.pollingInterval ?? 15e3;
1667
1669
  this.forcePolling = opts?.forcePolling ?? false;
@@ -1669,15 +1671,25 @@ var EsploraProvider = class {
1669
1671
  baseUrl;
1670
1672
  pollingInterval;
1671
1673
  forcePolling;
1674
+ /**
1675
+ * Live {@link watchAddresses} subscriptions, keyed by their address set.
1676
+ *
1677
+ * Concurrent watchers over the same addresses share one transport, so a
1678
+ * caller that opens watchers in a loop — or leaks them by abandoning
1679
+ * {@link waitForIncomingFunds} — costs one entry in a `Set` rather than
1680
+ * another WebSocket plus another full-history polling loop. Entries are
1681
+ * dropped once their last subscriber stops.
1682
+ */
1683
+ addressWatches = /* @__PURE__ */ new Map();
1672
1684
  async getCoins(address) {
1673
- const response = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1685
+ const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1674
1686
  if (!response.ok) {
1675
1687
  throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
1676
1688
  }
1677
1689
  return response.json();
1678
1690
  }
1679
1691
  async getFeeRate() {
1680
- const response = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
1692
+ const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
1681
1693
  if (response.status === 404) {
1682
1694
  return void 0;
1683
1695
  }
@@ -1698,7 +1710,7 @@ var EsploraProvider = class {
1698
1710
  }
1699
1711
  }
1700
1712
  async getTxOutspends(txid) {
1701
- const response = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1713
+ const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1702
1714
  if (!response.ok) {
1703
1715
  const error = await response.text();
1704
1716
  throw new Error(`Failed to get transaction outspends: ${error}`);
@@ -1706,15 +1718,27 @@ var EsploraProvider = class {
1706
1718
  return response.json();
1707
1719
  }
1708
1720
  async getTransactions(address) {
1709
- const response = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1721
+ const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1710
1722
  if (!response.ok) {
1711
1723
  const error = await response.text();
1712
1724
  throw new Error(`Failed to get transactions: ${error}`);
1713
1725
  }
1714
1726
  return response.json();
1715
1727
  }
1728
+ /**
1729
+ * Activity counts for an address, without its transactions — orders of
1730
+ * magnitude smaller than `/address/{addr}/txs`, which is what makes it
1731
+ * usable as a change probe for the polling fallback.
1732
+ */
1733
+ async getAddressStats(address) {
1734
+ const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/address/${address}`);
1735
+ if (!response.ok) {
1736
+ throw new Error(`Failed to get address stats: ${response.statusText}`);
1737
+ }
1738
+ return response.json();
1739
+ }
1716
1740
  async getRawTransaction(txid) {
1717
- const response = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
1741
+ const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
1718
1742
  if (!response.ok) {
1719
1743
  const error = await response.text();
1720
1744
  throw new Error(`Failed to get raw transaction ${txid}: ${error}`);
@@ -1722,7 +1746,7 @@ var EsploraProvider = class {
1722
1746
  return base.hex.decode((await response.text()).trim());
1723
1747
  }
1724
1748
  async getTxStatus(txid) {
1725
- const txresponse = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1749
+ const txresponse = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1726
1750
  if (!txresponse.ok) {
1727
1751
  throw new Error(txresponse.statusText);
1728
1752
  }
@@ -1730,7 +1754,7 @@ var EsploraProvider = class {
1730
1754
  if (!tx.status.confirmed) {
1731
1755
  return { confirmed: false };
1732
1756
  }
1733
- const response = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1757
+ const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1734
1758
  if (!response.ok) {
1735
1759
  throw new Error(`Failed to get transaction status: ${response.statusText}`);
1736
1760
  }
@@ -1744,50 +1768,227 @@ var EsploraProvider = class {
1744
1768
  blockHeight: data.block_height
1745
1769
  };
1746
1770
  }
1771
+ /**
1772
+ * Watch a set of addresses over the explorer's WebSocket, degrading to HTTP
1773
+ * polling whenever the socket is unavailable and returning to the socket as
1774
+ * soon as it can be re-established.
1775
+ *
1776
+ * Concurrent calls covering the same address set share one transport. The
1777
+ * returned function releases **this** subscription only; the transport is
1778
+ * torn down when the last subscriber releases it. Calling it more than once
1779
+ * is a no-op.
1780
+ *
1781
+ * @param addresses - Addresses to monitor; order is not significant
1782
+ * @param callback - Invoked with transactions seen after the watch started
1783
+ * @returns A function releasing this subscription
1784
+ * @remarks
1785
+ * The HTTP fallback fetches full address history per address per cycle,
1786
+ * which is dramatically more expensive than the socket — so callers should
1787
+ * release watches they no longer need rather than relying on sharing.
1788
+ * @see {@link waitForIncomingFunds} for the cancellation-aware wallet-level helper
1789
+ */
1747
1790
  async watchAddresses(addresses, callback) {
1748
- let intervalId = null;
1791
+ const key = [...addresses].sort().join("\0");
1792
+ let watch = this.addressWatches.get(key);
1793
+ if (!watch) {
1794
+ watch = this.createAddressWatch(addresses, () => this.addressWatches.delete(key));
1795
+ this.addressWatches.set(key, watch);
1796
+ }
1797
+ const subscriber = { callback };
1798
+ watch.subscribers.add(subscriber);
1799
+ const shared = watch;
1800
+ await shared.started;
1801
+ let released = false;
1802
+ return () => {
1803
+ if (released) return;
1804
+ released = true;
1805
+ shared.subscribers.delete(subscriber);
1806
+ if (shared.subscribers.size === 0) shared.teardown();
1807
+ };
1808
+ }
1809
+ /**
1810
+ * Bring up one shared address watch: a WebSocket subscription where the
1811
+ * explorer supports it, degrading to HTTP polling when it doesn't.
1812
+ *
1813
+ * @param addresses - Addresses this watch covers
1814
+ * @param onTeardown - Invoked when the watch retires, to drop the registry entry
1815
+ */
1816
+ createAddressWatch(addresses, onTeardown) {
1817
+ const subscribers = /* @__PURE__ */ new Set();
1749
1818
  const wsUrl = this.baseUrl.replace(/^http(s)?:/, "ws$1:") + "/v1/ws";
1750
- const poll = async () => {
1751
- const getAllTxs = async () => {
1752
- const txArrays = await Promise.all(
1753
- addresses.map((address) => this.getTransactions(address))
1754
- );
1755
- return txArrays.flat();
1819
+ let stopped = false;
1820
+ let timer = null;
1821
+ let pollStarted = false;
1822
+ let ws = null;
1823
+ let reconnectTimer = null;
1824
+ let reconnectFailures = 0;
1825
+ let pollSession = 0;
1826
+ const emit = (txs) => {
1827
+ if (stopped || txs.length === 0) return;
1828
+ for (const subscriber of [...subscribers]) {
1829
+ try {
1830
+ subscriber.callback(txs);
1831
+ } catch (error) {
1832
+ console.error("Address watch subscriber threw:", error);
1833
+ }
1834
+ }
1835
+ };
1836
+ const txKey2 = (tx) => `${tx.txid}_${tx.status.block_time}`;
1837
+ const getAllTxs = async () => {
1838
+ const txArrays = await Promise.all(
1839
+ addresses.map((address) => this.getTransactions(address))
1840
+ );
1841
+ return txArrays.flat();
1842
+ };
1843
+ const seen = /* @__PURE__ */ new Set();
1844
+ let baselined = false;
1845
+ let anchorHeight;
1846
+ const baseline = (async () => {
1847
+ const [history, tip] = await Promise.allSettled([getAllTxs(), this.getChainTip()]);
1848
+ if (history.status === "fulfilled") {
1849
+ for (const tx of history.value) seen.add(txKey2(tx));
1850
+ baselined = true;
1851
+ return;
1852
+ }
1853
+ console.warn(
1854
+ "Could not baseline watched addresses; the first poll pass will establish it instead:",
1855
+ history.reason
1856
+ );
1857
+ if (tip.status === "fulfilled") anchorHeight = tip.value.height;
1858
+ })();
1859
+ const report = (txs) => {
1860
+ const fresh = [];
1861
+ for (const tx of txs) {
1862
+ const key = txKey2(tx);
1863
+ if (seen.has(key)) continue;
1864
+ seen.add(key);
1865
+ fresh.push(tx);
1866
+ }
1867
+ if (fresh.length === 0) return;
1868
+ emit(fresh);
1869
+ };
1870
+ const startPolling = async () => {
1871
+ if (stopped || pollStarted) return;
1872
+ pollStarted = true;
1873
+ console.warn(
1874
+ `Esplora websocket unavailable (${wsUrl}); falling back to HTTP polling every ${this.pollingInterval}ms for ${addresses.length} address(es) while retrying the socket`
1875
+ );
1876
+ let failures = 0;
1877
+ const activityFingerprint = async () => {
1878
+ try {
1879
+ const stats = await Promise.all(
1880
+ addresses.map((address) => this.getAddressStats(address))
1881
+ );
1882
+ const counted = (activity) => typeof activity?.tx_count === "number" && typeof activity.funded_txo_count === "number" && typeof activity.spent_txo_count === "number";
1883
+ const usable = stats.every(
1884
+ (s) => counted(s?.chain_stats) && counted(s?.mempool_stats)
1885
+ );
1886
+ if (!usable) return void 0;
1887
+ if (stats.some((s) => s.mempool_stats.tx_count > 0)) return void 0;
1888
+ return stats.map(
1889
+ ({ chain_stats: chain }) => `${chain.tx_count}:${chain.funded_txo_count}:${chain.spent_txo_count}`
1890
+ ).join(",");
1891
+ } catch {
1892
+ return void 0;
1893
+ }
1894
+ };
1895
+ let lastFingerprint;
1896
+ const session = pollSession;
1897
+ const isCurrentLoop = () => !stopped && session === pollSession;
1898
+ const schedule = () => {
1899
+ if (!isCurrentLoop()) return;
1900
+ timer = setTimeout(tick, this.pollingInterval * 2 ** failures);
1756
1901
  };
1757
- const initialTxs = await getAllTxs();
1758
- const txKey2 = (tx) => `${tx.txid}_${tx.status.block_time}`;
1759
- const existingTxs = new Set(initialTxs.map(txKey2));
1760
- intervalId = setInterval(async () => {
1902
+ const tick = async () => {
1761
1903
  try {
1904
+ const fingerprint = await activityFingerprint();
1905
+ if (!isCurrentLoop()) return;
1906
+ if (fingerprint !== void 0 && fingerprint === lastFingerprint) {
1907
+ failures = 0;
1908
+ schedule();
1909
+ return;
1910
+ }
1762
1911
  const currentTxs = await getAllTxs();
1763
- const newTxs = currentTxs.filter((tx) => !existingTxs.has(txKey2(tx)));
1764
- if (newTxs.length > 0) {
1765
- newTxs.forEach((tx) => existingTxs.add(txKey2(tx)));
1766
- callback(newTxs);
1912
+ if (!isCurrentLoop()) return;
1913
+ lastFingerprint = fingerprint;
1914
+ if (baselined) {
1915
+ report(currentTxs);
1916
+ } else if (anchorHeight !== void 0) {
1917
+ const arrivedAfterStart = (tx) => !tx.status.confirmed || tx.status.block_height === void 0 || tx.status.block_height > anchorHeight;
1918
+ for (const tx of currentTxs) {
1919
+ if (!arrivedAfterStart(tx)) seen.add(txKey2(tx));
1920
+ }
1921
+ baselined = true;
1922
+ report(currentTxs);
1923
+ } else {
1924
+ console.warn(
1925
+ `Esplora address watch established its baseline late for ${addresses.length} address(es); deposits arriving before now may not have been reported`
1926
+ );
1927
+ for (const tx of currentTxs) seen.add(txKey2(tx));
1928
+ baselined = true;
1767
1929
  }
1930
+ failures = 0;
1768
1931
  } catch (error) {
1769
- console.error("Error in polling mechanism:", error);
1932
+ failures = Math.min(failures + 1, MAX_POLL_BACKOFF_EXPONENT);
1933
+ console.error("Error polling watched addresses:", error);
1770
1934
  }
1771
- }, this.pollingInterval);
1935
+ schedule();
1936
+ };
1937
+ await baseline;
1938
+ if (!isCurrentLoop()) return;
1939
+ await tick();
1772
1940
  };
1773
- let ws = null;
1774
- const stopFunc = () => {
1775
- if (ws) ws.close();
1776
- if (intervalId) clearInterval(intervalId);
1941
+ const stopPolling = () => {
1942
+ pollSession++;
1943
+ if (timer) {
1944
+ clearTimeout(timer);
1945
+ timer = null;
1946
+ }
1947
+ pollStarted = false;
1777
1948
  };
1778
- if (this.forcePolling) {
1779
- await poll();
1780
- return stopFunc;
1781
- }
1782
- try {
1783
- ws = new WebSocket(wsUrl);
1784
- ws.addEventListener("open", () => {
1949
+ const handleSocketFailure = () => {
1950
+ if (stopped) return Promise.resolve();
1951
+ scheduleReconnect();
1952
+ return startPolling();
1953
+ };
1954
+ const scheduleReconnect = () => {
1955
+ if (stopped || reconnectTimer !== null) return;
1956
+ const delay = RECONNECT_BASE_DELAY_MS * 2 ** Math.min(reconnectFailures, MAX_RECONNECT_BACKOFF_EXPONENT);
1957
+ reconnectFailures++;
1958
+ reconnectTimer = setTimeout(() => {
1959
+ reconnectTimer = null;
1960
+ connect();
1961
+ }, delay);
1962
+ };
1963
+ const connect = () => {
1964
+ if (stopped) return Promise.resolve();
1965
+ const previous = ws;
1966
+ ws = null;
1967
+ if (previous) {
1968
+ try {
1969
+ previous.close();
1970
+ } catch {
1971
+ }
1972
+ }
1973
+ let socket;
1974
+ try {
1975
+ socket = new WebSocket(wsUrl);
1976
+ } catch {
1977
+ return handleSocketFailure();
1978
+ }
1979
+ ws = socket;
1980
+ const isCurrent = () => !stopped && ws === socket;
1981
+ socket.addEventListener("open", () => {
1982
+ if (!isCurrent()) return;
1983
+ reconnectFailures = 0;
1785
1984
  const subscribeMsg = {
1786
1985
  "track-addresses": addresses
1787
1986
  };
1788
- ws.send(JSON.stringify(subscribeMsg));
1987
+ socket.send(JSON.stringify(subscribeMsg));
1988
+ stopPolling();
1789
1989
  });
1790
- ws.addEventListener("message", (event) => {
1990
+ socket.addEventListener("message", (event) => {
1991
+ if (!isCurrent()) return;
1791
1992
  try {
1792
1993
  const newTxs = [];
1793
1994
  const message = JSON.parse(event.data.toString());
@@ -1799,22 +2000,45 @@ var EsploraProvider = class {
1799
2000
  newTxs.push(...aux[address][type].filter(isExplorerTransaction));
1800
2001
  }
1801
2002
  }
1802
- if (newTxs.length > 0) callback(newTxs);
2003
+ report(newTxs);
1803
2004
  } catch (error) {
1804
2005
  console.error("Failed to process WebSocket message:", error);
1805
2006
  }
1806
2007
  });
1807
- ws.addEventListener("error", async () => {
1808
- await poll();
2008
+ socket.addEventListener("error", () => {
2009
+ if (isCurrent()) void handleSocketFailure();
1809
2010
  });
1810
- } catch {
1811
- if (intervalId) clearInterval(intervalId);
1812
- await poll();
1813
- }
1814
- return stopFunc;
2011
+ socket.addEventListener("close", () => {
2012
+ if (isCurrent()) void handleSocketFailure();
2013
+ });
2014
+ return Promise.resolve();
2015
+ };
2016
+ const teardown = () => {
2017
+ if (stopped) return;
2018
+ stopped = true;
2019
+ onTeardown();
2020
+ if (timer) {
2021
+ clearTimeout(timer);
2022
+ timer = null;
2023
+ }
2024
+ if (reconnectTimer !== null) {
2025
+ clearTimeout(reconnectTimer);
2026
+ reconnectTimer = null;
2027
+ }
2028
+ if (ws) {
2029
+ try {
2030
+ ws.close();
2031
+ } catch {
2032
+ }
2033
+ ws = null;
2034
+ }
2035
+ subscribers.clear();
2036
+ };
2037
+ const started = this.forcePolling ? startPolling() : connect().then(() => baseline);
2038
+ return { subscribers, teardown, started };
1815
2039
  }
1816
2040
  async getChainTip() {
1817
- const tipBlocks = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/blocks`);
2041
+ const tipBlocks = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/blocks`);
1818
2042
  if (!tipBlocks.ok) {
1819
2043
  throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
1820
2044
  }
@@ -1828,12 +2052,14 @@ var EsploraProvider = class {
1828
2052
  const hash = tip[0].id;
1829
2053
  return {
1830
2054
  height: tip[0].height,
2055
+ // `mediantime`, never `timestamp`: the latter is the header's own
2056
+ // `nTime`, and this field is specified as MTP.
1831
2057
  time: tip[0].mediantime,
1832
2058
  hash
1833
2059
  };
1834
2060
  }
1835
2061
  async broadcastPackage(parent, child) {
1836
- const response = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
2062
+ const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
1837
2063
  method: "POST",
1838
2064
  headers: {
1839
2065
  "Content-Type": "application/json"
@@ -1849,7 +2075,7 @@ var EsploraProvider = class {
1849
2075
  return result;
1850
2076
  }
1851
2077
  async broadcastTx(tx) {
1852
- const response = await chunk2JV4VQ7C_cjs.baseFetch(`${this.baseUrl}/tx`, {
2078
+ const response = await chunk5MLC2HU3_cjs.baseFetch(`${this.baseUrl}/tx`, {
1853
2079
  method: "POST",
1854
2080
  headers: {
1855
2081
  "Content-Type": "text/plain"
@@ -1893,6 +2119,9 @@ var isExplorerTransaction = (tx) => {
1893
2119
  (vout) => typeof vout.scriptpubkey_address === "string" && typeof vout.value === "number"
1894
2120
  ) && typeof tx.status === "object" && typeof tx.status.confirmed === "boolean";
1895
2121
  };
2122
+ var MAX_POLL_BACKOFF_EXPONENT = 4;
2123
+ var RECONNECT_BASE_DELAY_MS = 1e3;
2124
+ var MAX_RECONNECT_BACKOFF_EXPONENT = 5;
1896
2125
  var getVarIntSize = (n) => {
1897
2126
  if (n < 253) return 1;
1898
2127
  if (n <= 65535) return 3;
@@ -2029,7 +2258,7 @@ function findP2AOutput(tx) {
2029
2258
  var CHILD_DUST_AMOUNT = 546;
2030
2259
  function buildAnchorChild(params) {
2031
2260
  const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
2032
- const child = new chunk2JV4VQ7C_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
2261
+ const child = new chunk5MLC2HU3_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
2033
2262
  child.addInput(findP2AOutput(parent));
2034
2263
  const estimator = TxWeightEstimator.create().addP2AInput();
2035
2264
  for (const _ of fundingCoins) {
@@ -2077,7 +2306,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
2077
2306
  );
2078
2307
  }
2079
2308
  function buildForfeitTxWithOutput(inputs, output, txLocktime) {
2080
- const tx = new chunk2JV4VQ7C_cjs.Transaction({
2309
+ const tx = new chunk5MLC2HU3_cjs.Transaction({
2081
2310
  version: 3,
2082
2311
  lockTime: txLocktime
2083
2312
  });
@@ -2153,7 +2382,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
2153
2382
  if (previousScriptKey.length !== 32) {
2154
2383
  throw new Error(`parent output ${childIndex} has invalid script`);
2155
2384
  }
2156
- const cosigners = chunk2JV4VQ7C_cjs.getArkPsbtFields(child.root, 0, chunk2JV4VQ7C_cjs.CosignerPublicKey);
2385
+ const cosigners = chunk5MLC2HU3_cjs.getArkPsbtFields(child.root, 0, chunk5MLC2HU3_cjs.CosignerPublicKey);
2157
2386
  if (cosigners.length === 0) {
2158
2387
  throw ErrMissingCosignersPublicKeys;
2159
2388
  }
@@ -2211,7 +2440,7 @@ var EmulatorPacket = class _EmulatorPacket {
2211
2440
  return new _EmulatorPacket(entries);
2212
2441
  }
2213
2442
  static fromBytes(data) {
2214
- const reader = new chunkCO3KKSWM_cjs.BufferReader(data);
2443
+ const reader = new chunkGVHUHTRH_cjs.BufferReader(data);
2215
2444
  const entryCount = reader.readCompactSize();
2216
2445
  const entries = [];
2217
2446
  for (let i = 0; i < entryCount; i++) {
@@ -2229,7 +2458,7 @@ var EmulatorPacket = class _EmulatorPacket {
2229
2458
  return _EmulatorPacket.PACKET_TYPE;
2230
2459
  }
2231
2460
  serialize() {
2232
- const writer = new chunkCO3KKSWM_cjs.BufferWriter();
2461
+ const writer = new chunkGVHUHTRH_cjs.BufferWriter();
2233
2462
  writer.writeCompactSize(this.entries.length);
2234
2463
  for (const entry of this.entries) {
2235
2464
  writer.writeUint16LE(entry.vin);
@@ -2316,7 +2545,7 @@ var Extension = class _Extension {
2316
2545
  `expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
2317
2546
  );
2318
2547
  }
2319
- const reader = new chunkCO3KKSWM_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
2548
+ const reader = new chunkGVHUHTRH_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
2320
2549
  const packets = [];
2321
2550
  while (reader.remaining() > 0) {
2322
2551
  const packetType = reader.readByte();
@@ -2390,7 +2619,7 @@ var Extension = class _Extension {
2390
2619
  */
2391
2620
  getAssetPacket() {
2392
2621
  for (const p of this.packets) {
2393
- if (p instanceof chunkCO3KKSWM_cjs.Packet) {
2622
+ if (p instanceof chunkGVHUHTRH_cjs.Packet) {
2394
2623
  return p;
2395
2624
  }
2396
2625
  }
@@ -2428,8 +2657,8 @@ var Extension = class _Extension {
2428
2657
  };
2429
2658
  function parsePacket(packetType, data) {
2430
2659
  switch (packetType) {
2431
- case chunkCO3KKSWM_cjs.Packet.PACKET_TYPE:
2432
- return chunkCO3KKSWM_cjs.Packet.fromBytes(data);
2660
+ case chunkGVHUHTRH_cjs.Packet.PACKET_TYPE:
2661
+ return chunkGVHUHTRH_cjs.Packet.fromBytes(data);
2433
2662
  case EmulatorPacket.PACKET_TYPE:
2434
2663
  return EmulatorPacket.fromBytes(data);
2435
2664
  default:
@@ -2476,16 +2705,16 @@ function buildOpReturnScript(data) {
2476
2705
  }
2477
2706
  return script;
2478
2707
  }
2479
- var ErrOffchainOutputNotFound = (address) => new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
2480
- var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
2708
+ var ErrOffchainOutputNotFound = (address) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
2709
+ var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2481
2710
  `invalid asset output amount for ${assetId}: got ${got}, want ${want}`
2482
2711
  );
2483
- var ErrAssetGroupNotFound = (assetId) => new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
2484
- var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
2712
+ var ErrAssetGroupNotFound = (assetId) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
2713
+ var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2485
2714
  `asset output not found in asset group ${assetId} at index ${outputIndex}`
2486
2715
  );
2487
- var ErrOnchainOutputNotFound = (address) => new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
2488
- var ErrUnvalidatedOffchainOutput = (address) => new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
2716
+ var ErrOnchainOutputNotFound = (address) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
2717
+ var ErrUnvalidatedOffchainOutput = (address) => new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2489
2718
  `offchain output ${address} cannot be validated: virtual output tree signing did not run`
2490
2719
  );
2491
2720
  var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
@@ -2494,7 +2723,7 @@ var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain ou
2494
2723
  function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
2495
2724
  if (!validatedCommitmentTxid) return;
2496
2725
  if (finalCommitmentTx.id === validatedCommitmentTxid) return;
2497
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
2726
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2498
2727
  `${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
2499
2728
  );
2500
2729
  }
@@ -2504,7 +2733,7 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
2504
2733
  for (const recipient of recipients) {
2505
2734
  let arkAddress;
2506
2735
  try {
2507
- arkAddress = chunk2JV4VQ7C_cjs.ArkAddress.decode(recipient.address);
2736
+ arkAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(recipient.address);
2508
2737
  } catch {
2509
2738
  validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
2510
2739
  continue;
@@ -2516,7 +2745,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
2516
2745
  const usedOnchainOutputs = /* @__PURE__ */ new Set();
2517
2746
  for (const recipient of recipients) {
2518
2747
  try {
2519
- chunk2JV4VQ7C_cjs.ArkAddress.decode(recipient.address);
2748
+ chunk5MLC2HU3_cjs.ArkAddress.decode(recipient.address);
2520
2749
  } catch {
2521
2750
  validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
2522
2751
  continue;
@@ -2749,7 +2978,7 @@ function assetMintResolver() {
2749
2978
  if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
2750
2979
  const minted = tx.assets.filter((a) => {
2751
2980
  try {
2752
- return base.hex.encode(chunkCO3KKSWM_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
2981
+ return base.hex.encode(chunkGVHUHTRH_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
2753
2982
  } catch {
2754
2983
  return false;
2755
2984
  }
@@ -2792,7 +3021,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
2792
3021
  const existing = inputsByAssetId.get(asset.assetId);
2793
3022
  inputsByAssetId.set(asset.assetId, [
2794
3023
  ...existing ?? [],
2795
- chunkCO3KKSWM_cjs.AssetInput.create(inputIndex, asset.amount)
3024
+ chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount)
2796
3025
  ]);
2797
3026
  }
2798
3027
  }
@@ -2804,7 +3033,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
2804
3033
  const existing = outputsByAssetId.get(asset.assetId);
2805
3034
  outputsByAssetId.set(asset.assetId, [
2806
3035
  ...existing ?? [],
2807
- chunkCO3KKSWM_cjs.AssetOutput.create(outputIndex, asset.amount)
3036
+ chunkGVHUHTRH_cjs.AssetOutput.create(outputIndex, asset.amount)
2808
3037
  ]);
2809
3038
  }
2810
3039
  }
@@ -2815,7 +3044,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
2815
3044
  const existing = outputsByAssetId.get(asset.assetId);
2816
3045
  outputsByAssetId.set(asset.assetId, [
2817
3046
  ...existing ?? [],
2818
- chunkCO3KKSWM_cjs.AssetOutput.create(outputIndex, asset.amount)
3047
+ chunkGVHUHTRH_cjs.AssetOutput.create(outputIndex, asset.amount)
2819
3048
  ]);
2820
3049
  }
2821
3050
  }
@@ -2824,11 +3053,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
2824
3053
  for (const assetIdStr of allAssetIds) {
2825
3054
  const inputs = inputsByAssetId.get(assetIdStr);
2826
3055
  const outputs = outputsByAssetId.get(assetIdStr);
2827
- const assetId = chunkCO3KKSWM_cjs.AssetId.fromString(assetIdStr);
2828
- const group = chunkCO3KKSWM_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
3056
+ const assetId = chunkGVHUHTRH_cjs.AssetId.fromString(assetIdStr);
3057
+ const group = chunkGVHUHTRH_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
2829
3058
  groups.push(group);
2830
3059
  }
2831
- return chunkCO3KKSWM_cjs.Packet.create(groups);
3060
+ return chunkGVHUHTRH_cjs.Packet.create(groups);
2832
3061
  }
2833
3062
  function selectCoinsWithAsset(coins, assetId, requiredAmount) {
2834
3063
  const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
@@ -2865,7 +3094,7 @@ function selectedCoinsToAssetInputs(selectedCoins) {
2865
3094
  }
2866
3095
  function toXOnlySignerHex(pubkeyHex) {
2867
3096
  const bytes = base.hex.decode(pubkeyHex);
2868
- if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunkOIZ2V2VD_cjs.toXOnly(bytes, "signer key"));
3097
+ if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(bytes, "signer key"));
2869
3098
  throw new Error(`invalid signer pubkey length: expected 32 or 33 bytes, got ${bytes.length}`);
2870
3099
  }
2871
3100
  function signerSetFromInfo(info) {
@@ -2912,13 +3141,13 @@ var toTimelock = (value) => ({
2912
3141
  var toSeconds = (t) => t.type === "seconds" ? t.value : t.value * NOMINAL_BLOCK_SECONDS;
2913
3142
  function assertTimelockInPolicy(timelock, policy, label, overrideOption) {
2914
3143
  if (policy.requireSeconds && timelock.type === "blocks") {
2915
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3144
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2916
3145
  `${label} rejected: block-typed timelocks are not accepted (got ${timelock.value})`
2917
3146
  );
2918
3147
  }
2919
3148
  const seconds = toSeconds(timelock);
2920
3149
  if (seconds < policy.minSeconds) {
2921
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3150
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2922
3151
  `${label} rejected: ${timelock.value} ${timelock.type} is below the ${policy.minSeconds}s floor; pass ${overrideOption}: ${seconds}n to Wallet.create to lower it`
2923
3152
  );
2924
3153
  }
@@ -2939,7 +3168,7 @@ function resolveBatchExpiryPolicy(network, overrides) {
2939
3168
  }
2940
3169
  function assertValidBatchExpiry(batchExpiry, policy) {
2941
3170
  if (policy.advertisedVtxoTreeExpiry !== void 0 && batchExpiry !== policy.advertisedVtxoTreeExpiry) {
2942
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3171
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2943
3172
  `batch expiry rejected: ${batchExpiry} does not match the advertised vtxoTreeExpiry ${policy.advertisedVtxoTreeExpiry}`
2944
3173
  );
2945
3174
  }
@@ -2969,21 +3198,21 @@ function resolveCheckpointExitDelayPolicy(network, overrides) {
2969
3198
  function assertValidServerUnrollScript(checkpointTapscript, policy) {
2970
3199
  let script;
2971
3200
  try {
2972
- script = chunk2JV4VQ7C_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
3201
+ script = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
2973
3202
  } catch (e) {
2974
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3203
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2975
3204
  `checkpoint exit delay rejected: invalid checkpointTapscript from server (${e instanceof Error ? e.message : String(e)})`
2976
3205
  );
2977
3206
  }
2978
3207
  if (policy.advertisedForfeitPubkey !== void 0) {
2979
3208
  const { pubkeys } = script.params;
2980
3209
  if (pubkeys.length !== 1) {
2981
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3210
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2982
3211
  `checkpoint exit delay rejected: checkpointTapscript must commit to exactly one pubkey, got ${pubkeys.length} [${pubkeys.map(base.hex.encode).join(", ")}]`
2983
3212
  );
2984
3213
  }
2985
3214
  if (!utils_js.equalBytes(pubkeys[0], policy.advertisedForfeitPubkey)) {
2986
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3215
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
2987
3216
  `checkpoint exit delay rejected: checkpointTapscript pubkey ${base.hex.encode(pubkeys[0])} does not match the advertised forfeitPubkey ${base.hex.encode(policy.advertisedForfeitPubkey)}`
2988
3217
  );
2989
3218
  }
@@ -3027,8 +3256,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
3027
3256
  function buildVirtualTx(inputs, outputs) {
3028
3257
  let lockTime = 0n;
3029
3258
  for (const input of inputs) {
3030
- const tapscript = chunk2JV4VQ7C_cjs.decodeTapscript(chunk2JV4VQ7C_cjs.scriptFromTapLeafScript(input.tapLeafScript));
3031
- if (chunk2JV4VQ7C_cjs.CLTVMultisigTapscript.is(tapscript)) {
3259
+ const tapscript = chunk5MLC2HU3_cjs.decodeTapscript(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(input.tapLeafScript));
3260
+ if (chunk5MLC2HU3_cjs.CLTVMultisigTapscript.is(tapscript)) {
3032
3261
  if (lockTime !== 0n) {
3033
3262
  if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
3034
3263
  throw new Error("cannot mix seconds and blocks locktime");
@@ -3039,7 +3268,7 @@ function buildVirtualTx(inputs, outputs) {
3039
3268
  }
3040
3269
  }
3041
3270
  }
3042
- const tx = new chunk2JV4VQ7C_cjs.Transaction({
3271
+ const tx = new chunk5MLC2HU3_cjs.Transaction({
3043
3272
  version: 3,
3044
3273
  lockTime: Number(lockTime)
3045
3274
  });
@@ -3049,12 +3278,12 @@ function buildVirtualTx(inputs, outputs) {
3049
3278
  index: input.vout,
3050
3279
  sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
3051
3280
  witnessUtxo: {
3052
- script: chunk2JV4VQ7C_cjs.VtxoScript.decode(input.tapTree).pkScript,
3281
+ script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript,
3053
3282
  amount: BigInt(input.value)
3054
3283
  },
3055
3284
  tapLeafScript: [input.tapLeafScript]
3056
3285
  });
3057
- chunk2JV4VQ7C_cjs.setArkPsbtField(tx, i, chunk2JV4VQ7C_cjs.VtxoTaprootTree, input.tapTree);
3286
+ chunk5MLC2HU3_cjs.setArkPsbtField(tx, i, chunk5MLC2HU3_cjs.VtxoTaprootTree, input.tapTree);
3058
3287
  }
3059
3288
  for (const output of outputs) {
3060
3289
  tx.addOutput(output);
@@ -3063,8 +3292,8 @@ function buildVirtualTx(inputs, outputs) {
3063
3292
  return tx;
3064
3293
  }
3065
3294
  function buildCheckpointTx(vtxo, serverUnrollScript) {
3066
- const collaborativeClosure = chunk2JV4VQ7C_cjs.decodeTapscript(chunk2JV4VQ7C_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
3067
- const checkpointVtxoScript = new chunk2JV4VQ7C_cjs.VtxoScript([
3295
+ const collaborativeClosure = chunk5MLC2HU3_cjs.decodeTapscript(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
3296
+ const checkpointVtxoScript = new chunk5MLC2HU3_cjs.VtxoScript([
3068
3297
  serverUnrollScript.script,
3069
3298
  collaborativeClosure.script
3070
3299
  ]);
@@ -3107,9 +3336,6 @@ function hasBoardingTxExpired(coin, boardingTimelock, chainTipHeight) {
3107
3336
  const blockTime = BigInt(Math.floor(coin.status.block_time));
3108
3337
  return blockTime + boardingTimelock.value <= now;
3109
3338
  }
3110
- function formatSighash(type) {
3111
- return `0x${type.toString(16).padStart(2, "0")}`;
3112
- }
3113
3339
  function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubkeys = [], allowedSighashTypes = [btcSigner.SigHash.DEFAULT], expectedLeafHash) {
3114
3340
  const input = tx.getInput(inputIndex);
3115
3341
  const prevoutScripts = [];
@@ -3143,7 +3369,7 @@ function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubke
3143
3369
  const sighashType = signature.length === 65 ? signature[64] : btcSigner.SigHash.DEFAULT;
3144
3370
  const sig = signature.subarray(0, 64);
3145
3371
  if (!allowedSighashTypes.includes(sighashType)) {
3146
- const sighashName = formatSighash(sighashType);
3372
+ const sighashName = chunk5MLC2HU3_cjs.formatSighash(sighashType);
3147
3373
  throw new Error(
3148
3374
  `Unallowed sighash type ${sighashName} for input ${inputIndex}, pubkey ${pubKeyHex}.`
3149
3375
  );
@@ -3217,7 +3443,7 @@ function combineTapscriptSigs(signedTx, originalTx) {
3217
3443
  }
3218
3444
  function isValidArkAddress(address) {
3219
3445
  try {
3220
- chunk2JV4VQ7C_cjs.ArkAddress.decode(address);
3446
+ chunk5MLC2HU3_cjs.ArkAddress.decode(address);
3221
3447
  return true;
3222
3448
  } catch (e) {
3223
3449
  return false;
@@ -3225,16 +3451,16 @@ function isValidArkAddress(address) {
3225
3451
  }
3226
3452
  function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
3227
3453
  if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
3228
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3454
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3229
3455
  `${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
3230
3456
  );
3231
3457
  }
3232
3458
  const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
3233
3459
  return serverCheckpointTxs.map((encoded, index) => {
3234
- const server = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
3460
+ const server = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
3235
3461
  const local = byTxid.get(server.id);
3236
3462
  if (!local) {
3237
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3463
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3238
3464
  `${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
3239
3465
  );
3240
3466
  }
@@ -3244,14 +3470,14 @@ function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, contex
3244
3470
  }
3245
3471
  function assertSubmittedArkTxid(response, signedArkTx, context) {
3246
3472
  if (response.arkTxid !== signedArkTx.id) {
3247
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3473
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3248
3474
  `${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
3249
3475
  );
3250
3476
  }
3251
3477
  if (response.finalArkTx === void 0) return;
3252
- const finalTxid = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
3478
+ const finalTxid = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
3253
3479
  if (finalTxid !== signedArkTx.id) {
3254
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3480
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3255
3481
  `${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
3256
3482
  );
3257
3483
  }
@@ -3270,10 +3496,10 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeyHex,
3270
3496
  [serverPubkeyHex],
3271
3497
  void 0,
3272
3498
  void 0,
3273
- payment_js.tapLeafHash(chunk2JV4VQ7C_cjs.scriptFromTapLeafScript(leaf))
3499
+ payment_js.tapLeafHash(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(leaf))
3274
3500
  );
3275
3501
  } catch (error) {
3276
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3502
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3277
3503
  `${context}: input ${inputIndex} is not signed by the server on the leaf being spent (${error instanceof Error ? error.message : String(error)})`
3278
3504
  );
3279
3505
  }
@@ -3282,20 +3508,20 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
3282
3508
  const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
3283
3509
  for (const [index, checkpoint] of checkpoints.entries()) {
3284
3510
  if (checkpoint.inputsLength !== 1) {
3285
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3511
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3286
3512
  `${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
3287
3513
  );
3288
3514
  }
3289
3515
  const spent = checkpoint.getInput(0);
3290
3516
  if (!spent.txid || spent.index === void 0) {
3291
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3517
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3292
3518
  `${context}: checkpoint ${index} has no input outpoint`
3293
3519
  );
3294
3520
  }
3295
3521
  const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
3296
3522
  const input = byOutpoint.get(outpoint);
3297
3523
  if (!input) {
3298
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3524
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3299
3525
  `${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
3300
3526
  );
3301
3527
  }
@@ -3303,7 +3529,7 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
3303
3529
  (unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
3304
3530
  );
3305
3531
  if (!rebuilt) {
3306
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3532
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3307
3533
  `${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
3308
3534
  );
3309
3535
  }
@@ -3327,15 +3553,24 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
3327
3553
  assertSubmittedArkTxid(response, signedArkTx, "submitTx");
3328
3554
  const { arkTxid, signedCheckpointTxs } = response;
3329
3555
  const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
3556
+ matched.forEach(({ server }, index) => {
3557
+ try {
3558
+ chunk5MLC2HU3_cjs.assertAllowedSighashTypes(server);
3559
+ } catch (error) {
3560
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3561
+ `submitTx checkpoint ${index}: ${error instanceof Error ? error.message : String(error)}`
3562
+ );
3563
+ }
3564
+ });
3330
3565
  const verify = options?.verifyServerSignatures;
3331
3566
  if (verify) {
3332
3567
  if (response.finalArkTx === void 0) {
3333
- throw new chunk2JV4VQ7C_cjs.ServerResponseMismatchError(
3568
+ throw new chunk5MLC2HU3_cjs.ServerResponseMismatchError(
3334
3569
  "submitTx: server returned no final ark tx to verify its signatures against"
3335
3570
  );
3336
3571
  }
3337
- const finalArkTx = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
3338
- const serverPubkeyHex = base.hex.encode(chunkOIZ2V2VD_cjs.toXOnly(verify.serverPubkey, "server key"));
3572
+ const finalArkTx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
3573
+ const serverPubkeyHex = base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(verify.serverPubkey, "server key"));
3339
3574
  for (let i = 0; i < offchainTx.arkTx.inputsLength; i++) {
3340
3575
  assertServerSignedLeaf(
3341
3576
  finalArkTx,
@@ -3391,12 +3626,12 @@ function claimWithPreimageIdentity(identity, preimage) {
3391
3626
  return {
3392
3627
  ...identity,
3393
3628
  sign: async (tx, inputIndexes) => {
3394
- const signed = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(
3629
+ const signed = chunk5MLC2HU3_cjs.Transaction.fromPSBT(
3395
3630
  (await identity.sign(tx.clone(), inputIndexes)).toPSBT()
3396
3631
  );
3397
3632
  const indexes = inputIndexes ?? Array.from({ length: signed.inputsLength }, (_, i) => i);
3398
3633
  for (const index of indexes) {
3399
- chunk2JV4VQ7C_cjs.setArkPsbtField(signed, index, chunk2JV4VQ7C_cjs.ConditionWitness, [preimage]);
3634
+ chunk5MLC2HU3_cjs.setArkPsbtField(signed, index, chunk5MLC2HU3_cjs.ConditionWitness, [preimage]);
3400
3635
  }
3401
3636
  return signed;
3402
3637
  }
@@ -3588,7 +3823,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
3588
3823
  };
3589
3824
  }
3590
3825
  function deriveContractTapscripts(contract) {
3591
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.get(contract.type);
3826
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
3592
3827
  if (!handler) {
3593
3828
  throw new Error(`No handler for contract type '${contract.type}'`);
3594
3829
  }
@@ -3659,7 +3894,7 @@ function getRandomId() {
3659
3894
  }
3660
3895
  function isValidArkAddress2(address) {
3661
3896
  try {
3662
- chunk2JV4VQ7C_cjs.ArkAddress.decode(address);
3897
+ chunk5MLC2HU3_cjs.ArkAddress.decode(address);
3663
3898
  return true;
3664
3899
  } catch (e) {
3665
3900
  return false;
@@ -3687,7 +3922,7 @@ function assertRecipientArkAddress(encoded, address, context) {
3687
3922
  function assertTapTreeDerivesAddress(encoded, tapTree, address) {
3688
3923
  let derived;
3689
3924
  try {
3690
- derived = chunk2JV4VQ7C_cjs.VtxoScript.decode(tapTree).pkScript;
3925
+ derived = chunk5MLC2HU3_cjs.VtxoScript.decode(tapTree).pkScript;
3691
3926
  } catch (e) {
3692
3927
  throw new Error(
3693
3928
  `Invalid tapTree for ${encoded}: ${e instanceof Error ? e.message : String(e)}`
@@ -3704,7 +3939,7 @@ function validateRecipients(recipients, dustAmount, context) {
3704
3939
  for (const recipient of recipients) {
3705
3940
  let address;
3706
3941
  try {
3707
- address = chunk2JV4VQ7C_cjs.ArkAddress.decode(recipient.address);
3942
+ address = chunk5MLC2HU3_cjs.ArkAddress.decode(recipient.address);
3708
3943
  } catch (e) {
3709
3944
  throw new Error(`Invalid Arkade address: ${recipient.address}`);
3710
3945
  }
@@ -3729,7 +3964,7 @@ function validateRecipients(recipients, dustAmount, context) {
3729
3964
 
3730
3965
  // src/contracts/spendability.ts
3731
3966
  function isContractGenericallySpendable(contract) {
3732
- return chunkOIZ2V2VD_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
3967
+ return chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
3733
3968
  }
3734
3969
  function gatedContracts(contracts) {
3735
3970
  const gated = /* @__PURE__ */ new Map();
@@ -3742,7 +3977,7 @@ function gateExclusion(gated) {
3742
3977
  return (vtxo) => {
3743
3978
  const type = vtxo.script === void 0 ? void 0 : gated.get(vtxo.script);
3744
3979
  if (type === void 0) return void 0;
3745
- if (!chunkOIZ2V2VD_cjs.contractHandlers.has(type)) {
3980
+ if (!chunkWIFL5QYZ_cjs.contractHandlers.has(type)) {
3746
3981
  return `at ${vtxo.script} (contract type '${type}') has no handler registered in this build`;
3747
3982
  }
3748
3983
  return `at ${vtxo.script} (contract type '${type}') is not generically spendable`;
@@ -3778,7 +4013,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
3778
4013
  continue;
3779
4014
  }
3780
4015
  for (const v of vtxos) {
3781
- if (!chunk2JV4VQ7C_cjs.hasTerminalSpend(v) && !v.isSwept && !v.isUnrolled) {
4016
+ if (!chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isSwept && !v.isUnrolled) {
3782
4017
  out.add(`${v.txid}:${v.vout}`);
3783
4018
  }
3784
4019
  }
@@ -3813,10 +4048,10 @@ function byValueDescending(vtxos) {
3813
4048
  return [...vtxos].sort((a, b) => b.value - a.value);
3814
4049
  }
3815
4050
  async function fetchTimeHeight(wallet) {
3816
- return chunk2JV4VQ7C_cjs.resolveTimeHeight(wallet.onchainProvider);
4051
+ return chunk5MLC2HU3_cjs.resolveTimeHeight(wallet.onchainProvider);
3817
4052
  }
3818
4053
  function canMigrateBySend(vtxo, now) {
3819
- if (!chunk2JV4VQ7C_cjs.canSpendOffchain(vtxo, now)) return false;
4054
+ if (!chunk5MLC2HU3_cjs.canSpendOffchain(vtxo, now)) return false;
3820
4055
  return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
3821
4056
  }
3822
4057
  function byExpiryAscending(vtxos, now) {
@@ -3824,7 +4059,7 @@ function byExpiryAscending(vtxos, now) {
3824
4059
  if (vtxo.isSwept) return -Infinity;
3825
4060
  if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
3826
4061
  if (vtxo.expiresAtHeight !== void 0) {
3827
- return chunk2JV4VQ7C_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
4062
+ return chunk5MLC2HU3_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
3828
4063
  }
3829
4064
  return Infinity;
3830
4065
  };
@@ -3851,7 +4086,7 @@ function priceSettlementInputs(vtxos, estimator) {
3851
4086
  const payable = [];
3852
4087
  const net = /* @__PURE__ */ new Map();
3853
4088
  for (const vtxo of vtxos) {
3854
- const inputFee = estimator.evalOffchainInput(chunk2JV4VQ7C_cjs.toOffchainInputFeeParams(vtxo));
4089
+ const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(vtxo));
3855
4090
  if (inputFee.satoshis >= vtxo.value) {
3856
4091
  continue;
3857
4092
  }
@@ -3877,7 +4112,7 @@ function deductOffchainOutputFee(subtotal, estimator, arkAddress) {
3877
4112
  }
3878
4113
  const outputFee = estimator.evalOffchainOutput({
3879
4114
  amount: subtotal,
3880
- script: base.hex.encode(chunk2JV4VQ7C_cjs.ArkAddress.decode(arkAddress).pkScript)
4115
+ script: base.hex.encode(chunk5MLC2HU3_cjs.ArkAddress.decode(arkAddress).pkScript)
3881
4116
  });
3882
4117
  return subtotal - BigInt(outputFee.satoshis);
3883
4118
  }
@@ -3895,10 +4130,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
3895
4130
  };
3896
4131
  function getRecoverableVtxos(vtxos, dustAmount, now) {
3897
4132
  return vtxos.filter((vtxo) => {
3898
- if (chunk2JV4VQ7C_cjs.canRecoverOnchain(vtxo, now)) {
4133
+ if (chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
3899
4134
  return true;
3900
4135
  }
3901
- if (chunk2JV4VQ7C_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
4136
+ if (chunk5MLC2HU3_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
3902
4137
  return true;
3903
4138
  }
3904
4139
  return false;
@@ -3928,8 +4163,9 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
3928
4163
  };
3929
4164
  }
3930
4165
  function isVtxoExpiringSoon(vtxo, thresholdMs) {
4166
+ if (vtxo.isUnrolled) return false;
3931
4167
  const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
3932
- const expiresAt = chunk2JV4VQ7C_cjs.normalizeVtxo(vtxo).expiresAt;
4168
+ const expiresAt = chunk5MLC2HU3_cjs.normalizeVtxo(vtxo).expiresAt;
3933
4169
  if (expiresAt === void 0) return false;
3934
4170
  const now = Date.now();
3935
4171
  const batchExpiry = expiresAt.getTime();
@@ -3938,7 +4174,9 @@ function isVtxoExpiringSoon(vtxo, thresholdMs) {
3938
4174
  }
3939
4175
  function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
3940
4176
  return vtxos.filter(
3941
- (vtxo) => isVtxoExpiringSoon(vtxo, thresholdMs) || chunk2JV4VQ7C_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount)
4177
+ // The leading exclusion covers the `isSubdust` arm too, which is a value
4178
+ // property and would otherwise re-admit an exited coin on its own.
4179
+ (vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
3942
4180
  );
3943
4181
  }
3944
4182
  function isMigrationCapable(wallet) {
@@ -4537,11 +4775,11 @@ var VtxoManager = class _VtxoManager {
4537
4775
  `Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
4538
4776
  );
4539
4777
  }
4540
- const tx = new chunk2JV4VQ7C_cjs.Transaction();
4778
+ const tx = new chunk5MLC2HU3_cjs.Transaction();
4541
4779
  for (const utxo of expiredUtxos) {
4542
- const utxoScript = chunk2JV4VQ7C_cjs.VtxoScript.decode(utxo.tapTree);
4780
+ const utxoScript = chunk5MLC2HU3_cjs.VtxoScript.decode(utxo.tapTree);
4543
4781
  const utxoExitLeaf = utxoScript.leaves.find(
4544
- (leaf) => chunk2JV4VQ7C_cjs.CSVMultisigTapscript.isScriptValid(chunk2JV4VQ7C_cjs.scriptFromTapLeafScript(leaf)) === true
4782
+ (leaf) => chunk5MLC2HU3_cjs.CSVMultisigTapscript.isScriptValid(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(leaf)) === true
4545
4783
  );
4546
4784
  if (!utxoExitLeaf) {
4547
4785
  throw new Error(
@@ -4556,7 +4794,7 @@ var VtxoManager = class _VtxoManager {
4556
4794
  amount: BigInt(utxo.value)
4557
4795
  },
4558
4796
  tapLeafScript: [utxoExitLeaf],
4559
- sequence: chunk2JV4VQ7C_cjs.getSequence(utxoExitLeaf)
4797
+ sequence: chunk5MLC2HU3_cjs.getSequence(utxoExitLeaf)
4560
4798
  });
4561
4799
  }
4562
4800
  tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
@@ -4799,8 +5037,8 @@ var VtxoManager = class _VtxoManager {
4799
5037
  const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
4800
5038
  if (cls.status === "CURRENT") continue;
4801
5039
  const live = vtxos.filter((v) => !v.isUnrolled);
4802
- const recoverable = live.filter((v) => v.isSwept && !chunk2JV4VQ7C_cjs.hasTerminalSpend(v));
4803
- const spendable = live.filter((v) => !chunk2JV4VQ7C_cjs.hasTerminalSpend(v) && !v.isSwept);
5040
+ const recoverable = live.filter((v) => v.isSwept && !chunk5MLC2HU3_cjs.hasTerminalSpend(v));
5041
+ const spendable = live.filter((v) => !chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isSwept);
4804
5042
  const value = spendable.reduce((sum, v) => sum + v.value, 0);
4805
5043
  let recoverableCount = 0;
4806
5044
  let recoverableValue = 0;
@@ -4813,7 +5051,7 @@ var VtxoManager = class _VtxoManager {
4813
5051
  awaitingSweepCount = spendable.length;
4814
5052
  awaitingSweepValue = value;
4815
5053
  for (const v of spendable) {
4816
- const exp = chunk2JV4VQ7C_cjs.toBatchExpiry(v);
5054
+ const exp = chunk5MLC2HU3_cjs.toBatchExpiry(v);
4817
5055
  if (exp !== void 0 && (nextSweepEta === void 0 || exp < nextSweepEta)) {
4818
5056
  nextSweepEta = exp;
4819
5057
  }
@@ -5074,7 +5312,7 @@ var VtxoManager = class _VtxoManager {
5074
5312
  /** Decodes the boarding tapscript exit path to extract the CSV timelock. */
5075
5313
  getBoardingTimelock() {
5076
5314
  const wallet = this.getSweepWallet();
5077
- const exitScript = chunk2JV4VQ7C_cjs.CSVMultisigTapscript.decode(
5315
+ const exitScript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(
5078
5316
  base.hex.decode(wallet.boardingTapscript.exitScript)
5079
5317
  );
5080
5318
  return exitScript.params.timelock;
@@ -5205,8 +5443,8 @@ var VtxoManager = class _VtxoManager {
5205
5443
  * or doesn't carry the metadata.
5206
5444
  */
5207
5445
  extractSpentOutpoint(error) {
5208
- const ark = chunk2JV4VQ7C_cjs.maybeArkError(error);
5209
- if (!chunk2JV4VQ7C_cjs.isArkError(ark, chunk2JV4VQ7C_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
5446
+ const ark = chunk5MLC2HU3_cjs.maybeArkError(error);
5447
+ if (!chunk5MLC2HU3_cjs.isArkError(ark, chunk5MLC2HU3_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
5210
5448
  const raw = ark.metadata?.vtxo_outpoint;
5211
5449
  if (typeof raw !== "string") return void 0;
5212
5450
  const [txid, voutStr] = raw.split(":");
@@ -5396,7 +5634,7 @@ var VtxoManager = class _VtxoManager {
5396
5634
  if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
5397
5635
  break;
5398
5636
  }
5399
- const inputFee = estimator.evalOffchainInput(chunk2JV4VQ7C_cjs.toOffchainInputFeeParams(v));
5637
+ const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(v));
5400
5638
  if (inputFee.satoshis >= v.value) {
5401
5639
  continue;
5402
5640
  }
@@ -5416,7 +5654,7 @@ var VtxoManager = class _VtxoManager {
5416
5654
  const arkAddress = await this.wallet.getAddress();
5417
5655
  const outputFee = estimator.evalOffchainOutput({
5418
5656
  amount: totalAmount,
5419
- script: base.hex.encode(chunk2JV4VQ7C_cjs.ArkAddress.decode(arkAddress).pkScript)
5657
+ script: base.hex.encode(chunk5MLC2HU3_cjs.ArkAddress.decode(arkAddress).pkScript)
5420
5658
  });
5421
5659
  totalAmount -= BigInt(outputFee.satoshis);
5422
5660
  if (totalAmount < dustAmount) return;
@@ -5496,7 +5734,7 @@ var ArkNote = class _ArkNote {
5496
5734
  this.value = value;
5497
5735
  this.HRP = HRP;
5498
5736
  const preimageHash = utils_js.sha256(this.preimage);
5499
- this.vtxoScript = new chunk2JV4VQ7C_cjs.VtxoScript([noteTapscript(preimageHash)]);
5737
+ this.vtxoScript = new chunk5MLC2HU3_cjs.VtxoScript([noteTapscript(preimageHash)]);
5500
5738
  const leaf = this.vtxoScript.leaves[0];
5501
5739
  this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
5502
5740
  this.tapTree = this.vtxoScript.encode();
@@ -5663,7 +5901,7 @@ var ArkadeCash = class _ArkadeCash {
5663
5901
  const privateKey = data.slice(1, 33);
5664
5902
  const serverPubKey = data.slice(33, 65);
5665
5903
  const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
5666
- const csvTimelock = chunk2JV4VQ7C_cjs.sequenceToTimelock(sequence);
5904
+ const csvTimelock = chunk5MLC2HU3_cjs.sequenceToTimelock(sequence);
5667
5905
  return new _ArkadeCash(privateKey, serverPubKey, csvTimelock, decoded.prefix);
5668
5906
  }
5669
5907
  toString() {
@@ -5671,7 +5909,7 @@ var ArkadeCash = class _ArkadeCash {
5671
5909
  data[0] = _ArkadeCash.Version;
5672
5910
  data.set(this._privateKey, 1);
5673
5911
  data.set(this._serverPubKey, 33);
5674
- const sequence = chunk2JV4VQ7C_cjs.timelockToSequence(this.csvTimelock);
5912
+ const sequence = chunk5MLC2HU3_cjs.timelockToSequence(this.csvTimelock);
5675
5913
  new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
5676
5914
  const words = base.bech32m.toWords(data);
5677
5915
  return base.bech32m.encode(this.hrp, words, 1023);
@@ -5680,7 +5918,7 @@ var ArkadeCash = class _ArkadeCash {
5680
5918
  return SingleKey.fromPrivateKey(this._privateKey);
5681
5919
  }
5682
5920
  get vtxoScript() {
5683
- return new chunkOIZ2V2VD_cjs.DefaultVtxo.Script({
5921
+ return new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
5684
5922
  pubKey: this._publicKey,
5685
5923
  serverPubKey: this._serverPubKey,
5686
5924
  csvTimelock: this.csvTimelock
@@ -5941,7 +6179,7 @@ async function captureExitBranch(params) {
5941
6179
  const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
5942
6180
  if (nonCommitment.length > 0) {
5943
6181
  for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
5944
- psbtByTxid.set(chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6182
+ psbtByTxid.set(chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
5945
6183
  }
5946
6184
  }
5947
6185
  }
@@ -5984,10 +6222,10 @@ var IndexerExitDataSource = class {
5984
6222
  while (hasMore) {
5985
6223
  const { chain: page, page: meta } = await this.indexer.getVtxoChain(
5986
6224
  { txid: vtxo.txid, vout: vtxo.vout },
5987
- { pageIndex, pageSize: chunk2JV4VQ7C_cjs.DEFAULT_PAGE_SIZE }
6225
+ { pageIndex, pageSize: chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE }
5988
6226
  );
5989
6227
  chain.push(...page);
5990
- hasMore = meta ? page.length === chunk2JV4VQ7C_cjs.DEFAULT_PAGE_SIZE : false;
6228
+ hasMore = meta ? page.length === chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE : false;
5991
6229
  pageIndex++;
5992
6230
  }
5993
6231
  return chain;
@@ -5999,12 +6237,12 @@ var IndexerExitDataSource = class {
5999
6237
  while (hasMore) {
6000
6238
  const { txs, page } = await this.indexer.getVirtualTxs(txids, {
6001
6239
  pageIndex,
6002
- pageSize: chunk2JV4VQ7C_cjs.DEFAULT_PAGE_SIZE
6240
+ pageSize: chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE
6003
6241
  });
6004
6242
  for (const psbt of txs) {
6005
- out.set(chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6243
+ out.set(chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6006
6244
  }
6007
- hasMore = page ? txs.length === chunk2JV4VQ7C_cjs.DEFAULT_PAGE_SIZE : false;
6245
+ hasMore = page ? txs.length === chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE : false;
6008
6246
  pageIndex++;
6009
6247
  }
6010
6248
  return out;
@@ -6025,7 +6263,7 @@ function chainedTxTypeToChainTxType(t) {
6025
6263
  }
6026
6264
  }
6027
6265
  function psbtInputTxids(psbtBase64) {
6028
- const tx = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
6266
+ const tx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
6029
6267
  const ids = [];
6030
6268
  for (let i = 0; i < tx.inputsLength; i++) {
6031
6269
  const txid = tx.getInput(i).txid;
@@ -6384,10 +6622,10 @@ async function resolveArkInfo(arkProvider, walletRepository) {
6384
6622
  try {
6385
6623
  info = await arkProvider.getInfo();
6386
6624
  } catch (err) {
6387
- if (!chunk2JV4VQ7C_cjs.isRetryableProviderError(err)) throw err;
6625
+ if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
6388
6626
  const snapshot = await loadArkInfoSnapshot(walletRepository);
6389
6627
  if (!snapshot) {
6390
- throw new chunk2JV4VQ7C_cjs.ProviderUnavailableError(
6628
+ throw new chunk5MLC2HU3_cjs.ProviderUnavailableError(
6391
6629
  "Arkade server info is unavailable and no cached snapshot exists",
6392
6630
  { cause: err }
6393
6631
  );
@@ -6470,6 +6708,13 @@ var TxTree = class {
6470
6708
  if (nbOfInputs !== 1) {
6471
6709
  throw new Error(`unexpected number of inputs: ${nbOfInputs}, expected 1`);
6472
6710
  }
6711
+ if (this.root.lockTime !== 0) {
6712
+ throw new Error(`unexpected locktime: ${this.root.lockTime}, expected 0`);
6713
+ }
6714
+ const sequence = this.root.getInput(0).sequence;
6715
+ if (sequence !== void 0 && sequence !== btcSigner.DEFAULT_SEQUENCE) {
6716
+ throw new Error(`unexpected sequence: ${sequence}, expected ${btcSigner.DEFAULT_SEQUENCE}`);
6717
+ }
6473
6718
  if (this.children.size > nbOfOutputs - 1) {
6474
6719
  throw new Error(
6475
6720
  `unexpected number of children: ${this.children.size}, expected maximum ${nbOfOutputs - 1}`
@@ -6770,7 +7015,7 @@ function collectArkTxidsNeedingCreatedAt(vtxos) {
6770
7015
  return [...txids];
6771
7016
  }
6772
7017
  async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt) {
6773
- const fromOldestVtxo = vtxos.map(chunk2JV4VQ7C_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
7018
+ const fromOldestVtxo = vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
6774
7019
  const txidsNeedingCreatedAt = resolveTxCreatedAt ? collectArkTxidsNeedingCreatedAt(fromOldestVtxo) : [];
6775
7020
  const resolvedCreatedAt = resolveTxCreatedAt && txidsNeedingCreatedAt.length > 0 ? await resolveTxCreatedAt(txidsNeedingCreatedAt) : /* @__PURE__ */ new Map();
6776
7021
  const unmatchedSettledBoardingTxs = allBoardingTxs.filter(isSettledBoardingReceive).sort((a, b) => a.createdAt - b.createdAt);
@@ -6934,7 +7179,7 @@ var AssetManager = class extends ReadonlyAssetManager {
6934
7179
  const virtualCoins = await this.wallet.getSpendableVtxos({
6935
7180
  withRecoverable: false
6936
7181
  });
6937
- const controlAssetRef = params.controlAssetId ? chunkCO3KKSWM_cjs.AssetRef.fromId(chunkCO3KKSWM_cjs.AssetId.fromString(params.controlAssetId)) : null;
7182
+ const controlAssetRef = params.controlAssetId ? chunkGVHUHTRH_cjs.AssetRef.fromId(chunkGVHUHTRH_cjs.AssetId.fromString(params.controlAssetId)) : null;
6938
7183
  const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
6939
7184
  let totalBtcSelected = 0n;
6940
7185
  const assetChanges = /* @__PURE__ */ new Map();
@@ -6947,8 +7192,8 @@ var AssetManager = class extends ReadonlyAssetManager {
6947
7192
  }
6948
7193
  }
6949
7194
  const groups = [];
6950
- const issuedAssetOutput = chunkCO3KKSWM_cjs.AssetOutput.create(0, params.amount);
6951
- const issuedAssetGroup = chunkCO3KKSWM_cjs.AssetGroup.create(
7195
+ const issuedAssetOutput = chunkGVHUHTRH_cjs.AssetOutput.create(0, params.amount);
7196
+ const issuedAssetGroup = chunkGVHUHTRH_cjs.AssetGroup.create(
6952
7197
  null,
6953
7198
  controlAssetRef,
6954
7199
  [],
@@ -6963,28 +7208,28 @@ var AssetManager = class extends ReadonlyAssetManager {
6963
7208
  for (const [inputIndex, assets] of assetInputs) {
6964
7209
  for (const asset of assets) {
6965
7210
  if (asset.assetId !== assetId) continue;
6966
- changeInputs.push(chunkCO3KKSWM_cjs.AssetInput.create(inputIndex, asset.amount));
7211
+ changeInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
6967
7212
  }
6968
7213
  }
6969
7214
  groups.push(
6970
- chunkCO3KKSWM_cjs.AssetGroup.create(
6971
- chunkCO3KKSWM_cjs.AssetId.fromString(assetId),
7215
+ chunkGVHUHTRH_cjs.AssetGroup.create(
7216
+ chunkGVHUHTRH_cjs.AssetId.fromString(assetId),
6972
7217
  null,
6973
7218
  changeInputs,
6974
- [chunkCO3KKSWM_cjs.AssetOutput.create(0, amount)],
7219
+ [chunkGVHUHTRH_cjs.AssetOutput.create(0, amount)],
6975
7220
  []
6976
7221
  )
6977
7222
  );
6978
7223
  }
6979
7224
  }
6980
7225
  const address = await this.wallet.getAddress();
6981
- const outputAddress = chunk2JV4VQ7C_cjs.ArkAddress.decode(address);
7226
+ const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
6982
7227
  const outputs = [
6983
7228
  {
6984
7229
  script: outputAddress.pkScript,
6985
7230
  amount: BigInt(totalBtcSelected)
6986
7231
  },
6987
- Extension.create([chunkCO3KKSWM_cjs.Packet.create(groups)]).txOut()
7232
+ Extension.create([chunkGVHUHTRH_cjs.Packet.create(groups)]).txOut()
6988
7233
  ];
6989
7234
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
6990
7235
  coinSelection.inputs,
@@ -6992,7 +7237,7 @@ var AssetManager = class extends ReadonlyAssetManager {
6992
7237
  );
6993
7238
  return {
6994
7239
  arkTxId: arkTxid,
6995
- assetId: chunkCO3KKSWM_cjs.AssetId.create(arkTxid, 0).toString()
7240
+ assetId: chunkGVHUHTRH_cjs.AssetId.create(arkTxid, 0).toString()
6996
7241
  };
6997
7242
  }
6998
7243
  /**
@@ -7064,16 +7309,16 @@ var AssetManager = class extends ReadonlyAssetManager {
7064
7309
  for (const [inputIndex, assets] of assetInputs) {
7065
7310
  for (const asset of assets) {
7066
7311
  if (asset.assetId !== params.assetId) continue;
7067
- reissueInputs.push(chunkCO3KKSWM_cjs.AssetInput.create(inputIndex, asset.amount));
7312
+ reissueInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
7068
7313
  }
7069
7314
  }
7070
7315
  const totalAssetAmount = assetToReissueAmount + params.amount;
7071
- const reissueAssetIdObj = chunkCO3KKSWM_cjs.AssetId.fromString(params.assetId);
7072
- const reissueAssetGroup = chunkCO3KKSWM_cjs.AssetGroup.create(
7316
+ const reissueAssetIdObj = chunkGVHUHTRH_cjs.AssetId.fromString(params.assetId);
7317
+ const reissueAssetGroup = chunkGVHUHTRH_cjs.AssetGroup.create(
7073
7318
  reissueAssetIdObj,
7074
7319
  null,
7075
7320
  reissueInputs,
7076
- [chunkCO3KKSWM_cjs.AssetOutput.create(0, totalAssetAmount)],
7321
+ [chunkGVHUHTRH_cjs.AssetOutput.create(0, totalAssetAmount)],
7077
7322
  []
7078
7323
  );
7079
7324
  const groups = [reissueAssetGroup];
@@ -7082,27 +7327,27 @@ var AssetManager = class extends ReadonlyAssetManager {
7082
7327
  for (const [inputIndex, assets] of assetInputs) {
7083
7328
  for (const asset of assets) {
7084
7329
  if (asset.assetId !== assetId) continue;
7085
- changeInputs.push(chunkCO3KKSWM_cjs.AssetInput.create(inputIndex, asset.amount));
7330
+ changeInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
7086
7331
  }
7087
7332
  }
7088
7333
  groups.push(
7089
- chunkCO3KKSWM_cjs.AssetGroup.create(
7090
- chunkCO3KKSWM_cjs.AssetId.fromString(assetId),
7334
+ chunkGVHUHTRH_cjs.AssetGroup.create(
7335
+ chunkGVHUHTRH_cjs.AssetId.fromString(assetId),
7091
7336
  null,
7092
7337
  changeInputs,
7093
- [chunkCO3KKSWM_cjs.AssetOutput.create(0, amount)],
7338
+ [chunkGVHUHTRH_cjs.AssetOutput.create(0, amount)],
7094
7339
  []
7095
7340
  )
7096
7341
  );
7097
7342
  }
7098
7343
  const address = await this.wallet.getAddress();
7099
- const outputAddress = chunk2JV4VQ7C_cjs.ArkAddress.decode(address);
7344
+ const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
7100
7345
  const outputs = [
7101
7346
  {
7102
7347
  script: outputAddress.pkScript,
7103
7348
  amount: BigInt(totalBtcSelected)
7104
7349
  },
7105
- Extension.create([chunkCO3KKSWM_cjs.Packet.create(groups)]).txOut()
7350
+ Extension.create([chunkGVHUHTRH_cjs.Packet.create(groups)]).txOut()
7106
7351
  ];
7107
7352
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
7108
7353
  return arkTxid;
@@ -7169,27 +7414,27 @@ var AssetManager = class extends ReadonlyAssetManager {
7169
7414
  for (const [inputIndex, assets] of assetInputs) {
7170
7415
  for (const asset of assets) {
7171
7416
  if (asset.assetId !== assetId) continue;
7172
- changeInputs.push(chunkCO3KKSWM_cjs.AssetInput.create(inputIndex, asset.amount));
7417
+ changeInputs.push(chunkGVHUHTRH_cjs.AssetInput.create(inputIndex, asset.amount));
7173
7418
  }
7174
7419
  }
7175
7420
  groups.push(
7176
- chunkCO3KKSWM_cjs.AssetGroup.create(
7177
- chunkCO3KKSWM_cjs.AssetId.fromString(assetId),
7421
+ chunkGVHUHTRH_cjs.AssetGroup.create(
7422
+ chunkGVHUHTRH_cjs.AssetId.fromString(assetId),
7178
7423
  null,
7179
7424
  changeInputs,
7180
- amount > 0n ? [chunkCO3KKSWM_cjs.AssetOutput.create(0, amount)] : [],
7425
+ amount > 0n ? [chunkGVHUHTRH_cjs.AssetOutput.create(0, amount)] : [],
7181
7426
  []
7182
7427
  )
7183
7428
  );
7184
7429
  }
7185
7430
  const address = await this.wallet.getAddress();
7186
- const outputAddress = chunk2JV4VQ7C_cjs.ArkAddress.decode(address);
7431
+ const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(address);
7187
7432
  const outputs = [
7188
7433
  {
7189
7434
  script: outputAddress.pkScript,
7190
7435
  amount: BigInt(totalBtcSelected)
7191
7436
  },
7192
- Extension.create([chunkCO3KKSWM_cjs.Packet.create(groups)]).txOut()
7437
+ Extension.create([chunkGVHUHTRH_cjs.Packet.create(groups)]).txOut()
7193
7438
  ];
7194
7439
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
7195
7440
  return arkTxid;
@@ -7214,7 +7459,7 @@ function castMetadata(metadata) {
7214
7459
  } else {
7215
7460
  throw new Error("Invalid metadata value type");
7216
7461
  }
7217
- md.push(chunkCO3KKSWM_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
7462
+ md.push(chunkGVHUHTRH_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
7218
7463
  }
7219
7464
  return md;
7220
7465
  }
@@ -7235,10 +7480,10 @@ var DelegateManagerImpl = class {
7235
7480
  if (vtxos.length === 0) {
7236
7481
  return { delegated: [], failed: [] };
7237
7482
  }
7238
- const destinationScript = chunk2JV4VQ7C_cjs.ArkAddress.decode(destination).pkScript;
7483
+ const destinationScript = chunk5MLC2HU3_cjs.ArkAddress.decode(destination).pkScript;
7239
7484
  const arkInfo = await this.arkInfoProvider.getInfo();
7240
7485
  const delegateInfo = await this.delegateProvider.getDelegateInfo();
7241
- const eligible = vtxos.map(chunk2JV4VQ7C_cjs.normalizeVtxo).filter(
7486
+ const eligible = vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo).filter(
7242
7487
  (v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
7243
7488
  );
7244
7489
  if (eligible.length === 0) {
@@ -7267,11 +7512,11 @@ var DelegateManagerImpl = class {
7267
7512
  const groupByExpiry = /* @__PURE__ */ new Map();
7268
7513
  let recoverableVtxos = [];
7269
7514
  for (const vtxo of eligible) {
7270
- if (chunk2JV4VQ7C_cjs.canRecoverOnchain(vtxo, now)) {
7515
+ if (chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
7271
7516
  recoverableVtxos.push(vtxo);
7272
7517
  continue;
7273
7518
  }
7274
- const expiry = chunk2JV4VQ7C_cjs.toBatchExpiry(vtxo);
7519
+ const expiry = chunk5MLC2HU3_cjs.toBatchExpiry(vtxo);
7275
7520
  if (!expiry) continue;
7276
7521
  const dayKey = getDayTimestamp(expiry);
7277
7522
  groupByExpiry.set(dayKey, [...groupByExpiry.get(dayKey) ?? [], vtxo]);
@@ -7336,7 +7581,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7336
7581
  }
7337
7582
  if (!delegateAt) {
7338
7583
  const now = { timestamp: /* @__PURE__ */ new Date() };
7339
- const expiryTimestamp = vtxos.filter((coin) => !chunk2JV4VQ7C_cjs.canRecoverOnchain(coin, now) && chunk2JV4VQ7C_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunk2JV4VQ7C_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
7584
+ const expiryTimestamp = vtxos.filter((coin) => !chunk5MLC2HU3_cjs.canRecoverOnchain(coin, now) && chunk5MLC2HU3_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunk5MLC2HU3_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
7340
7585
  if (!expiryTimestamp || expiryTimestamp === Number.MAX_SAFE_INTEGER) {
7341
7586
  delegateAt = new Date(Date.now() + 1 * 60 * 1e3);
7342
7587
  } else {
@@ -7365,7 +7610,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7365
7610
  let amount = 0n;
7366
7611
  for (const coin of vtxos) {
7367
7612
  const inputFee = estimator.evalOffchainInput({
7368
- ...chunk2JV4VQ7C_cjs.toOffchainInputFeeParams(coin),
7613
+ ...chunk5MLC2HU3_cjs.toOffchainInputFeeParams(coin),
7369
7614
  type: "vtxo"
7370
7615
  });
7371
7616
  if (inputFee.value >= coin.value) {
@@ -7379,7 +7624,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7379
7624
  const delegateFee = BigInt(Number(fee));
7380
7625
  if (delegateFee > 0n) {
7381
7626
  outputs.push({
7382
- script: chunk2JV4VQ7C_cjs.ArkAddress.decode(delegateAddress).pkScript,
7627
+ script: chunk5MLC2HU3_cjs.ArkAddress.decode(delegateAddress).pkScript,
7383
7628
  amount: delegateFee
7384
7629
  });
7385
7630
  }
@@ -7412,10 +7657,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7412
7657
  destinationScript
7413
7658
  );
7414
7659
  const forfeitOutputScript = btcSigner.OutScript.encode(
7415
- btcSigner.Address(chunk2JV4VQ7C_cjs.getNetwork(network)).decode(forfeitAddress)
7660
+ btcSigner.Address(chunk5MLC2HU3_cjs.getNetwork(network)).decode(forfeitAddress)
7416
7661
  );
7417
7662
  const forfeits = await Promise.all(
7418
- vtxos.filter((v) => !chunk2JV4VQ7C_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
7663
+ vtxos.filter((v) => !chunk5MLC2HU3_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
7419
7664
  const forfeit = await makeDelegateForfeitTx(
7420
7665
  coin,
7421
7666
  dust,
@@ -7440,7 +7685,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
7440
7685
  index: input.vout,
7441
7686
  witnessUtxo: {
7442
7687
  amount: BigInt(input.value),
7443
- script: chunk2JV4VQ7C_cjs.VtxoScript.decode(input.tapTree).pkScript
7688
+ script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
7444
7689
  },
7445
7690
  sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
7446
7691
  tapLeafScript: [delegateTapLeaf]
@@ -7498,7 +7743,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
7498
7743
  expire_at: 0,
7499
7744
  cosigners_public_keys: cosignerPubKeys
7500
7745
  };
7501
- const proof = chunk2JV4VQ7C_cjs.Intent.create(message, coins, outputs);
7746
+ const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, outputs);
7502
7747
  const signedProof = await identity.sign(proof);
7503
7748
  return {
7504
7749
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -7516,10 +7761,10 @@ function getDayTimestamp(timestamp) {
7516
7761
  function findDelegateTapLeaf(vtxo, delegatePubkey) {
7517
7762
  if (!vtxo.tapTree) return void 0;
7518
7763
  const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
7519
- const vtxoScript = chunk2JV4VQ7C_cjs.VtxoScript.decode(vtxo.tapTree);
7764
+ const vtxoScript = chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree);
7520
7765
  return vtxoScript.leaves.find((tapLeaf) => {
7521
- const arkTapscript = chunk2JV4VQ7C_cjs.decodeTapscript(chunk2JV4VQ7C_cjs.scriptFromTapLeafScript(tapLeaf));
7522
- if (!chunk2JV4VQ7C_cjs.MultisigTapscript.is(arkTapscript)) return false;
7766
+ const arkTapscript = chunk5MLC2HU3_cjs.decodeTapscript(chunk5MLC2HU3_cjs.scriptFromTapLeafScript(tapLeaf));
7767
+ if (!chunk5MLC2HU3_cjs.MultisigTapscript.is(arkTapscript)) return false;
7523
7768
  return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
7524
7769
  });
7525
7770
  }
@@ -7800,7 +8045,7 @@ function createManagedConnection(dbName, version, initDatabase2) {
7800
8045
  };
7801
8046
  }
7802
8047
  function scriptFromArkAddress(address) {
7803
- return base.hex.encode(chunk2JV4VQ7C_cjs.ArkAddress.decode(address).pkScript);
8048
+ return base.hex.encode(chunk5MLC2HU3_cjs.ArkAddress.decode(address).pkScript);
7804
8049
  }
7805
8050
 
7806
8051
  // src/repositories/indexedDB/schema.ts
@@ -8295,7 +8540,7 @@ function validateVtxosForScript(vtxos, script, context) {
8295
8540
  }
8296
8541
  async function getVtxosForContract(repo, contract) {
8297
8542
  const vtxos = repo.getVtxosForScript ? await repo.getVtxosForScript(contract.script) : filterVtxosForScript(await repo.getVtxos(contract.address), contract.script);
8298
- return vtxos.map(chunk2JV4VQ7C_cjs.normalizeVtxo);
8543
+ return vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
8299
8544
  }
8300
8545
  async function saveVtxosForContract(repo, contract, vtxos) {
8301
8546
  if (repo.saveVtxosForScript) {
@@ -8437,7 +8682,7 @@ function decodeArkContract(encoded) {
8437
8682
  }
8438
8683
  function contractFromArkContract(encoded, options = {}) {
8439
8684
  const parsed = decodeArkContract(encoded);
8440
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.get(parsed.type);
8685
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(parsed.type);
8441
8686
  if (!handler) {
8442
8687
  throw new Error(`No handler registered for contract type '${parsed.type}'`);
8443
8688
  }
@@ -8451,9 +8696,9 @@ function contractFromArkContract(encoded, options = {}) {
8451
8696
  metadata: options.metadata
8452
8697
  };
8453
8698
  }
8454
- function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunk2JV4VQ7C_cjs.DEFAULT_NETWORK.hrp, options = {}) {
8699
+ function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunk5MLC2HU3_cjs.DEFAULT_NETWORK.hrp, options = {}) {
8455
8700
  const parsed = decodeArkContract(encoded);
8456
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.getOrThrow(parsed.type);
8701
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.getOrThrow(parsed.type);
8457
8702
  const params = parsed.data;
8458
8703
  const vtxoScript = handler.createScript(params);
8459
8704
  return {
@@ -8707,9 +8952,9 @@ var ContractWatcher = class {
8707
8952
  this.connectionState = "connected";
8708
8953
  this.reconnectAttempts = 0;
8709
8954
  this.listenLoop().catch((e) => {
8710
- if (chunk2JV4VQ7C_cjs.isEventSourceError(e)) {
8955
+ if (chunk5MLC2HU3_cjs.isEventSourceError(e)) {
8711
8956
  console.debug("ContractWatcher subscription disconnected; reconnecting");
8712
- } else if (!chunk2JV4VQ7C_cjs.isEventSourceUnavailableError(e)) {
8957
+ } else if (!chunk5MLC2HU3_cjs.isEventSourceUnavailableError(e)) {
8713
8958
  console.error(e);
8714
8959
  }
8715
8960
  this.connectionState = "disconnected";
@@ -8721,7 +8966,7 @@ var ContractWatcher = class {
8721
8966
  this.scheduleReconnect();
8722
8967
  });
8723
8968
  } catch (error) {
8724
- if (!chunk2JV4VQ7C_cjs.isEventSourceUnavailableError(error)) {
8969
+ if (!chunk5MLC2HU3_cjs.isEventSourceUnavailableError(error)) {
8725
8970
  console.error("ContractWatcher connection failed:", error);
8726
8971
  }
8727
8972
  this.connectionState = "disconnected";
@@ -8747,7 +8992,7 @@ var ContractWatcher = class {
8747
8992
  * slower; what it loses is push latency.
8748
8993
  */
8749
8994
  reportEventSourceUnavailable(error) {
8750
- if (!chunk2JV4VQ7C_cjs.isEventSourceUnavailableError(error)) return false;
8995
+ if (!chunk5MLC2HU3_cjs.isEventSourceUnavailableError(error)) return false;
8751
8996
  if (!this.eventSourceReported) {
8752
8997
  this.eventSourceReported = true;
8753
8998
  console.warn(
@@ -8963,14 +9208,14 @@ var ContractWatcher = class {
8963
9208
  const timestamp = Date.now();
8964
9209
  if (update.newVtxos?.length) {
8965
9210
  this.processSubscriptionVtxos(
8966
- update.newVtxos.map(chunk2JV4VQ7C_cjs.normalizeVtxo),
9211
+ update.newVtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo),
8967
9212
  "vtxo_received",
8968
9213
  timestamp
8969
9214
  );
8970
9215
  }
8971
9216
  if (update.spentVtxos?.length) {
8972
9217
  this.processSubscriptionVtxos(
8973
- update.spentVtxos.map(chunk2JV4VQ7C_cjs.normalizeVtxo),
9218
+ update.spentVtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo),
8974
9219
  "vtxo_spent",
8975
9220
  timestamp
8976
9221
  );
@@ -9065,7 +9310,7 @@ var NON_TERMINAL_INTENT_STATES = ALL_INTENT_STATES.filter(
9065
9310
  (s) => !isTerminalIntentState(s)
9066
9311
  );
9067
9312
  function isConsumed(vtxo) {
9068
- return vtxo !== void 0 && chunk2JV4VQ7C_cjs.hasTerminalSpend(vtxo);
9313
+ return vtxo !== void 0 && chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo);
9069
9314
  }
9070
9315
  async function classifyIntent(intent, vtxosByOutpoint, now) {
9071
9316
  if (isTerminalIntentState(intent.state)) return void 0;
@@ -9108,7 +9353,7 @@ async function reconcileIntents(deps) {
9108
9353
  let vtxosByOutpoint = /* @__PURE__ */ new Map();
9109
9354
  if (outpoints.length > 0) {
9110
9355
  try {
9111
- const { vtxos } = await chunk2JV4VQ7C_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
9356
+ const { vtxos } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
9112
9357
  vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
9113
9358
  } catch (e) {
9114
9359
  console.error("reconcileIntents: failed to fetch input VTXO state", e);
@@ -9282,7 +9527,7 @@ var ContractManager = class _ContractManager {
9282
9527
  await this.reconcileWatched();
9283
9528
  this.markSyncOnline();
9284
9529
  } catch (err) {
9285
- if (!chunk2JV4VQ7C_cjs.isRetryableProviderError(err)) throw err;
9530
+ if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
9286
9531
  this.markSyncDegraded(err);
9287
9532
  }
9288
9533
  this.initialized = true;
@@ -9414,7 +9659,7 @@ var ContractManager = class _ContractManager {
9414
9659
  const from = Math.max(0, watermark - lookAhead.size);
9415
9660
  const to = watermark + lookAhead.size;
9416
9661
  const deps = lookAhead.candidateDeps();
9417
- const handlers = chunkOIZ2V2VD_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkOIZ2V2VD_cjs.contractHandlers.get(t)).filter(hasCandidates);
9662
+ const handlers = chunkWIFL5QYZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkWIFL5QYZ_cjs.contractHandlers.get(t)).filter(hasCandidates);
9418
9663
  const band = /* @__PURE__ */ new Map();
9419
9664
  for (let index = from; index <= to; index++) {
9420
9665
  const descriptor = lookAhead.materialize(index);
@@ -9425,7 +9670,7 @@ var ContractManager = class _ContractManager {
9425
9670
  index,
9426
9671
  params: {
9427
9672
  ...candidate,
9428
- ...chunkOIZ2V2VD_cjs.speculativeReceiveMetadata(descriptor)
9673
+ ...chunkWIFL5QYZ_cjs.speculativeReceiveMetadata(descriptor)
9429
9674
  }
9430
9675
  });
9431
9676
  }
@@ -9487,7 +9732,7 @@ var ContractManager = class _ContractManager {
9487
9732
  });
9488
9733
  for (const entry of pending) entry.catchUpPending = false;
9489
9734
  } catch (err) {
9490
- if (!chunk2JV4VQ7C_cjs.isRetryableProviderError(err)) throw err;
9735
+ if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
9491
9736
  this.markSyncDegraded(err);
9492
9737
  }
9493
9738
  }
@@ -9537,7 +9782,7 @@ var ContractManager = class _ContractManager {
9537
9782
  await this.fetchContractVxosFromIndexer([contract]);
9538
9783
  this.markSyncOnline();
9539
9784
  } catch (err) {
9540
- if (!chunk2JV4VQ7C_cjs.isRetryableProviderError(err)) throw err;
9785
+ if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
9541
9786
  this.markSyncDegraded(err);
9542
9787
  }
9543
9788
  await this.watcher.addContract(contract);
@@ -9574,7 +9819,7 @@ var ContractManager = class _ContractManager {
9574
9819
  return result;
9575
9820
  }
9576
9821
  async upsertContractRow(params) {
9577
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.get(params.type);
9822
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(params.type);
9578
9823
  if (!handler) {
9579
9824
  throw new Error(`No handler registered for contract type '${params.type}'`);
9580
9825
  }
@@ -9674,7 +9919,7 @@ var ContractManager = class _ContractManager {
9674
9919
  `scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
9675
9920
  );
9676
9921
  }
9677
- const registered = chunkOIZ2V2VD_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkOIZ2V2VD_cjs.contractHandlers.get(t)).filter(isDiscoverable);
9922
+ const registered = chunkWIFL5QYZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkWIFL5QYZ_cjs.contractHandlers.get(t)).filter(isDiscoverable);
9678
9923
  const discoverables = [
9679
9924
  ...registered.filter((h) => h.type === "boarding"),
9680
9925
  ...registered.filter((h) => h.type !== "boarding")
@@ -9809,7 +10054,7 @@ var ContractManager = class _ContractManager {
9809
10054
  await this.syncContracts({ contracts, pageSize });
9810
10055
  this.markSyncOnline();
9811
10056
  } catch (err) {
9812
- if (!chunk2JV4VQ7C_cjs.isRetryableProviderError(err)) throw err;
10057
+ if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
9813
10058
  this.markSyncDegraded(err);
9814
10059
  }
9815
10060
  const vtxos = await this.getVtxosForContracts(contracts);
@@ -9830,7 +10075,7 @@ var ContractManager = class _ContractManager {
9830
10075
  }
9831
10076
  const tapscriptCache = tapscripts ?? /* @__PURE__ */ new Map();
9832
10077
  return vtxos.map(
9833
- (vtxo) => extendVirtualCoinForContract(chunk2JV4VQ7C_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
10078
+ (vtxo) => extendVirtualCoinForContract(chunk5MLC2HU3_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
9834
10079
  );
9835
10080
  }
9836
10081
  /** @inheritdoc */
@@ -9874,14 +10119,14 @@ var ContractManager = class _ContractManager {
9874
10119
  const byScript = new Map(contracts.map((contract) => [contract.script, contract]));
9875
10120
  const asking = vtxos.filter((vtxo) => {
9876
10121
  const contract = byScript.get(vtxo.script);
9877
- return contract !== void 0 && chunkOIZ2V2VD_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
10122
+ return contract !== void 0 && chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
9878
10123
  });
9879
10124
  if (asking.length === 0) return refused;
9880
10125
  const tip = await this.currentChainTip();
9881
10126
  const walletKey = await walletPubKey?.();
9882
10127
  for (const vtxo of asking) {
9883
10128
  const contract = byScript.get(vtxo.script);
9884
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.get(contract.type);
10129
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
9885
10130
  if (!handler?.assertSpendableNow) continue;
9886
10131
  const context = {
9887
10132
  collaborative: true,
@@ -9896,7 +10141,7 @@ var ContractManager = class _ContractManager {
9896
10141
  // the next handler to answer a CSV question would meet a
9897
10142
  // TypeError instead of a `false`. Carry the coin only when it
9898
10143
  // really is one.
9899
- vtxo: chunk2JV4VQ7C_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
10144
+ vtxo: chunk5MLC2HU3_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
9900
10145
  };
9901
10146
  try {
9902
10147
  await handler.assertSpendableNow(
@@ -10052,7 +10297,7 @@ var ContractManager = class _ContractManager {
10052
10297
  const { contractScript, collaborative = true, walletPubKey, vtxo } = options;
10053
10298
  const [contract] = await this.getContracts({ script: contractScript });
10054
10299
  if (!contract) return [];
10055
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.get(contract.type);
10300
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
10056
10301
  if (!handler) return [];
10057
10302
  const script = handler.createScript(contract.params);
10058
10303
  const tip = await this.currentChainTip();
@@ -10080,7 +10325,7 @@ var ContractManager = class _ContractManager {
10080
10325
  const { contractScript, collaborative = true, walletPubKey } = options;
10081
10326
  const [contract] = await this.getContracts({ script: contractScript });
10082
10327
  if (!contract) return [];
10083
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.get(contract.type);
10328
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
10084
10329
  if (!handler) return [];
10085
10330
  const script = handler.createScript(contract.params);
10086
10331
  const context = {
@@ -10136,7 +10381,7 @@ var ContractManager = class _ContractManager {
10136
10381
  }
10137
10382
  async refreshOutpoints(outpoints) {
10138
10383
  if (outpoints.length === 0) return;
10139
- const { vtxos } = await chunk2JV4VQ7C_cjs.getNormalizedVtxos(this.config.indexerProvider, {
10384
+ const { vtxos } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(this.config.indexerProvider, {
10140
10385
  outpoints
10141
10386
  });
10142
10387
  if (vtxos.length === 0) return;
@@ -10215,7 +10460,7 @@ var ContractManager = class _ContractManager {
10215
10460
  break;
10216
10461
  }
10217
10462
  } catch (err) {
10218
- if (!chunk2JV4VQ7C_cjs.isRetryableProviderError(err)) throw err;
10463
+ if (!chunk5MLC2HU3_cjs.isRetryableProviderError(err)) throw err;
10219
10464
  this.markSyncDegraded(err);
10220
10465
  }
10221
10466
  this.emitEvent(event);
@@ -10294,7 +10539,7 @@ var ContractManager = class _ContractManager {
10294
10539
  */
10295
10540
  async reconcilePendingFrontier(contracts) {
10296
10541
  const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
10297
- const vtxos = await chunk2JV4VQ7C_cjs.getAllNormalizedVtxos(
10542
+ const vtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(
10298
10543
  this.config.indexerProvider,
10299
10544
  contracts.map((c) => c.script),
10300
10545
  { pendingOnly: true }
@@ -10377,7 +10622,7 @@ var ContractManager = class _ContractManager {
10377
10622
  }
10378
10623
  return result;
10379
10624
  }
10380
- async fetchContractVtxosBulk(contracts, pageSize = chunk2JV4VQ7C_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
10625
+ async fetchContractVtxosBulk(contracts, pageSize = chunk5MLC2HU3_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
10381
10626
  if (contracts.length === 0) {
10382
10627
  return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
10383
10628
  }
@@ -10393,7 +10638,7 @@ var ContractManager = class _ContractManager {
10393
10638
  before: syncWindow.before
10394
10639
  }
10395
10640
  } : {};
10396
- const vtxos = await chunk2JV4VQ7C_cjs.getAllNormalizedVtxos(
10641
+ const vtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(
10397
10642
  this.config.indexerProvider,
10398
10643
  contracts.map((c) => c.script),
10399
10644
  { ...windowOpts, pageSize }
@@ -10538,7 +10783,7 @@ var deserializeTapLeaf = (t) => {
10538
10783
  const s = base.hex.decode(t.s);
10539
10784
  return [cb, s];
10540
10785
  };
10541
- var deserializeVtxo = (o) => chunk2JV4VQ7C_cjs.normalizeVtxo({
10786
+ var deserializeVtxo = (o) => chunk5MLC2HU3_cjs.normalizeVtxo({
10542
10787
  ...o,
10543
10788
  createdAt: new Date(o.createdAt),
10544
10789
  tapTree: base.hex.decode(o.tapTree),
@@ -11361,7 +11606,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
11361
11606
  */
11362
11607
  materializeDescriptorAt(index) {
11363
11608
  const descriptor = this.identity.descriptor;
11364
- const network = chunkOIZ2V2VD_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
11609
+ const network = chunkWIFL5QYZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
11365
11610
  const expansion = descriptorsScure.expand({ descriptor, network, index });
11366
11611
  const keyInfo = expansion.expansionMap?.["@0"];
11367
11612
  if (!keyInfo?.keyExpression) {
@@ -11509,7 +11754,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
11509
11754
  const provider = await resolveDescriptorProvider(config, setup.walletRepository);
11510
11755
  if (!provider) return void 0;
11511
11756
  const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
11512
- const expectedContractType = setup.offchainTapscript instanceof chunkOIZ2V2VD_cjs.DelegateVtxo.Script ? "delegate" : "default";
11757
+ const expectedContractType = setup.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? "delegate" : "default";
11513
11758
  const factoryOpts = {
11514
11759
  walletRepository: setup.walletRepository,
11515
11760
  contractRepository: setup.contractRepository,
@@ -11710,7 +11955,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
11710
11955
  };
11711
11956
  function deriveLeafPubkey(descriptor) {
11712
11957
  try {
11713
- return chunkOIZ2V2VD_cjs.deriveDescriptorLeafPubKey(descriptor);
11958
+ return chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor);
11714
11959
  } catch (e) {
11715
11960
  throw new NonRangeableDescriptorError(
11716
11961
  "Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
@@ -11722,7 +11967,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
11722
11967
  const pubKey = deriveLeafPubkey(descriptor);
11723
11968
  const tapscript = rebuildTapscript(current, pubKey);
11724
11969
  const serverPubKey = tapscript.options.serverPubKey;
11725
- const csvTimelock = chunk2JV4VQ7C_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
11970
+ const csvTimelock = chunk5MLC2HU3_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
11726
11971
  const base$1 = {
11727
11972
  script: base.hex.encode(tapscript.pkScript),
11728
11973
  address: tapscript.address(hrp, serverPubKey).encode(),
@@ -11733,11 +11978,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
11733
11978
  // index-0 key. Without it, spends produce unsigned PSBTs that the
11734
11979
  // server rejects with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
11735
11980
  metadata: {
11736
- ...tagSource && { source: chunkOIZ2V2VD_cjs.WALLET_RECEIVE_SOURCE },
11981
+ ...tagSource && { source: chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE },
11737
11982
  signingDescriptor: descriptor
11738
11983
  }
11739
11984
  };
11740
- const params = tapscript instanceof chunkOIZ2V2VD_cjs.DelegateVtxo.Script ? {
11985
+ const params = tapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? {
11741
11986
  ...base$1,
11742
11987
  type: "delegate",
11743
11988
  params: {
@@ -11758,10 +12003,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
11758
12003
  return { tapscript, params };
11759
12004
  }
11760
12005
  function rebuildTapscript(current, pubKey) {
11761
- if (current instanceof chunkOIZ2V2VD_cjs.DelegateVtxo.Script) {
11762
- return new chunkOIZ2V2VD_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
12006
+ if (current instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script) {
12007
+ return new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
11763
12008
  }
11764
- return new chunkOIZ2V2VD_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
12009
+ return new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
11765
12010
  }
11766
12011
  async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
11767
12012
  const candidates = await contractRepository.getContracts({
@@ -11770,7 +12015,7 @@ async function pickActiveReceive(contractRepository, serverPubKey, expectedType)
11770
12015
  });
11771
12016
  const serverPubKeyHex = base.hex.encode(serverPubKey);
11772
12017
  const matching = candidates.filter(
11773
- (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkOIZ2V2VD_cjs.WALLET_RECEIVE_SOURCE
12018
+ (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE
11774
12019
  ).sort((a, b) => {
11775
12020
  if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
11776
12021
  return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
@@ -11826,7 +12071,7 @@ function computeOffchainBalance(vtxos, caps) {
11826
12071
  }
11827
12072
  };
11828
12073
  for (const vtxo of vtxos) {
11829
- if (chunk2JV4VQ7C_cjs.hasTerminalSpend(vtxo)) continue;
12074
+ if (chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)) continue;
11830
12075
  addAssets(owned, vtxo);
11831
12076
  if (vtxo.isUnrolled) {
11832
12077
  unrolled += vtxo.value;
@@ -11836,11 +12081,11 @@ function computeOffchainBalance(vtxos, caps) {
11836
12081
  pendingRecovery += vtxo.value;
11837
12082
  continue;
11838
12083
  }
11839
- if (chunk2JV4VQ7C_cjs.canRecoverOnchain(vtxo, now)) {
12084
+ if (chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
11840
12085
  recoverable += vtxo.value;
11841
12086
  continue;
11842
12087
  }
11843
- if (!chunk2JV4VQ7C_cjs.canSpendOffchain(vtxo, now)) continue;
12088
+ if (!chunk5MLC2HU3_cjs.canSpendOffchain(vtxo, now)) continue;
11844
12089
  if (vtxo.isPreconfirmed) {
11845
12090
  preconfirmed += vtxo.value;
11846
12091
  } else {
@@ -12010,12 +12255,12 @@ var InputSignerRouter = class {
12010
12255
  };
12011
12256
 
12012
12257
  // src/wallet/wallet.ts
12013
- var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunk2JV4VQ7C_cjs.DEFAULT_ARKADE_SERVER_URL;
12258
+ var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunk5MLC2HU3_cjs.DEFAULT_ARKADE_SERVER_URL;
12014
12259
  function intentProofJobs(coins) {
12015
12260
  if (coins.length === 0) return [];
12016
12261
  const coinJobs = coins.map((coin, i) => ({
12017
12262
  index: i + 1,
12018
- lookupScript: chunk2JV4VQ7C_cjs.VtxoScript.decode(coin.tapTree).pkScript
12263
+ lookupScript: chunk5MLC2HU3_cjs.VtxoScript.decode(coin.tapTree).pkScript
12019
12264
  }));
12020
12265
  return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
12021
12266
  }
@@ -12047,7 +12292,7 @@ function dedupeTimelocks(timelocks) {
12047
12292
  const seen = /* @__PURE__ */ new Set();
12048
12293
  const deduped = [];
12049
12294
  for (const timelock of timelocks) {
12050
- const sequence = chunk2JV4VQ7C_cjs.timelockToSequence(timelock).toString();
12295
+ const sequence = chunk5MLC2HU3_cjs.timelockToSequence(timelock).toString();
12051
12296
  if (seen.has(sequence)) continue;
12052
12297
  seen.add(sequence);
12053
12298
  deduped.push(timelock);
@@ -12064,7 +12309,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
12064
12309
  state: "active"
12065
12310
  });
12066
12311
  const newest = candidates.filter(
12067
- (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkOIZ2V2VD_cjs.WALLET_RECEIVE_SOURCE
12312
+ (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE
12068
12313
  ).sort((a, b) => {
12069
12314
  if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
12070
12315
  return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
@@ -12072,7 +12317,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
12072
12317
  if (!newest?.params.pubKey) return baseline;
12073
12318
  try {
12074
12319
  const pubKey = base.hex.decode(newest.params.pubKey);
12075
- return new chunkOIZ2V2VD_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
12320
+ return new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
12076
12321
  } catch (e) {
12077
12322
  console.warn("Skipping malformed boarding contract at boot", newest.script, e);
12078
12323
  return baseline;
@@ -12091,16 +12336,17 @@ function filterSnapshotVtxos(snapshot, filter, pendingSpendOutpoints) {
12091
12336
  if (vtxo.isUnrolled) {
12092
12337
  return !!f.withUnrolled;
12093
12338
  }
12094
- if (chunk2JV4VQ7C_cjs.hasTerminalSpend(vtxo)) {
12339
+ if (chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)) {
12095
12340
  return false;
12096
12341
  }
12097
- if (!f.withRecoverable && chunk2JV4VQ7C_cjs.canRecoverOnchain(vtxo, now)) {
12342
+ if (!f.withRecoverable && chunk5MLC2HU3_cjs.canRecoverOnchain(vtxo, now)) {
12098
12343
  return false;
12099
12344
  }
12100
12345
  return true;
12101
12346
  });
12102
12347
  }
12103
12348
  var PENDING_RECOVERY_REASON = "is past its operator signer's rotation cutoff \u2014 the operator will not co-sign it until it recovers";
12349
+ var UNROLLED_REASON = "was unilaterally exited and lives onchain \u2014 `Unroll.completeUnroll` is the only spend that reaches it";
12104
12350
  function omittedOutpoints(before, after) {
12105
12351
  if (before.length === after.length) return /* @__PURE__ */ new Set();
12106
12352
  const kept = new Set(after.map((vtxo) => `${vtxo.txid}:${vtxo.vout}`));
@@ -12433,7 +12679,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12433
12679
  */
12434
12680
  static async setupWalletConfig(config, pubKey) {
12435
12681
  const arkadeServerUrl = getArkadeServerUrl(config);
12436
- const arkProvider = config.arkProvider || new chunk2JV4VQ7C_cjs.RestArkProvider(arkadeServerUrl);
12682
+ const arkProvider = config.arkProvider || new chunk5MLC2HU3_cjs.RestArkProvider(arkadeServerUrl);
12437
12683
  let indexerProvider = config.indexerProvider;
12438
12684
  if (!indexerProvider) {
12439
12685
  let indexerUrl = config.indexerUrl;
@@ -12450,7 +12696,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12450
12696
  indexerUrl = arkadeServerUrl;
12451
12697
  }
12452
12698
  }
12453
- indexerProvider = new chunkCO3KKSWM_cjs.RestIndexerProvider(indexerUrl);
12699
+ indexerProvider = new chunkGVHUHTRH_cjs.RestIndexerProvider(indexerUrl);
12454
12700
  }
12455
12701
  const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
12456
12702
  const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
@@ -12459,7 +12705,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12459
12705
  source: serverInfoSource,
12460
12706
  lastOnlineAt: serverInfoLastOnlineAt
12461
12707
  } = await resolveArkInfo(arkProvider, walletRepository);
12462
- const network = chunk2JV4VQ7C_cjs.getNetwork(info.network);
12708
+ const network = chunk5MLC2HU3_cjs.getNetwork(info.network);
12463
12709
  if ("descriptor" in config.identity) {
12464
12710
  const descriptor = config.identity.descriptor;
12465
12711
  const identityIsMainnet = !descriptor.includes("tpub");
@@ -12499,18 +12745,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
12499
12745
  value: info.boardingExitDelay,
12500
12746
  type: info.boardingExitDelay < 512n ? "blocks" : "seconds"
12501
12747
  };
12502
- const serverPubKey = chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
12503
- const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
12748
+ const serverPubKey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
12749
+ const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
12504
12750
  const offchainOptions = {
12505
12751
  pubKey,
12506
12752
  serverPubKey,
12507
12753
  csvTimelock: exitTimelock
12508
12754
  };
12509
- const offchainTapscript = !delegatePubKey ? new chunkOIZ2V2VD_cjs.DefaultVtxo.Script(offchainOptions) : new chunkOIZ2V2VD_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
12510
- const boardingTapscript = chunkOIZ2V2VD_cjs.BoardingContractHandler.createScript({
12755
+ const offchainTapscript = !delegatePubKey ? new chunkWIFL5QYZ_cjs.DefaultVtxo.Script(offchainOptions) : new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
12756
+ const boardingTapscript = chunkWIFL5QYZ_cjs.BoardingContractHandler.createScript({
12511
12757
  pubKey: base.hex.encode(pubKey),
12512
12758
  serverPubKey: base.hex.encode(serverPubKey),
12513
- csvTimelock: chunk2JV4VQ7C_cjs.timelockToSequence(boardingTimelock).toString()
12759
+ csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(boardingTimelock).toString()
12514
12760
  });
12515
12761
  return {
12516
12762
  arkProvider,
@@ -12673,6 +12919,13 @@ var ReadonlyWallet = class _ReadonlyWallet {
12673
12919
  "is locked by an in-flight settlement intent"
12674
12920
  )
12675
12921
  ]);
12922
+ if (!filter?.withUnrolled) {
12923
+ logExcludedVtxos(
12924
+ "getSpendableVtxos",
12925
+ snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)),
12926
+ [() => UNROLLED_REASON]
12927
+ );
12928
+ }
12676
12929
  return unlocked;
12677
12930
  }
12678
12931
  /**
@@ -12812,7 +13065,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12812
13065
  const response = await contractManager.getContractsWithVtxos();
12813
13066
  const allVtxos = response.flatMap((_) => _.vtxos);
12814
13067
  const { boardingTxs, commitmentsToIgnore } = await this.getBoardingTxs();
12815
- const resolveTxCreatedAt = (txids) => chunk2JV4VQ7C_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
13068
+ const resolveTxCreatedAt = (txids) => chunk5MLC2HU3_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
12816
13069
  return buildTransactionHistory(
12817
13070
  allVtxos,
12818
13071
  boardingTxs,
@@ -12906,7 +13159,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12906
13159
  },
12907
13160
  isUnrolled: true,
12908
13161
  ...boardingFacts,
12909
- virtualStatus: chunk2JV4VQ7C_cjs.toVirtualStatus(boardingFacts),
13162
+ virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(boardingFacts),
12910
13163
  spentBy: "",
12911
13164
  createdAt: tx.status.confirmed ? new Date(tx.status.block_time * 1e3) : /* @__PURE__ */ new Date(0),
12912
13165
  script: scriptHex
@@ -12962,9 +13215,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
12962
13215
  async getBoardingTapscripts(allowedSigners) {
12963
13216
  const byScript = /* @__PURE__ */ new Map();
12964
13217
  const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
12965
- const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkOIZ2V2VD_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13218
+ const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
12966
13219
  add(
12967
- new chunkOIZ2V2VD_cjs.DefaultVtxo.Script({
13220
+ new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
12968
13221
  pubKey: await this.identity.xOnlyPublicKey(),
12969
13222
  serverPubKey: this.boardingTapscript.options.serverPubKey,
12970
13223
  csvTimelock: boardingCsv
@@ -12979,7 +13232,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12979
13232
  for (const c of boardingContracts) {
12980
13233
  if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
12981
13234
  try {
12982
- add(chunkOIZ2V2VD_cjs.BoardingContractHandler.createScript(c.params));
13235
+ add(chunkWIFL5QYZ_cjs.BoardingContractHandler.createScript(c.params));
12983
13236
  } catch (e) {
12984
13237
  console.warn("Skipping malformed boarding contract", c.script, e);
12985
13238
  }
@@ -13017,7 +13270,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13017
13270
  // Per-row CSV delay decoded from THIS tapscript's exit leaf —
13018
13271
  // not the wallet's current boarding timelock, which a signer
13019
13272
  // rotation may have changed.
13020
- csvTimelock: chunk2JV4VQ7C_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
13273
+ csvTimelock: chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
13021
13274
  coins: utxos
13022
13275
  });
13023
13276
  }
@@ -13150,7 +13403,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13150
13403
  /** Fetch Arkade transaction ids that are still pending final settlement. */
13151
13404
  async fetchPendingTxs() {
13152
13405
  const scripts = await this.getWalletScripts();
13153
- const vtxos = await chunk2JV4VQ7C_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
13406
+ const vtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
13154
13407
  return vtxos.filter(
13155
13408
  (vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
13156
13409
  ).map((_) => _.arkTxId);
@@ -13181,7 +13434,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13181
13434
  });
13182
13435
  for (const contract of contracts) {
13183
13436
  if (map.has(contract.script)) continue;
13184
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.get(contract.type);
13437
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
13185
13438
  if (handler) {
13186
13439
  const script = handler.createScript(contract.params);
13187
13440
  map.set(contract.script, script);
@@ -13293,7 +13546,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13293
13546
  }
13294
13547
  });
13295
13548
  const baselinePubkey = await this.identity.xOnlyPublicKey();
13296
- const delegatePubKey = this.offchainTapscript instanceof chunkOIZ2V2VD_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
13549
+ const delegatePubKey = this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
13297
13550
  const baselineSigners = [
13298
13551
  this.offchainTapscript.options.serverPubKey,
13299
13552
  ...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
@@ -13301,8 +13554,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
13301
13554
  const seenBaselineScripts = /* @__PURE__ */ new Set();
13302
13555
  for (const serverPubKey of baselineSigners) {
13303
13556
  for (const csvTimelock of this.walletContractTimelocks) {
13304
- const csvTimelockStr = chunk2JV4VQ7C_cjs.timelockToSequence(csvTimelock).toString();
13305
- const defaultScript = new chunkOIZ2V2VD_cjs.DefaultVtxo.Script({
13557
+ const csvTimelockStr = chunk5MLC2HU3_cjs.timelockToSequence(csvTimelock).toString();
13558
+ const defaultScript = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
13306
13559
  pubKey: baselinePubkey,
13307
13560
  serverPubKey,
13308
13561
  csvTimelock
@@ -13323,7 +13576,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13323
13576
  });
13324
13577
  }
13325
13578
  if (delegatePubKey) {
13326
- const delegateScript = new chunkOIZ2V2VD_cjs.DelegateVtxo.Script({
13579
+ const delegateScript = new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({
13327
13580
  pubKey: baselinePubkey,
13328
13581
  serverPubKey,
13329
13582
  delegatePubKey,
@@ -13347,9 +13600,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
13347
13600
  }
13348
13601
  }
13349
13602
  }
13350
- const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkOIZ2V2VD_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13603
+ const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13351
13604
  for (const serverPubKey of baselineSigners) {
13352
- const baselineBoarding = new chunkOIZ2V2VD_cjs.DefaultVtxo.Script({
13605
+ const baselineBoarding = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
13353
13606
  pubKey: baselinePubkey,
13354
13607
  serverPubKey,
13355
13608
  csvTimelock: boardingCsvTimelock
@@ -13362,7 +13615,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13362
13615
  params: {
13363
13616
  pubKey: base.hex.encode(baselineBoarding.options.pubKey),
13364
13617
  serverPubKey: base.hex.encode(serverPubKey),
13365
- csvTimelock: chunk2JV4VQ7C_cjs.timelockToSequence(boardingCsvTimelock).toString()
13618
+ csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(boardingCsvTimelock).toString()
13366
13619
  },
13367
13620
  script: boardingScriptHex,
13368
13621
  address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
@@ -13562,7 +13815,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13562
13815
  serverPubKey: this.offchainTapscript.options.serverPubKey,
13563
13816
  deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
13564
13817
  csvTimelocks: this.walletContractTimelocks,
13565
- delegatePubKey: this.offchainTapscript instanceof chunkOIZ2V2VD_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
13818
+ delegatePubKey: this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
13566
13819
  };
13567
13820
  }
13568
13821
  _signerRouter;
@@ -13807,7 +14060,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13807
14060
  const [row] = await manager.getContracts({ script: base.hex.encode(display.pkScript) });
13808
14061
  const persisted = row?.metadata?.signingDescriptor;
13809
14062
  if (typeof persisted === "string") return persisted;
13810
- return chunkOIZ2V2VD_cjs.identityDescriptor(this.identity);
14063
+ return chunkWIFL5QYZ_cjs.identityDescriptor(this.identity);
13811
14064
  }
13812
14065
  /**
13813
14066
  * Build, persist and shape one address of `type` owned by `descriptor` —
@@ -13823,7 +14076,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13823
14076
  async mintAddress(manager, type, descriptor, tagSource, allocated) {
13824
14077
  if (type === "boarding") {
13825
14078
  const built2 = this.buildBoardingContract(
13826
- chunkOIZ2V2VD_cjs.deriveDescriptorLeafPubKey(descriptor),
14079
+ chunkWIFL5QYZ_cjs.deriveDescriptorLeafPubKey(descriptor),
13827
14080
  descriptor,
13828
14081
  tagSource
13829
14082
  );
@@ -13868,11 +14121,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13868
14121
  * {@link buildReceiveContract}.
13869
14122
  */
13870
14123
  buildBoardingContract(pubKey, descriptor, tagSource) {
13871
- const tapscript = new chunkOIZ2V2VD_cjs.DefaultVtxo.Script({
14124
+ const tapscript = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
13872
14125
  ...this._boardingTapscript.options,
13873
14126
  pubKey
13874
14127
  });
13875
- const csvTimelock = tapscript.options.csvTimelock ?? chunkOIZ2V2VD_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14128
+ const csvTimelock = tapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13876
14129
  return {
13877
14130
  tapscript,
13878
14131
  params: {
@@ -13880,13 +14133,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13880
14133
  params: {
13881
14134
  pubKey: base.hex.encode(pubKey),
13882
14135
  serverPubKey: base.hex.encode(tapscript.options.serverPubKey),
13883
- csvTimelock: chunk2JV4VQ7C_cjs.timelockToSequence(csvTimelock).toString()
14136
+ csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(csvTimelock).toString()
13884
14137
  },
13885
14138
  script: base.hex.encode(tapscript.pkScript),
13886
14139
  address: tapscript.address(this.network.hrp, this.arkServerPublicKey).encode(),
13887
14140
  state: "active",
13888
14141
  metadata: {
13889
- ...tagSource && { source: chunkOIZ2V2VD_cjs.WALLET_RECEIVE_SOURCE },
14142
+ ...tagSource && { source: chunkWIFL5QYZ_cjs.WALLET_RECEIVE_SOURCE },
13890
14143
  signingDescriptor: descriptor
13891
14144
  }
13892
14145
  }
@@ -13915,7 +14168,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13915
14168
  if (this._descriptorProvider instanceof HDDescriptorProvider) {
13916
14169
  return (await this.getContractManager()).getNextSigningDescriptor();
13917
14170
  }
13918
- return chunkOIZ2V2VD_cjs.identityDescriptor(this.identity);
14171
+ return chunkWIFL5QYZ_cjs.identityDescriptor(this.identity);
13919
14172
  }
13920
14173
  /**
13921
14174
  * @see HDAllocationCapable.advanceSigningDescriptorWatermark
@@ -14011,7 +14264,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14011
14264
  * the stable public API.
14012
14265
  */
14013
14266
  async rotateServerSigner(newServerPubKey, checkpointTapscript) {
14014
- const xonly = chunkOIZ2V2VD_cjs.toXOnly(newServerPubKey, "ark signer key");
14267
+ const xonly = chunkWIFL5QYZ_cjs.toXOnly(newServerPubKey, "ark signer key");
14015
14268
  const newServerUnrollScript = assertValidServerUnrollScript(
14016
14269
  checkpointTapscript,
14017
14270
  resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
@@ -14040,21 +14293,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14040
14293
  const [currentBoardingRow] = await manager.getContracts({
14041
14294
  script: currentBoardingScript
14042
14295
  });
14043
- const newOffchain = this.offchainTapscript instanceof chunkOIZ2V2VD_cjs.DelegateVtxo.Script ? new chunkOIZ2V2VD_cjs.DelegateVtxo.Script({
14296
+ const newOffchain = this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? new chunkWIFL5QYZ_cjs.DelegateVtxo.Script({
14044
14297
  ...this.offchainTapscript.options,
14045
14298
  serverPubKey: xonly
14046
- }) : new chunkOIZ2V2VD_cjs.DefaultVtxo.Script({
14299
+ }) : new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
14047
14300
  ...this.offchainTapscript.options,
14048
14301
  serverPubKey: xonly
14049
14302
  });
14050
- const newBoarding = new chunkOIZ2V2VD_cjs.DefaultVtxo.Script({
14303
+ const newBoarding = new chunkWIFL5QYZ_cjs.DefaultVtxo.Script({
14051
14304
  ...this._boardingTapscript.options,
14052
14305
  serverPubKey: xonly
14053
14306
  });
14054
- const offchainCsv = chunk2JV4VQ7C_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
14307
+ const offchainCsv = chunk5MLC2HU3_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
14055
14308
  const newOffchainScript = base.hex.encode(newOffchain.pkScript);
14056
14309
  const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
14057
- if (newOffchain instanceof chunkOIZ2V2VD_cjs.DelegateVtxo.Script) {
14310
+ if (newOffchain instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script) {
14058
14311
  await manager.createContract({
14059
14312
  type: "delegate",
14060
14313
  params: {
@@ -14082,13 +14335,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14082
14335
  metadata: currentOffchainRow?.metadata
14083
14336
  });
14084
14337
  }
14085
- const boardingCsv = newBoarding.options.csvTimelock ?? chunkOIZ2V2VD_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14338
+ const boardingCsv = newBoarding.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14086
14339
  await manager.createContract({
14087
14340
  type: "boarding",
14088
14341
  params: {
14089
14342
  pubKey: base.hex.encode(newBoarding.options.pubKey),
14090
14343
  serverPubKey: base.hex.encode(xonly),
14091
- csvTimelock: chunk2JV4VQ7C_cjs.timelockToSequence(boardingCsv).toString()
14344
+ csvTimelock: chunk5MLC2HU3_cjs.timelockToSequence(boardingCsv).toString()
14092
14345
  },
14093
14346
  script: base.hex.encode(newBoarding.pkScript),
14094
14347
  address: newBoarding.address(this.network.hrp, xonly).encode(),
@@ -14121,14 +14374,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14121
14374
  _restoreInFlight;
14122
14375
  _addPendingSpends(inputs) {
14123
14376
  for (const input of inputs) {
14124
- if (chunk2JV4VQ7C_cjs.isVirtualCoin(input)) {
14377
+ if (chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
14125
14378
  this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
14126
14379
  }
14127
14380
  }
14128
14381
  }
14129
14382
  _removePendingSpends(inputs) {
14130
14383
  for (const input of inputs) {
14131
- if (chunk2JV4VQ7C_cjs.isVirtualCoin(input)) {
14384
+ if (chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
14132
14385
  this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
14133
14386
  }
14134
14387
  }
@@ -14186,13 +14439,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14186
14439
  const manager = await this.getContractManager();
14187
14440
  const provider = this._descriptorProvider;
14188
14441
  const hd = provider instanceof HDDescriptorProvider;
14189
- const staticDescriptor = hd ? void 0 : await chunkOIZ2V2VD_cjs.identityDescriptor(this.identity);
14442
+ const staticDescriptor = hd ? void 0 : await chunkWIFL5QYZ_cjs.identityDescriptor(this.identity);
14190
14443
  const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
14191
- const delegatePubKey = this.offchainTapscript instanceof chunkOIZ2V2VD_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
14444
+ const delegatePubKey = this.offchainTapscript instanceof chunkWIFL5QYZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
14192
14445
  const arkInfo = await this.arkProvider.getInfo();
14193
- const currentSignerPubKey = chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
14446
+ const currentSignerPubKey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
14194
14447
  const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
14195
- (s) => chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
14448
+ (s) => chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
14196
14449
  );
14197
14450
  const deps = {
14198
14451
  indexerProvider: this.indexerProvider,
@@ -14207,7 +14460,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14207
14460
  csvTimelocks: this.walletContractTimelocks,
14208
14461
  // Boarding-exit CSV so the boarding handler can build its
14209
14462
  // candidate script (distinct from the unilateral-exit matrix).
14210
- boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkOIZ2V2VD_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
14463
+ boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkWIFL5QYZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
14211
14464
  delegatePubKey
14212
14465
  };
14213
14466
  const result = await manager.scanContracts({
@@ -14321,7 +14574,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14321
14574
  throw new Error("Invalid configured public key");
14322
14575
  }
14323
14576
  const setup = await ReadonlyWallet.setupWalletConfig(config, pubkey);
14324
- const forfeitPubkey = chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
14577
+ const forfeitPubkey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
14325
14578
  const forfeitAddress = btcSigner.Address(setup.network).decode(setup.info.forfeitAddress);
14326
14579
  const forfeitOutputScript = btcSigner.OutScript.encode(forfeitAddress);
14327
14580
  const checkpointExitDelayOverrides = {
@@ -14470,7 +14723,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14470
14723
  inputs: params.selectedVtxos,
14471
14724
  changeAmount: BigInt(changeAmount)
14472
14725
  };
14473
- const outputAddress = chunk2JV4VQ7C_cjs.ArkAddress.decode(params.address);
14726
+ const outputAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(params.address);
14474
14727
  assertRecipientArkAddress(
14475
14728
  params.address,
14476
14729
  outputAddress,
@@ -14536,13 +14789,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14536
14789
  void this.logUngatedInputs("settle({ inputs })", params.inputs);
14537
14790
  }
14538
14791
  const offchainAddress = await this.getAddress();
14539
- const offchainPkScript = chunk2JV4VQ7C_cjs.ArkAddress.decode(offchainAddress).pkScript;
14792
+ const offchainPkScript = chunk5MLC2HU3_cjs.ArkAddress.decode(offchainAddress).pkScript;
14540
14793
  const offchainOutputScript = base.hex.encode(offchainPkScript);
14541
14794
  if (!params) {
14542
14795
  const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
14543
14796
  const estimator = new Estimator(fees.intentFee);
14544
14797
  let amount = 0;
14545
- const exitScript = chunk2JV4VQ7C_cjs.CSVMultisigTapscript.decode(
14798
+ const exitScript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(
14546
14799
  base.hex.decode(this.boardingTapscript.exitScript)
14547
14800
  );
14548
14801
  const boardingTimelock = exitScript.params.timelock;
@@ -14571,7 +14824,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14571
14824
  if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
14572
14825
  break;
14573
14826
  }
14574
- const inputFee = estimator.evalOffchainInput(chunk2JV4VQ7C_cjs.toOffchainInputFeeParams(vtxo));
14827
+ const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(vtxo));
14575
14828
  if (inputFee.satoshis >= vtxo.value) {
14576
14829
  continue;
14577
14830
  }
@@ -14618,7 +14871,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14618
14871
  let script;
14619
14872
  let arkAddress;
14620
14873
  try {
14621
- arkAddress = chunk2JV4VQ7C_cjs.ArkAddress.decode(output.address);
14874
+ arkAddress = chunk5MLC2HU3_cjs.ArkAddress.decode(output.address);
14622
14875
  } catch {
14623
14876
  arkAddress = void 0;
14624
14877
  }
@@ -14708,7 +14961,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14708
14961
  const abortController = new AbortController();
14709
14962
  let stream;
14710
14963
  let committedTxid;
14711
- const settleInputVtxos = params.inputs.filter(chunk2JV4VQ7C_cjs.isVirtualCoin);
14964
+ const settleInputVtxos = params.inputs.filter(chunk5MLC2HU3_cjs.isVirtualCoin);
14712
14965
  const contractManager = await this.getContractManager();
14713
14966
  await contractManager.assertAnnotatable(settleInputVtxos);
14714
14967
  await contractManager.assertSpendableNow?.(
@@ -14820,7 +15073,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14820
15073
  async maybeRotateBoardingAfterBoard(inputs) {
14821
15074
  if (!this._descriptorProvider) return;
14822
15075
  const consumedBoarding = inputs.some(
14823
- (input) => typeof input !== "string" && !chunk2JV4VQ7C_cjs.isVirtualCoin(input)
15076
+ (input) => typeof input !== "string" && !chunk5MLC2HU3_cjs.isVirtualCoin(input)
14824
15077
  );
14825
15078
  if (!consumedBoarding) return;
14826
15079
  try {
@@ -14844,7 +15097,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14844
15097
  let connectorIndex = 0;
14845
15098
  const connectorsLeaves = connectorsGraph?.leaves() || [];
14846
15099
  for (const input of inputs) {
14847
- if (!chunk2JV4VQ7C_cjs.isVirtualCoin(input)) {
15100
+ if (!chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
14848
15101
  for (let i = 0; i < settlementPsbt.inputsLength; i++) {
14849
15102
  const settlementInput = settlementPsbt.getInput(i);
14850
15103
  if (!settlementInput.txid || settlementInput.index === void 0) {
@@ -14875,7 +15128,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14875
15128
  }
14876
15129
  continue;
14877
15130
  }
14878
- if (chunk2JV4VQ7C_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
15131
+ if (chunk5MLC2HU3_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
14879
15132
  continue;
14880
15133
  }
14881
15134
  if (connectorsLeaves.length === 0) {
@@ -14903,7 +15156,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14903
15156
  index: input.vout,
14904
15157
  witnessUtxo: {
14905
15158
  amount: BigInt(input.value),
14906
- script: chunk2JV4VQ7C_cjs.VtxoScript.decode(input.tapTree).pkScript
15159
+ script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
14907
15160
  },
14908
15161
  sighashType: btcSigner.SigHash.DEFAULT,
14909
15162
  tapLeafScript: [input.forfeitTapLeafScript]
@@ -14922,7 +15175,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14922
15175
  forfeitTx = await this._signerRouter.sign(forfeitTx, [
14923
15176
  {
14924
15177
  index: 0,
14925
- lookupScript: chunk2JV4VQ7C_cjs.VtxoScript.decode(input.tapTree).pkScript
15178
+ lookupScript: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
14926
15179
  }
14927
15180
  ]);
14928
15181
  signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
@@ -14980,7 +15233,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14980
15233
  resolveBatchExpiryPolicy(this.network, this.batchExpiryPolicy)
14981
15234
  );
14982
15235
  await this.arkProvider.confirmRegistration(intentId);
14983
- const sweepTapscript = chunk2JV4VQ7C_cjs.CSVMultisigTapscript.encode({
15236
+ const sweepTapscript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.encode({
14984
15237
  timelock,
14985
15238
  pubkeys: [this.forfeitPubkey]
14986
15239
  }).script;
@@ -14995,10 +15248,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14995
15248
  throw new Error("Sweep tap tree root not set");
14996
15249
  }
14997
15250
  const xOnlyPublicKeys = event.cosignersPublicKeys.map(
14998
- (k) => base.hex.encode(chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
15251
+ (k) => base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
14999
15252
  );
15000
15253
  const signerPublicKey = await session.getPublicKey();
15001
- const xonlySignerPublicKey = chunkOIZ2V2VD_cjs.toXOnly(signerPublicKey, "signer key");
15254
+ const xonlySignerPublicKey = chunkWIFL5QYZ_cjs.toXOnly(signerPublicKey, "signer key");
15002
15255
  if (!xOnlyPublicKeys.includes(base.hex.encode(xonlySignerPublicKey))) {
15003
15256
  return { skip: true };
15004
15257
  }
@@ -15088,9 +15341,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15088
15341
  ...existing ?? {},
15089
15342
  intentTxId,
15090
15343
  registerProof: intent.proof,
15091
- registerProofMessage: chunk2JV4VQ7C_cjs.Intent.encodeMessage(intent.message),
15344
+ registerProofMessage: chunk5MLC2HU3_cjs.Intent.encodeMessage(intent.message),
15092
15345
  deleteProof: deleteIntent.proof,
15093
- deleteProofMessage: chunk2JV4VQ7C_cjs.Intent.encodeMessage(deleteIntent.message),
15346
+ deleteProofMessage: chunk5MLC2HU3_cjs.Intent.encodeMessage(deleteIntent.message),
15094
15347
  intentVtxos: inputs.map((i) => ({
15095
15348
  txid: i.txid,
15096
15349
  vout: i.vout
@@ -15122,7 +15375,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15122
15375
  try {
15123
15376
  return await this.arkProvider.registerIntent(intent);
15124
15377
  } catch (error) {
15125
- if (error instanceof chunk2JV4VQ7C_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
15378
+ if (error instanceof chunk5MLC2HU3_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
15126
15379
  const deleteIntent = await this.makeDeleteIntentSignature(inputs);
15127
15380
  await this.arkProvider.deleteIntent(deleteIntent);
15128
15381
  return this.arkProvider.registerIntent(intent);
@@ -15138,7 +15391,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15138
15391
  expire_at: 0,
15139
15392
  cosigners_public_keys: cosignerPubKeys
15140
15393
  };
15141
- const proof = chunk2JV4VQ7C_cjs.Intent.create(message, coins, outputs);
15394
+ const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, outputs);
15142
15395
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
15143
15396
  return {
15144
15397
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -15150,7 +15403,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15150
15403
  type: "delete",
15151
15404
  expire_at: 0
15152
15405
  };
15153
- const proof = chunk2JV4VQ7C_cjs.Intent.create(message, coins, []);
15406
+ const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, []);
15154
15407
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
15155
15408
  return {
15156
15409
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -15162,7 +15415,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15162
15415
  type: "get-pending-tx",
15163
15416
  expire_at: 0
15164
15417
  };
15165
- const proof = chunk2JV4VQ7C_cjs.Intent.create(message, coins, []);
15418
+ const proof = chunk5MLC2HU3_cjs.Intent.create(message, coins, []);
15166
15419
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
15167
15420
  return {
15168
15421
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -15183,7 +15436,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15183
15436
  if (!vtxos || vtxos.length === 0) {
15184
15437
  const scriptMap = await this.getScriptMap();
15185
15438
  const allExtended = [];
15186
- const fetchedVtxos = await chunk2JV4VQ7C_cjs.getAllNormalizedVtxos(this.indexerProvider, [
15439
+ const fetchedVtxos = await chunk5MLC2HU3_cjs.getAllNormalizedVtxos(this.indexerProvider, [
15187
15440
  ...scriptMap.keys()
15188
15441
  ]);
15189
15442
  for (const vtxo of fetchedVtxos) {
@@ -15225,9 +15478,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15225
15478
  seen.add(pendingTx.arkTxid);
15226
15479
  batchPending.push(pendingTx.arkTxid);
15227
15480
  try {
15228
- const checkpointTxs = pendingTx.signedCheckpointTxs.map(
15229
- (c) => btcSigner.Transaction.fromPSBT(base.base64.decode(c))
15230
- );
15481
+ const checkpointTxs = pendingTx.signedCheckpointTxs.map((c) => {
15482
+ const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(c));
15483
+ chunk5MLC2HU3_cjs.assertAllowedSighashTypes(tx);
15484
+ return tx;
15485
+ });
15231
15486
  assertCheckpointsMatchInputs(
15232
15487
  checkpointTxs,
15233
15488
  checkpointInputs,
@@ -15297,11 +15552,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15297
15552
  * against the current key alone would leave it pending forever.
15298
15553
  */
15299
15554
  checkpointUnrollCandidates(info) {
15300
- const current = chunk2JV4VQ7C_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
15555
+ const current = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
15301
15556
  const candidates = [this._serverUnrollScript, current];
15302
15557
  for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
15303
15558
  candidates.push(
15304
- chunk2JV4VQ7C_cjs.CSVMultisigTapscript.encode({
15559
+ chunk5MLC2HU3_cjs.CSVMultisigTapscript.encode({
15305
15560
  ...current.params,
15306
15561
  pubkeys: [base.hex.decode(deprecated)]
15307
15562
  })
@@ -15392,10 +15647,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15392
15647
  if (vtxos.length === 0) {
15393
15648
  throw new Error("No VTXOs found for this arkadeCash");
15394
15649
  }
15395
- const myPkScript = chunk2JV4VQ7C_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
15650
+ const myPkScript = chunk5MLC2HU3_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
15396
15651
  let { spendable, unclaimed } = this.classifyCashVtxos(vtxos);
15397
15652
  let swept = 0;
15398
- const drainable = vtxos.filter((vtxo) => !isSubdust(vtxo, this.dustAmount));
15653
+ const drainable = vtxos.filter(
15654
+ (vtxo) => !isSubdust(vtxo, this.dustAmount) && !vtxo.isUnrolled
15655
+ );
15399
15656
  if (drainable.length > 0) {
15400
15657
  let drained = { count: 0, swept: 0, claimed: /* @__PURE__ */ new Set() };
15401
15658
  try {
@@ -15466,7 +15723,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15466
15723
  const spendable = [];
15467
15724
  const unclaimed = [];
15468
15725
  for (const vtxo of vtxos) {
15469
- if (chunk2JV4VQ7C_cjs.hasTerminalSpend(vtxo)) {
15726
+ if (chunk5MLC2HU3_cjs.hasTerminalSpend(vtxo)) {
15470
15727
  unclaimed.push(cashReport(vtxo, "already-spent"));
15471
15728
  } else if (vtxo.isUnrolled) {
15472
15729
  unclaimed.push(cashReport(vtxo, "exited"));
@@ -15488,7 +15745,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15488
15745
  const all = [];
15489
15746
  const seen = /* @__PURE__ */ new Set();
15490
15747
  for (let pageIndex = 0; ; pageIndex++) {
15491
- const { vtxos, page } = await chunk2JV4VQ7C_cjs.getNormalizedVtxos(this.indexerProvider, {
15748
+ const { vtxos, page } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(this.indexerProvider, {
15492
15749
  scripts,
15493
15750
  pageIndex,
15494
15751
  pageSize
@@ -15535,7 +15792,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15535
15792
  for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
15536
15793
  const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
15537
15794
  const message = { type: "get-pending-tx", expire_at: 0 };
15538
- const proof = chunk2JV4VQ7C_cjs.Intent.create(message, batch, []);
15795
+ const proof = chunk5MLC2HU3_cjs.Intent.create(message, batch, []);
15539
15796
  const signedProof = await identity.sign(
15540
15797
  proof,
15541
15798
  Array.from({ length: batch.length + 1 }, (_, j) => j)
@@ -15555,9 +15812,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15555
15812
  const unrollCandidates = this.checkpointUnrollCandidates(await this.arkProvider.getInfo());
15556
15813
  for (const pendingTx of pendingTxs) {
15557
15814
  try {
15558
- const checkpointTxs = pendingTx.signedCheckpointTxs.map(
15559
- (checkpoint) => btcSigner.Transaction.fromPSBT(base.base64.decode(checkpoint))
15560
- );
15815
+ const checkpointTxs = pendingTx.signedCheckpointTxs.map((checkpoint) => {
15816
+ const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(checkpoint));
15817
+ chunk5MLC2HU3_cjs.assertAllowedSighashTypes(tx);
15818
+ return tx;
15819
+ });
15561
15820
  assertCheckpointsMatchInputs(
15562
15821
  checkpointTxs,
15563
15822
  inputs.map((input) => ({
@@ -15754,7 +16013,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15754
16013
  script: recipient.script,
15755
16014
  amount: BigInt(recipient.amount),
15756
16015
  // Already checked against the recipient address in `validateRecipients`.
15757
- ...recipient.tapTree ? { tapTree: chunk2JV4VQ7C_cjs.TapTreeCoder.decode(recipient.tapTree) } : {}
16016
+ ...recipient.tapTree ? { tapTree: chunk5MLC2HU3_cjs.TapTreeCoder.decode(recipient.tapTree) } : {}
15758
16017
  }));
15759
16018
  const totalBtcOutput = outputs.reduce((sum, o) => sum + Number(o.amount), 0);
15760
16019
  let changeAmount = totalBtcSelected - totalBtcOutput;
@@ -15898,10 +16157,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15898
16157
  const serverPubKey = this.arkServerPublicKey;
15899
16158
  const serverUnrollScript = this.serverUnrollScript;
15900
16159
  const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
15901
- const normalizedInputs = inputs.map(chunk2JV4VQ7C_cjs.normalizeVtxo);
15902
- const at = now ?? await chunk2JV4VQ7C_cjs.resolveTimeHeight(this.onchainProvider);
16160
+ const normalizedInputs = inputs.map(chunk5MLC2HU3_cjs.normalizeVtxo);
16161
+ const at = now ?? await chunk5MLC2HU3_cjs.resolveTimeHeight(this.onchainProvider);
15903
16162
  for (const input of normalizedInputs) {
15904
- if (!chunk2JV4VQ7C_cjs.canSpendOffchain(input, at)) {
16163
+ if (!chunk5MLC2HU3_cjs.canSpendOffchain(input, at)) {
15905
16164
  throw new Error(
15906
16165
  `sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
15907
16166
  );
@@ -15971,7 +16230,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15971
16230
  );
15972
16231
  const arkTxJobs = inputs.map((input, index) => ({
15973
16232
  index,
15974
- lookupScript: chunk2JV4VQ7C_cjs.VtxoScript.decode(input.tapTree).pkScript
16233
+ lookupScript: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
15975
16234
  }));
15976
16235
  const identity = this.identity;
15977
16236
  const signer = {
@@ -16057,14 +16316,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16057
16316
  const spentBy = checkpointIdByOutpoint.get(`${vtxo.txid}:${vtxo.vout}`);
16058
16317
  spentVtxos.push({
16059
16318
  ...spentFacts,
16060
- virtualStatus: chunk2JV4VQ7C_cjs.toVirtualStatus(spentFacts),
16319
+ virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(spentFacts),
16061
16320
  ...spentBy ? { spentBy } : {},
16062
16321
  arkTxId: arkTxid
16063
16322
  });
16064
16323
  for (const id of vtxo.commitmentTxIds) {
16065
16324
  commitmentTxIds.add(id);
16066
16325
  }
16067
- const vtxoExpiry = chunk2JV4VQ7C_cjs.toBatchExpiry(vtxo);
16326
+ const vtxoExpiry = chunk5MLC2HU3_cjs.toBatchExpiry(vtxo);
16068
16327
  if (vtxoExpiry) {
16069
16328
  batchExpiry = Math.min(batchExpiry, vtxoExpiry);
16070
16329
  }
@@ -16077,7 +16336,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16077
16336
  isSwept: false,
16078
16337
  isPreconfirmed: true,
16079
16338
  commitmentTxIds: Array.from(commitmentTxIds),
16080
- ...chunk2JV4VQ7C_cjs.parseLegacyExpiry(batchExpiry)
16339
+ ...chunk5MLC2HU3_cjs.parseLegacyExpiry(batchExpiry)
16081
16340
  };
16082
16341
  changeVtxo = {
16083
16342
  txid: arkTxid,
@@ -16089,7 +16348,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16089
16348
  tapTree: offchainTapscript.encode(),
16090
16349
  value: Number(changeAmount),
16091
16350
  ...changeFacts,
16092
- virtualStatus: chunk2JV4VQ7C_cjs.toVirtualStatus(changeFacts),
16351
+ virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(changeFacts),
16093
16352
  spentBy: "",
16094
16353
  status: {
16095
16354
  confirmed: false
@@ -16158,12 +16417,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16158
16417
  const spentVtxos = [];
16159
16418
  const inputArkTxIds = /* @__PURE__ */ new Set();
16160
16419
  const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
16161
- const vtxoInputs = inputs.filter(chunk2JV4VQ7C_cjs.isVirtualCoin);
16420
+ const vtxoInputs = inputs.filter(chunk5MLC2HU3_cjs.isVirtualCoin);
16162
16421
  const cm = await this.getContractManager();
16163
16422
  const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
16164
16423
  const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
16165
16424
  for (const input of inputs) {
16166
- if (chunk2JV4VQ7C_cjs.isVirtualCoin(input)) {
16425
+ if (chunk5MLC2HU3_cjs.isVirtualCoin(input)) {
16167
16426
  const outpoint = `${input.txid}:${input.vout}`;
16168
16427
  const vtxo = annotatedByKey.get(outpoint);
16169
16428
  if (!vtxo) {
@@ -16175,13 +16434,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16175
16434
  const settledFacts = { ...vtxo, isSpent: true };
16176
16435
  spentVtxos.push({
16177
16436
  ...settledFacts,
16178
- virtualStatus: chunk2JV4VQ7C_cjs.toVirtualStatus(settledFacts),
16437
+ virtualStatus: chunk5MLC2HU3_cjs.toVirtualStatus(settledFacts),
16179
16438
  settledBy: commitmentTxid
16180
16439
  });
16181
16440
  } else {
16182
16441
  let sourceAddress;
16183
16442
  try {
16184
- sourceAddress = chunk2JV4VQ7C_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
16443
+ sourceAddress = chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
16185
16444
  this.network
16186
16445
  );
16187
16446
  } catch {
@@ -16239,9 +16498,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16239
16498
  }
16240
16499
  };
16241
16500
  function selectVirtualCoins(coins, targetAmount) {
16242
- const sortedCoins = coins.map(chunk2JV4VQ7C_cjs.normalizeVtxo).sort((a, b) => {
16243
- const expiryA = chunk2JV4VQ7C_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
16244
- const expiryB = chunk2JV4VQ7C_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
16501
+ const sortedCoins = coins.map(chunk5MLC2HU3_cjs.normalizeVtxo).sort((a, b) => {
16502
+ const expiryA = chunk5MLC2HU3_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
16503
+ const expiryB = chunk5MLC2HU3_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
16245
16504
  if (expiryA !== expiryB) {
16246
16505
  return expiryA - expiryB;
16247
16506
  }
@@ -16268,19 +16527,53 @@ function selectVirtualCoins(coins, targetAmount) {
16268
16527
  changeAmount
16269
16528
  };
16270
16529
  }
16271
- async function waitForIncomingFunds(wallet) {
16530
+ var AbortError = class extends Error {
16531
+ constructor(message = "Operation aborted") {
16532
+ super(message);
16533
+ this.name = "AbortError";
16534
+ }
16535
+ };
16536
+ function abortReason(signal) {
16537
+ const { reason } = signal;
16538
+ if (reason instanceof Error) return reason;
16539
+ return new AbortError(typeof reason === "string" ? reason : void 0);
16540
+ }
16541
+ async function waitForIncomingFunds(wallet, options) {
16542
+ const { signal, timeoutMs } = options ?? {};
16543
+ if (signal?.aborted) throw abortReason(signal);
16272
16544
  let stopFunc;
16273
16545
  let settled = false;
16274
- return new Promise((resolve) => {
16546
+ let timeoutId;
16547
+ let onAbort;
16548
+ return new Promise((resolve, reject) => {
16549
+ const settle = (deliver) => {
16550
+ if (settled) return;
16551
+ settled = true;
16552
+ if (timeoutId !== void 0) clearTimeout(timeoutId);
16553
+ if (onAbort) signal?.removeEventListener("abort", onAbort);
16554
+ stopFunc?.();
16555
+ deliver();
16556
+ };
16557
+ const cancel = (reason) => settle(() => reject(reason));
16558
+ if (signal) {
16559
+ onAbort = () => cancel(abortReason(signal));
16560
+ signal.addEventListener("abort", onAbort);
16561
+ }
16562
+ if (timeoutMs !== void 0) {
16563
+ timeoutId = setTimeout(
16564
+ () => cancel(new AbortError(`waitForIncomingFunds timed out after ${timeoutMs}ms`)),
16565
+ timeoutMs
16566
+ );
16567
+ }
16275
16568
  wallet.notifyIncomingFunds((funds) => {
16276
16569
  const hasFunds = funds.type === "utxo" ? funds.coins.length > 0 : funds.newVtxos.length > 0;
16277
16570
  if (settled || !hasFunds) return;
16278
- settled = true;
16279
- resolve(funds);
16280
- stopFunc?.();
16571
+ settle(() => resolve(funds));
16281
16572
  }).then((stop) => {
16282
16573
  stopFunc = stop;
16283
16574
  if (settled) stop();
16575
+ }).catch((error) => {
16576
+ cancel(error);
16284
16577
  });
16285
16578
  });
16286
16579
  }
@@ -16576,7 +16869,7 @@ var MessageBus = class {
16576
16869
  this.initialized = true;
16577
16870
  }
16578
16871
  async buildServices(config) {
16579
- const arkProvider = new chunk2JV4VQ7C_cjs.RestArkProvider(config.arkServer.url);
16872
+ const arkProvider = new chunk5MLC2HU3_cjs.RestArkProvider(config.arkServer.url);
16580
16873
  const storage = {
16581
16874
  walletRepository: this.walletRepository,
16582
16875
  contractRepository: this.contractRepository,
@@ -16918,7 +17211,7 @@ var offboardNetworkNames = [
16918
17211
  function offboardDestinationScript(destinationAddress) {
16919
17212
  for (const networkName of offboardNetworkNames) {
16920
17213
  try {
16921
- const network = chunk2JV4VQ7C_cjs.networks[networkName];
17214
+ const network = chunk5MLC2HU3_cjs.networks[networkName];
16922
17215
  const addr = btcSigner.Address(network).decode(destinationAddress);
16923
17216
  return btcSigner.OutScript.encode(addr);
16924
17217
  } catch {
@@ -16982,7 +17275,7 @@ var Ramps = class {
16982
17275
  }
16983
17276
  amount = amount ?? totalAmount;
16984
17277
  const offchainAddress = await this.wallet.getAddress();
16985
- const offchainAddr = chunk2JV4VQ7C_cjs.ArkAddress.decode(offchainAddress);
17278
+ const offchainAddr = chunk5MLC2HU3_cjs.ArkAddress.decode(offchainAddress);
16986
17279
  const offchainScript = base.hex.encode(offchainAddr.pkScript);
16987
17280
  const outputFee = estimator.evalOffchainOutput({
16988
17281
  amount,
@@ -17042,7 +17335,7 @@ var Ramps = class {
17042
17335
  const filteredVtxos = [];
17043
17336
  let totalAmount = 0n;
17044
17337
  for (const vtxo of vtxos) {
17045
- const inputFee = estimator.evalOffchainInput(chunk2JV4VQ7C_cjs.toOffchainInputFeeParams(vtxo));
17338
+ const inputFee = estimator.evalOffchainInput(chunk5MLC2HU3_cjs.toOffchainInputFeeParams(vtxo));
17046
17339
  if (inputFee.satoshis >= vtxo.value) {
17047
17340
  continue;
17048
17341
  }
@@ -17878,7 +18171,7 @@ var WalletMessageHandler = class {
17878
18171
  // Wallet methods
17879
18172
  async handleInitWallet({ payload }) {
17880
18173
  const { arkServerUrl } = payload;
17881
- this.indexerProvider = new chunkCO3KKSWM_cjs.RestIndexerProvider(arkServerUrl);
18174
+ this.indexerProvider = new chunkGVHUHTRH_cjs.RestIndexerProvider(arkServerUrl);
17882
18175
  await this.onWalletInitialized();
17883
18176
  }
17884
18177
  /**
@@ -18167,7 +18460,7 @@ var WalletMessageHandler = class {
18167
18460
  if (v.isUnrolled) {
18168
18461
  return withUnrolled;
18169
18462
  }
18170
- if (chunk2JV4VQ7C_cjs.hasTerminalSpend(v)) {
18463
+ if (chunk5MLC2HU3_cjs.hasTerminalSpend(v)) {
18171
18464
  return false;
18172
18465
  }
18173
18466
  if (includeRecoverable) {
@@ -18176,10 +18469,10 @@ var WalletMessageHandler = class {
18176
18469
  if (dustAmount != null && isSubdust(v, dustAmount)) {
18177
18470
  return false;
18178
18471
  }
18179
- if (chunk2JV4VQ7C_cjs.isRecoverable(v)) {
18472
+ if (chunk5MLC2HU3_cjs.isRecoverable(v)) {
18180
18473
  return false;
18181
18474
  }
18182
- if (chunk2JV4VQ7C_cjs.isExpired(v)) {
18475
+ if (chunk5MLC2HU3_cjs.isExpired(v)) {
18183
18476
  return false;
18184
18477
  }
18185
18478
  return true;
@@ -18277,7 +18570,7 @@ var WalletMessageHandler = class {
18277
18570
  if (!this.readonlyWallet) return null;
18278
18571
  const { boardingTxs, commitmentsToIgnore } = await this.readonlyWallet.getBoardingTxs();
18279
18572
  const indexerProvider = this.indexerProvider;
18280
- const resolveTxCreatedAt = indexerProvider ? (txids) => chunk2JV4VQ7C_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
18573
+ const resolveTxCreatedAt = indexerProvider ? (txids) => chunk5MLC2HU3_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
18281
18574
  return buildTransactionHistory(vtxos, boardingTxs, commitmentsToIgnore, resolveTxCreatedAt);
18282
18575
  }
18283
18576
  async ensureContractEventBroadcasting() {
@@ -18973,7 +19266,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
18973
19266
  };
18974
19267
  try {
18975
19268
  const response = await this.sendMessage(message);
18976
- return response.payload.vtxos.map(chunk2JV4VQ7C_cjs.normalizeVtxo);
19269
+ return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
18977
19270
  } catch (error) {
18978
19271
  throw new Error(`Failed to get vtxos: ${error}`);
18979
19272
  }
@@ -18998,7 +19291,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
18998
19291
  };
18999
19292
  try {
19000
19293
  const response = await this.sendMessage(message);
19001
- return response.payload.vtxos.map(chunk2JV4VQ7C_cjs.normalizeVtxo);
19294
+ return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
19002
19295
  } catch (error) {
19003
19296
  throw new Error(`Failed to get spendable vtxos: ${error}`);
19004
19297
  }
@@ -19129,7 +19422,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
19129
19422
  };
19130
19423
  try {
19131
19424
  const response = await sendContractMessage(message);
19132
- return response.payload.vtxos.map(chunk2JV4VQ7C_cjs.normalizeVtxo);
19425
+ return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
19133
19426
  } catch (e) {
19134
19427
  throw new Error("Failed to annotate vtxos");
19135
19428
  }
@@ -19730,7 +20023,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
19730
20023
  };
19731
20024
  try {
19732
20025
  const response = await wallet.sendMessage(message);
19733
- return response.payload.vtxos.map(chunk2JV4VQ7C_cjs.normalizeVtxo);
20026
+ return response.payload.vtxos.map(chunk5MLC2HU3_cjs.normalizeVtxo);
19734
20027
  } catch (e) {
19735
20028
  throw new Error(`Failed to get expiring vtxos: ${e}`);
19736
20029
  }
@@ -19842,12 +20135,12 @@ var OnchainWallet = class _OnchainWallet {
19842
20135
  * @returns Configured onchain wallet
19843
20136
  * @throws Error if the configured identity cannot produce a valid x-only public key
19844
20137
  */
19845
- static async create(identity, networkName = chunk2JV4VQ7C_cjs.DEFAULT_NETWORK_NAME, provider) {
20138
+ static async create(identity, networkName = chunk5MLC2HU3_cjs.DEFAULT_NETWORK_NAME, provider) {
19846
20139
  const pubkey = await identity.xOnlyPublicKey();
19847
20140
  if (!pubkey) {
19848
20141
  throw new Error("Invalid configured public key");
19849
20142
  }
19850
- const network = chunk2JV4VQ7C_cjs.getNetwork(networkName);
20143
+ const network = chunk5MLC2HU3_cjs.getNetwork(networkName);
19851
20144
  const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
19852
20145
  const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
19853
20146
  return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
@@ -19953,7 +20246,7 @@ var OnchainWallet = class _OnchainWallet {
19953
20246
  if (!inputs) {
19954
20247
  throw new Error("Fee estimation failed");
19955
20248
  }
19956
- let tx = new chunk2JV4VQ7C_cjs.Transaction();
20249
+ let tx = new chunk5MLC2HU3_cjs.Transaction();
19957
20250
  for (const input of inputs) {
19958
20251
  tx.addInput({
19959
20252
  txid: input.txid,
@@ -20011,7 +20304,7 @@ var OnchainWallet = class _OnchainWallet {
20011
20304
  * @throws If the parent has no anchor, or funding cannot be selected/signed
20012
20305
  */
20013
20306
  async bumpAnchor(parentHex, feeRate) {
20014
- const parent = chunk2JV4VQ7C_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
20307
+ const parent = chunk5MLC2HU3_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
20015
20308
  const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
20016
20309
  const child = await this.buildBumpPackage(parent, feeRate, coins);
20017
20310
  return [parent.hex, child.hex];
@@ -20110,6 +20403,7 @@ var ListUnspentMethod = "blockchain.scripthash.listunspent";
20110
20403
  var MISSING_TRANSACTION = "missingtransaction";
20111
20404
  var MAX_FETCH_TRANSACTIONS_ATTEMPTS = 5;
20112
20405
  var BLOCK_HEADER_SIZE = 80;
20406
+ var MTP_WINDOW = 11;
20113
20407
  function parseBlockHeader(headerHex) {
20114
20408
  const headerBytes = base.hex.decode(headerHex);
20115
20409
  if (headerBytes.length !== BLOCK_HEADER_SIZE) {
@@ -20416,6 +20710,8 @@ var ElectrumOnchainProvider = class {
20416
20710
  ws;
20417
20711
  network;
20418
20712
  chain;
20713
+ mtpCache;
20714
+ mtpInflight;
20419
20715
  async getCoins(address) {
20420
20716
  const script = this.encodeAddress(address);
20421
20717
  const scriptHash = toScriptHash(script);
@@ -20671,15 +20967,58 @@ var ElectrumOnchainProvider = class {
20671
20967
  blockTime
20672
20968
  };
20673
20969
  }
20970
+ /** `time` is median-time-past, per {@link OnchainProvider.getChainTip};
20971
+ * Electrum serves raw headers and no MTP, so it is computed here. */
20674
20972
  async getChainTip() {
20675
20973
  const tip = await this.chain.subscribeHeaders();
20676
20974
  const { hash, timestamp } = parseBlockHeader(tip.hex);
20677
20975
  return {
20678
20976
  height: tip.height,
20679
- time: timestamp,
20977
+ time: await this.medianTimePast(tip.height, timestamp, hash),
20680
20978
  hash
20681
20979
  };
20682
20980
  }
20981
+ /**
20982
+ * Consensus's `GetMedianTimePast`, ending at and including `height`.
20983
+ *
20984
+ * Cached per tip HASH, not height: this runs on every balance read, and
20985
+ * hashing means a reorg at the same height recomputes rather than serving
20986
+ * the orphaned chain's median.
20987
+ */
20988
+ async medianTimePast(height, tipTime, hash) {
20989
+ if (this.mtpCache?.hash === hash) return this.mtpCache.mtp;
20990
+ if (this.mtpInflight?.hash === hash) return this.mtpInflight.mtp;
20991
+ const mtp = this.readMedianTimePast(height, tipTime, hash).finally(() => {
20992
+ this.mtpInflight = void 0;
20993
+ });
20994
+ this.mtpInflight = { hash, mtp };
20995
+ return mtp;
20996
+ }
20997
+ /** Degrades to the tip's `nTime` rather than throwing — a caller that
20998
+ * cannot read the tip at all is worse off. */
20999
+ async readMedianTimePast(height, tipTime, hash) {
21000
+ const heights = [];
21001
+ for (let h = height - 1; h >= 0 && heights.length < MTP_WINDOW - 1; h--) heights.push(h);
21002
+ if (heights.length === 0) return tipTime;
21003
+ let timestamps;
21004
+ try {
21005
+ const headers = await this.chain.fetchBlockHeaders(heights);
21006
+ timestamps = [
21007
+ tipTime,
21008
+ ...headers.map((header) => parseBlockHeader(header.hex).timestamp)
21009
+ ];
21010
+ } catch (e) {
21011
+ console.warn(
21012
+ "Failed to fetch the median-time-past window; using the tip's own time",
21013
+ e
21014
+ );
21015
+ return tipTime;
21016
+ }
21017
+ timestamps.sort((a, b) => a - b);
21018
+ const mtp = timestamps[Math.floor(timestamps.length / 2)];
21019
+ this.mtpCache = { hash, mtp };
21020
+ return mtp;
21021
+ }
20683
21022
  async watchAddresses(addresses, eventCallback) {
20684
21023
  const scripts = addresses.map((addr) => this.encodeAddress(addr));
20685
21024
  const scriptHashes = scripts.map(toScriptHash);
@@ -20872,7 +21211,7 @@ async function resolvePrevTxs(txids, source, onchain) {
20872
21211
  try {
20873
21212
  const { txs } = await source.getVirtualTxs(wanted);
20874
21213
  for (const psbt of txs) {
20875
- const tx = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
21214
+ const tx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
20876
21215
  resolved.set(tx.id, tx.toBytes());
20877
21216
  }
20878
21217
  } catch (err) {
@@ -20905,7 +21244,7 @@ async function resolvePrevTxs(txids, source, onchain) {
20905
21244
  async function attachPrevArkTxs(tx, txids, source, onchain) {
20906
21245
  const pending = [];
20907
21246
  for (let i = 0; i < tx.inputsLength; i++) {
20908
- if (chunk2JV4VQ7C_cjs.getArkPsbtFields(tx, i, chunk2JV4VQ7C_cjs.PrevArkTxField).length === 0) pending.push(i);
21247
+ if (chunk5MLC2HU3_cjs.getArkPsbtFields(tx, i, chunk5MLC2HU3_cjs.PrevArkTxField).length === 0) pending.push(i);
20909
21248
  }
20910
21249
  if (pending.length === 0) return;
20911
21250
  const resolved = await resolvePrevTxs(
@@ -20914,13 +21253,13 @@ async function attachPrevArkTxs(tx, txids, source, onchain) {
20914
21253
  onchain
20915
21254
  );
20916
21255
  for (const i of pending) {
20917
- chunk2JV4VQ7C_cjs.setArkPsbtField(tx, i, chunk2JV4VQ7C_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
21256
+ chunk5MLC2HU3_cjs.setArkPsbtField(tx, i, chunk5MLC2HU3_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
20918
21257
  }
20919
21258
  }
20920
21259
  async function attachPrevoutTxs(tx, source) {
20921
21260
  const pending = [];
20922
21261
  for (let i = 0; i < tx.inputsLength; i++) {
20923
- if (chunk2JV4VQ7C_cjs.getArkPsbtFields(tx, i, chunk2JV4VQ7C_cjs.PrevoutTxField).length > 0) continue;
21262
+ if (chunk5MLC2HU3_cjs.getArkPsbtFields(tx, i, chunk5MLC2HU3_cjs.PrevoutTxField).length > 0) continue;
20924
21263
  const input = tx.getInput(i);
20925
21264
  if (!input?.txid) throw new PrevTxUnavailableError(`input ${i} has no outpoint`);
20926
21265
  pending.push({ index: i, txid: base.hex.encode(input.txid) });
@@ -20931,7 +21270,7 @@ async function attachPrevoutTxs(tx, source) {
20931
21270
  resolved.set(txid, await source.getRawTransaction(txid));
20932
21271
  }
20933
21272
  for (const { index, txid } of pending) {
20934
- chunk2JV4VQ7C_cjs.setArkPsbtField(tx, index, chunk2JV4VQ7C_cjs.PrevoutTxField, resolved.get(txid));
21273
+ chunk5MLC2HU3_cjs.setArkPsbtField(tx, index, chunk5MLC2HU3_cjs.PrevoutTxField, resolved.get(txid));
20935
21274
  }
20936
21275
  }
20937
21276
  async function withPrevTxs(coins, source, onchain) {
@@ -20957,7 +21296,7 @@ exports.BIP322 = void 0;
20957
21296
  async function sign2(message, identity, network) {
20958
21297
  const xOnlyPubKey = await identity.xOnlyPublicKey();
20959
21298
  const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
20960
- const toSpend = chunk2JV4VQ7C_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
21299
+ const toSpend = chunk5MLC2HU3_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
20961
21300
  const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
20962
21301
  const signed = await identity.sign(toSign, [0]);
20963
21302
  signed.finalizeIdx(0);
@@ -21015,7 +21354,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
21015
21354
  if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
21016
21355
  return false;
21017
21356
  }
21018
- const toSpend = chunk2JV4VQ7C_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
21357
+ const toSpend = chunk5MLC2HU3_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
21019
21358
  const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
21020
21359
  const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
21021
21360
  const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
@@ -21036,7 +21375,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
21036
21375
  }
21037
21376
  const sighashType = sigWithHash[sigWithHash.length - 1];
21038
21377
  const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
21039
- const toSpend = chunk2JV4VQ7C_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
21378
+ const toSpend = chunk5MLC2HU3_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
21040
21379
  const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
21041
21380
  const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
21042
21381
  const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
@@ -21089,7 +21428,7 @@ function encodeCompactSize(n) {
21089
21428
  return buf;
21090
21429
  }
21091
21430
  function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
21092
- const tx = new chunk2JV4VQ7C_cjs.Transaction({ version: 0 });
21431
+ const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 0 });
21093
21432
  tx.addInput({
21094
21433
  txid: toSpend.id,
21095
21434
  index: 0,
@@ -21103,12 +21442,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
21103
21442
  });
21104
21443
  tx.addOutput({
21105
21444
  amount: 0n,
21106
- script: chunk2JV4VQ7C_cjs.OP_RETURN_EMPTY_PKSCRIPT
21445
+ script: chunk5MLC2HU3_cjs.OP_RETURN_EMPTY_PKSCRIPT
21107
21446
  });
21108
21447
  return tx;
21109
21448
  }
21110
21449
  function craftBIP322ToSignSimple(toSpend, pkScript) {
21111
- const tx = new chunk2JV4VQ7C_cjs.Transaction({ version: 0 });
21450
+ const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 0 });
21112
21451
  tx.addInput({
21113
21452
  txid: toSpend.id,
21114
21453
  index: 0,
@@ -21120,7 +21459,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
21120
21459
  });
21121
21460
  tx.addOutput({
21122
21461
  amount: 0n,
21123
- script: chunk2JV4VQ7C_cjs.OP_RETURN_EMPTY_PKSCRIPT
21462
+ script: chunk5MLC2HU3_cjs.OP_RETURN_EMPTY_PKSCRIPT
21124
21463
  });
21125
21464
  return tx;
21126
21465
  }
@@ -21251,7 +21590,7 @@ var RestEmulatorProvider = class {
21251
21590
  }
21252
21591
  };
21253
21592
  function finalizeVirtualTx(type, psbtBase64) {
21254
- const tx = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
21593
+ const tx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
21255
21594
  if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
21256
21595
  const input = tx.getInput(0);
21257
21596
  if (!input) {
@@ -21278,14 +21617,14 @@ var ExitPathError = class extends Error {
21278
21617
  reason;
21279
21618
  };
21280
21619
  function delayWeight(sequence) {
21281
- const t = chunk2JV4VQ7C_cjs.sequenceToTimelock(sequence);
21620
+ const t = chunk5MLC2HU3_cjs.sequenceToTimelock(sequence);
21282
21621
  return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
21283
21622
  }
21284
21623
  async function resolveUnilateralPath(params) {
21285
21624
  const { vtxo, scriptHex, contractRepository } = params;
21286
21625
  const contract = contractRepository ? (await contractRepository.getContracts({ script: scriptHex }))[0] : void 0;
21287
21626
  if (contract) {
21288
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.get(contract.type);
21627
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
21289
21628
  if (!handler) {
21290
21629
  throw new ExitPathError(
21291
21630
  "no-handler",
@@ -21308,12 +21647,12 @@ async function resolveUnilateralPath(params) {
21308
21647
  paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
21309
21648
  return { selection: paths[0], label: `${contract.type}:unilateral` };
21310
21649
  }
21311
- const decoded = chunk2JV4VQ7C_cjs.VtxoScript.decode(vtxo.tapTree);
21650
+ const decoded = chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree);
21312
21651
  let best;
21313
21652
  for (const exit of decoded.exitPaths()) {
21314
21653
  const leaf = decoded.findLeaf(base.hex.encode(exit.script));
21315
21654
  if (!leaf) continue;
21316
- const sequence = chunk2JV4VQ7C_cjs.timelockToSequence(exit.params.timelock);
21655
+ const sequence = chunk5MLC2HU3_cjs.timelockToSequence(exit.params.timelock);
21317
21656
  const weight = delayWeight(sequence);
21318
21657
  if (!best || weight < best.weight) {
21319
21658
  best = { selection: { leaf, sequence }, weight };
@@ -21533,7 +21872,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
21533
21872
  let totalAmount = 0n;
21534
21873
  const txWeightEstimator = TxWeightEstimator.create();
21535
21874
  for (const vtxo of vtxos) {
21536
- if (!chunk2JV4VQ7C_cjs.canSweepOnchain(vtxo)) {
21875
+ if (!chunk5MLC2HU3_cjs.canSweepOnchain(vtxo)) {
21537
21876
  throw new Error(
21538
21877
  `Vtxo ${vtxo.txid}:${vtxo.vout} cannot be swept onchain: it is not fully unrolled (use unroll first), or its exit output was already spent`
21539
21878
  );
@@ -21544,14 +21883,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
21544
21883
  }
21545
21884
  const resolved = await resolveUnilateralPath({
21546
21885
  vtxo,
21547
- scriptHex: base.hex.encode(chunk2JV4VQ7C_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
21886
+ scriptHex: base.hex.encode(chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
21548
21887
  contractRepository: wallet.contractRepository,
21549
21888
  walletPubKeyHex: base.hex.encode(await wallet.identity.xOnlyPublicKey()),
21550
21889
  currentTime: Date.now()
21551
21890
  });
21552
21891
  const spendingLeaf = resolved.selection.leaf;
21553
21892
  const sequence = resolved.selection.sequence;
21554
- const timelock = chunk2JV4VQ7C_cjs.sequenceToTimelock(sequence);
21893
+ const timelock = chunk5MLC2HU3_cjs.sequenceToTimelock(sequence);
21555
21894
  const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
21556
21895
  if (!elapsed) {
21557
21896
  throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
@@ -21564,7 +21903,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
21564
21903
  sequence,
21565
21904
  witnessUtxo: {
21566
21905
  amount: BigInt(vtxo.value),
21567
- script: chunk2JV4VQ7C_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
21906
+ script: chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
21568
21907
  },
21569
21908
  sighashType: btcSigner.SigHash.DEFAULT
21570
21909
  });
@@ -21574,7 +21913,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
21574
21913
  btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
21575
21914
  );
21576
21915
  }
21577
- const tx = new chunk2JV4VQ7C_cjs.Transaction({ version: 2 });
21916
+ const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 2 });
21578
21917
  for (const input of inputs) {
21579
21918
  tx.addInput(input);
21580
21919
  }
@@ -21657,7 +21996,7 @@ async function buildSignedSweep(params) {
21657
21996
  `uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
21658
21997
  );
21659
21998
  }
21660
- const tx = new chunk2JV4VQ7C_cjs.Transaction({ version: 2 });
21999
+ const tx = new chunk5MLC2HU3_cjs.Transaction({ version: 2 });
21661
22000
  tx.addInput({
21662
22001
  txid: vtxo.txid,
21663
22002
  index: vtxo.vout,
@@ -21682,7 +22021,7 @@ async function buildSignedSweep(params) {
21682
22021
  finalScriptWitness: [
21683
22022
  tapScriptSig[0][1],
21684
22023
  ...path.extraWitness,
21685
- chunk2JV4VQ7C_cjs.scriptFromTapLeafScript(path.leaf),
22024
+ chunk5MLC2HU3_cjs.scriptFromTapLeafScript(path.leaf),
21686
22025
  btcSigner.TaprootControlBlock.encode(controlBlock)
21687
22026
  ]
21688
22027
  });
@@ -21712,7 +22051,7 @@ async function resolveFeeRate(opts) {
21712
22051
  }
21713
22052
  async function selectExitVtxos(opts) {
21714
22053
  if (!opts.vtxos) return opts.wallet.getVtxos();
21715
- const res = await chunk2JV4VQ7C_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
22054
+ const res = await chunk5MLC2HU3_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
21716
22055
  const tapTrees = /* @__PURE__ */ new Map();
21717
22056
  const out = [];
21718
22057
  for (const vtxo of res.vtxos) {
@@ -21727,7 +22066,7 @@ async function selectExitVtxos(opts) {
21727
22066
  `no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
21728
22067
  );
21729
22068
  }
21730
- const handler = chunkOIZ2V2VD_cjs.contractHandlers.get(contract.type);
22069
+ const handler = chunkWIFL5QYZ_cjs.contractHandlers.get(contract.type);
21731
22070
  if (!handler) {
21732
22071
  throw new Error(`no contract handler registered for type '${contract.type}'`);
21733
22072
  }
@@ -21757,7 +22096,7 @@ async function computeExitLayout(opts, feeRate) {
21757
22096
  if (pendingNodes.length > 0) {
21758
22097
  const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
21759
22098
  for (const psbt of txs) {
21760
- psbts.set(chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
22099
+ psbts.set(chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
21761
22100
  }
21762
22101
  }
21763
22102
  const childVsize = Number(
@@ -21793,7 +22132,7 @@ async function computeExitLayout(opts, feeRate) {
21793
22132
  try {
21794
22133
  const resolved = await resolveUnilateralPath({
21795
22134
  vtxo,
21796
- scriptHex: base.hex.encode(chunk2JV4VQ7C_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
22135
+ scriptHex: base.hex.encode(chunk5MLC2HU3_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
21797
22136
  contractRepository: wallet.contractRepository,
21798
22137
  walletPubKeyHex,
21799
22138
  currentTime: Date.now()
@@ -21812,7 +22151,7 @@ async function computeExitLayout(opts, feeRate) {
21812
22151
  });
21813
22152
  continue;
21814
22153
  }
21815
- const t = chunk2JV4VQ7C_cjs.sequenceToTimelock(resolved.selection.sequence);
22154
+ const t = chunk5MLC2HU3_cjs.sequenceToTimelock(resolved.selection.sequence);
21816
22155
  const delay = { type: t.type, value: Number(t.value) };
21817
22156
  infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
21818
22157
  sweeps.push({ vtxo, resolved, sweepFee, delay });
@@ -22213,7 +22552,7 @@ async function prepare(opts) {
22213
22552
  txid: sweep.vtxo.txid,
22214
22553
  vout: sweep.vtxo.vout,
22215
22554
  value: sweep.vtxo.value,
22216
- pkScript: chunk2JV4VQ7C_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
22555
+ pkScript: chunk5MLC2HU3_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
22217
22556
  },
22218
22557
  path: sweep.resolved.selection,
22219
22558
  outputAddress: opts.sweepAddress,
@@ -22301,7 +22640,7 @@ async function prepare(opts) {
22301
22640
  if (newFee <= splitterFee) break;
22302
22641
  splitterFee = newFee;
22303
22642
  }
22304
- const splitter = new chunk2JV4VQ7C_cjs.Transaction({ version: 2 });
22643
+ const splitter = new chunk5MLC2HU3_cjs.Transaction({ version: 2 });
22305
22644
  for (const coin of selected.inputs) {
22306
22645
  splitter.addInput({
22307
22646
  txid: coin.txid,
@@ -22445,41 +22784,41 @@ var UnilateralExit = {
22445
22784
  // src/arkade/index.ts
22446
22785
  var arkade_exports = {};
22447
22786
  chunk5BLDMQED_cjs.__export(arkade_exports, {
22448
- ARKADE_OP: () => chunkOIZ2V2VD_cjs.ARKADE_OP,
22449
- ARKADE_OPCODES: () => chunkOIZ2V2VD_cjs.ARKADE_OPCODES,
22450
- ARKADE_OPCODE_NAMES: () => chunkOIZ2V2VD_cjs.ARKADE_OPCODE_NAMES,
22451
- ARKADE_OPCODE_VALUES: () => chunkOIZ2V2VD_cjs.ARKADE_OPCODE_VALUES,
22452
- ARKADE_OPS: () => chunkOIZ2V2VD_cjs.ARKADE_OPS,
22787
+ ARKADE_OP: () => chunkWIFL5QYZ_cjs.ARKADE_OP,
22788
+ ARKADE_OPCODES: () => chunkWIFL5QYZ_cjs.ARKADE_OPCODES,
22789
+ ARKADE_OPCODE_NAMES: () => chunkWIFL5QYZ_cjs.ARKADE_OPCODE_NAMES,
22790
+ ARKADE_OPCODE_VALUES: () => chunkWIFL5QYZ_cjs.ARKADE_OPCODE_VALUES,
22791
+ ARKADE_OPS: () => chunkWIFL5QYZ_cjs.ARKADE_OPS,
22453
22792
  Arkade: () => Arkade,
22454
22793
  ArkadeContract: () => ArkadeContract,
22455
- ArkadeProgramScript: () => chunkOIZ2V2VD_cjs.ArkadeProgramScript,
22456
- ArkadeScript: () => chunkOIZ2V2VD_cjs.ArkadeScript,
22794
+ ArkadeProgramScript: () => chunkWIFL5QYZ_cjs.ArkadeProgramScript,
22795
+ ArkadeScript: () => chunkWIFL5QYZ_cjs.ArkadeScript,
22457
22796
  ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
22458
- BigNum: () => chunkOIZ2V2VD_cjs.bignum_exports,
22797
+ BigNum: () => chunkWIFL5QYZ_cjs.bignum_exports,
22459
22798
  OP: () => btcSigner.OP,
22460
- OPCODE_NAMES: () => chunkOIZ2V2VD_cjs.OPCODE_NAMES,
22461
- OPCODE_VALUES: () => chunkOIZ2V2VD_cjs.OPCODE_VALUES,
22462
- SUPPORTED_PROGRAM_VERSION: () => chunkOIZ2V2VD_cjs.SUPPORTED_PROGRAM_VERSION,
22799
+ OPCODE_NAMES: () => chunkWIFL5QYZ_cjs.OPCODE_NAMES,
22800
+ OPCODE_VALUES: () => chunkWIFL5QYZ_cjs.OPCODE_VALUES,
22801
+ SUPPORTED_PROGRAM_VERSION: () => chunkWIFL5QYZ_cjs.SUPPORTED_PROGRAM_VERSION,
22463
22802
  Script: () => btcSigner.Script,
22464
- arkadeScriptHash: () => chunkOIZ2V2VD_cjs.arkadeScriptHash,
22465
- arkadeWitnessHash: () => chunkOIZ2V2VD_cjs.arkadeWitnessHash,
22466
- asmToBytes: () => chunkOIZ2V2VD_cjs.asmToBytes,
22467
- bytesToASM: () => chunkOIZ2V2VD_cjs.bytesToASM,
22468
- computeArkadeScriptPublicKey: () => chunkOIZ2V2VD_cjs.computeArkadeScriptPublicKey,
22803
+ arkadeScriptHash: () => chunkWIFL5QYZ_cjs.arkadeScriptHash,
22804
+ arkadeWitnessHash: () => chunkWIFL5QYZ_cjs.arkadeWitnessHash,
22805
+ asmToBytes: () => chunkWIFL5QYZ_cjs.asmToBytes,
22806
+ bytesToASM: () => chunkWIFL5QYZ_cjs.bytesToASM,
22807
+ computeArkadeScriptPublicKey: () => chunkWIFL5QYZ_cjs.computeArkadeScriptPublicKey,
22469
22808
  createArkadeBatchHandler: () => createArkadeBatchHandler,
22470
- deserializeArkadeContractParams: () => chunkOIZ2V2VD_cjs.deserializeArkadeContractParams,
22471
- fromASM: () => chunkOIZ2V2VD_cjs.fromASM,
22472
- getOpcodeName: () => chunkOIZ2V2VD_cjs.getOpcodeName,
22473
- getOpcodeValue: () => chunkOIZ2V2VD_cjs.getOpcodeValue,
22474
- parseArtifact: () => chunkOIZ2V2VD_cjs.parseArtifact,
22475
- resolveAsm: () => chunkOIZ2V2VD_cjs.resolveAsm,
22476
- serializeArkadeContractParams: () => chunkOIZ2V2VD_cjs.serializeArkadeContractParams,
22477
- stringifyArtifact: () => chunkOIZ2V2VD_cjs.stringifyArtifact,
22478
- toASM: () => chunkOIZ2V2VD_cjs.toASM,
22479
- validateProgram: () => chunkOIZ2V2VD_cjs.validateProgram,
22480
- witnessRefToBytes: () => chunkOIZ2V2VD_cjs.witnessRefToBytes
22809
+ deserializeArkadeContractParams: () => chunkWIFL5QYZ_cjs.deserializeArkadeContractParams,
22810
+ fromASM: () => chunkWIFL5QYZ_cjs.fromASM,
22811
+ getOpcodeName: () => chunkWIFL5QYZ_cjs.getOpcodeName,
22812
+ getOpcodeValue: () => chunkWIFL5QYZ_cjs.getOpcodeValue,
22813
+ parseArtifact: () => chunkWIFL5QYZ_cjs.parseArtifact,
22814
+ resolveAsm: () => chunkWIFL5QYZ_cjs.resolveAsm,
22815
+ serializeArkadeContractParams: () => chunkWIFL5QYZ_cjs.serializeArkadeContractParams,
22816
+ stringifyArtifact: () => chunkWIFL5QYZ_cjs.stringifyArtifact,
22817
+ toASM: () => chunkWIFL5QYZ_cjs.toASM,
22818
+ validateProgram: () => chunkWIFL5QYZ_cjs.validateProgram,
22819
+ witnessRefToBytes: () => chunkWIFL5QYZ_cjs.witnessRefToBytes
22481
22820
  });
22482
- var isVtxoCoin = (input) => chunk2JV4VQ7C_cjs.isVirtualCoin(input);
22821
+ var isVtxoCoin = (input) => chunk5MLC2HU3_cjs.isVirtualCoin(input);
22483
22822
  function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients, batchExpiryPolicy) {
22484
22823
  let batchId;
22485
22824
  let sweepTapTreeRoot;
@@ -22500,23 +22839,23 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
22500
22839
  );
22501
22840
  await arkProvider.confirmRegistration(intentId);
22502
22841
  batchId = event.id;
22503
- const sweepTapscript = chunk2JV4VQ7C_cjs.CSVMultisigTapscript.encode({
22842
+ const sweepTapscript = chunk5MLC2HU3_cjs.CSVMultisigTapscript.encode({
22504
22843
  timelock,
22505
- pubkeys: [chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
22844
+ pubkeys: [chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
22506
22845
  }).script;
22507
22846
  sweepTapTreeRoot = payment_js.tapLeafHash(sweepTapscript);
22508
22847
  return { skip: false };
22509
22848
  },
22510
22849
  onTreeSigningStarted: async (event, vtxoTree) => {
22511
22850
  const signerPubKey = await session.getPublicKey();
22512
- const xonlySignerPubKey = chunkOIZ2V2VD_cjs.toXOnly(signerPubKey, "signer key");
22851
+ const xonlySignerPubKey = chunkWIFL5QYZ_cjs.toXOnly(signerPubKey, "signer key");
22513
22852
  const xOnlyPubkeys = event.cosignersPublicKeys.map(
22514
- (k) => base.hex.encode(chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
22853
+ (k) => base.hex.encode(chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
22515
22854
  );
22516
22855
  if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
22517
22856
  return { skip: true };
22518
22857
  }
22519
- const commitmentTx = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
22858
+ const commitmentTx = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
22520
22859
  validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
22521
22860
  if (recipients && recipients.length > 0) {
22522
22861
  validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
@@ -22548,7 +22887,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
22548
22887
  if (connectorTree) {
22549
22888
  validateConnectorsTxGraph(event.commitmentTx, connectorTree);
22550
22889
  }
22551
- let commitmentPsbt = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
22890
+ let commitmentPsbt = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
22552
22891
  assertFinalCommitmentMatchesValidated(
22553
22892
  commitmentPsbt,
22554
22893
  validatedCommitmentTxid,
@@ -22583,7 +22922,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
22583
22922
  boardingIndices.push(boardingIdx);
22584
22923
  continue;
22585
22924
  }
22586
- if (chunk2JV4VQ7C_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
22925
+ if (chunk5MLC2HU3_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
22587
22926
  continue;
22588
22927
  }
22589
22928
  if (connectorIndex >= connectorLeaves.length) {
@@ -22604,7 +22943,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
22604
22943
  index: input.vout,
22605
22944
  witnessUtxo: {
22606
22945
  amount: BigInt(input.value),
22607
- script: chunk2JV4VQ7C_cjs.VtxoScript.decode(input.tapTree).pkScript
22946
+ script: chunk5MLC2HU3_cjs.VtxoScript.decode(input.tapTree).pkScript
22608
22947
  },
22609
22948
  sighashType: btcSigner.SigHash.DEFAULT,
22610
22949
  tapLeafScript: [input.forfeitTapLeafScript]
@@ -22695,16 +23034,16 @@ var Arkade = class _Arkade {
22695
23034
  /** Connect and resolve the server key, checkpoint closure and (if present) the co-signer key. */
22696
23035
  static async connect(opts) {
22697
23036
  const info = await opts.arkade.getInfo();
22698
- const serverKey = chunkOIZ2V2VD_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
22699
- const checkpoint = chunk2JV4VQ7C_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
22700
- const network = opts.network ?? chunk2JV4VQ7C_cjs.DEFAULT_NETWORK;
23037
+ const serverKey = chunkWIFL5QYZ_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
23038
+ const checkpoint = chunk5MLC2HU3_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
23039
+ const network = opts.network ?? chunk5MLC2HU3_cjs.DEFAULT_NETWORK;
22701
23040
  let emulatorKey;
22702
23041
  if (opts.emulator) {
22703
- emulatorKey = base.hex.decode(chunk2JV4VQ7C_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
23042
+ emulatorKey = base.hex.decode(chunk5MLC2HU3_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
22704
23043
  }
22705
23044
  let userKey;
22706
23045
  if (opts.identity) {
22707
- userKey = chunkOIZ2V2VD_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
23046
+ userKey = chunkWIFL5QYZ_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
22708
23047
  }
22709
23048
  return new _Arkade({
22710
23049
  arkProvider: opts.arkade,
@@ -22730,7 +23069,7 @@ var Arkade = class _Arkade {
22730
23069
  * key respectively; explicit args always win.
22731
23070
  */
22732
23071
  contract(program, args = {}) {
22733
- const declared = (program.params ?? []).map(chunkOIZ2V2VD_cjs.inputName);
23072
+ const declared = (program.params ?? []).map(chunkWIFL5QYZ_cjs.inputName);
22734
23073
  if (declared.includes("server") && args.server === void 0) {
22735
23074
  args = { ...args, server: this.serverKey };
22736
23075
  }
@@ -22750,7 +23089,7 @@ var ArkadeContract = class _ArkadeContract {
22750
23089
  userKey: client.userKey,
22751
23090
  emulatorKey: client.emulatorKey
22752
23091
  };
22753
- this.vtxoScript = new chunkOIZ2V2VD_cjs.ArkadeProgramScript(program, args, this.keys);
23092
+ this.vtxoScript = new chunkWIFL5QYZ_cjs.ArkadeProgramScript(program, args, this.keys);
22754
23093
  this.tapTree = this.vtxoScript.encode();
22755
23094
  this.compiled = this.vtxoScript.compiled;
22756
23095
  }
@@ -22778,7 +23117,7 @@ var ArkadeContract = class _ArkadeContract {
22778
23117
  `ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
22779
23118
  );
22780
23119
  }
22781
- const typed = chunkOIZ2V2VD_cjs.deserializeArkadeContractParams(contract.params);
23120
+ const typed = chunkWIFL5QYZ_cjs.deserializeArkadeContractParams(contract.params);
22782
23121
  return new _ArkadeContract(client, typed.program, typed.args, {
22783
23122
  serverKey: typed.serverKey,
22784
23123
  userKey: typed.userKey,
@@ -22819,7 +23158,7 @@ var ArkadeContract = class _ArkadeContract {
22819
23158
  toContractParams() {
22820
23159
  return {
22821
23160
  type: "arkade",
22822
- params: chunkOIZ2V2VD_cjs.serializeArkadeContractParams({
23161
+ params: chunkWIFL5QYZ_cjs.serializeArkadeContractParams({
22823
23162
  program: this.program,
22824
23163
  args: this.args,
22825
23164
  serverKey: this.keys.serverKey,
@@ -22856,6 +23195,10 @@ var ArkadeContract = class _ArkadeContract {
22856
23195
  * When a `contractManager` is configured and this contract is registered,
22857
23196
  * reads the repository-backed state (offline-first, kept fresh by the
22858
23197
  * contract watcher). Otherwise falls back to a direct indexer query.
23198
+ *
23199
+ * Both branches refuse a spent or unilaterally exited output. They are not
23200
+ * otherwise interchangeable: the fallback asks `spendableOnly`, which also
23201
+ * drops swept coins — the manager branch keeps those.
22859
23202
  */
22860
23203
  async getUtxos() {
22861
23204
  const manager = this.client.contractManager;
@@ -22865,18 +23208,18 @@ var ArkadeContract = class _ArkadeContract {
22865
23208
  if (registered) {
22866
23209
  const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
22867
23210
  return (withVtxos?.vtxos ?? []).filter(
22868
- (v) => !chunk2JV4VQ7C_cjs.hasTerminalSpend(v) && !v.isUnrolled
23211
+ (v) => !chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isUnrolled
22869
23212
  );
22870
23213
  }
22871
23214
  }
22872
23215
  if (!this.client.indexer) {
22873
23216
  throw new Error("ArkadeContract.getUtxos: an indexer is required");
22874
23217
  }
22875
- const { vtxos } = await chunk2JV4VQ7C_cjs.getNormalizedVtxos(this.client.indexer, {
23218
+ const { vtxos } = await chunk5MLC2HU3_cjs.getNormalizedVtxos(this.client.indexer, {
22876
23219
  scripts: [scriptHex],
22877
23220
  spendableOnly: true
22878
23221
  });
22879
- return vtxos;
23222
+ return vtxos.filter((v) => !chunk5MLC2HU3_cjs.hasTerminalSpend(v) && !v.isUnrolled);
22880
23223
  }
22881
23224
  /** Total spendable balance (requires an indexer). */
22882
23225
  async getBalance() {
@@ -22974,7 +23317,7 @@ var ArkadeTransactionBuilder = class {
22974
23317
  this.contract.client.checkpoint
22975
23318
  );
22976
23319
  if (coin.sourceTx) {
22977
- chunk2JV4VQ7C_cjs.setArkPsbtField(arkTx, 0, chunk2JV4VQ7C_cjs.PrevArkTxField, coin.sourceTx);
23320
+ chunk5MLC2HU3_cjs.setArkPsbtField(arkTx, 0, chunk5MLC2HU3_cjs.PrevArkTxField, coin.sourceTx);
22978
23321
  }
22979
23322
  if (this.fn.arkadeScript) {
22980
23323
  const indexer = this.contract.client.indexer;
@@ -22991,8 +23334,8 @@ var ArkadeTransactionBuilder = class {
22991
23334
  }
22992
23335
  const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
22993
23336
  if (condition.length > 0) {
22994
- chunk2JV4VQ7C_cjs.setArkPsbtField(arkTx, 0, chunk2JV4VQ7C_cjs.ConditionWitness, condition);
22995
- chunk2JV4VQ7C_cjs.setArkPsbtField(checkpoints[0], 0, chunk2JV4VQ7C_cjs.ConditionWitness, condition);
23337
+ chunk5MLC2HU3_cjs.setArkPsbtField(arkTx, 0, chunk5MLC2HU3_cjs.ConditionWitness, condition);
23338
+ chunk5MLC2HU3_cjs.setArkPsbtField(checkpoints[0], 0, chunk5MLC2HU3_cjs.ConditionWitness, condition);
22996
23339
  }
22997
23340
  const packets = [];
22998
23341
  if (this.assetSpecs.length > 0) {
@@ -23031,7 +23374,7 @@ var ArkadeTransactionBuilder = class {
23031
23374
  base.base64.encode(signedArk2.toPSBT()),
23032
23375
  signedCps.map((c) => base.base64.encode(c.toPSBT()))
23033
23376
  );
23034
- const txid = chunk2JV4VQ7C_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
23377
+ const txid = chunk5MLC2HU3_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
23035
23378
  return {
23036
23379
  txid,
23037
23380
  signedArkTx: res2.signedArkTx,
@@ -23090,23 +23433,23 @@ var ArkadeTransactionBuilder = class {
23090
23433
  }
23091
23434
  buildAssetPacket() {
23092
23435
  const groups = this.assetSpecs.map((s) => {
23093
- const id = typeof s.assetId === "string" ? chunkCO3KKSWM_cjs.AssetId.fromString(s.assetId) : chunkCO3KKSWM_cjs.AssetId.fromBytes(s.assetId);
23094
- return chunkCO3KKSWM_cjs.AssetGroup.create(
23436
+ const id = typeof s.assetId === "string" ? chunkGVHUHTRH_cjs.AssetId.fromString(s.assetId) : chunkGVHUHTRH_cjs.AssetId.fromBytes(s.assetId);
23437
+ return chunkGVHUHTRH_cjs.AssetGroup.create(
23095
23438
  id,
23096
23439
  null,
23097
- s.inputs.map((i) => chunkCO3KKSWM_cjs.AssetInput.create(i.vin, i.amount)),
23098
- s.outputs.map((o) => chunkCO3KKSWM_cjs.AssetOutput.create(o.vout, o.amount)),
23099
- (s.metadata ?? []).map((m) => chunkCO3KKSWM_cjs.Metadata.create(m.key, m.value))
23440
+ s.inputs.map((i) => chunkGVHUHTRH_cjs.AssetInput.create(i.vin, i.amount)),
23441
+ s.outputs.map((o) => chunkGVHUHTRH_cjs.AssetOutput.create(o.vout, o.amount)),
23442
+ (s.metadata ?? []).map((m) => chunkGVHUHTRH_cjs.Metadata.create(m.key, m.value))
23100
23443
  );
23101
23444
  });
23102
- return chunkCO3KKSWM_cjs.Packet.create(groups);
23445
+ return chunkGVHUHTRH_cjs.Packet.create(groups);
23103
23446
  }
23104
23447
  witnessBytes(ref) {
23105
- return chunkOIZ2V2VD_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
23448
+ return chunkWIFL5QYZ_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
23106
23449
  }
23107
23450
  };
23108
23451
  function bindInputs(fn, callArgs) {
23109
- const names = (fn.def.inputs ?? []).map(chunkOIZ2V2VD_cjs.inputName);
23452
+ const names = (fn.def.inputs ?? []).map(chunkWIFL5QYZ_cjs.inputName);
23110
23453
  if (callArgs.length !== names.length) {
23111
23454
  throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
23112
23455
  }
@@ -23497,6 +23840,7 @@ function createDefaultPaymentRouter(wallet) {
23497
23840
  exports.ARKADE_MAGIC = ARKADE_MAGIC;
23498
23841
  exports.ARKADE_SALTED_PREIMAGE_TAG = ARKADE_SALTED_PREIMAGE_TAG;
23499
23842
  exports.ARKADE_SWAP_PREIMAGE_TAG = ARKADE_SWAP_PREIMAGE_TAG;
23843
+ exports.AbortError = AbortError;
23500
23844
  exports.ActivityRegistry = ActivityRegistry;
23501
23845
  exports.AmbiguousRouteError = AmbiguousRouteError;
23502
23846
  exports.ArkNote = ArkNote;
@@ -23711,5 +24055,5 @@ exports.verifyTapscriptSignatures = verifyTapscriptSignatures;
23711
24055
  exports.waitForIncomingFunds = waitForIncomingFunds;
23712
24056
  exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
23713
24057
  exports.withPrevTxs = withPrevTxs;
23714
- //# sourceMappingURL=chunk-MJUTO3PY.cjs.map
23715
- //# sourceMappingURL=chunk-MJUTO3PY.cjs.map
24058
+ //# sourceMappingURL=chunk-EBYCTLET.cjs.map
24059
+ //# sourceMappingURL=chunk-EBYCTLET.cjs.map