@arkade-os/sdk 0.4.71 → 0.4.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +29 -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-CjKAUiuj.d.ts → asyncStorageTaskQueue-DhhNZc4v.d.ts} +2 -2
  9. package/dist/{asyncStorageTaskQueue-DgXf4iuU.d.cts → asyncStorageTaskQueue-s5lUGWxu.d.cts} +2 -2
  10. package/dist/{chunk-I7ZNWBBU.cjs → chunk-4BWZ437E.cjs} +21 -17
  11. package/dist/chunk-4BWZ437E.cjs.map +1 -0
  12. package/dist/{chunk-FM263GKH.cjs → chunk-4C5PMGBB.cjs} +51 -25
  13. package/dist/chunk-4C5PMGBB.cjs.map +1 -0
  14. package/dist/{chunk-2ZX4Z2IP.js → chunk-5GQFYVWP.js} +30 -5
  15. package/dist/chunk-5GQFYVWP.js.map +1 -0
  16. package/dist/{chunk-5J5PDZRR.cjs → chunk-6FTHFJAN.cjs} +30 -4
  17. package/dist/chunk-6FTHFJAN.cjs.map +1 -0
  18. package/dist/{chunk-E5JNYFOF.js → chunk-BHLYB44A.js} +210 -53
  19. package/dist/chunk-BHLYB44A.js.map +1 -0
  20. package/dist/{chunk-ALZ2CZ3T.js → chunk-CB6QPAO5.js} +3 -3
  21. package/dist/{chunk-ALZ2CZ3T.js.map → chunk-CB6QPAO5.js.map} +1 -1
  22. package/dist/{chunk-NOWVA5CM.js → chunk-CZPBPMO2.js} +4 -4
  23. package/dist/{chunk-NOWVA5CM.js.map → chunk-CZPBPMO2.js.map} +1 -1
  24. package/dist/{chunk-ZT3EM4CE.js → chunk-IGER5FPC.js} +37 -11
  25. package/dist/chunk-IGER5FPC.js.map +1 -0
  26. package/dist/{chunk-7PHMT3T4.cjs → chunk-KDMHEWTD.cjs} +10 -10
  27. package/dist/{chunk-7PHMT3T4.cjs.map → chunk-KDMHEWTD.cjs.map} +1 -1
  28. package/dist/{chunk-P6EXRY5L.cjs → chunk-NPM5YZBC.cjs} +49 -49
  29. package/dist/{chunk-P6EXRY5L.cjs.map → chunk-NPM5YZBC.cjs.map} +1 -1
  30. package/dist/{chunk-SCSLCU66.js → chunk-S5PUFSXC.js} +8 -4
  31. package/dist/chunk-S5PUFSXC.js.map +1 -0
  32. package/dist/{chunk-MK5EPTTB.cjs → chunk-U5I3ITV7.cjs} +643 -485
  33. package/dist/chunk-U5I3ITV7.cjs.map +1 -0
  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-D-gEEqrP.d.cts → delegate-BJp8f6LT.d.cts} +1 -1
  39. package/dist/{delegate-CKJdsC99.d.ts → delegate-Ckz_TWzM.d.ts} +1 -1
  40. package/dist/{hdWalletCapable-CwLPmWct.d.cts → hdWalletCapable-DA9bJ5eB.d.cts} +2 -2
  41. package/dist/{hdWalletCapable-BJ4pvkai.d.ts → hdWalletCapable-DABgAD-T.d.ts} +2 -2
  42. package/dist/{index-Boppyqav.d.ts → index-B8xrELXY.d.ts} +2 -2
  43. package/dist/{index-BE1uFXrV.d.cts → index-DSbDm0Io.d.cts} +2 -2
  44. package/dist/{index-CyGnhCSS.d.ts → index-Dg0-TvBQ.d.cts} +51 -3
  45. package/dist/{index-CyGnhCSS.d.cts → index-Dg0-TvBQ.d.ts} +51 -3
  46. package/dist/index.cjs +306 -298
  47. package/dist/index.d.cts +54 -10
  48. package/dist/index.d.ts +54 -10
  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-CjmMH_rW.d.cts → taskRunner-BH_FxaNI.d.cts} +2 -2
  59. package/dist/{taskRunner-l3zyfW_Q.d.ts → taskRunner-DrVz2QZs.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-2ZX4Z2IP.js.map +0 -1
  74. package/dist/chunk-5J5PDZRR.cjs.map +0 -1
  75. package/dist/chunk-E5JNYFOF.js.map +0 -1
  76. package/dist/chunk-FM263GKH.cjs.map +0 -1
  77. package/dist/chunk-I7ZNWBBU.cjs.map +0 -1
  78. package/dist/chunk-MK5EPTTB.cjs.map +0 -1
  79. package/dist/chunk-SCSLCU66.js.map +0 -1
  80. package/dist/chunk-ZT3EM4CE.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkFM263GKH_cjs = require('./chunk-FM263GKH.cjs');
4
- var chunkP6EXRY5L_cjs = require('./chunk-P6EXRY5L.cjs');
5
- var chunk5J5PDZRR_cjs = require('./chunk-5J5PDZRR.cjs');
3
+ var chunk4C5PMGBB_cjs = require('./chunk-4C5PMGBB.cjs');
4
+ var chunkNPM5YZBC_cjs = require('./chunk-NPM5YZBC.cjs');
5
+ var chunk6FTHFJAN_cjs = require('./chunk-6FTHFJAN.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 = chunk5J5PDZRR_cjs.getArkPsbtFields(tx.root, 0, chunk5J5PDZRR_cjs.CosignerPublicKey).map(
191
+ const cosigners = chunk6FTHFJAN_cjs.getArkPsbtFields(tx.root, 0, chunk6FTHFJAN_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 = chunk5J5PDZRR_cjs.getArkPsbtFields(g.root, 0, chunk5J5PDZRR_cjs.CosignerPublicKey).map((c) => c.key);
243
+ const cosigners = chunk6FTHFJAN_cjs.getArkPsbtFields(g.root, 0, chunk6FTHFJAN_cjs.CosignerPublicKey).map((c) => c.key);
244
244
  const { finalKey } = aggregateKeys(cosigners, true, {
245
245
  taprootTweak: this.scriptRoot
246
246
  });
@@ -323,7 +323,7 @@ var SingleKey = class _SingleKey {
323
323
  async sign(tx, inputIndexes) {
324
324
  const txCpy = tx.clone();
325
325
  if (!inputIndexes) {
326
- chunk5J5PDZRR_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH);
326
+ chunk6FTHFJAN_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH);
327
327
  try {
328
328
  if (!txCpy.sign(this.key, ALLOWED_SIGHASH)) {
329
329
  throw new Error("Failed to sign transaction");
@@ -432,7 +432,7 @@ var SeedIdentity = class _SeedIdentity {
432
432
  let network;
433
433
  if ("descriptor" in opts && typeof opts.descriptor === "string") {
434
434
  descriptor = opts.descriptor;
435
- network = chunkP6EXRY5L_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
435
+ network = chunkNPM5YZBC_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
436
436
  } else {
437
437
  network = opts.isMainnet ?? true ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
438
438
  descriptor = descriptorsScure.scriptExpressions.trBIP32({
@@ -530,7 +530,7 @@ var SeedIdentity = class _SeedIdentity {
530
530
  * `StaticDescriptorProvider` for legacy single-key wallets.
531
531
  */
532
532
  isOurs(descriptor) {
533
- return chunkP6EXRY5L_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
533
+ return chunkNPM5YZBC_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
534
534
  }
535
535
  /**
536
536
  * Signs each request with the key derived from its descriptor.
@@ -579,7 +579,7 @@ var SeedIdentity = class _SeedIdentity {
579
579
  }
580
580
  // ── internal helpers ─────────────────────────────────────────────
581
581
  derivePrivateKeyForDescriptor(descriptor) {
582
- const network = chunkP6EXRY5L_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
582
+ const network = chunkNPM5YZBC_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
583
583
  const expansion = descriptorsScure.expand({ descriptor, network });
584
584
  if (expansion.isRanged) {
585
585
  throw new Error(
@@ -604,7 +604,7 @@ var SeedIdentity = class _SeedIdentity {
604
604
  signTxWithKey(tx, key, inputIndexes) {
605
605
  const txCpy = tx.clone();
606
606
  if (!inputIndexes) {
607
- chunk5J5PDZRR_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH2);
607
+ chunk6FTHFJAN_cjs.assertAllowedSighashTypes(txCpy, ALLOWED_SIGHASH2);
608
608
  try {
609
609
  if (!txCpy.sign(key, ALLOWED_SIGHASH2)) {
610
610
  throw new Error("Failed to sign transaction");
@@ -666,7 +666,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
666
666
  */
667
667
  descriptor;
668
668
  constructor(descriptor) {
669
- const network = chunkP6EXRY5L_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
669
+ const network = chunkNPM5YZBC_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
670
670
  let expansion;
671
671
  try {
672
672
  expansion = descriptorsScure.expand({ descriptor, network, index: 0 });
@@ -716,7 +716,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
716
716
  * `StaticDescriptorProvider` for legacy single-key wallets.
717
717
  */
718
718
  isOurs(descriptor) {
719
- return chunkP6EXRY5L_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
719
+ return chunkNPM5YZBC_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
720
720
  }
721
721
  };
722
722
  function serializeSeedOwnedSigningIdentity(identity) {
@@ -878,10 +878,10 @@ var DescriptorIdentity = class {
878
878
  this.base = base;
879
879
  }
880
880
  async xOnlyPublicKey() {
881
- return chunkP6EXRY5L_cjs.deriveDescriptorLeafPubKey(this.descriptor);
881
+ return chunkNPM5YZBC_cjs.deriveDescriptorLeafPubKey(this.descriptor);
882
882
  }
883
883
  async compressedPublicKey() {
884
- return chunkP6EXRY5L_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
884
+ return chunkNPM5YZBC_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
885
885
  }
886
886
  async sign(tx, inputIndexes) {
887
887
  const [signed] = await this.signer.signWithDescriptor([
@@ -949,12 +949,12 @@ var WalletCannotAllocateAddressError = class extends Error {
949
949
  };
950
950
  async function resolveDescriptorSigner(descriptor, identity, provider) {
951
951
  const owner = provider?.isOurs(descriptor) ? provider : isHDCapableIdentity(identity) && identity.isOurs(descriptor) ? identity : void 0;
952
- if (owner && chunkP6EXRY5L_cjs.parseHDDescriptor(descriptor)) {
952
+ if (owner && chunkNPM5YZBC_cjs.parseHDDescriptor(descriptor)) {
953
953
  return new DescriptorIdentity({ descriptor, signer: owner, base: identity });
954
954
  }
955
955
  let key;
956
956
  try {
957
- key = chunkP6EXRY5L_cjs.deriveDescriptorLeafPubKey(descriptor);
957
+ key = chunkNPM5YZBC_cjs.deriveDescriptorLeafPubKey(descriptor);
958
958
  } catch {
959
959
  throw new ForeignDescriptorError(descriptor);
960
960
  }
@@ -1329,14 +1329,14 @@ function buildSaltedPreimageMessage(xonly, salt) {
1329
1329
  }
1330
1330
  var PREIMAGE_INDEX = 0;
1331
1331
  function isPerArtifactDescriptor(descriptor) {
1332
- return chunkP6EXRY5L_cjs.parseHDDescriptor(descriptor) !== null;
1332
+ return chunkNPM5YZBC_cjs.parseHDDescriptor(descriptor) !== null;
1333
1333
  }
1334
1334
  async function provisionDescriptor(wallet) {
1335
1335
  const allocated = isHDAllocationCapable(wallet) ? await wallet.getNextSigningDescriptor() : void 0;
1336
- return allocated ?? await chunkP6EXRY5L_cjs.identityDescriptor(wallet.identity);
1336
+ return allocated ?? await chunkNPM5YZBC_cjs.identityDescriptor(wallet.identity);
1337
1337
  }
1338
1338
  async function provisionRefundKey(wallet) {
1339
- const descriptor = await chunkP6EXRY5L_cjs.identityDescriptor(wallet.identity);
1339
+ const descriptor = await chunkNPM5YZBC_cjs.identityDescriptor(wallet.identity);
1340
1340
  const signer = await contractSigner(wallet, descriptor);
1341
1341
  const pubkey = await signer.xOnlyPublicKey();
1342
1342
  const identityPubkey = await wallet.identity.xOnlyPublicKey();
@@ -1346,7 +1346,7 @@ async function provisionRefundKey(wallet) {
1346
1346
  );
1347
1347
  }
1348
1348
  const address = await wallet.getAddress();
1349
- const { pkScript } = chunk5J5PDZRR_cjs.ArkAddress.decode(address);
1349
+ const { pkScript } = chunk6FTHFJAN_cjs.ArkAddress.decode(address);
1350
1350
  return { descriptor, pubkey, pkScript, address };
1351
1351
  }
1352
1352
  async function provisionClaimSecret(wallet, opts = {}) {
@@ -1392,7 +1392,7 @@ async function contractSigner(wallet, descriptor) {
1392
1392
  const signer = isHDWalletCapable(wallet) ? await wallet.signerForDescriptor(descriptor) : wallet.identity;
1393
1393
  let expected;
1394
1394
  try {
1395
- expected = chunkP6EXRY5L_cjs.deriveDescriptorLeafPubKey(descriptor);
1395
+ expected = chunkNPM5YZBC_cjs.deriveDescriptorLeafPubKey(descriptor);
1396
1396
  } catch (cause) {
1397
1397
  throw new ForeignDescriptorError(descriptor, { cause });
1398
1398
  }
@@ -1611,14 +1611,14 @@ var RestDelegateProvider = class {
1611
1611
  */
1612
1612
  async delegate(intent, forfeitTxs, options) {
1613
1613
  const url = `${this.url}/v1/delegate`;
1614
- const response = await chunk5J5PDZRR_cjs.baseFetch(url, {
1614
+ const response = await chunk6FTHFJAN_cjs.baseFetch(url, {
1615
1615
  method: "POST",
1616
1616
  headers: {
1617
1617
  "Content-Type": "application/json"
1618
1618
  },
1619
1619
  body: JSON.stringify({
1620
1620
  intent: {
1621
- message: chunk5J5PDZRR_cjs.Intent.encodeMessage(intent.message),
1621
+ message: chunk6FTHFJAN_cjs.Intent.encodeMessage(intent.message),
1622
1622
  proof: intent.proof
1623
1623
  },
1624
1624
  forfeit_txs: forfeitTxs,
@@ -1638,7 +1638,7 @@ var RestDelegateProvider = class {
1638
1638
  */
1639
1639
  async getDelegateInfo() {
1640
1640
  const url = `${this.url}/v1/delegator/info`;
1641
- const response = await chunk5J5PDZRR_cjs.rateGate.runHttp(url, () => chunk5J5PDZRR_cjs.baseFetch(url));
1641
+ const response = await chunk6FTHFJAN_cjs.rateGate.runHttp(url, () => chunk6FTHFJAN_cjs.baseFetch(url));
1642
1642
  if (!response.ok) {
1643
1643
  const errorText2 = await response.text();
1644
1644
  throw new Error(`Failed to get delegate info: ${errorText2}`);
@@ -1663,7 +1663,7 @@ var ESPLORA_URL = {
1663
1663
  regtest: "http://localhost:3000/api"
1664
1664
  };
1665
1665
  var EsploraProvider = class {
1666
- constructor(baseUrl = ESPLORA_URL[chunk5J5PDZRR_cjs.DEFAULT_NETWORK_NAME], opts) {
1666
+ constructor(baseUrl = ESPLORA_URL[chunk6FTHFJAN_cjs.DEFAULT_NETWORK_NAME], opts) {
1667
1667
  this.baseUrl = baseUrl;
1668
1668
  this.pollingInterval = opts?.pollingInterval ?? 15e3;
1669
1669
  this.forcePolling = opts?.forcePolling ?? false;
@@ -1682,14 +1682,14 @@ var EsploraProvider = class {
1682
1682
  */
1683
1683
  addressWatches = /* @__PURE__ */ new Map();
1684
1684
  async getCoins(address) {
1685
- const response = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1685
+ const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1686
1686
  if (!response.ok) {
1687
1687
  throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
1688
1688
  }
1689
1689
  return response.json();
1690
1690
  }
1691
1691
  async getFeeRate() {
1692
- const response = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
1692
+ const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
1693
1693
  if (response.status === 404) {
1694
1694
  return void 0;
1695
1695
  }
@@ -1710,7 +1710,7 @@ var EsploraProvider = class {
1710
1710
  }
1711
1711
  }
1712
1712
  async getTxOutspends(txid) {
1713
- const response = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1713
+ const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1714
1714
  if (!response.ok) {
1715
1715
  const error = await response.text();
1716
1716
  throw new Error(`Failed to get transaction outspends: ${error}`);
@@ -1718,7 +1718,7 @@ var EsploraProvider = class {
1718
1718
  return response.json();
1719
1719
  }
1720
1720
  async getTransactions(address) {
1721
- const response = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1721
+ const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1722
1722
  if (!response.ok) {
1723
1723
  const error = await response.text();
1724
1724
  throw new Error(`Failed to get transactions: ${error}`);
@@ -1731,14 +1731,14 @@ var EsploraProvider = class {
1731
1731
  * usable as a change probe for the polling fallback.
1732
1732
  */
1733
1733
  async getAddressStats(address) {
1734
- const response = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/address/${address}`);
1734
+ const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/address/${address}`);
1735
1735
  if (!response.ok) {
1736
1736
  throw new Error(`Failed to get address stats: ${response.statusText}`);
1737
1737
  }
1738
1738
  return response.json();
1739
1739
  }
1740
1740
  async getRawTransaction(txid) {
1741
- const response = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
1741
+ const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/hex`);
1742
1742
  if (!response.ok) {
1743
1743
  const error = await response.text();
1744
1744
  throw new Error(`Failed to get raw transaction ${txid}: ${error}`);
@@ -1746,7 +1746,7 @@ var EsploraProvider = class {
1746
1746
  return base.hex.decode((await response.text()).trim());
1747
1747
  }
1748
1748
  async getTxStatus(txid) {
1749
- const txresponse = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1749
+ const txresponse = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1750
1750
  if (!txresponse.ok) {
1751
1751
  throw new Error(txresponse.statusText);
1752
1752
  }
@@ -1754,7 +1754,7 @@ var EsploraProvider = class {
1754
1754
  if (!tx.status.confirmed) {
1755
1755
  return { confirmed: false };
1756
1756
  }
1757
- const response = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1757
+ const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1758
1758
  if (!response.ok) {
1759
1759
  throw new Error(`Failed to get transaction status: ${response.statusText}`);
1760
1760
  }
@@ -2038,9 +2038,9 @@ var EsploraProvider = class {
2038
2038
  return { subscribers, teardown, started };
2039
2039
  }
2040
2040
  async getChainTip() {
2041
- let tipBlocks = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/blocks`);
2041
+ let tipBlocks = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/blocks`);
2042
2042
  if (tipBlocks.status === 404) {
2043
- tipBlocks = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/v1/blocks`);
2043
+ tipBlocks = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/v1/blocks`);
2044
2044
  }
2045
2045
  if (!tipBlocks.ok) {
2046
2046
  throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
@@ -2062,7 +2062,7 @@ var EsploraProvider = class {
2062
2062
  };
2063
2063
  }
2064
2064
  async broadcastPackage(parent, child) {
2065
- const response = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
2065
+ const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
2066
2066
  method: "POST",
2067
2067
  headers: {
2068
2068
  "Content-Type": "application/json"
@@ -2078,7 +2078,7 @@ var EsploraProvider = class {
2078
2078
  return result;
2079
2079
  }
2080
2080
  async broadcastTx(tx) {
2081
- const response = await chunk5J5PDZRR_cjs.baseFetch(`${this.baseUrl}/tx`, {
2081
+ const response = await chunk6FTHFJAN_cjs.baseFetch(`${this.baseUrl}/tx`, {
2082
2082
  method: "POST",
2083
2083
  headers: {
2084
2084
  "Content-Type": "text/plain"
@@ -2261,7 +2261,7 @@ function findP2AOutput(tx) {
2261
2261
  var CHILD_DUST_AMOUNT = 546;
2262
2262
  function buildAnchorChild(params) {
2263
2263
  const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
2264
- const child = new chunk5J5PDZRR_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
2264
+ const child = new chunk6FTHFJAN_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
2265
2265
  child.addInput(findP2AOutput(parent));
2266
2266
  const estimator = TxWeightEstimator.create().addP2AInput();
2267
2267
  for (const _ of fundingCoins) {
@@ -2309,7 +2309,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
2309
2309
  );
2310
2310
  }
2311
2311
  function buildForfeitTxWithOutput(inputs, output, txLocktime) {
2312
- const tx = new chunk5J5PDZRR_cjs.Transaction({
2312
+ const tx = new chunk6FTHFJAN_cjs.Transaction({
2313
2313
  version: 3,
2314
2314
  lockTime: txLocktime
2315
2315
  });
@@ -2385,7 +2385,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
2385
2385
  if (previousScriptKey.length !== 32) {
2386
2386
  throw new Error(`parent output ${childIndex} has invalid script`);
2387
2387
  }
2388
- const cosigners = chunk5J5PDZRR_cjs.getArkPsbtFields(child.root, 0, chunk5J5PDZRR_cjs.CosignerPublicKey);
2388
+ const cosigners = chunk6FTHFJAN_cjs.getArkPsbtFields(child.root, 0, chunk6FTHFJAN_cjs.CosignerPublicKey);
2389
2389
  if (cosigners.length === 0) {
2390
2390
  throw ErrMissingCosignersPublicKeys;
2391
2391
  }
@@ -2443,7 +2443,7 @@ var EmulatorPacket = class _EmulatorPacket {
2443
2443
  return new _EmulatorPacket(entries);
2444
2444
  }
2445
2445
  static fromBytes(data) {
2446
- const reader = new chunkFM263GKH_cjs.BufferReader(data);
2446
+ const reader = new chunk4C5PMGBB_cjs.BufferReader(data);
2447
2447
  const entryCount = reader.readCompactSize();
2448
2448
  const entries = [];
2449
2449
  for (let i = 0; i < entryCount; i++) {
@@ -2461,7 +2461,7 @@ var EmulatorPacket = class _EmulatorPacket {
2461
2461
  return _EmulatorPacket.PACKET_TYPE;
2462
2462
  }
2463
2463
  serialize() {
2464
- const writer = new chunkFM263GKH_cjs.BufferWriter();
2464
+ const writer = new chunk4C5PMGBB_cjs.BufferWriter();
2465
2465
  writer.writeCompactSize(this.entries.length);
2466
2466
  for (const entry of this.entries) {
2467
2467
  writer.writeUint16LE(entry.vin);
@@ -2548,7 +2548,7 @@ var Extension = class _Extension {
2548
2548
  `expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
2549
2549
  );
2550
2550
  }
2551
- const reader = new chunkFM263GKH_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
2551
+ const reader = new chunk4C5PMGBB_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
2552
2552
  const packets = [];
2553
2553
  while (reader.remaining() > 0) {
2554
2554
  const packetType = reader.readByte();
@@ -2622,7 +2622,7 @@ var Extension = class _Extension {
2622
2622
  */
2623
2623
  getAssetPacket() {
2624
2624
  for (const p of this.packets) {
2625
- if (p instanceof chunkFM263GKH_cjs.Packet) {
2625
+ if (p instanceof chunk4C5PMGBB_cjs.Packet) {
2626
2626
  return p;
2627
2627
  }
2628
2628
  }
@@ -2660,8 +2660,8 @@ var Extension = class _Extension {
2660
2660
  };
2661
2661
  function parsePacket(packetType, data) {
2662
2662
  switch (packetType) {
2663
- case chunkFM263GKH_cjs.Packet.PACKET_TYPE:
2664
- return chunkFM263GKH_cjs.Packet.fromBytes(data);
2663
+ case chunk4C5PMGBB_cjs.Packet.PACKET_TYPE:
2664
+ return chunk4C5PMGBB_cjs.Packet.fromBytes(data);
2665
2665
  case EmulatorPacket.PACKET_TYPE:
2666
2666
  return EmulatorPacket.fromBytes(data);
2667
2667
  default:
@@ -2708,16 +2708,16 @@ function buildOpReturnScript(data) {
2708
2708
  }
2709
2709
  return script;
2710
2710
  }
2711
- var ErrOffchainOutputNotFound = (address) => new chunk5J5PDZRR_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
2712
- var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
2711
+ var ErrOffchainOutputNotFound = (address) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
2712
+ var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
2713
2713
  `invalid asset output amount for ${assetId}: got ${got}, want ${want}`
2714
2714
  );
2715
- var ErrAssetGroupNotFound = (assetId) => new chunk5J5PDZRR_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
2716
- var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
2715
+ var ErrAssetGroupNotFound = (assetId) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
2716
+ var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
2717
2717
  `asset output not found in asset group ${assetId} at index ${outputIndex}`
2718
2718
  );
2719
- var ErrOnchainOutputNotFound = (address) => new chunk5J5PDZRR_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
2720
- var ErrUnvalidatedOffchainOutput = (address) => new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
2719
+ var ErrOnchainOutputNotFound = (address) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
2720
+ var ErrUnvalidatedOffchainOutput = (address) => new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
2721
2721
  `offchain output ${address} cannot be validated: virtual output tree signing did not run`
2722
2722
  );
2723
2723
  var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
@@ -2726,7 +2726,7 @@ var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain ou
2726
2726
  function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
2727
2727
  if (!validatedCommitmentTxid) return;
2728
2728
  if (finalCommitmentTx.id === validatedCommitmentTxid) return;
2729
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
2729
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
2730
2730
  `${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
2731
2731
  );
2732
2732
  }
@@ -2736,7 +2736,7 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
2736
2736
  for (const recipient of recipients) {
2737
2737
  let arkAddress;
2738
2738
  try {
2739
- arkAddress = chunk5J5PDZRR_cjs.ArkAddress.decode(recipient.address);
2739
+ arkAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(recipient.address);
2740
2740
  } catch {
2741
2741
  validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
2742
2742
  continue;
@@ -2748,7 +2748,7 @@ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
2748
2748
  const usedOnchainOutputs = /* @__PURE__ */ new Set();
2749
2749
  for (const recipient of recipients) {
2750
2750
  try {
2751
- chunk5J5PDZRR_cjs.ArkAddress.decode(recipient.address);
2751
+ chunk6FTHFJAN_cjs.ArkAddress.decode(recipient.address);
2752
2752
  } catch {
2753
2753
  validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
2754
2754
  continue;
@@ -2981,7 +2981,7 @@ function assetMintResolver() {
2981
2981
  if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
2982
2982
  const minted = tx.assets.filter((a) => {
2983
2983
  try {
2984
- return base.hex.encode(chunkFM263GKH_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
2984
+ return base.hex.encode(chunk4C5PMGBB_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
2985
2985
  } catch {
2986
2986
  return false;
2987
2987
  }
@@ -3005,6 +3005,39 @@ function createDefaultActivityRegistry() {
3005
3005
  return registry;
3006
3006
  }
3007
3007
 
3008
+ // src/wallet/restoreHooks.ts
3009
+ var restoreHooks = /* @__PURE__ */ new WeakMap();
3010
+ function registerWalletRestoreHook(wallet, hook) {
3011
+ const hooks = restoreHooks.get(wallet) ?? [];
3012
+ const entry = { ...hook };
3013
+ const existing = hooks.findIndex(({ id }) => id === hook.id);
3014
+ if (existing === -1) hooks.push(entry);
3015
+ else hooks[existing] = entry;
3016
+ restoreHooks.set(wallet, hooks);
3017
+ return () => {
3018
+ const current = restoreHooks.get(wallet);
3019
+ if (!current) return;
3020
+ const index = current.indexOf(entry);
3021
+ if (index === -1) return;
3022
+ current.splice(index, 1);
3023
+ if (current.length === 0) restoreHooks.delete(wallet);
3024
+ };
3025
+ }
3026
+ async function runWalletRestoreHooks(wallet) {
3027
+ const snapshot = [...restoreHooks.get(wallet) ?? []];
3028
+ const errors = [];
3029
+ for (const hook of snapshot) {
3030
+ try {
3031
+ await hook.restore(wallet);
3032
+ } catch (error) {
3033
+ errors.push(error);
3034
+ }
3035
+ }
3036
+ if (errors.length > 0) {
3037
+ throw new AggregateError(errors, "Wallet restore hooks failed");
3038
+ }
3039
+ }
3040
+
3008
3041
  // src/wallet/index.ts
3009
3042
  var TxType = /* @__PURE__ */ ((TxType2) => {
3010
3043
  TxType2["TxSent"] = "SENT";
@@ -3024,7 +3057,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
3024
3057
  const existing = inputsByAssetId.get(asset.assetId);
3025
3058
  inputsByAssetId.set(asset.assetId, [
3026
3059
  ...existing ?? [],
3027
- chunkFM263GKH_cjs.AssetInput.create(inputIndex, asset.amount)
3060
+ chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount)
3028
3061
  ]);
3029
3062
  }
3030
3063
  }
@@ -3036,7 +3069,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
3036
3069
  const existing = outputsByAssetId.get(asset.assetId);
3037
3070
  outputsByAssetId.set(asset.assetId, [
3038
3071
  ...existing ?? [],
3039
- chunkFM263GKH_cjs.AssetOutput.create(outputIndex, asset.amount)
3072
+ chunk4C5PMGBB_cjs.AssetOutput.create(outputIndex, asset.amount)
3040
3073
  ]);
3041
3074
  }
3042
3075
  }
@@ -3047,7 +3080,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
3047
3080
  const existing = outputsByAssetId.get(asset.assetId);
3048
3081
  outputsByAssetId.set(asset.assetId, [
3049
3082
  ...existing ?? [],
3050
- chunkFM263GKH_cjs.AssetOutput.create(outputIndex, asset.amount)
3083
+ chunk4C5PMGBB_cjs.AssetOutput.create(outputIndex, asset.amount)
3051
3084
  ]);
3052
3085
  }
3053
3086
  }
@@ -3056,11 +3089,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
3056
3089
  for (const assetIdStr of allAssetIds) {
3057
3090
  const inputs = inputsByAssetId.get(assetIdStr);
3058
3091
  const outputs = outputsByAssetId.get(assetIdStr);
3059
- const assetId = chunkFM263GKH_cjs.AssetId.fromString(assetIdStr);
3060
- const group = chunkFM263GKH_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
3092
+ const assetId = chunk4C5PMGBB_cjs.AssetId.fromString(assetIdStr);
3093
+ const group = chunk4C5PMGBB_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
3061
3094
  groups.push(group);
3062
3095
  }
3063
- return chunkFM263GKH_cjs.Packet.create(groups);
3096
+ return chunk4C5PMGBB_cjs.Packet.create(groups);
3064
3097
  }
3065
3098
  function selectCoinsWithAsset(coins, assetId, requiredAmount) {
3066
3099
  const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
@@ -3097,7 +3130,7 @@ function selectedCoinsToAssetInputs(selectedCoins) {
3097
3130
  }
3098
3131
  function toXOnlySignerHex(pubkeyHex) {
3099
3132
  const bytes = base.hex.decode(pubkeyHex);
3100
- if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunkP6EXRY5L_cjs.toXOnly(bytes, "signer key"));
3133
+ if (bytes.length === 32 || bytes.length === 33) return base.hex.encode(chunkNPM5YZBC_cjs.toXOnly(bytes, "signer key"));
3101
3134
  throw new Error(`invalid signer pubkey length: expected 32 or 33 bytes, got ${bytes.length}`);
3102
3135
  }
3103
3136
  function signerSetFromInfo(info) {
@@ -3144,13 +3177,13 @@ var toTimelock = (value) => ({
3144
3177
  var toSeconds = (t) => t.type === "seconds" ? t.value : t.value * NOMINAL_BLOCK_SECONDS;
3145
3178
  function assertTimelockInPolicy(timelock, policy, label, overrideOption) {
3146
3179
  if (policy.requireSeconds && timelock.type === "blocks") {
3147
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3180
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3148
3181
  `${label} rejected: block-typed timelocks are not accepted (got ${timelock.value})`
3149
3182
  );
3150
3183
  }
3151
3184
  const seconds = toSeconds(timelock);
3152
3185
  if (seconds < policy.minSeconds) {
3153
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3186
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3154
3187
  `${label} rejected: ${timelock.value} ${timelock.type} is below the ${policy.minSeconds}s floor; pass ${overrideOption}: ${seconds}n to Wallet.create to lower it`
3155
3188
  );
3156
3189
  }
@@ -3171,7 +3204,7 @@ function resolveBatchExpiryPolicy(network, overrides) {
3171
3204
  }
3172
3205
  function assertValidBatchExpiry(batchExpiry, policy) {
3173
3206
  if (policy.advertisedVtxoTreeExpiry !== void 0 && batchExpiry !== policy.advertisedVtxoTreeExpiry) {
3174
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3207
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3175
3208
  `batch expiry rejected: ${batchExpiry} does not match the advertised vtxoTreeExpiry ${policy.advertisedVtxoTreeExpiry}`
3176
3209
  );
3177
3210
  }
@@ -3201,21 +3234,21 @@ function resolveCheckpointExitDelayPolicy(network, overrides) {
3201
3234
  function assertValidServerUnrollScript(checkpointTapscript, policy) {
3202
3235
  let script;
3203
3236
  try {
3204
- script = chunk5J5PDZRR_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
3237
+ script = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
3205
3238
  } catch (e) {
3206
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3239
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3207
3240
  `checkpoint exit delay rejected: invalid checkpointTapscript from server (${e instanceof Error ? e.message : String(e)})`
3208
3241
  );
3209
3242
  }
3210
3243
  if (policy.advertisedForfeitPubkey !== void 0) {
3211
3244
  const { pubkeys } = script.params;
3212
3245
  if (pubkeys.length !== 1) {
3213
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3246
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3214
3247
  `checkpoint exit delay rejected: checkpointTapscript must commit to exactly one pubkey, got ${pubkeys.length} [${pubkeys.map(base.hex.encode).join(", ")}]`
3215
3248
  );
3216
3249
  }
3217
3250
  if (!utils_js.equalBytes(pubkeys[0], policy.advertisedForfeitPubkey)) {
3218
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3251
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3219
3252
  `checkpoint exit delay rejected: checkpointTapscript pubkey ${base.hex.encode(pubkeys[0])} does not match the advertised forfeitPubkey ${base.hex.encode(policy.advertisedForfeitPubkey)}`
3220
3253
  );
3221
3254
  }
@@ -3259,8 +3292,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
3259
3292
  function buildVirtualTx(inputs, outputs) {
3260
3293
  let lockTime = 0n;
3261
3294
  for (const input of inputs) {
3262
- const tapscript = chunk5J5PDZRR_cjs.decodeTapscript(chunk5J5PDZRR_cjs.scriptFromTapLeafScript(input.tapLeafScript));
3263
- if (chunk5J5PDZRR_cjs.CLTVMultisigTapscript.is(tapscript)) {
3295
+ const tapscript = chunk6FTHFJAN_cjs.decodeTapscript(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(input.tapLeafScript));
3296
+ if (chunk6FTHFJAN_cjs.CLTVMultisigTapscript.is(tapscript)) {
3264
3297
  if (lockTime !== 0n) {
3265
3298
  if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
3266
3299
  throw new Error("cannot mix seconds and blocks locktime");
@@ -3271,7 +3304,7 @@ function buildVirtualTx(inputs, outputs) {
3271
3304
  }
3272
3305
  }
3273
3306
  }
3274
- const tx = new chunk5J5PDZRR_cjs.Transaction({
3307
+ const tx = new chunk6FTHFJAN_cjs.Transaction({
3275
3308
  version: 3,
3276
3309
  lockTime: Number(lockTime)
3277
3310
  });
@@ -3281,12 +3314,12 @@ function buildVirtualTx(inputs, outputs) {
3281
3314
  index: input.vout,
3282
3315
  sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
3283
3316
  witnessUtxo: {
3284
- script: chunk5J5PDZRR_cjs.VtxoScript.decode(input.tapTree).pkScript,
3317
+ script: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript,
3285
3318
  amount: BigInt(input.value)
3286
3319
  },
3287
3320
  tapLeafScript: [input.tapLeafScript]
3288
3321
  });
3289
- chunk5J5PDZRR_cjs.setArkPsbtField(tx, i, chunk5J5PDZRR_cjs.VtxoTaprootTree, input.tapTree);
3322
+ chunk6FTHFJAN_cjs.setArkPsbtField(tx, i, chunk6FTHFJAN_cjs.VtxoTaprootTree, input.tapTree);
3290
3323
  }
3291
3324
  for (const output of outputs) {
3292
3325
  tx.addOutput(output);
@@ -3295,8 +3328,8 @@ function buildVirtualTx(inputs, outputs) {
3295
3328
  return tx;
3296
3329
  }
3297
3330
  function buildCheckpointTx(vtxo, serverUnrollScript) {
3298
- const collaborativeClosure = chunk5J5PDZRR_cjs.decodeTapscript(chunk5J5PDZRR_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
3299
- const checkpointVtxoScript = new chunk5J5PDZRR_cjs.VtxoScript([
3331
+ const collaborativeClosure = chunk6FTHFJAN_cjs.decodeTapscript(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
3332
+ const checkpointVtxoScript = new chunk6FTHFJAN_cjs.VtxoScript([
3300
3333
  serverUnrollScript.script,
3301
3334
  collaborativeClosure.script
3302
3335
  ]);
@@ -3372,7 +3405,7 @@ function verifyTapscriptSignatures(tx, inputIndex, requiredSigners, excludePubke
3372
3405
  const sighashType = signature.length === 65 ? signature[64] : btcSigner.SigHash.DEFAULT;
3373
3406
  const sig = signature.subarray(0, 64);
3374
3407
  if (!allowedSighashTypes.includes(sighashType)) {
3375
- const sighashName = chunk5J5PDZRR_cjs.formatSighash(sighashType);
3408
+ const sighashName = chunk6FTHFJAN_cjs.formatSighash(sighashType);
3376
3409
  throw new Error(
3377
3410
  `Unallowed sighash type ${sighashName} for input ${inputIndex}, pubkey ${pubKeyHex}.`
3378
3411
  );
@@ -3446,7 +3479,7 @@ function combineTapscriptSigs(signedTx, originalTx) {
3446
3479
  }
3447
3480
  function isValidArkAddress(address) {
3448
3481
  try {
3449
- chunk5J5PDZRR_cjs.ArkAddress.decode(address);
3482
+ chunk6FTHFJAN_cjs.ArkAddress.decode(address);
3450
3483
  return true;
3451
3484
  } catch (e) {
3452
3485
  return false;
@@ -3454,16 +3487,16 @@ function isValidArkAddress(address) {
3454
3487
  }
3455
3488
  function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
3456
3489
  if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
3457
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3490
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3458
3491
  `${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
3459
3492
  );
3460
3493
  }
3461
3494
  const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
3462
3495
  return serverCheckpointTxs.map((encoded, index) => {
3463
- const server = chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
3496
+ const server = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
3464
3497
  const local = byTxid.get(server.id);
3465
3498
  if (!local) {
3466
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3499
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3467
3500
  `${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
3468
3501
  );
3469
3502
  }
@@ -3473,14 +3506,14 @@ function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, contex
3473
3506
  }
3474
3507
  function assertSubmittedArkTxid(response, signedArkTx, context) {
3475
3508
  if (response.arkTxid !== signedArkTx.id) {
3476
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3509
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3477
3510
  `${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
3478
3511
  );
3479
3512
  }
3480
3513
  if (response.finalArkTx === void 0) return;
3481
- const finalTxid = chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
3514
+ const finalTxid = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
3482
3515
  if (finalTxid !== signedArkTx.id) {
3483
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3516
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3484
3517
  `${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
3485
3518
  );
3486
3519
  }
@@ -3499,10 +3532,10 @@ function assertServerSignedLeaf(serverTx, localTx, inputIndex, serverPubkeyHex,
3499
3532
  [serverPubkeyHex],
3500
3533
  void 0,
3501
3534
  void 0,
3502
- payment_js.tapLeafHash(chunk5J5PDZRR_cjs.scriptFromTapLeafScript(leaf))
3535
+ payment_js.tapLeafHash(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(leaf))
3503
3536
  );
3504
3537
  } catch (error) {
3505
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3538
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3506
3539
  `${context}: input ${inputIndex} is not signed by the server on the leaf being spent (${error instanceof Error ? error.message : String(error)})`
3507
3540
  );
3508
3541
  }
@@ -3511,20 +3544,20 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
3511
3544
  const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
3512
3545
  for (const [index, checkpoint] of checkpoints.entries()) {
3513
3546
  if (checkpoint.inputsLength !== 1) {
3514
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3547
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3515
3548
  `${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
3516
3549
  );
3517
3550
  }
3518
3551
  const spent = checkpoint.getInput(0);
3519
3552
  if (!spent.txid || spent.index === void 0) {
3520
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3553
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3521
3554
  `${context}: checkpoint ${index} has no input outpoint`
3522
3555
  );
3523
3556
  }
3524
3557
  const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
3525
3558
  const input = byOutpoint.get(outpoint);
3526
3559
  if (!input) {
3527
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3560
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3528
3561
  `${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
3529
3562
  );
3530
3563
  }
@@ -3532,7 +3565,7 @@ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, con
3532
3565
  (unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
3533
3566
  );
3534
3567
  if (!rebuilt) {
3535
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3568
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3536
3569
  `${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
3537
3570
  );
3538
3571
  }
@@ -3558,9 +3591,9 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
3558
3591
  const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
3559
3592
  matched.forEach(({ server }, index) => {
3560
3593
  try {
3561
- chunk5J5PDZRR_cjs.assertAllowedSighashTypes(server);
3594
+ chunk6FTHFJAN_cjs.assertAllowedSighashTypes(server);
3562
3595
  } catch (error) {
3563
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3596
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3564
3597
  `submitTx checkpoint ${index}: ${error instanceof Error ? error.message : String(error)}`
3565
3598
  );
3566
3599
  }
@@ -3568,12 +3601,12 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks, options) {
3568
3601
  const verify = options?.verifyServerSignatures;
3569
3602
  if (verify) {
3570
3603
  if (response.finalArkTx === void 0) {
3571
- throw new chunk5J5PDZRR_cjs.ServerResponseMismatchError(
3604
+ throw new chunk6FTHFJAN_cjs.ServerResponseMismatchError(
3572
3605
  "submitTx: server returned no final ark tx to verify its signatures against"
3573
3606
  );
3574
3607
  }
3575
- const finalArkTx = chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
3576
- const serverPubkeyHex = base.hex.encode(chunkP6EXRY5L_cjs.toXOnly(verify.serverPubkey, "server key"));
3608
+ const finalArkTx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx));
3609
+ const serverPubkeyHex = base.hex.encode(chunkNPM5YZBC_cjs.toXOnly(verify.serverPubkey, "server key"));
3577
3610
  for (let i = 0; i < offchainTx.arkTx.inputsLength; i++) {
3578
3611
  assertServerSignedLeaf(
3579
3612
  finalArkTx,
@@ -3629,12 +3662,12 @@ function claimWithPreimageIdentity(identity, preimage) {
3629
3662
  return {
3630
3663
  ...identity,
3631
3664
  sign: async (tx, inputIndexes) => {
3632
- const signed = chunk5J5PDZRR_cjs.Transaction.fromPSBT(
3665
+ const signed = chunk6FTHFJAN_cjs.Transaction.fromPSBT(
3633
3666
  (await identity.sign(tx.clone(), inputIndexes)).toPSBT()
3634
3667
  );
3635
3668
  const indexes = inputIndexes ?? Array.from({ length: signed.inputsLength }, (_, i) => i);
3636
3669
  for (const index of indexes) {
3637
- chunk5J5PDZRR_cjs.setArkPsbtField(signed, index, chunk5J5PDZRR_cjs.ConditionWitness, [preimage]);
3670
+ chunk6FTHFJAN_cjs.setArkPsbtField(signed, index, chunk6FTHFJAN_cjs.ConditionWitness, [preimage]);
3638
3671
  }
3639
3672
  return signed;
3640
3673
  }
@@ -3829,7 +3862,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
3829
3862
  };
3830
3863
  }
3831
3864
  function deriveContractTapscripts(contract) {
3832
- const handler = chunkP6EXRY5L_cjs.contractHandlers.get(contract.type);
3865
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
3833
3866
  if (!handler) {
3834
3867
  throw new Error(`No handler for contract type '${contract.type}'`);
3835
3868
  }
@@ -3900,7 +3933,7 @@ function getRandomId() {
3900
3933
  }
3901
3934
  function isValidArkAddress2(address) {
3902
3935
  try {
3903
- chunk5J5PDZRR_cjs.ArkAddress.decode(address);
3936
+ chunk6FTHFJAN_cjs.ArkAddress.decode(address);
3904
3937
  return true;
3905
3938
  } catch (e) {
3906
3939
  return false;
@@ -3928,7 +3961,7 @@ function assertRecipientArkAddress(encoded, address, context) {
3928
3961
  function assertTapTreeDerivesAddress(encoded, tapTree, address) {
3929
3962
  let derived;
3930
3963
  try {
3931
- derived = chunk5J5PDZRR_cjs.VtxoScript.decode(tapTree).pkScript;
3964
+ derived = chunk6FTHFJAN_cjs.VtxoScript.decode(tapTree).pkScript;
3932
3965
  } catch (e) {
3933
3966
  throw new Error(
3934
3967
  `Invalid tapTree for ${encoded}: ${e instanceof Error ? e.message : String(e)}`
@@ -3945,7 +3978,7 @@ function validateRecipients(recipients, dustAmount, context) {
3945
3978
  for (const recipient of recipients) {
3946
3979
  let address;
3947
3980
  try {
3948
- address = chunk5J5PDZRR_cjs.ArkAddress.decode(recipient.address);
3981
+ address = chunk6FTHFJAN_cjs.ArkAddress.decode(recipient.address);
3949
3982
  } catch (e) {
3950
3983
  throw new Error(`Invalid Arkade address: ${recipient.address}`);
3951
3984
  }
@@ -3970,7 +4003,7 @@ function validateRecipients(recipients, dustAmount, context) {
3970
4003
 
3971
4004
  // src/contracts/spendability.ts
3972
4005
  function isContractGenericallySpendable(contract) {
3973
- return chunkP6EXRY5L_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
4006
+ return chunkNPM5YZBC_cjs.contractHandlers.get(contract.type)?.isGenericallySpendable?.(contract) === true;
3974
4007
  }
3975
4008
  function gatedContracts(contracts) {
3976
4009
  const gated = /* @__PURE__ */ new Map();
@@ -3979,11 +4012,20 @@ function gatedContracts(contracts) {
3979
4012
  }
3980
4013
  return gated;
3981
4014
  }
4015
+ function gatedFrom(snapshot) {
4016
+ return gatedContracts(snapshot.map((entry) => entry.contract));
4017
+ }
4018
+ function gatedTypeOf(vtxo, gated) {
4019
+ return vtxo.script === void 0 ? void 0 : gated.get(vtxo.script);
4020
+ }
4021
+ function isGatedVtxo(vtxo, gated) {
4022
+ return gatedTypeOf(vtxo, gated) !== void 0;
4023
+ }
3982
4024
  function gateExclusion(gated) {
3983
4025
  return (vtxo) => {
3984
- const type = vtxo.script === void 0 ? void 0 : gated.get(vtxo.script);
4026
+ const type = gatedTypeOf(vtxo, gated);
3985
4027
  if (type === void 0) return void 0;
3986
- if (!chunkP6EXRY5L_cjs.contractHandlers.has(type)) {
4028
+ if (!chunkNPM5YZBC_cjs.contractHandlers.has(type)) {
3987
4029
  return `at ${vtxo.script} (contract type '${type}') has no handler registered in this build`;
3988
4030
  }
3989
4031
  return `at ${vtxo.script} (contract type '${type}') is not generically spendable`;
@@ -4019,7 +4061,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
4019
4061
  continue;
4020
4062
  }
4021
4063
  for (const v of vtxos) {
4022
- if (!chunk5J5PDZRR_cjs.hasTerminalSpend(v) && !v.isSwept && !v.isUnrolled) {
4064
+ if (!chunk6FTHFJAN_cjs.hasTerminalSpend(v) && !v.isSwept && !v.isUnrolled) {
4023
4065
  out.add(`${v.txid}:${v.vout}`);
4024
4066
  }
4025
4067
  }
@@ -4054,10 +4096,10 @@ function byValueDescending(vtxos) {
4054
4096
  return [...vtxos].sort((a, b) => b.value - a.value);
4055
4097
  }
4056
4098
  async function fetchTimeHeight(wallet) {
4057
- return chunk5J5PDZRR_cjs.resolveTimeHeight(wallet.onchainProvider);
4099
+ return chunk6FTHFJAN_cjs.resolveTimeHeight(wallet.onchainProvider);
4058
4100
  }
4059
4101
  function canMigrateBySend(vtxo, now) {
4060
- if (!chunk5J5PDZRR_cjs.canSpendOffchain(vtxo, now)) return false;
4102
+ if (!chunk6FTHFJAN_cjs.canSpendOffchain(vtxo, now)) return false;
4061
4103
  return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
4062
4104
  }
4063
4105
  function byExpiryAscending(vtxos, now) {
@@ -4065,7 +4107,7 @@ function byExpiryAscending(vtxos, now) {
4065
4107
  if (vtxo.isSwept) return -Infinity;
4066
4108
  if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
4067
4109
  if (vtxo.expiresAtHeight !== void 0) {
4068
- return chunk5J5PDZRR_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
4110
+ return chunk6FTHFJAN_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
4069
4111
  }
4070
4112
  return Infinity;
4071
4113
  };
@@ -4092,7 +4134,7 @@ function priceSettlementInputs(vtxos, estimator) {
4092
4134
  const payable = [];
4093
4135
  const net = /* @__PURE__ */ new Map();
4094
4136
  for (const vtxo of vtxos) {
4095
- const inputFee = estimator.evalOffchainInput(chunk5J5PDZRR_cjs.toOffchainInputFeeParams(vtxo));
4137
+ const inputFee = estimator.evalOffchainInput(chunk6FTHFJAN_cjs.toOffchainInputFeeParams(vtxo));
4096
4138
  if (inputFee.satoshis >= vtxo.value) {
4097
4139
  continue;
4098
4140
  }
@@ -4118,7 +4160,7 @@ function deductOffchainOutputFee(subtotal, estimator, arkAddress) {
4118
4160
  }
4119
4161
  const outputFee = estimator.evalOffchainOutput({
4120
4162
  amount: subtotal,
4121
- script: base.hex.encode(chunk5J5PDZRR_cjs.ArkAddress.decode(arkAddress).pkScript)
4163
+ script: base.hex.encode(chunk6FTHFJAN_cjs.ArkAddress.decode(arkAddress).pkScript)
4122
4164
  });
4123
4165
  return subtotal - BigInt(outputFee.satoshis);
4124
4166
  }
@@ -4136,10 +4178,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
4136
4178
  };
4137
4179
  function getRecoverableVtxos(vtxos, dustAmount, now) {
4138
4180
  return vtxos.filter((vtxo) => {
4139
- if (chunk5J5PDZRR_cjs.canRecoverOnchain(vtxo, now)) {
4181
+ if (chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now)) {
4140
4182
  return true;
4141
4183
  }
4142
- if (chunk5J5PDZRR_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
4184
+ if (chunk6FTHFJAN_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
4143
4185
  return true;
4144
4186
  }
4145
4187
  return false;
@@ -4171,7 +4213,7 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
4171
4213
  function isVtxoExpiringSoon(vtxo, thresholdMs) {
4172
4214
  if (vtxo.isUnrolled) return false;
4173
4215
  const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
4174
- const expiresAt = chunk5J5PDZRR_cjs.normalizeVtxo(vtxo).expiresAt;
4216
+ const expiresAt = chunk6FTHFJAN_cjs.normalizeVtxo(vtxo).expiresAt;
4175
4217
  if (expiresAt === void 0) return false;
4176
4218
  const now = Date.now();
4177
4219
  const batchExpiry = expiresAt.getTime();
@@ -4182,7 +4224,7 @@ function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
4182
4224
  return vtxos.filter(
4183
4225
  // The leading exclusion covers the `isSubdust` arm too, which is a value
4184
4226
  // property and would otherwise re-admit an exited coin on its own.
4185
- (vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunk5J5PDZRR_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
4227
+ (vtxo) => !vtxo.isUnrolled && (isVtxoExpiringSoon(vtxo, thresholdMs) || chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount))
4186
4228
  );
4187
4229
  }
4188
4230
  function isMigrationCapable(wallet) {
@@ -4781,11 +4823,11 @@ var VtxoManager = class _VtxoManager {
4781
4823
  `Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
4782
4824
  );
4783
4825
  }
4784
- const tx = new chunk5J5PDZRR_cjs.Transaction();
4826
+ const tx = new chunk6FTHFJAN_cjs.Transaction();
4785
4827
  for (const utxo of expiredUtxos) {
4786
- const utxoScript = chunk5J5PDZRR_cjs.VtxoScript.decode(utxo.tapTree);
4828
+ const utxoScript = chunk6FTHFJAN_cjs.VtxoScript.decode(utxo.tapTree);
4787
4829
  const utxoExitLeaf = utxoScript.leaves.find(
4788
- (leaf) => chunk5J5PDZRR_cjs.CSVMultisigTapscript.isScriptValid(chunk5J5PDZRR_cjs.scriptFromTapLeafScript(leaf)) === true
4830
+ (leaf) => chunk6FTHFJAN_cjs.CSVMultisigTapscript.isScriptValid(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(leaf)) === true
4789
4831
  );
4790
4832
  if (!utxoExitLeaf) {
4791
4833
  throw new Error(
@@ -4800,7 +4842,7 @@ var VtxoManager = class _VtxoManager {
4800
4842
  amount: BigInt(utxo.value)
4801
4843
  },
4802
4844
  tapLeafScript: [utxoExitLeaf],
4803
- sequence: chunk5J5PDZRR_cjs.getSequence(utxoExitLeaf)
4845
+ sequence: chunk6FTHFJAN_cjs.getSequence(utxoExitLeaf)
4804
4846
  });
4805
4847
  }
4806
4848
  tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
@@ -5043,8 +5085,8 @@ var VtxoManager = class _VtxoManager {
5043
5085
  const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
5044
5086
  if (cls.status === "CURRENT") continue;
5045
5087
  const live = vtxos.filter((v) => !v.isUnrolled);
5046
- const recoverable = live.filter((v) => v.isSwept && !chunk5J5PDZRR_cjs.hasTerminalSpend(v));
5047
- const spendable = live.filter((v) => !chunk5J5PDZRR_cjs.hasTerminalSpend(v) && !v.isSwept);
5088
+ const recoverable = live.filter((v) => v.isSwept && !chunk6FTHFJAN_cjs.hasTerminalSpend(v));
5089
+ const spendable = live.filter((v) => !chunk6FTHFJAN_cjs.hasTerminalSpend(v) && !v.isSwept);
5048
5090
  const value = spendable.reduce((sum, v) => sum + v.value, 0);
5049
5091
  let recoverableCount = 0;
5050
5092
  let recoverableValue = 0;
@@ -5057,7 +5099,7 @@ var VtxoManager = class _VtxoManager {
5057
5099
  awaitingSweepCount = spendable.length;
5058
5100
  awaitingSweepValue = value;
5059
5101
  for (const v of spendable) {
5060
- const exp = chunk5J5PDZRR_cjs.toBatchExpiry(v);
5102
+ const exp = chunk6FTHFJAN_cjs.toBatchExpiry(v);
5061
5103
  if (exp !== void 0 && (nextSweepEta === void 0 || exp < nextSweepEta)) {
5062
5104
  nextSweepEta = exp;
5063
5105
  }
@@ -5318,7 +5360,7 @@ var VtxoManager = class _VtxoManager {
5318
5360
  /** Decodes the boarding tapscript exit path to extract the CSV timelock. */
5319
5361
  getBoardingTimelock() {
5320
5362
  const wallet = this.getSweepWallet();
5321
- const exitScript = chunk5J5PDZRR_cjs.CSVMultisigTapscript.decode(
5363
+ const exitScript = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(
5322
5364
  base.hex.decode(wallet.boardingTapscript.exitScript)
5323
5365
  );
5324
5366
  return exitScript.params.timelock;
@@ -5449,8 +5491,8 @@ var VtxoManager = class _VtxoManager {
5449
5491
  * or doesn't carry the metadata.
5450
5492
  */
5451
5493
  extractSpentOutpoint(error) {
5452
- const ark = chunk5J5PDZRR_cjs.maybeArkError(error);
5453
- if (!chunk5J5PDZRR_cjs.isArkError(ark, chunk5J5PDZRR_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
5494
+ const ark = chunk6FTHFJAN_cjs.maybeArkError(error);
5495
+ if (!chunk6FTHFJAN_cjs.isArkError(ark, chunk6FTHFJAN_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
5454
5496
  const raw = ark.metadata?.vtxo_outpoint;
5455
5497
  if (typeof raw !== "string") return void 0;
5456
5498
  const [txid, voutStr] = raw.split(":");
@@ -5640,7 +5682,7 @@ var VtxoManager = class _VtxoManager {
5640
5682
  if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
5641
5683
  break;
5642
5684
  }
5643
- const inputFee = estimator.evalOffchainInput(chunk5J5PDZRR_cjs.toOffchainInputFeeParams(v));
5685
+ const inputFee = estimator.evalOffchainInput(chunk6FTHFJAN_cjs.toOffchainInputFeeParams(v));
5644
5686
  if (inputFee.satoshis >= v.value) {
5645
5687
  continue;
5646
5688
  }
@@ -5660,7 +5702,7 @@ var VtxoManager = class _VtxoManager {
5660
5702
  const arkAddress = await this.wallet.getAddress();
5661
5703
  const outputFee = estimator.evalOffchainOutput({
5662
5704
  amount: totalAmount,
5663
- script: base.hex.encode(chunk5J5PDZRR_cjs.ArkAddress.decode(arkAddress).pkScript)
5705
+ script: base.hex.encode(chunk6FTHFJAN_cjs.ArkAddress.decode(arkAddress).pkScript)
5664
5706
  });
5665
5707
  totalAmount -= BigInt(outputFee.satoshis);
5666
5708
  if (totalAmount < dustAmount) return;
@@ -5740,7 +5782,7 @@ var ArkNote = class _ArkNote {
5740
5782
  this.value = value;
5741
5783
  this.HRP = HRP;
5742
5784
  const preimageHash = utils_js.sha256(this.preimage);
5743
- this.vtxoScript = new chunk5J5PDZRR_cjs.VtxoScript([noteTapscript(preimageHash)]);
5785
+ this.vtxoScript = new chunk6FTHFJAN_cjs.VtxoScript([noteTapscript(preimageHash)]);
5744
5786
  const leaf = this.vtxoScript.leaves[0];
5745
5787
  this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
5746
5788
  this.tapTree = this.vtxoScript.encode();
@@ -5907,7 +5949,7 @@ var ArkadeCash = class _ArkadeCash {
5907
5949
  const privateKey = data.slice(1, 33);
5908
5950
  const serverPubKey = data.slice(33, 65);
5909
5951
  const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
5910
- const csvTimelock = chunk5J5PDZRR_cjs.sequenceToTimelock(sequence);
5952
+ const csvTimelock = chunk6FTHFJAN_cjs.sequenceToTimelock(sequence);
5911
5953
  return new _ArkadeCash(privateKey, serverPubKey, csvTimelock, decoded.prefix);
5912
5954
  }
5913
5955
  toString() {
@@ -5915,7 +5957,7 @@ var ArkadeCash = class _ArkadeCash {
5915
5957
  data[0] = _ArkadeCash.Version;
5916
5958
  data.set(this._privateKey, 1);
5917
5959
  data.set(this._serverPubKey, 33);
5918
- const sequence = chunk5J5PDZRR_cjs.timelockToSequence(this.csvTimelock);
5960
+ const sequence = chunk6FTHFJAN_cjs.timelockToSequence(this.csvTimelock);
5919
5961
  new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
5920
5962
  const words = base.bech32m.toWords(data);
5921
5963
  return base.bech32m.encode(this.hrp, words, 1023);
@@ -5924,7 +5966,7 @@ var ArkadeCash = class _ArkadeCash {
5924
5966
  return SingleKey.fromPrivateKey(this._privateKey);
5925
5967
  }
5926
5968
  get vtxoScript() {
5927
- return new chunkP6EXRY5L_cjs.DefaultVtxo.Script({
5969
+ return new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
5928
5970
  pubKey: this._publicKey,
5929
5971
  serverPubKey: this._serverPubKey,
5930
5972
  csvTimelock: this.csvTimelock
@@ -6185,7 +6227,7 @@ async function captureExitBranch(params) {
6185
6227
  const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
6186
6228
  if (nonCommitment.length > 0) {
6187
6229
  for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
6188
- psbtByTxid.set(chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6230
+ psbtByTxid.set(chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6189
6231
  }
6190
6232
  }
6191
6233
  }
@@ -6228,10 +6270,10 @@ var IndexerExitDataSource = class {
6228
6270
  while (hasMore) {
6229
6271
  const { chain: page, page: meta } = await this.indexer.getVtxoChain(
6230
6272
  { txid: vtxo.txid, vout: vtxo.vout },
6231
- { pageIndex, pageSize: chunk5J5PDZRR_cjs.DEFAULT_PAGE_SIZE }
6273
+ { pageIndex, pageSize: chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE }
6232
6274
  );
6233
6275
  chain.push(...page);
6234
- hasMore = meta ? page.length === chunk5J5PDZRR_cjs.DEFAULT_PAGE_SIZE : false;
6276
+ hasMore = meta ? page.length === chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE : false;
6235
6277
  pageIndex++;
6236
6278
  }
6237
6279
  return chain;
@@ -6243,12 +6285,12 @@ var IndexerExitDataSource = class {
6243
6285
  while (hasMore) {
6244
6286
  const { txs, page } = await this.indexer.getVirtualTxs(txids, {
6245
6287
  pageIndex,
6246
- pageSize: chunk5J5PDZRR_cjs.DEFAULT_PAGE_SIZE
6288
+ pageSize: chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE
6247
6289
  });
6248
6290
  for (const psbt of txs) {
6249
- out.set(chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6291
+ out.set(chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
6250
6292
  }
6251
- hasMore = page ? txs.length === chunk5J5PDZRR_cjs.DEFAULT_PAGE_SIZE : false;
6293
+ hasMore = page ? txs.length === chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE : false;
6252
6294
  pageIndex++;
6253
6295
  }
6254
6296
  return out;
@@ -6269,7 +6311,7 @@ function chainedTxTypeToChainTxType(t) {
6269
6311
  }
6270
6312
  }
6271
6313
  function psbtInputTxids(psbtBase64) {
6272
- const tx = chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
6314
+ const tx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
6273
6315
  const ids = [];
6274
6316
  for (let i = 0; i < tx.inputsLength; i++) {
6275
6317
  const txid = tx.getInput(i).txid;
@@ -6628,10 +6670,10 @@ async function resolveArkInfo(arkProvider, walletRepository) {
6628
6670
  try {
6629
6671
  info = await arkProvider.getInfo();
6630
6672
  } catch (err) {
6631
- if (!chunk5J5PDZRR_cjs.isRetryableProviderError(err)) throw err;
6673
+ if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
6632
6674
  const snapshot = await loadArkInfoSnapshot(walletRepository);
6633
6675
  if (!snapshot) {
6634
- throw new chunk5J5PDZRR_cjs.ProviderUnavailableError(
6676
+ throw new chunk6FTHFJAN_cjs.ProviderUnavailableError(
6635
6677
  "Arkade server info is unavailable and no cached snapshot exists",
6636
6678
  { cause: err }
6637
6679
  );
@@ -6959,6 +7001,24 @@ exports.Batch = void 0;
6959
7001
  })(exports.Batch || (exports.Batch = {}));
6960
7002
 
6961
7003
  // src/utils/transactionHistory.ts
7004
+ function localCreatedAtByTxid(vtxos) {
7005
+ const createdAt = /* @__PURE__ */ new Map();
7006
+ for (const vtxo of vtxos) {
7007
+ if (vtxo.txid && !createdAt.has(vtxo.txid)) {
7008
+ createdAt.set(vtxo.txid, vtxo.createdAt.getTime());
7009
+ }
7010
+ }
7011
+ return createdAt;
7012
+ }
7013
+ function gatedTouchpoints(gated) {
7014
+ const paidIn = /* @__PURE__ */ new Set();
7015
+ const paidOut = /* @__PURE__ */ new Set();
7016
+ for (const vtxo of gated) {
7017
+ if (vtxo.txid) paidIn.add(vtxo.txid);
7018
+ if (vtxo.isSpent && vtxo.arkTxId) paidOut.add(vtxo.arkTxId);
7019
+ }
7020
+ return { paidIn, paidOut };
7021
+ }
6962
7022
  var txKey = {
6963
7023
  commitmentTxid: "",
6964
7024
  boardingTxid: "",
@@ -7010,24 +7070,27 @@ function subtractAssets(spent, change) {
7010
7070
  if (map.size === 0) return void 0;
7011
7071
  return Array.from(map, ([assetId, amount]) => ({ assetId, amount }));
7012
7072
  }
7013
- function collectArkTxidsNeedingCreatedAt(vtxos) {
7014
- const ownTxids = new Set(vtxos.map((v) => v.txid));
7073
+ function collectArkTxidsNeedingCreatedAt(vtxos, localCreatedAt) {
7015
7074
  const txids = /* @__PURE__ */ new Set();
7016
7075
  for (const vtxo of vtxos) {
7017
- if (vtxo.isSpent && vtxo.arkTxId && !ownTxids.has(vtxo.arkTxId)) {
7076
+ if (vtxo.isSpent && vtxo.arkTxId && !localCreatedAt.has(vtxo.arkTxId)) {
7018
7077
  txids.add(vtxo.arkTxId);
7019
7078
  }
7020
7079
  }
7021
7080
  return [...txids];
7022
7081
  }
7023
- async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt) {
7024
- const fromOldestVtxo = vtxos.map(chunk5J5PDZRR_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
7025
- const txidsNeedingCreatedAt = resolveTxCreatedAt ? collectArkTxidsNeedingCreatedAt(fromOldestVtxo) : [];
7082
+ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt, gatedScripts = /* @__PURE__ */ new Map()) {
7083
+ const normalized = vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
7084
+ const localCreatedAt = localCreatedAtByTxid(normalized);
7085
+ const gatedVtxos = normalized.filter((vtxo) => isGatedVtxo(vtxo, gatedScripts));
7086
+ const ownVtxos = normalized.filter((vtxo) => !isGatedVtxo(vtxo, gatedScripts));
7087
+ const { paidIn: paidIntoGated, paidOut: paidOutOfGated } = gatedTouchpoints(gatedVtxos);
7088
+ const txidsNeedingCreatedAt = resolveTxCreatedAt ? collectArkTxidsNeedingCreatedAt(ownVtxos, localCreatedAt) : [];
7026
7089
  const resolvedCreatedAt = resolveTxCreatedAt && txidsNeedingCreatedAt.length > 0 ? await resolveTxCreatedAt(txidsNeedingCreatedAt) : /* @__PURE__ */ new Map();
7027
7090
  const unmatchedSettledBoardingTxs = allBoardingTxs.filter(isSettledBoardingReceive).sort((a, b) => a.createdAt - b.createdAt);
7028
7091
  const sent = [];
7029
7092
  let received = [];
7030
- for (const vtxo of fromOldestVtxo) {
7093
+ for (const vtxo of ownVtxos) {
7031
7094
  if (vtxo.status.isLeaf) {
7032
7095
  const commitmentTxid = vtxo.commitmentTxIds[0];
7033
7096
  const vtxoCreatedAt = vtxo.createdAt.getTime();
@@ -7037,7 +7100,7 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
7037
7100
  unmatchedSettledBoardingTxs,
7038
7101
  (tx) => tx.createdAt <= vtxoCreatedAt && (tx.key.commitmentTxid === commitmentTxid || tx.key.commitmentTxid === vtxo.settledBy)
7039
7102
  );
7040
- } else if (fromOldestVtxo.filter((v) => v.settledBy === vtxo.commitmentTxIds[0]).length === 0) {
7103
+ } else if (ownVtxos.filter((v) => v.settledBy === vtxo.commitmentTxIds[0]).length === 0) {
7041
7104
  const duplicateBoardingReceive = consumeBoardingReceive(
7042
7105
  unmatchedSettledBoardingTxs,
7043
7106
  (tx) => tx.amount === vtxo.value && tx.createdAt <= vtxoCreatedAt
@@ -7058,11 +7121,14 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
7058
7121
  });
7059
7122
  }
7060
7123
  }
7061
- } else if (fromOldestVtxo.filter((v) => v.arkTxId === vtxo.txid).length === 0) {
7124
+ } else if (ownVtxos.filter((v) => v.arkTxId === vtxo.txid).length === 0) {
7062
7125
  const assets = collectAssets([vtxo]);
7063
7126
  received.push({
7064
7127
  key: { ...txKey, arkTxid: vtxo.txid },
7065
- tag: "offchain",
7128
+ // The escrow paying out: a swap fill or a cancel spends the
7129
+ // gated coin and lands the proceeds here. Nothing else about
7130
+ // the row changes — the tag only names the counterparty.
7131
+ tag: paidOutOfGated.has(vtxo.txid) ? "gated" : "offchain",
7066
7132
  type: "RECEIVED" /* TxReceived */,
7067
7133
  amount: vtxo.value,
7068
7134
  settled: vtxo.status.isLeaf || vtxo.isSpent,
@@ -7072,8 +7138,8 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
7072
7138
  }
7073
7139
  if (vtxo.isSpent) {
7074
7140
  if (vtxo.arkTxId && !sent.some((s) => s.key.arkTxid === vtxo.arkTxId)) {
7075
- const changes = fromOldestVtxo.filter((_) => _.txid === vtxo.arkTxId);
7076
- const allSpent = fromOldestVtxo.filter((v) => v.arkTxId === vtxo.arkTxId);
7141
+ const changes = ownVtxos.filter((_) => _.txid === vtxo.arkTxId);
7142
+ const allSpent = ownVtxos.filter((v) => v.arkTxId === vtxo.arkTxId);
7077
7143
  const spentAmount = allSpent.reduce((acc, v) => acc + v.value, 0);
7078
7144
  let txAmount = 0;
7079
7145
  let txTime = 0;
@@ -7083,13 +7149,16 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
7083
7149
  txTime = changes[0].createdAt.getTime();
7084
7150
  } else {
7085
7151
  txAmount = spentAmount;
7086
- txTime = resolvedCreatedAt.get(vtxo.arkTxId) ?? vtxo.createdAt.getTime() + 1;
7152
+ txTime = localCreatedAt.get(vtxo.arkTxId) ?? resolvedCreatedAt.get(vtxo.arkTxId) ?? vtxo.createdAt.getTime() + 1;
7087
7153
  }
7088
7154
  const assets = subtractAssets(allSpent, changes);
7089
7155
  if (txAmount !== 0 || assets) {
7090
7156
  sent.push({
7091
7157
  key: { ...txKey, arkTxid: vtxo.arkTxId },
7092
- tag: "offchain",
7158
+ // Funding the escrow: an output of this tx landed on a
7159
+ // gated contract of the wallet's, so the send is to the
7160
+ // user's own covenant rather than to a stranger.
7161
+ tag: paidIntoGated.has(vtxo.arkTxId) ? "gated" : "offchain",
7093
7162
  type: "SENT" /* TxSent */,
7094
7163
  amount: txAmount,
7095
7164
  settled: true,
@@ -7099,10 +7168,10 @@ async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnor
7099
7168
  }
7100
7169
  }
7101
7170
  if (vtxo.settledBy && !commitmentsToIgnore.has(vtxo.settledBy) && !sent.some((s) => s.key.commitmentTxid === vtxo.settledBy)) {
7102
- const changes = fromOldestVtxo.filter(
7171
+ const changes = ownVtxos.filter(
7103
7172
  (v) => v.status.isLeaf && v.commitmentTxIds.length > 0 && v.commitmentTxIds.every((_) => vtxo.settledBy === _)
7104
7173
  );
7105
- const forfeitVtxos = fromOldestVtxo.filter((v) => v.settledBy === vtxo.settledBy);
7174
+ const forfeitVtxos = ownVtxos.filter((v) => v.settledBy === vtxo.settledBy);
7106
7175
  const forfeitAmount = forfeitVtxos.reduce((acc, v) => acc + v.value, 0);
7107
7176
  if (changes.length > 0) {
7108
7177
  const settledAmount = changes.reduce((acc, v) => acc + v.value, 0);
@@ -7185,7 +7254,7 @@ var AssetManager = class extends ReadonlyAssetManager {
7185
7254
  const virtualCoins = await this.wallet.getSpendableVtxos({
7186
7255
  withRecoverable: false
7187
7256
  });
7188
- const controlAssetRef = params.controlAssetId ? chunkFM263GKH_cjs.AssetRef.fromId(chunkFM263GKH_cjs.AssetId.fromString(params.controlAssetId)) : null;
7257
+ const controlAssetRef = params.controlAssetId ? chunk4C5PMGBB_cjs.AssetRef.fromId(chunk4C5PMGBB_cjs.AssetId.fromString(params.controlAssetId)) : null;
7189
7258
  const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
7190
7259
  let totalBtcSelected = 0n;
7191
7260
  const assetChanges = /* @__PURE__ */ new Map();
@@ -7198,8 +7267,8 @@ var AssetManager = class extends ReadonlyAssetManager {
7198
7267
  }
7199
7268
  }
7200
7269
  const groups = [];
7201
- const issuedAssetOutput = chunkFM263GKH_cjs.AssetOutput.create(0, params.amount);
7202
- const issuedAssetGroup = chunkFM263GKH_cjs.AssetGroup.create(
7270
+ const issuedAssetOutput = chunk4C5PMGBB_cjs.AssetOutput.create(0, params.amount);
7271
+ const issuedAssetGroup = chunk4C5PMGBB_cjs.AssetGroup.create(
7203
7272
  null,
7204
7273
  controlAssetRef,
7205
7274
  [],
@@ -7214,28 +7283,28 @@ var AssetManager = class extends ReadonlyAssetManager {
7214
7283
  for (const [inputIndex, assets] of assetInputs) {
7215
7284
  for (const asset of assets) {
7216
7285
  if (asset.assetId !== assetId) continue;
7217
- changeInputs.push(chunkFM263GKH_cjs.AssetInput.create(inputIndex, asset.amount));
7286
+ changeInputs.push(chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount));
7218
7287
  }
7219
7288
  }
7220
7289
  groups.push(
7221
- chunkFM263GKH_cjs.AssetGroup.create(
7222
- chunkFM263GKH_cjs.AssetId.fromString(assetId),
7290
+ chunk4C5PMGBB_cjs.AssetGroup.create(
7291
+ chunk4C5PMGBB_cjs.AssetId.fromString(assetId),
7223
7292
  null,
7224
7293
  changeInputs,
7225
- [chunkFM263GKH_cjs.AssetOutput.create(0, amount)],
7294
+ [chunk4C5PMGBB_cjs.AssetOutput.create(0, amount)],
7226
7295
  []
7227
7296
  )
7228
7297
  );
7229
7298
  }
7230
7299
  }
7231
7300
  const address = await this.wallet.getAddress();
7232
- const outputAddress = chunk5J5PDZRR_cjs.ArkAddress.decode(address);
7301
+ const outputAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(address);
7233
7302
  const outputs = [
7234
7303
  {
7235
7304
  script: outputAddress.pkScript,
7236
7305
  amount: BigInt(totalBtcSelected)
7237
7306
  },
7238
- Extension.create([chunkFM263GKH_cjs.Packet.create(groups)]).txOut()
7307
+ Extension.create([chunk4C5PMGBB_cjs.Packet.create(groups)]).txOut()
7239
7308
  ];
7240
7309
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
7241
7310
  coinSelection.inputs,
@@ -7243,7 +7312,7 @@ var AssetManager = class extends ReadonlyAssetManager {
7243
7312
  );
7244
7313
  return {
7245
7314
  arkTxId: arkTxid,
7246
- assetId: chunkFM263GKH_cjs.AssetId.create(arkTxid, 0).toString()
7315
+ assetId: chunk4C5PMGBB_cjs.AssetId.create(arkTxid, 0).toString()
7247
7316
  };
7248
7317
  }
7249
7318
  /**
@@ -7315,16 +7384,16 @@ var AssetManager = class extends ReadonlyAssetManager {
7315
7384
  for (const [inputIndex, assets] of assetInputs) {
7316
7385
  for (const asset of assets) {
7317
7386
  if (asset.assetId !== params.assetId) continue;
7318
- reissueInputs.push(chunkFM263GKH_cjs.AssetInput.create(inputIndex, asset.amount));
7387
+ reissueInputs.push(chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount));
7319
7388
  }
7320
7389
  }
7321
7390
  const totalAssetAmount = assetToReissueAmount + params.amount;
7322
- const reissueAssetIdObj = chunkFM263GKH_cjs.AssetId.fromString(params.assetId);
7323
- const reissueAssetGroup = chunkFM263GKH_cjs.AssetGroup.create(
7391
+ const reissueAssetIdObj = chunk4C5PMGBB_cjs.AssetId.fromString(params.assetId);
7392
+ const reissueAssetGroup = chunk4C5PMGBB_cjs.AssetGroup.create(
7324
7393
  reissueAssetIdObj,
7325
7394
  null,
7326
7395
  reissueInputs,
7327
- [chunkFM263GKH_cjs.AssetOutput.create(0, totalAssetAmount)],
7396
+ [chunk4C5PMGBB_cjs.AssetOutput.create(0, totalAssetAmount)],
7328
7397
  []
7329
7398
  );
7330
7399
  const groups = [reissueAssetGroup];
@@ -7333,27 +7402,27 @@ var AssetManager = class extends ReadonlyAssetManager {
7333
7402
  for (const [inputIndex, assets] of assetInputs) {
7334
7403
  for (const asset of assets) {
7335
7404
  if (asset.assetId !== assetId) continue;
7336
- changeInputs.push(chunkFM263GKH_cjs.AssetInput.create(inputIndex, asset.amount));
7405
+ changeInputs.push(chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount));
7337
7406
  }
7338
7407
  }
7339
7408
  groups.push(
7340
- chunkFM263GKH_cjs.AssetGroup.create(
7341
- chunkFM263GKH_cjs.AssetId.fromString(assetId),
7409
+ chunk4C5PMGBB_cjs.AssetGroup.create(
7410
+ chunk4C5PMGBB_cjs.AssetId.fromString(assetId),
7342
7411
  null,
7343
7412
  changeInputs,
7344
- [chunkFM263GKH_cjs.AssetOutput.create(0, amount)],
7413
+ [chunk4C5PMGBB_cjs.AssetOutput.create(0, amount)],
7345
7414
  []
7346
7415
  )
7347
7416
  );
7348
7417
  }
7349
7418
  const address = await this.wallet.getAddress();
7350
- const outputAddress = chunk5J5PDZRR_cjs.ArkAddress.decode(address);
7419
+ const outputAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(address);
7351
7420
  const outputs = [
7352
7421
  {
7353
7422
  script: outputAddress.pkScript,
7354
7423
  amount: BigInt(totalBtcSelected)
7355
7424
  },
7356
- Extension.create([chunkFM263GKH_cjs.Packet.create(groups)]).txOut()
7425
+ Extension.create([chunk4C5PMGBB_cjs.Packet.create(groups)]).txOut()
7357
7426
  ];
7358
7427
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
7359
7428
  return arkTxid;
@@ -7420,27 +7489,27 @@ var AssetManager = class extends ReadonlyAssetManager {
7420
7489
  for (const [inputIndex, assets] of assetInputs) {
7421
7490
  for (const asset of assets) {
7422
7491
  if (asset.assetId !== assetId) continue;
7423
- changeInputs.push(chunkFM263GKH_cjs.AssetInput.create(inputIndex, asset.amount));
7492
+ changeInputs.push(chunk4C5PMGBB_cjs.AssetInput.create(inputIndex, asset.amount));
7424
7493
  }
7425
7494
  }
7426
7495
  groups.push(
7427
- chunkFM263GKH_cjs.AssetGroup.create(
7428
- chunkFM263GKH_cjs.AssetId.fromString(assetId),
7496
+ chunk4C5PMGBB_cjs.AssetGroup.create(
7497
+ chunk4C5PMGBB_cjs.AssetId.fromString(assetId),
7429
7498
  null,
7430
7499
  changeInputs,
7431
- amount > 0n ? [chunkFM263GKH_cjs.AssetOutput.create(0, amount)] : [],
7500
+ amount > 0n ? [chunk4C5PMGBB_cjs.AssetOutput.create(0, amount)] : [],
7432
7501
  []
7433
7502
  )
7434
7503
  );
7435
7504
  }
7436
7505
  const address = await this.wallet.getAddress();
7437
- const outputAddress = chunk5J5PDZRR_cjs.ArkAddress.decode(address);
7506
+ const outputAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(address);
7438
7507
  const outputs = [
7439
7508
  {
7440
7509
  script: outputAddress.pkScript,
7441
7510
  amount: BigInt(totalBtcSelected)
7442
7511
  },
7443
- Extension.create([chunkFM263GKH_cjs.Packet.create(groups)]).txOut()
7512
+ Extension.create([chunk4C5PMGBB_cjs.Packet.create(groups)]).txOut()
7444
7513
  ];
7445
7514
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
7446
7515
  return arkTxid;
@@ -7465,7 +7534,7 @@ function castMetadata(metadata) {
7465
7534
  } else {
7466
7535
  throw new Error("Invalid metadata value type");
7467
7536
  }
7468
- md.push(chunkFM263GKH_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
7537
+ md.push(chunk4C5PMGBB_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
7469
7538
  }
7470
7539
  return md;
7471
7540
  }
@@ -7486,10 +7555,10 @@ var DelegateManagerImpl = class {
7486
7555
  if (vtxos.length === 0) {
7487
7556
  return { delegated: [], failed: [] };
7488
7557
  }
7489
- const destinationScript = chunk5J5PDZRR_cjs.ArkAddress.decode(destination).pkScript;
7558
+ const destinationScript = chunk6FTHFJAN_cjs.ArkAddress.decode(destination).pkScript;
7490
7559
  const arkInfo = await this.arkInfoProvider.getInfo();
7491
7560
  const delegateInfo = await this.delegateProvider.getDelegateInfo();
7492
- const eligible = vtxos.map(chunk5J5PDZRR_cjs.normalizeVtxo).filter(
7561
+ const eligible = vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo).filter(
7493
7562
  (v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
7494
7563
  );
7495
7564
  if (eligible.length === 0) {
@@ -7518,11 +7587,11 @@ var DelegateManagerImpl = class {
7518
7587
  const groupByExpiry = /* @__PURE__ */ new Map();
7519
7588
  let recoverableVtxos = [];
7520
7589
  for (const vtxo of eligible) {
7521
- if (chunk5J5PDZRR_cjs.canRecoverOnchain(vtxo, now)) {
7590
+ if (chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now)) {
7522
7591
  recoverableVtxos.push(vtxo);
7523
7592
  continue;
7524
7593
  }
7525
- const expiry = chunk5J5PDZRR_cjs.toBatchExpiry(vtxo);
7594
+ const expiry = chunk6FTHFJAN_cjs.toBatchExpiry(vtxo);
7526
7595
  if (!expiry) continue;
7527
7596
  const dayKey = getDayTimestamp(expiry);
7528
7597
  groupByExpiry.set(dayKey, [...groupByExpiry.get(dayKey) ?? [], vtxo]);
@@ -7587,7 +7656,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7587
7656
  }
7588
7657
  if (!delegateAt) {
7589
7658
  const now = { timestamp: /* @__PURE__ */ new Date() };
7590
- const expiryTimestamp = vtxos.filter((coin) => !chunk5J5PDZRR_cjs.canRecoverOnchain(coin, now) && chunk5J5PDZRR_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunk5J5PDZRR_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
7659
+ const expiryTimestamp = vtxos.filter((coin) => !chunk6FTHFJAN_cjs.canRecoverOnchain(coin, now) && chunk6FTHFJAN_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunk6FTHFJAN_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
7591
7660
  if (!expiryTimestamp || expiryTimestamp === Number.MAX_SAFE_INTEGER) {
7592
7661
  delegateAt = new Date(Date.now() + 1 * 60 * 1e3);
7593
7662
  } else {
@@ -7616,7 +7685,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7616
7685
  let amount = 0n;
7617
7686
  for (const coin of vtxos) {
7618
7687
  const inputFee = estimator.evalOffchainInput({
7619
- ...chunk5J5PDZRR_cjs.toOffchainInputFeeParams(coin),
7688
+ ...chunk6FTHFJAN_cjs.toOffchainInputFeeParams(coin),
7620
7689
  type: "vtxo"
7621
7690
  });
7622
7691
  if (inputFee.value >= coin.value) {
@@ -7630,7 +7699,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7630
7699
  const delegateFee = BigInt(Number(fee));
7631
7700
  if (delegateFee > 0n) {
7632
7701
  outputs.push({
7633
- script: chunk5J5PDZRR_cjs.ArkAddress.decode(delegateAddress).pkScript,
7702
+ script: chunk6FTHFJAN_cjs.ArkAddress.decode(delegateAddress).pkScript,
7634
7703
  amount: delegateFee
7635
7704
  });
7636
7705
  }
@@ -7663,10 +7732,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
7663
7732
  destinationScript
7664
7733
  );
7665
7734
  const forfeitOutputScript = btcSigner.OutScript.encode(
7666
- btcSigner.Address(chunk5J5PDZRR_cjs.getNetwork(network)).decode(forfeitAddress)
7735
+ btcSigner.Address(chunk6FTHFJAN_cjs.getNetwork(network)).decode(forfeitAddress)
7667
7736
  );
7668
7737
  const forfeits = await Promise.all(
7669
- vtxos.filter((v) => !chunk5J5PDZRR_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
7738
+ vtxos.filter((v) => !chunk6FTHFJAN_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
7670
7739
  const forfeit = await makeDelegateForfeitTx(
7671
7740
  coin,
7672
7741
  dust,
@@ -7691,7 +7760,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
7691
7760
  index: input.vout,
7692
7761
  witnessUtxo: {
7693
7762
  amount: BigInt(input.value),
7694
- script: chunk5J5PDZRR_cjs.VtxoScript.decode(input.tapTree).pkScript
7763
+ script: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
7695
7764
  },
7696
7765
  sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
7697
7766
  tapLeafScript: [delegateTapLeaf]
@@ -7749,7 +7818,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
7749
7818
  expire_at: 0,
7750
7819
  cosigners_public_keys: cosignerPubKeys
7751
7820
  };
7752
- const proof = chunk5J5PDZRR_cjs.Intent.create(message, coins, outputs);
7821
+ const proof = chunk6FTHFJAN_cjs.Intent.create(message, coins, outputs);
7753
7822
  const signedProof = await identity.sign(proof);
7754
7823
  return {
7755
7824
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -7767,10 +7836,10 @@ function getDayTimestamp(timestamp) {
7767
7836
  function findDelegateTapLeaf(vtxo, delegatePubkey) {
7768
7837
  if (!vtxo.tapTree) return void 0;
7769
7838
  const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
7770
- const vtxoScript = chunk5J5PDZRR_cjs.VtxoScript.decode(vtxo.tapTree);
7839
+ const vtxoScript = chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree);
7771
7840
  return vtxoScript.leaves.find((tapLeaf) => {
7772
- const arkTapscript = chunk5J5PDZRR_cjs.decodeTapscript(chunk5J5PDZRR_cjs.scriptFromTapLeafScript(tapLeaf));
7773
- if (!chunk5J5PDZRR_cjs.MultisigTapscript.is(arkTapscript)) return false;
7841
+ const arkTapscript = chunk6FTHFJAN_cjs.decodeTapscript(chunk6FTHFJAN_cjs.scriptFromTapLeafScript(tapLeaf));
7842
+ if (!chunk6FTHFJAN_cjs.MultisigTapscript.is(arkTapscript)) return false;
7774
7843
  return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
7775
7844
  });
7776
7845
  }
@@ -8051,7 +8120,7 @@ function createManagedConnection(dbName, version, initDatabase2) {
8051
8120
  };
8052
8121
  }
8053
8122
  function scriptFromArkAddress(address) {
8054
- return base.hex.encode(chunk5J5PDZRR_cjs.ArkAddress.decode(address).pkScript);
8123
+ return base.hex.encode(chunk6FTHFJAN_cjs.ArkAddress.decode(address).pkScript);
8055
8124
  }
8056
8125
 
8057
8126
  // src/repositories/indexedDB/schema.ts
@@ -8546,7 +8615,7 @@ function validateVtxosForScript(vtxos, script, context) {
8546
8615
  }
8547
8616
  async function getVtxosForContract(repo, contract) {
8548
8617
  const vtxos = repo.getVtxosForScript ? await repo.getVtxosForScript(contract.script) : filterVtxosForScript(await repo.getVtxos(contract.address), contract.script);
8549
- return vtxos.map(chunk5J5PDZRR_cjs.normalizeVtxo);
8618
+ return vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
8550
8619
  }
8551
8620
  async function saveVtxosForContract(repo, contract, vtxos) {
8552
8621
  if (repo.saveVtxosForScript) {
@@ -8688,7 +8757,7 @@ function decodeArkContract(encoded) {
8688
8757
  }
8689
8758
  function contractFromArkContract(encoded, options = {}) {
8690
8759
  const parsed = decodeArkContract(encoded);
8691
- const handler = chunkP6EXRY5L_cjs.contractHandlers.get(parsed.type);
8760
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.get(parsed.type);
8692
8761
  if (!handler) {
8693
8762
  throw new Error(`No handler registered for contract type '${parsed.type}'`);
8694
8763
  }
@@ -8702,9 +8771,9 @@ function contractFromArkContract(encoded, options = {}) {
8702
8771
  metadata: options.metadata
8703
8772
  };
8704
8773
  }
8705
- function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunk5J5PDZRR_cjs.DEFAULT_NETWORK.hrp, options = {}) {
8774
+ function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunk6FTHFJAN_cjs.DEFAULT_NETWORK.hrp, options = {}) {
8706
8775
  const parsed = decodeArkContract(encoded);
8707
- const handler = chunkP6EXRY5L_cjs.contractHandlers.getOrThrow(parsed.type);
8776
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.getOrThrow(parsed.type);
8708
8777
  const params = parsed.data;
8709
8778
  const vtxoScript = handler.createScript(params);
8710
8779
  return {
@@ -9001,9 +9070,9 @@ var ContractWatcher = class {
9001
9070
  this.connectionState = "connected";
9002
9071
  this.reconnectAttempts = 0;
9003
9072
  this.listenLoop().catch((e) => {
9004
- if (chunk5J5PDZRR_cjs.isEventSourceError(e)) {
9073
+ if (chunk6FTHFJAN_cjs.isEventSourceError(e)) {
9005
9074
  console.debug("ContractWatcher subscription disconnected; reconnecting");
9006
- } else if (!chunk5J5PDZRR_cjs.isEventSourceUnavailableError(e)) {
9075
+ } else if (!chunk6FTHFJAN_cjs.isEventSourceUnavailableError(e)) {
9007
9076
  console.error(e);
9008
9077
  }
9009
9078
  this.connectionState = "disconnected";
@@ -9015,7 +9084,7 @@ var ContractWatcher = class {
9015
9084
  this.scheduleReconnect();
9016
9085
  });
9017
9086
  } catch (error) {
9018
- if (!chunk5J5PDZRR_cjs.isEventSourceUnavailableError(error)) {
9087
+ if (!chunk6FTHFJAN_cjs.isEventSourceUnavailableError(error)) {
9019
9088
  console.error("ContractWatcher connection failed:", error);
9020
9089
  }
9021
9090
  this.connectionState = "disconnected";
@@ -9041,7 +9110,7 @@ var ContractWatcher = class {
9041
9110
  * slower; what it loses is push latency.
9042
9111
  */
9043
9112
  reportEventSourceUnavailable(error) {
9044
- if (!chunk5J5PDZRR_cjs.isEventSourceUnavailableError(error)) return false;
9113
+ if (!chunk6FTHFJAN_cjs.isEventSourceUnavailableError(error)) return false;
9045
9114
  if (!this.eventSourceReported) {
9046
9115
  this.eventSourceReported = true;
9047
9116
  console.warn(
@@ -9113,7 +9182,7 @@ var ContractWatcher = class {
9113
9182
  const now = Date.now();
9114
9183
  let current;
9115
9184
  try {
9116
- current = await chunk5J5PDZRR_cjs.getAllNormalizedVtxos(this.config.indexerProvider, scripts, {
9185
+ current = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(this.config.indexerProvider, scripts, {
9117
9186
  spendableOnly: true
9118
9187
  });
9119
9188
  } catch (error) {
@@ -9166,13 +9235,14 @@ var ContractWatcher = class {
9166
9235
  try {
9167
9236
  const vtxosMap = await this.getContractVtxos({
9168
9237
  contractScripts,
9169
- includeSpent: false
9170
- // only spendable ones!
9238
+ includeSpent: true
9171
9239
  });
9172
9240
  for (const contractScript of contractScripts) {
9173
9241
  const state = this.contracts.get(contractScript);
9174
9242
  if (!state) continue;
9175
- const currentVtxos = vtxosMap.get(contractScript) || [];
9243
+ const known = vtxosMap.get(contractScript) || [];
9244
+ const knownByKey = new Map(known.map((v) => [`${v.txid}:${v.vout}`, v]));
9245
+ const currentVtxos = known.filter((v) => !v.isSpent);
9176
9246
  const currentKeys = new Set(currentVtxos.map((v) => `${v.txid}:${v.vout}`));
9177
9247
  const newVtxos = [];
9178
9248
  for (const vtxo of currentVtxos) {
@@ -9185,7 +9255,7 @@ var ContractWatcher = class {
9185
9255
  const spentVtxos = [];
9186
9256
  for (const [key, vtxo] of state.lastKnownVtxos) {
9187
9257
  if (!currentKeys.has(key)) {
9188
- spentVtxos.push(vtxo);
9258
+ spentVtxos.push(knownByKey.get(key) ?? vtxo);
9189
9259
  state.lastKnownVtxos.delete(key);
9190
9260
  }
9191
9261
  }
@@ -9321,14 +9391,14 @@ var ContractWatcher = class {
9321
9391
  const timestamp = Date.now();
9322
9392
  if (update.newVtxos?.length) {
9323
9393
  this.processSubscriptionVtxos(
9324
- update.newVtxos.map(chunk5J5PDZRR_cjs.normalizeVtxo),
9394
+ update.newVtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo),
9325
9395
  "vtxo_received",
9326
9396
  timestamp
9327
9397
  );
9328
9398
  }
9329
9399
  if (update.spentVtxos?.length) {
9330
9400
  this.processSubscriptionVtxos(
9331
- update.spentVtxos.map(chunk5J5PDZRR_cjs.normalizeVtxo),
9401
+ update.spentVtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo),
9332
9402
  "vtxo_spent",
9333
9403
  timestamp
9334
9404
  );
@@ -9356,8 +9426,8 @@ var ContractWatcher = class {
9356
9426
  continue;
9357
9427
  }
9358
9428
  if (target === byWatchedScript && eventType === "vtxo_received") {
9359
- const n = chunk5J5PDZRR_cjs.normalizeVtxo(vtxo);
9360
- if (chunk5J5PDZRR_cjs.hasTerminalSpend(n) || n.isSwept || chunk5J5PDZRR_cjs.isPastExpiry(n, now)) continue;
9429
+ const n = chunk6FTHFJAN_cjs.normalizeVtxo(vtxo);
9430
+ if (chunk6FTHFJAN_cjs.hasTerminalSpend(n) || n.isSwept || chunk6FTHFJAN_cjs.isPastExpiry(n, now)) continue;
9361
9431
  }
9362
9432
  let bucket = target.get(vtxo.script);
9363
9433
  if (!bucket) {
@@ -9456,7 +9526,7 @@ var NON_TERMINAL_INTENT_STATES = ALL_INTENT_STATES.filter(
9456
9526
  (s) => !isTerminalIntentState(s)
9457
9527
  );
9458
9528
  function isConsumed(vtxo) {
9459
- return vtxo !== void 0 && chunk5J5PDZRR_cjs.hasTerminalSpend(vtxo);
9529
+ return vtxo !== void 0 && chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo);
9460
9530
  }
9461
9531
  async function classifyIntent(intent, vtxosByOutpoint, now) {
9462
9532
  if (isTerminalIntentState(intent.state)) return void 0;
@@ -9499,7 +9569,7 @@ async function reconcileIntents(deps) {
9499
9569
  let vtxosByOutpoint = /* @__PURE__ */ new Map();
9500
9570
  if (outpoints.length > 0) {
9501
9571
  try {
9502
- const { vtxos } = await chunk5J5PDZRR_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
9572
+ const { vtxos } = await chunk6FTHFJAN_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
9503
9573
  vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
9504
9574
  } catch (e) {
9505
9575
  console.error("reconcileIntents: failed to fetch input VTXO state", e);
@@ -9579,6 +9649,7 @@ var ContractManager = class _ContractManager {
9579
9649
  syncDegradedReason;
9580
9650
  /** Epoch-ms of the last successful provider sync, if any. */
9581
9651
  lastSyncedAt;
9652
+ syncedAtByScript = /* @__PURE__ */ new Map();
9582
9653
  /** Last chain tip read, with the epoch-ms it was read at. @see currentChainTip */
9583
9654
  chainTipCache;
9584
9655
  /** In-flight chain tip read, so concurrent cache misses share one. */
@@ -9632,6 +9703,10 @@ var ContractManager = class _ContractManager {
9632
9703
  lastSyncedAt: this.lastSyncedAt
9633
9704
  };
9634
9705
  }
9706
+ /** @see ContractManagerConfig.vtxoSyncMaxAgeMs — for factory-built managers. */
9707
+ setVtxoSyncMaxAge(maxAgeMs) {
9708
+ this.config.vtxoSyncMaxAgeMs = maxAgeMs;
9709
+ }
9635
9710
  markSyncOnline() {
9636
9711
  this.lastSyncedAt = Date.now();
9637
9712
  this.syncDegradedReason = this.annotationDegradedReason();
@@ -9673,7 +9748,7 @@ var ContractManager = class _ContractManager {
9673
9748
  await this.reconcileWatched();
9674
9749
  this.markSyncOnline();
9675
9750
  } catch (err) {
9676
- if (!chunk5J5PDZRR_cjs.isRetryableProviderError(err)) throw err;
9751
+ if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
9677
9752
  this.markSyncDegraded(err);
9678
9753
  }
9679
9754
  this.initialized = true;
@@ -9805,7 +9880,7 @@ var ContractManager = class _ContractManager {
9805
9880
  const from = Math.max(0, watermark - lookAhead.size);
9806
9881
  const to = watermark + lookAhead.size;
9807
9882
  const deps = lookAhead.candidateDeps();
9808
- const handlers = chunkP6EXRY5L_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkP6EXRY5L_cjs.contractHandlers.get(t)).filter(hasCandidates);
9883
+ const handlers = chunkNPM5YZBC_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkNPM5YZBC_cjs.contractHandlers.get(t)).filter(hasCandidates);
9809
9884
  const band = /* @__PURE__ */ new Map();
9810
9885
  for (let index = from; index <= to; index++) {
9811
9886
  const descriptor = lookAhead.materialize(index);
@@ -9816,7 +9891,7 @@ var ContractManager = class _ContractManager {
9816
9891
  index,
9817
9892
  params: {
9818
9893
  ...candidate,
9819
- ...chunkP6EXRY5L_cjs.speculativeReceiveMetadata(descriptor)
9894
+ ...chunkNPM5YZBC_cjs.speculativeReceiveMetadata(descriptor)
9820
9895
  }
9821
9896
  });
9822
9897
  }
@@ -9878,7 +9953,7 @@ var ContractManager = class _ContractManager {
9878
9953
  });
9879
9954
  for (const entry of pending) entry.catchUpPending = false;
9880
9955
  } catch (err) {
9881
- if (!chunk5J5PDZRR_cjs.isRetryableProviderError(err)) throw err;
9956
+ if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
9882
9957
  this.markSyncDegraded(err);
9883
9958
  }
9884
9959
  }
@@ -9928,13 +10003,48 @@ var ContractManager = class _ContractManager {
9928
10003
  await this.fetchContractVxosFromIndexer([contract]);
9929
10004
  this.markSyncOnline();
9930
10005
  } catch (err) {
9931
- if (!chunk5J5PDZRR_cjs.isRetryableProviderError(err)) throw err;
10006
+ if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
9932
10007
  this.markSyncDegraded(err);
9933
10008
  }
9934
10009
  await this.watcher.addContract(contract);
9935
10010
  }
9936
10011
  return contract;
9937
10012
  }
10013
+ /**
10014
+ * `createContract`'s step order, fetch batched: persist all, hydrate once,
10015
+ * then watch. Hydrating first keeps it equivalent — the watcher seeds from
10016
+ * the repository, so an unhydrated row reads as all-new. A part-way failure
10017
+ * still watches what it wrote; a retry reports those rows as existing.
10018
+ */
10019
+ async createContracts(paramsList) {
10020
+ if (paramsList.length === 0) return [];
10021
+ return this.watcher.withCoalescedSubscription(async () => {
10022
+ const upserted = [];
10023
+ try {
10024
+ for (const params of paramsList) upserted.push(await this.upsertContract(params));
10025
+ } catch (err) {
10026
+ for (const u of upserted) {
10027
+ if (!u.persisted) continue;
10028
+ await this.watcher.addContract(u.contract).catch(
10029
+ (e) => console.error(`ContractManager: ${u.contract.script} left dark`, e)
10030
+ );
10031
+ }
10032
+ throw err;
10033
+ }
10034
+ const fresh = upserted.filter((u) => u.persisted).map((u) => u.contract);
10035
+ if (fresh.length > 0) {
10036
+ try {
10037
+ await this.fetchContractVxosFromIndexer(fresh);
10038
+ this.markSyncOnline();
10039
+ } catch (err) {
10040
+ if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
10041
+ this.markSyncDegraded(err);
10042
+ }
10043
+ for (const contract of fresh) await this.watcher.addContract(contract);
10044
+ }
10045
+ return upserted.map((u) => u.contract);
10046
+ });
10047
+ }
9938
10048
  /**
9939
10049
  * Lightweight variant of {@link createContract} for batch discovery
9940
10050
  * paths (currently: {@link scanContracts}). Validates, dedupes, persists,
@@ -9965,7 +10075,7 @@ var ContractManager = class _ContractManager {
9965
10075
  return result;
9966
10076
  }
9967
10077
  async upsertContractRow(params) {
9968
- const handler = chunkP6EXRY5L_cjs.contractHandlers.get(params.type);
10078
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.get(params.type);
9969
10079
  if (!handler) {
9970
10080
  throw new Error(`No handler registered for contract type '${params.type}'`);
9971
10081
  }
@@ -10065,7 +10175,7 @@ var ContractManager = class _ContractManager {
10065
10175
  `scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
10066
10176
  );
10067
10177
  }
10068
- const registered = chunkP6EXRY5L_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkP6EXRY5L_cjs.contractHandlers.get(t)).filter(isDiscoverable);
10178
+ const registered = chunkNPM5YZBC_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkNPM5YZBC_cjs.contractHandlers.get(t)).filter(isDiscoverable);
10069
10179
  const discoverables = [
10070
10180
  ...registered.filter((h) => h.type === "boarding"),
10071
10181
  ...registered.filter((h) => h.type !== "boarding")
@@ -10196,12 +10306,16 @@ var ContractManager = class _ContractManager {
10196
10306
  }
10197
10307
  async getContractsWithVtxos(filter, pageSize) {
10198
10308
  const contracts = await this.getContracts(filter);
10199
- try {
10200
- await this.syncContracts({ contracts, pageSize });
10201
- this.markSyncOnline();
10202
- } catch (err) {
10203
- if (!chunk5J5PDZRR_cjs.isRetryableProviderError(err)) throw err;
10204
- this.markSyncDegraded(err);
10309
+ if (this.syncedWithin(contracts, this.config.vtxoSyncMaxAgeMs ?? 0)) {
10310
+ await this.demoteFundedAwaitingContracts(contracts);
10311
+ } else {
10312
+ try {
10313
+ await this.syncContracts({ contracts, pageSize });
10314
+ this.markSyncOnline();
10315
+ } catch (err) {
10316
+ if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
10317
+ this.markSyncDegraded(err);
10318
+ }
10205
10319
  }
10206
10320
  const vtxos = await this.getVtxosForContracts(contracts);
10207
10321
  return contracts.map((contract) => ({
@@ -10221,7 +10335,7 @@ var ContractManager = class _ContractManager {
10221
10335
  }
10222
10336
  const tapscriptCache = tapscripts ?? /* @__PURE__ */ new Map();
10223
10337
  return vtxos.map(
10224
- (vtxo) => extendVirtualCoinForContract(chunk5J5PDZRR_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
10338
+ (vtxo) => extendVirtualCoinForContract(chunk6FTHFJAN_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
10225
10339
  );
10226
10340
  }
10227
10341
  /** @inheritdoc */
@@ -10265,14 +10379,14 @@ var ContractManager = class _ContractManager {
10265
10379
  const byScript = new Map(contracts.map((contract) => [contract.script, contract]));
10266
10380
  const asking = vtxos.filter((vtxo) => {
10267
10381
  const contract = byScript.get(vtxo.script);
10268
- return contract !== void 0 && chunkP6EXRY5L_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
10382
+ return contract !== void 0 && chunkNPM5YZBC_cjs.contractHandlers.get(contract.type)?.assertSpendableNow !== void 0;
10269
10383
  });
10270
10384
  if (asking.length === 0) return refused;
10271
10385
  const tip = await this.currentChainTip();
10272
10386
  const walletKey = await walletPubKey?.();
10273
10387
  for (const vtxo of asking) {
10274
10388
  const contract = byScript.get(vtxo.script);
10275
- const handler = chunkP6EXRY5L_cjs.contractHandlers.get(contract.type);
10389
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
10276
10390
  if (!handler?.assertSpendableNow) continue;
10277
10391
  const context = {
10278
10392
  collaborative: true,
@@ -10287,7 +10401,7 @@ var ContractManager = class _ContractManager {
10287
10401
  // the next handler to answer a CSV question would meet a
10288
10402
  // TypeError instead of a `false`. Carry the coin only when it
10289
10403
  // really is one.
10290
- vtxo: chunk5J5PDZRR_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
10404
+ vtxo: chunk6FTHFJAN_cjs.isVirtualCoin(vtxo) && "status" in vtxo ? vtxo : void 0
10291
10405
  };
10292
10406
  try {
10293
10407
  await handler.assertSpendableNow(
@@ -10443,7 +10557,7 @@ var ContractManager = class _ContractManager {
10443
10557
  const { contractScript, collaborative = true, walletPubKey, vtxo } = options;
10444
10558
  const [contract] = await this.getContracts({ script: contractScript });
10445
10559
  if (!contract) return [];
10446
- const handler = chunkP6EXRY5L_cjs.contractHandlers.get(contract.type);
10560
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
10447
10561
  if (!handler) return [];
10448
10562
  const script = handler.createScript(contract.params);
10449
10563
  const tip = await this.currentChainTip();
@@ -10471,7 +10585,7 @@ var ContractManager = class _ContractManager {
10471
10585
  const { contractScript, collaborative = true, walletPubKey } = options;
10472
10586
  const [contract] = await this.getContracts({ script: contractScript });
10473
10587
  if (!contract) return [];
10474
- const handler = chunkP6EXRY5L_cjs.contractHandlers.get(contract.type);
10588
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
10475
10589
  if (!handler) return [];
10476
10590
  const script = handler.createScript(contract.params);
10477
10591
  const context = {
@@ -10527,7 +10641,7 @@ var ContractManager = class _ContractManager {
10527
10641
  }
10528
10642
  async refreshOutpoints(outpoints) {
10529
10643
  if (outpoints.length === 0) return;
10530
- const { vtxos } = await chunk5J5PDZRR_cjs.getNormalizedVtxos(this.config.indexerProvider, {
10644
+ const { vtxos } = await chunk6FTHFJAN_cjs.getNormalizedVtxos(this.config.indexerProvider, {
10531
10645
  outpoints
10532
10646
  });
10533
10647
  if (vtxos.length === 0) return;
@@ -10616,13 +10730,14 @@ var ContractManager = class _ContractManager {
10616
10730
  }
10617
10731
  break;
10618
10732
  case "connection_reset":
10733
+ this.syncedAtByScript.clear();
10619
10734
  await this.scheduleLookAheadDrain();
10620
10735
  await this.reconcileWatched();
10621
10736
  this.markSyncOnline();
10622
10737
  break;
10623
10738
  }
10624
10739
  } catch (err) {
10625
- if (!chunk5J5PDZRR_cjs.isRetryableProviderError(err)) throw err;
10740
+ if (!chunk6FTHFJAN_cjs.isRetryableProviderError(err)) throw err;
10626
10741
  this.markSyncDegraded(err);
10627
10742
  }
10628
10743
  this.emitEvent(event);
@@ -10662,9 +10777,21 @@ var ContractManager = class _ContractManager {
10662
10777
  const cutoff = cursorCutoff(requestStartedAt);
10663
10778
  await advanceSyncCursor(this.config.walletRepository, cutoff);
10664
10779
  }
10780
+ if (options.window === void 0) {
10781
+ for (const contract of contracts) {
10782
+ this.syncedAtByScript.set(contract.script, requestStartedAt);
10783
+ }
10784
+ }
10665
10785
  await this.demoteFundedAwaitingContracts(contracts);
10666
10786
  return result;
10667
10787
  }
10788
+ syncedWithin(contracts, maxAgeMs) {
10789
+ if (maxAgeMs <= 0) return false;
10790
+ const floor = Date.now() - maxAgeMs;
10791
+ return contracts.every(
10792
+ (contract) => (this.syncedAtByScript.get(contract.script) ?? 0) >= floor
10793
+ );
10794
+ }
10668
10795
  /**
10669
10796
  * Demote every `awaiting-funds` contract in `contracts` that has been
10670
10797
  * funded — the automatic half of {@link ContractWatchState}.
@@ -10701,7 +10828,7 @@ var ContractManager = class _ContractManager {
10701
10828
  */
10702
10829
  async reconcilePendingFrontier(contracts) {
10703
10830
  const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
10704
- const vtxos = await chunk5J5PDZRR_cjs.getAllNormalizedVtxos(
10831
+ const vtxos = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(
10705
10832
  this.config.indexerProvider,
10706
10833
  contracts.map((c) => c.script),
10707
10834
  { pendingOnly: true }
@@ -10784,7 +10911,7 @@ var ContractManager = class _ContractManager {
10784
10911
  }
10785
10912
  return result;
10786
10913
  }
10787
- async fetchContractVtxosBulk(contracts, pageSize = chunk5J5PDZRR_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
10914
+ async fetchContractVtxosBulk(contracts, pageSize = chunk6FTHFJAN_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
10788
10915
  if (contracts.length === 0) {
10789
10916
  return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
10790
10917
  }
@@ -10800,7 +10927,7 @@ var ContractManager = class _ContractManager {
10800
10927
  before: syncWindow.before
10801
10928
  }
10802
10929
  } : {};
10803
- const vtxos = await chunk5J5PDZRR_cjs.getAllNormalizedVtxos(
10930
+ const vtxos = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(
10804
10931
  this.config.indexerProvider,
10805
10932
  contracts.map((c) => c.script),
10806
10933
  { ...windowOpts, pageSize }
@@ -10945,7 +11072,7 @@ var deserializeTapLeaf = (t) => {
10945
11072
  const s = base.hex.decode(t.s);
10946
11073
  return [cb, s];
10947
11074
  };
10948
- var deserializeVtxo = (o) => chunk5J5PDZRR_cjs.normalizeVtxo({
11075
+ var deserializeVtxo = (o) => chunk6FTHFJAN_cjs.normalizeVtxo({
10949
11076
  ...o,
10950
11077
  createdAt: new Date(o.createdAt),
10951
11078
  tapTree: base.hex.decode(o.tapTree),
@@ -11768,7 +11895,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
11768
11895
  */
11769
11896
  materializeDescriptorAt(index) {
11770
11897
  const descriptor = this.identity.descriptor;
11771
- const network = chunkP6EXRY5L_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
11898
+ const network = chunkNPM5YZBC_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
11772
11899
  const expansion = descriptorsScure.expand({ descriptor, network, index });
11773
11900
  const keyInfo = expansion.expansionMap?.["@0"];
11774
11901
  if (!keyInfo?.keyExpression) {
@@ -11916,7 +12043,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
11916
12043
  const provider = await resolveDescriptorProvider(config, setup.walletRepository);
11917
12044
  if (!provider) return void 0;
11918
12045
  const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
11919
- const expectedContractType = setup.offchainTapscript instanceof chunkP6EXRY5L_cjs.DelegateVtxo.Script ? "delegate" : "default";
12046
+ const expectedContractType = setup.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? "delegate" : "default";
11920
12047
  const factoryOpts = {
11921
12048
  walletRepository: setup.walletRepository,
11922
12049
  contractRepository: setup.contractRepository,
@@ -12117,7 +12244,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
12117
12244
  };
12118
12245
  function deriveLeafPubkey(descriptor) {
12119
12246
  try {
12120
- return chunkP6EXRY5L_cjs.deriveDescriptorLeafPubKey(descriptor);
12247
+ return chunkNPM5YZBC_cjs.deriveDescriptorLeafPubKey(descriptor);
12121
12248
  } catch (e) {
12122
12249
  throw new NonRangeableDescriptorError(
12123
12250
  "Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
@@ -12129,7 +12256,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
12129
12256
  const pubKey = deriveLeafPubkey(descriptor);
12130
12257
  const tapscript = rebuildTapscript(current, pubKey);
12131
12258
  const serverPubKey = tapscript.options.serverPubKey;
12132
- const csvTimelock = chunk5J5PDZRR_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
12259
+ const csvTimelock = chunk6FTHFJAN_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
12133
12260
  const base$1 = {
12134
12261
  script: base.hex.encode(tapscript.pkScript),
12135
12262
  address: tapscript.address(hrp, serverPubKey).encode(),
@@ -12140,11 +12267,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
12140
12267
  // index-0 key. Without it, spends produce unsigned PSBTs that the
12141
12268
  // server rejects with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
12142
12269
  metadata: {
12143
- ...tagSource && { source: chunkP6EXRY5L_cjs.WALLET_RECEIVE_SOURCE },
12270
+ ...tagSource && { source: chunkNPM5YZBC_cjs.WALLET_RECEIVE_SOURCE },
12144
12271
  signingDescriptor: descriptor
12145
12272
  }
12146
12273
  };
12147
- const params = tapscript instanceof chunkP6EXRY5L_cjs.DelegateVtxo.Script ? {
12274
+ const params = tapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? {
12148
12275
  ...base$1,
12149
12276
  type: "delegate",
12150
12277
  params: {
@@ -12165,10 +12292,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
12165
12292
  return { tapscript, params };
12166
12293
  }
12167
12294
  function rebuildTapscript(current, pubKey) {
12168
- if (current instanceof chunkP6EXRY5L_cjs.DelegateVtxo.Script) {
12169
- return new chunkP6EXRY5L_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
12295
+ if (current instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script) {
12296
+ return new chunkNPM5YZBC_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
12170
12297
  }
12171
- return new chunkP6EXRY5L_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
12298
+ return new chunkNPM5YZBC_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
12172
12299
  }
12173
12300
  async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
12174
12301
  const candidates = await contractRepository.getContracts({
@@ -12177,7 +12304,7 @@ async function pickActiveReceive(contractRepository, serverPubKey, expectedType)
12177
12304
  });
12178
12305
  const serverPubKeyHex = base.hex.encode(serverPubKey);
12179
12306
  const matching = candidates.filter(
12180
- (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkP6EXRY5L_cjs.WALLET_RECEIVE_SOURCE
12307
+ (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkNPM5YZBC_cjs.WALLET_RECEIVE_SOURCE
12181
12308
  ).sort((a, b) => {
12182
12309
  if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
12183
12310
  return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
@@ -12233,7 +12360,7 @@ function computeOffchainBalance(vtxos, caps) {
12233
12360
  }
12234
12361
  };
12235
12362
  for (const vtxo of vtxos) {
12236
- if (chunk5J5PDZRR_cjs.hasTerminalSpend(vtxo)) continue;
12363
+ if (chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo)) continue;
12237
12364
  addAssets(owned, vtxo);
12238
12365
  if (vtxo.isUnrolled) {
12239
12366
  unrolled += vtxo.value;
@@ -12243,11 +12370,11 @@ function computeOffchainBalance(vtxos, caps) {
12243
12370
  pendingRecovery += vtxo.value;
12244
12371
  continue;
12245
12372
  }
12246
- if (chunk5J5PDZRR_cjs.canRecoverOnchain(vtxo, now)) {
12373
+ if (chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now)) {
12247
12374
  recoverable += vtxo.value;
12248
12375
  continue;
12249
12376
  }
12250
- if (!chunk5J5PDZRR_cjs.canSpendOffchain(vtxo, now)) continue;
12377
+ if (!chunk6FTHFJAN_cjs.canSpendOffchain(vtxo, now)) continue;
12251
12378
  if (vtxo.isPreconfirmed) {
12252
12379
  preconfirmed += vtxo.value;
12253
12380
  } else {
@@ -12417,12 +12544,12 @@ var InputSignerRouter = class {
12417
12544
  };
12418
12545
 
12419
12546
  // src/wallet/wallet.ts
12420
- var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunk5J5PDZRR_cjs.DEFAULT_ARKADE_SERVER_URL;
12547
+ var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunk6FTHFJAN_cjs.DEFAULT_ARKADE_SERVER_URL;
12421
12548
  function intentProofJobs(coins) {
12422
12549
  if (coins.length === 0) return [];
12423
12550
  const coinJobs = coins.map((coin, i) => ({
12424
12551
  index: i + 1,
12425
- lookupScript: chunk5J5PDZRR_cjs.VtxoScript.decode(coin.tapTree).pkScript
12552
+ lookupScript: chunk6FTHFJAN_cjs.VtxoScript.decode(coin.tapTree).pkScript
12426
12553
  }));
12427
12554
  return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
12428
12555
  }
@@ -12454,7 +12581,7 @@ function dedupeTimelocks(timelocks) {
12454
12581
  const seen = /* @__PURE__ */ new Set();
12455
12582
  const deduped = [];
12456
12583
  for (const timelock of timelocks) {
12457
- const sequence = chunk5J5PDZRR_cjs.timelockToSequence(timelock).toString();
12584
+ const sequence = chunk6FTHFJAN_cjs.timelockToSequence(timelock).toString();
12458
12585
  if (seen.has(sequence)) continue;
12459
12586
  seen.add(sequence);
12460
12587
  deduped.push(timelock);
@@ -12471,7 +12598,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
12471
12598
  state: "active"
12472
12599
  });
12473
12600
  const newest = candidates.filter(
12474
- (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkP6EXRY5L_cjs.WALLET_RECEIVE_SOURCE
12601
+ (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkNPM5YZBC_cjs.WALLET_RECEIVE_SOURCE
12475
12602
  ).sort((a, b) => {
12476
12603
  if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
12477
12604
  return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
@@ -12479,7 +12606,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
12479
12606
  if (!newest?.params.pubKey) return baseline;
12480
12607
  try {
12481
12608
  const pubKey = base.hex.decode(newest.params.pubKey);
12482
- return new chunkP6EXRY5L_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
12609
+ return new chunkNPM5YZBC_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
12483
12610
  } catch (e) {
12484
12611
  console.warn("Skipping malformed boarding contract at boot", newest.script, e);
12485
12612
  return baseline;
@@ -12498,10 +12625,10 @@ function filterSnapshotVtxos(snapshot, filter, pendingSpendOutpoints) {
12498
12625
  if (vtxo.isUnrolled) {
12499
12626
  return !!f.withUnrolled;
12500
12627
  }
12501
- if (chunk5J5PDZRR_cjs.hasTerminalSpend(vtxo)) {
12628
+ if (chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo)) {
12502
12629
  return false;
12503
12630
  }
12504
- if (!f.withRecoverable && chunk5J5PDZRR_cjs.canRecoverOnchain(vtxo, now)) {
12631
+ if (!f.withRecoverable && chunk6FTHFJAN_cjs.canRecoverOnchain(vtxo, now)) {
12505
12632
  return false;
12506
12633
  }
12507
12634
  return true;
@@ -12841,7 +12968,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12841
12968
  */
12842
12969
  static async setupWalletConfig(config, pubKey) {
12843
12970
  const arkadeServerUrl = getArkadeServerUrl(config);
12844
- const arkProvider = config.arkProvider || new chunk5J5PDZRR_cjs.RestArkProvider(arkadeServerUrl);
12971
+ const arkProvider = config.arkProvider || new chunk6FTHFJAN_cjs.RestArkProvider(arkadeServerUrl);
12845
12972
  let indexerProvider = config.indexerProvider;
12846
12973
  if (!indexerProvider) {
12847
12974
  let indexerUrl = config.indexerUrl;
@@ -12858,7 +12985,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12858
12985
  indexerUrl = arkadeServerUrl;
12859
12986
  }
12860
12987
  }
12861
- indexerProvider = new chunkFM263GKH_cjs.RestIndexerProvider(indexerUrl);
12988
+ indexerProvider = new chunk4C5PMGBB_cjs.RestIndexerProvider(indexerUrl);
12862
12989
  }
12863
12990
  const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
12864
12991
  const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
@@ -12867,7 +12994,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
12867
12994
  source: serverInfoSource,
12868
12995
  lastOnlineAt: serverInfoLastOnlineAt
12869
12996
  } = await resolveArkInfo(arkProvider, walletRepository);
12870
- const network = chunk5J5PDZRR_cjs.getNetwork(info.network);
12997
+ const network = chunk6FTHFJAN_cjs.getNetwork(info.network);
12871
12998
  if ("descriptor" in config.identity) {
12872
12999
  const descriptor = config.identity.descriptor;
12873
13000
  const identityIsMainnet = !descriptor.includes("tpub");
@@ -12907,18 +13034,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
12907
13034
  value: info.boardingExitDelay,
12908
13035
  type: info.boardingExitDelay < 512n ? "blocks" : "seconds"
12909
13036
  };
12910
- const serverPubKey = chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
12911
- const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
13037
+ const serverPubKey = chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
13038
+ const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info2.pubkey), "delegate key")).catch(() => void 0) : void 0;
12912
13039
  const offchainOptions = {
12913
13040
  pubKey,
12914
13041
  serverPubKey,
12915
13042
  csvTimelock: exitTimelock
12916
13043
  };
12917
- const offchainTapscript = !delegatePubKey ? new chunkP6EXRY5L_cjs.DefaultVtxo.Script(offchainOptions) : new chunkP6EXRY5L_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
12918
- const boardingTapscript = chunkP6EXRY5L_cjs.BoardingContractHandler.createScript({
13044
+ const offchainTapscript = !delegatePubKey ? new chunkNPM5YZBC_cjs.DefaultVtxo.Script(offchainOptions) : new chunkNPM5YZBC_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
13045
+ const boardingTapscript = chunkNPM5YZBC_cjs.BoardingContractHandler.createScript({
12919
13046
  pubKey: base.hex.encode(pubKey),
12920
13047
  serverPubKey: base.hex.encode(serverPubKey),
12921
- csvTimelock: chunk5J5PDZRR_cjs.timelockToSequence(boardingTimelock).toString()
13048
+ csvTimelock: chunk6FTHFJAN_cjs.timelockToSequence(boardingTimelock).toString()
12922
13049
  });
12923
13050
  return {
12924
13051
  arkProvider,
@@ -13070,7 +13197,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13070
13197
  const vtxos = filterSnapshotVtxos(snapshot, filter, this._pendingSpendOutpoints);
13071
13198
  const { gated, pendingRecovery } = this.spendabilityView(snapshot);
13072
13199
  const selectable = vtxos.filter(
13073
- (vtxo) => !gated.has(vtxo.script) && !pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`)
13200
+ (vtxo) => !isGatedVtxo(vtxo, gated) && !pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`)
13074
13201
  );
13075
13202
  const unlocked = await spendableVtxosExcludingLocked(selectable, this.intentRepository);
13076
13203
  logExcludedVtxos("getSpendableVtxos", vtxos, [
@@ -13084,7 +13211,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13084
13211
  if (!filter?.withUnrolled) {
13085
13212
  logExcludedVtxos(
13086
13213
  "getSpendableVtxos",
13087
- snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunk5J5PDZRR_cjs.hasTerminalSpend(vtxo)),
13214
+ snapshot.flatMap((contract) => contract.vtxos).filter((vtxo) => vtxo.isUnrolled && !chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo)),
13088
13215
  [() => UNROLLED_REASON]
13089
13216
  );
13090
13217
  }
@@ -13168,7 +13295,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13168
13295
  */
13169
13296
  spendabilityView(snapshot) {
13170
13297
  return {
13171
- gated: gatedContracts(snapshot.map((_) => _.contract)),
13298
+ gated: gatedFrom(snapshot),
13172
13299
  pendingRecovery: this.selectPendingRecovery(snapshot)
13173
13300
  };
13174
13301
  }
@@ -13183,7 +13310,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13183
13310
  return {
13184
13311
  now: { timestamp: /* @__PURE__ */ new Date() },
13185
13312
  isPendingRecovery: (vtxo) => pendingRecovery.has(`${vtxo.txid}:${vtxo.vout}`),
13186
- isGenericallySpendable: (vtxo) => !gated.has(vtxo.script),
13313
+ isGenericallySpendable: (vtxo) => !isGatedVtxo(vtxo, gated),
13187
13314
  isUnlocked: (vtxo) => unlocked.has(`${vtxo.txid}:${vtxo.vout}`)
13188
13315
  };
13189
13316
  }
@@ -13223,16 +13350,18 @@ var ReadonlyWallet = class _ReadonlyWallet {
13223
13350
  * Return wallet transaction history derived from Arkade state and boarding transactions.
13224
13351
  */
13225
13352
  async getTransactionHistory() {
13226
- const contractManager = await this.getContractManager();
13227
- const response = await contractManager.getContractsWithVtxos();
13228
- const allVtxos = response.flatMap((_) => _.vtxos);
13229
- const { boardingTxs, commitmentsToIgnore } = await this.getBoardingTxs();
13230
- const resolveTxCreatedAt = (txids) => chunk5J5PDZRR_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
13353
+ const [snapshot, { boardingTxs, commitmentsToIgnore }] = await Promise.all([
13354
+ this.contractSnapshot(),
13355
+ this.getBoardingTxs()
13356
+ ]);
13357
+ const allVtxos = snapshot.flatMap((_) => _.vtxos);
13358
+ const resolveTxCreatedAt = (txids) => chunk6FTHFJAN_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
13231
13359
  return buildTransactionHistory(
13232
13360
  allVtxos,
13233
13361
  boardingTxs,
13234
13362
  commitmentsToIgnore,
13235
- resolveTxCreatedAt
13363
+ resolveTxCreatedAt,
13364
+ gatedFrom(snapshot)
13236
13365
  );
13237
13366
  }
13238
13367
  /**
@@ -13321,7 +13450,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13321
13450
  },
13322
13451
  isUnrolled: true,
13323
13452
  ...boardingFacts,
13324
- virtualStatus: chunk5J5PDZRR_cjs.toVirtualStatus(boardingFacts),
13453
+ virtualStatus: chunk6FTHFJAN_cjs.toVirtualStatus(boardingFacts),
13325
13454
  spentBy: "",
13326
13455
  createdAt: tx.status.confirmed ? new Date(tx.status.block_time * 1e3) : /* @__PURE__ */ new Date(0),
13327
13456
  script: scriptHex
@@ -13377,9 +13506,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
13377
13506
  async getBoardingTapscripts(allowedSigners) {
13378
13507
  const byScript = /* @__PURE__ */ new Map();
13379
13508
  const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
13380
- const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkP6EXRY5L_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13509
+ const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13381
13510
  add(
13382
- new chunkP6EXRY5L_cjs.DefaultVtxo.Script({
13511
+ new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
13383
13512
  pubKey: await this.identity.xOnlyPublicKey(),
13384
13513
  serverPubKey: this.boardingTapscript.options.serverPubKey,
13385
13514
  csvTimelock: boardingCsv
@@ -13394,7 +13523,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13394
13523
  for (const c of boardingContracts) {
13395
13524
  if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
13396
13525
  try {
13397
- add(chunkP6EXRY5L_cjs.BoardingContractHandler.createScript(c.params));
13526
+ add(chunkNPM5YZBC_cjs.BoardingContractHandler.createScript(c.params));
13398
13527
  } catch (e) {
13399
13528
  console.warn("Skipping malformed boarding contract", c.script, e);
13400
13529
  }
@@ -13432,7 +13561,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13432
13561
  // Per-row CSV delay decoded from THIS tapscript's exit leaf —
13433
13562
  // not the wallet's current boarding timelock, which a signer
13434
13563
  // rotation may have changed.
13435
- csvTimelock: chunk5J5PDZRR_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
13564
+ csvTimelock: chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
13436
13565
  coins: utxos
13437
13566
  });
13438
13567
  }
@@ -13565,7 +13694,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13565
13694
  /** Fetch Arkade transaction ids that are still pending final settlement. */
13566
13695
  async fetchPendingTxs() {
13567
13696
  const scripts = await this.getWalletScripts();
13568
- const vtxos = await chunk5J5PDZRR_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
13697
+ const vtxos = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
13569
13698
  return vtxos.filter(
13570
13699
  (vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
13571
13700
  ).map((_) => _.arkTxId);
@@ -13596,7 +13725,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13596
13725
  });
13597
13726
  for (const contract of contracts) {
13598
13727
  if (map.has(contract.script)) continue;
13599
- const handler = chunkP6EXRY5L_cjs.contractHandlers.get(contract.type);
13728
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
13600
13729
  if (handler) {
13601
13730
  const script = handler.createScript(contract.params);
13602
13731
  map.set(contract.script, script);
@@ -13708,7 +13837,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13708
13837
  }
13709
13838
  });
13710
13839
  const baselinePubkey = await this.identity.xOnlyPublicKey();
13711
- const delegatePubKey = this.offchainTapscript instanceof chunkP6EXRY5L_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
13840
+ const delegatePubKey = this.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
13712
13841
  const baselineSigners = [
13713
13842
  this.offchainTapscript.options.serverPubKey,
13714
13843
  ...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
@@ -13716,8 +13845,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
13716
13845
  const seenBaselineScripts = /* @__PURE__ */ new Set();
13717
13846
  for (const serverPubKey of baselineSigners) {
13718
13847
  for (const csvTimelock of this.walletContractTimelocks) {
13719
- const csvTimelockStr = chunk5J5PDZRR_cjs.timelockToSequence(csvTimelock).toString();
13720
- const defaultScript = new chunkP6EXRY5L_cjs.DefaultVtxo.Script({
13848
+ const csvTimelockStr = chunk6FTHFJAN_cjs.timelockToSequence(csvTimelock).toString();
13849
+ const defaultScript = new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
13721
13850
  pubKey: baselinePubkey,
13722
13851
  serverPubKey,
13723
13852
  csvTimelock
@@ -13738,7 +13867,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13738
13867
  });
13739
13868
  }
13740
13869
  if (delegatePubKey) {
13741
- const delegateScript = new chunkP6EXRY5L_cjs.DelegateVtxo.Script({
13870
+ const delegateScript = new chunkNPM5YZBC_cjs.DelegateVtxo.Script({
13742
13871
  pubKey: baselinePubkey,
13743
13872
  serverPubKey,
13744
13873
  delegatePubKey,
@@ -13762,9 +13891,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
13762
13891
  }
13763
13892
  }
13764
13893
  }
13765
- const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkP6EXRY5L_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13894
+ const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
13766
13895
  for (const serverPubKey of baselineSigners) {
13767
- const baselineBoarding = new chunkP6EXRY5L_cjs.DefaultVtxo.Script({
13896
+ const baselineBoarding = new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
13768
13897
  pubKey: baselinePubkey,
13769
13898
  serverPubKey,
13770
13899
  csvTimelock: boardingCsvTimelock
@@ -13777,7 +13906,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
13777
13906
  params: {
13778
13907
  pubKey: base.hex.encode(baselineBoarding.options.pubKey),
13779
13908
  serverPubKey: base.hex.encode(serverPubKey),
13780
- csvTimelock: chunk5J5PDZRR_cjs.timelockToSequence(boardingCsvTimelock).toString()
13909
+ csvTimelock: chunk6FTHFJAN_cjs.timelockToSequence(boardingCsvTimelock).toString()
13781
13910
  },
13782
13911
  script: boardingScriptHex,
13783
13912
  address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
@@ -13977,7 +14106,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13977
14106
  serverPubKey: this.offchainTapscript.options.serverPubKey,
13978
14107
  deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
13979
14108
  csvTimelocks: this.walletContractTimelocks,
13980
- delegatePubKey: this.offchainTapscript instanceof chunkP6EXRY5L_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
14109
+ delegatePubKey: this.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
13981
14110
  };
13982
14111
  }
13983
14112
  _signerRouter;
@@ -14222,7 +14351,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14222
14351
  const [row] = await manager.getContracts({ script: base.hex.encode(display.pkScript) });
14223
14352
  const persisted = row?.metadata?.signingDescriptor;
14224
14353
  if (typeof persisted === "string") return persisted;
14225
- return chunkP6EXRY5L_cjs.identityDescriptor(this.identity);
14354
+ return chunkNPM5YZBC_cjs.identityDescriptor(this.identity);
14226
14355
  }
14227
14356
  /**
14228
14357
  * Build, persist and shape one address of `type` owned by `descriptor` —
@@ -14238,7 +14367,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14238
14367
  async mintAddress(manager, type, descriptor, tagSource, allocated) {
14239
14368
  if (type === "boarding") {
14240
14369
  const built2 = this.buildBoardingContract(
14241
- chunkP6EXRY5L_cjs.deriveDescriptorLeafPubKey(descriptor),
14370
+ chunkNPM5YZBC_cjs.deriveDescriptorLeafPubKey(descriptor),
14242
14371
  descriptor,
14243
14372
  tagSource
14244
14373
  );
@@ -14283,11 +14412,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14283
14412
  * {@link buildReceiveContract}.
14284
14413
  */
14285
14414
  buildBoardingContract(pubKey, descriptor, tagSource) {
14286
- const tapscript = new chunkP6EXRY5L_cjs.DefaultVtxo.Script({
14415
+ const tapscript = new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
14287
14416
  ...this._boardingTapscript.options,
14288
14417
  pubKey
14289
14418
  });
14290
- const csvTimelock = tapscript.options.csvTimelock ?? chunkP6EXRY5L_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14419
+ const csvTimelock = tapscript.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14291
14420
  return {
14292
14421
  tapscript,
14293
14422
  params: {
@@ -14295,13 +14424,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14295
14424
  params: {
14296
14425
  pubKey: base.hex.encode(pubKey),
14297
14426
  serverPubKey: base.hex.encode(tapscript.options.serverPubKey),
14298
- csvTimelock: chunk5J5PDZRR_cjs.timelockToSequence(csvTimelock).toString()
14427
+ csvTimelock: chunk6FTHFJAN_cjs.timelockToSequence(csvTimelock).toString()
14299
14428
  },
14300
14429
  script: base.hex.encode(tapscript.pkScript),
14301
14430
  address: tapscript.address(this.network.hrp, this.arkServerPublicKey).encode(),
14302
14431
  state: "active",
14303
14432
  metadata: {
14304
- ...tagSource && { source: chunkP6EXRY5L_cjs.WALLET_RECEIVE_SOURCE },
14433
+ ...tagSource && { source: chunkNPM5YZBC_cjs.WALLET_RECEIVE_SOURCE },
14305
14434
  signingDescriptor: descriptor
14306
14435
  }
14307
14436
  }
@@ -14330,7 +14459,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14330
14459
  if (this._descriptorProvider instanceof HDDescriptorProvider) {
14331
14460
  return (await this.getContractManager()).getNextSigningDescriptor();
14332
14461
  }
14333
- return chunkP6EXRY5L_cjs.identityDescriptor(this.identity);
14462
+ return chunkNPM5YZBC_cjs.identityDescriptor(this.identity);
14334
14463
  }
14335
14464
  /**
14336
14465
  * @see HDAllocationCapable.advanceSigningDescriptorWatermark
@@ -14426,7 +14555,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14426
14555
  * the stable public API.
14427
14556
  */
14428
14557
  async rotateServerSigner(newServerPubKey, checkpointTapscript) {
14429
- const xonly = chunkP6EXRY5L_cjs.toXOnly(newServerPubKey, "ark signer key");
14558
+ const xonly = chunkNPM5YZBC_cjs.toXOnly(newServerPubKey, "ark signer key");
14430
14559
  const newServerUnrollScript = assertValidServerUnrollScript(
14431
14560
  checkpointTapscript,
14432
14561
  resolveCheckpointExitDelayPolicy(this.network, this.checkpointExitDelayPolicy)
@@ -14455,21 +14584,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14455
14584
  const [currentBoardingRow] = await manager.getContracts({
14456
14585
  script: currentBoardingScript
14457
14586
  });
14458
- const newOffchain = this.offchainTapscript instanceof chunkP6EXRY5L_cjs.DelegateVtxo.Script ? new chunkP6EXRY5L_cjs.DelegateVtxo.Script({
14587
+ const newOffchain = this.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? new chunkNPM5YZBC_cjs.DelegateVtxo.Script({
14459
14588
  ...this.offchainTapscript.options,
14460
14589
  serverPubKey: xonly
14461
- }) : new chunkP6EXRY5L_cjs.DefaultVtxo.Script({
14590
+ }) : new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
14462
14591
  ...this.offchainTapscript.options,
14463
14592
  serverPubKey: xonly
14464
14593
  });
14465
- const newBoarding = new chunkP6EXRY5L_cjs.DefaultVtxo.Script({
14594
+ const newBoarding = new chunkNPM5YZBC_cjs.DefaultVtxo.Script({
14466
14595
  ...this._boardingTapscript.options,
14467
14596
  serverPubKey: xonly
14468
14597
  });
14469
- const offchainCsv = chunk5J5PDZRR_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
14598
+ const offchainCsv = chunk6FTHFJAN_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
14470
14599
  const newOffchainScript = base.hex.encode(newOffchain.pkScript);
14471
14600
  const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
14472
- if (newOffchain instanceof chunkP6EXRY5L_cjs.DelegateVtxo.Script) {
14601
+ if (newOffchain instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script) {
14473
14602
  await manager.createContract({
14474
14603
  type: "delegate",
14475
14604
  params: {
@@ -14497,13 +14626,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14497
14626
  metadata: currentOffchainRow?.metadata
14498
14627
  });
14499
14628
  }
14500
- const boardingCsv = newBoarding.options.csvTimelock ?? chunkP6EXRY5L_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14629
+ const boardingCsv = newBoarding.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
14501
14630
  await manager.createContract({
14502
14631
  type: "boarding",
14503
14632
  params: {
14504
14633
  pubKey: base.hex.encode(newBoarding.options.pubKey),
14505
14634
  serverPubKey: base.hex.encode(xonly),
14506
- csvTimelock: chunk5J5PDZRR_cjs.timelockToSequence(boardingCsv).toString()
14635
+ csvTimelock: chunk6FTHFJAN_cjs.timelockToSequence(boardingCsv).toString()
14507
14636
  },
14508
14637
  script: base.hex.encode(newBoarding.pkScript),
14509
14638
  address: newBoarding.address(this.network.hrp, xonly).encode(),
@@ -14536,14 +14665,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14536
14665
  _restoreInFlight;
14537
14666
  _addPendingSpends(inputs) {
14538
14667
  for (const input of inputs) {
14539
- if (chunk5J5PDZRR_cjs.isVirtualCoin(input)) {
14668
+ if (chunk6FTHFJAN_cjs.isVirtualCoin(input)) {
14540
14669
  this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
14541
14670
  }
14542
14671
  }
14543
14672
  }
14544
14673
  _removePendingSpends(inputs) {
14545
14674
  for (const input of inputs) {
14546
- if (chunk5J5PDZRR_cjs.isVirtualCoin(input)) {
14675
+ if (chunk6FTHFJAN_cjs.isVirtualCoin(input)) {
14547
14676
  this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
14548
14677
  }
14549
14678
  }
@@ -14592,7 +14721,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14592
14721
  `restore: gapLimit must be a positive integer (got ${String(opts?.gapLimit)})`
14593
14722
  );
14594
14723
  }
14595
- this._restoreInFlight = this._runRestore(gapLimit).finally(() => {
14724
+ this._restoreInFlight = (async () => {
14725
+ await this._runRestore(gapLimit);
14726
+ await runWalletRestoreHooks(this);
14727
+ })().finally(() => {
14596
14728
  this._restoreInFlight = void 0;
14597
14729
  });
14598
14730
  return this._restoreInFlight;
@@ -14601,13 +14733,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14601
14733
  const manager = await this.getContractManager();
14602
14734
  const provider = this._descriptorProvider;
14603
14735
  const hd = provider instanceof HDDescriptorProvider;
14604
- const staticDescriptor = hd ? void 0 : await chunkP6EXRY5L_cjs.identityDescriptor(this.identity);
14736
+ const staticDescriptor = hd ? void 0 : await chunkNPM5YZBC_cjs.identityDescriptor(this.identity);
14605
14737
  const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
14606
- const delegatePubKey = this.offchainTapscript instanceof chunkP6EXRY5L_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
14738
+ const delegatePubKey = this.offchainTapscript instanceof chunkNPM5YZBC_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
14607
14739
  const arkInfo = await this.arkProvider.getInfo();
14608
- const currentSignerPubKey = chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
14740
+ const currentSignerPubKey = chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(arkInfo.signerPubkey), "ark signer key");
14609
14741
  const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
14610
- (s) => chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
14742
+ (s) => chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(s.pubkey), "deprecated signer key")
14611
14743
  );
14612
14744
  const deps = {
14613
14745
  indexerProvider: this.indexerProvider,
@@ -14622,7 +14754,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14622
14754
  csvTimelocks: this.walletContractTimelocks,
14623
14755
  // Boarding-exit CSV so the boarding handler can build its
14624
14756
  // candidate script (distinct from the unilateral-exit matrix).
14625
- boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkP6EXRY5L_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
14757
+ boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkNPM5YZBC_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
14626
14758
  delegatePubKey
14627
14759
  };
14628
14760
  const result = await manager.scanContracts({
@@ -14736,7 +14868,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14736
14868
  throw new Error("Invalid configured public key");
14737
14869
  }
14738
14870
  const setup = await ReadonlyWallet.setupWalletConfig(config, pubkey);
14739
- const forfeitPubkey = chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
14871
+ const forfeitPubkey = chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(setup.info.forfeitPubkey), "forfeit key");
14740
14872
  const forfeitAddress = btcSigner.Address(setup.network).decode(setup.info.forfeitAddress);
14741
14873
  const forfeitOutputScript = btcSigner.OutScript.encode(forfeitAddress);
14742
14874
  const checkpointExitDelayOverrides = {
@@ -14885,7 +15017,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14885
15017
  inputs: params.selectedVtxos,
14886
15018
  changeAmount: BigInt(changeAmount)
14887
15019
  };
14888
- const outputAddress = chunk5J5PDZRR_cjs.ArkAddress.decode(params.address);
15020
+ const outputAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(params.address);
14889
15021
  assertRecipientArkAddress(
14890
15022
  params.address,
14891
15023
  outputAddress,
@@ -14951,13 +15083,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14951
15083
  void this.logUngatedInputs("settle({ inputs })", params.inputs);
14952
15084
  }
14953
15085
  const offchainAddress = await this.getAddress();
14954
- const offchainPkScript = chunk5J5PDZRR_cjs.ArkAddress.decode(offchainAddress).pkScript;
15086
+ const offchainPkScript = chunk6FTHFJAN_cjs.ArkAddress.decode(offchainAddress).pkScript;
14955
15087
  const offchainOutputScript = base.hex.encode(offchainPkScript);
14956
15088
  if (!params) {
14957
15089
  const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
14958
15090
  const estimator = new Estimator(fees.intentFee);
14959
15091
  let amount = 0;
14960
- const exitScript = chunk5J5PDZRR_cjs.CSVMultisigTapscript.decode(
15092
+ const exitScript = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(
14961
15093
  base.hex.decode(this.boardingTapscript.exitScript)
14962
15094
  );
14963
15095
  const boardingTimelock = exitScript.params.timelock;
@@ -14986,7 +15118,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14986
15118
  if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
14987
15119
  break;
14988
15120
  }
14989
- const inputFee = estimator.evalOffchainInput(chunk5J5PDZRR_cjs.toOffchainInputFeeParams(vtxo));
15121
+ const inputFee = estimator.evalOffchainInput(chunk6FTHFJAN_cjs.toOffchainInputFeeParams(vtxo));
14990
15122
  if (inputFee.satoshis >= vtxo.value) {
14991
15123
  continue;
14992
15124
  }
@@ -15033,7 +15165,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15033
15165
  let script;
15034
15166
  let arkAddress;
15035
15167
  try {
15036
- arkAddress = chunk5J5PDZRR_cjs.ArkAddress.decode(output.address);
15168
+ arkAddress = chunk6FTHFJAN_cjs.ArkAddress.decode(output.address);
15037
15169
  } catch {
15038
15170
  arkAddress = void 0;
15039
15171
  }
@@ -15123,7 +15255,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15123
15255
  const abortController = new AbortController();
15124
15256
  let stream;
15125
15257
  let committedTxid;
15126
- const settleInputVtxos = params.inputs.filter(chunk5J5PDZRR_cjs.isVirtualCoin);
15258
+ const settleInputVtxos = params.inputs.filter(chunk6FTHFJAN_cjs.isVirtualCoin);
15127
15259
  const contractManager = await this.getContractManager();
15128
15260
  await contractManager.assertAnnotatable(settleInputVtxos);
15129
15261
  await contractManager.assertSpendableNow?.(
@@ -15235,7 +15367,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15235
15367
  async maybeRotateBoardingAfterBoard(inputs) {
15236
15368
  if (!this._descriptorProvider) return;
15237
15369
  const consumedBoarding = inputs.some(
15238
- (input) => typeof input !== "string" && !chunk5J5PDZRR_cjs.isVirtualCoin(input)
15370
+ (input) => typeof input !== "string" && !chunk6FTHFJAN_cjs.isVirtualCoin(input)
15239
15371
  );
15240
15372
  if (!consumedBoarding) return;
15241
15373
  try {
@@ -15259,7 +15391,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15259
15391
  let connectorIndex = 0;
15260
15392
  const connectorsLeaves = connectorsGraph?.leaves() || [];
15261
15393
  for (const input of inputs) {
15262
- if (!chunk5J5PDZRR_cjs.isVirtualCoin(input)) {
15394
+ if (!chunk6FTHFJAN_cjs.isVirtualCoin(input)) {
15263
15395
  for (let i = 0; i < settlementPsbt.inputsLength; i++) {
15264
15396
  const settlementInput = settlementPsbt.getInput(i);
15265
15397
  if (!settlementInput.txid || settlementInput.index === void 0) {
@@ -15290,7 +15422,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15290
15422
  }
15291
15423
  continue;
15292
15424
  }
15293
- if (chunk5J5PDZRR_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
15425
+ if (chunk6FTHFJAN_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
15294
15426
  continue;
15295
15427
  }
15296
15428
  if (connectorsLeaves.length === 0) {
@@ -15318,7 +15450,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15318
15450
  index: input.vout,
15319
15451
  witnessUtxo: {
15320
15452
  amount: BigInt(input.value),
15321
- script: chunk5J5PDZRR_cjs.VtxoScript.decode(input.tapTree).pkScript
15453
+ script: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
15322
15454
  },
15323
15455
  sighashType: btcSigner.SigHash.DEFAULT,
15324
15456
  tapLeafScript: [input.forfeitTapLeafScript]
@@ -15337,7 +15469,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15337
15469
  forfeitTx = await this._signerRouter.sign(forfeitTx, [
15338
15470
  {
15339
15471
  index: 0,
15340
- lookupScript: chunk5J5PDZRR_cjs.VtxoScript.decode(input.tapTree).pkScript
15472
+ lookupScript: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
15341
15473
  }
15342
15474
  ]);
15343
15475
  signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
@@ -15395,7 +15527,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15395
15527
  resolveBatchExpiryPolicy(this.network, this.batchExpiryPolicy)
15396
15528
  );
15397
15529
  await this.arkProvider.confirmRegistration(intentId);
15398
- const sweepTapscript = chunk5J5PDZRR_cjs.CSVMultisigTapscript.encode({
15530
+ const sweepTapscript = chunk6FTHFJAN_cjs.CSVMultisigTapscript.encode({
15399
15531
  timelock,
15400
15532
  pubkeys: [this.forfeitPubkey]
15401
15533
  }).script;
@@ -15410,10 +15542,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15410
15542
  throw new Error("Sweep tap tree root not set");
15411
15543
  }
15412
15544
  const xOnlyPublicKeys = event.cosignersPublicKeys.map(
15413
- (k) => base.hex.encode(chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
15545
+ (k) => base.hex.encode(chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
15414
15546
  );
15415
15547
  const signerPublicKey = await session.getPublicKey();
15416
- const xonlySignerPublicKey = chunkP6EXRY5L_cjs.toXOnly(signerPublicKey, "signer key");
15548
+ const xonlySignerPublicKey = chunkNPM5YZBC_cjs.toXOnly(signerPublicKey, "signer key");
15417
15549
  if (!xOnlyPublicKeys.includes(base.hex.encode(xonlySignerPublicKey))) {
15418
15550
  return { skip: true };
15419
15551
  }
@@ -15503,9 +15635,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15503
15635
  ...existing ?? {},
15504
15636
  intentTxId,
15505
15637
  registerProof: intent.proof,
15506
- registerProofMessage: chunk5J5PDZRR_cjs.Intent.encodeMessage(intent.message),
15638
+ registerProofMessage: chunk6FTHFJAN_cjs.Intent.encodeMessage(intent.message),
15507
15639
  deleteProof: deleteIntent.proof,
15508
- deleteProofMessage: chunk5J5PDZRR_cjs.Intent.encodeMessage(deleteIntent.message),
15640
+ deleteProofMessage: chunk6FTHFJAN_cjs.Intent.encodeMessage(deleteIntent.message),
15509
15641
  intentVtxos: inputs.map((i) => ({
15510
15642
  txid: i.txid,
15511
15643
  vout: i.vout
@@ -15537,7 +15669,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15537
15669
  try {
15538
15670
  return await this.arkProvider.registerIntent(intent);
15539
15671
  } catch (error) {
15540
- if (error instanceof chunk5J5PDZRR_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
15672
+ if (error instanceof chunk6FTHFJAN_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
15541
15673
  const deleteIntent = await this.makeDeleteIntentSignature(inputs);
15542
15674
  await this.arkProvider.deleteIntent(deleteIntent);
15543
15675
  return this.arkProvider.registerIntent(intent);
@@ -15553,7 +15685,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15553
15685
  expire_at: 0,
15554
15686
  cosigners_public_keys: cosignerPubKeys
15555
15687
  };
15556
- const proof = chunk5J5PDZRR_cjs.Intent.create(message, coins, outputs);
15688
+ const proof = chunk6FTHFJAN_cjs.Intent.create(message, coins, outputs);
15557
15689
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
15558
15690
  return {
15559
15691
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -15565,7 +15697,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15565
15697
  type: "delete",
15566
15698
  expire_at: 0
15567
15699
  };
15568
- const proof = chunk5J5PDZRR_cjs.Intent.create(message, coins, []);
15700
+ const proof = chunk6FTHFJAN_cjs.Intent.create(message, coins, []);
15569
15701
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
15570
15702
  return {
15571
15703
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -15577,7 +15709,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15577
15709
  type: "get-pending-tx",
15578
15710
  expire_at: 0
15579
15711
  };
15580
- const proof = chunk5J5PDZRR_cjs.Intent.create(message, coins, []);
15712
+ const proof = chunk6FTHFJAN_cjs.Intent.create(message, coins, []);
15581
15713
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
15582
15714
  return {
15583
15715
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -15598,7 +15730,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15598
15730
  if (!vtxos || vtxos.length === 0) {
15599
15731
  const scriptMap = await this.getScriptMap();
15600
15732
  const allExtended = [];
15601
- const fetchedVtxos = await chunk5J5PDZRR_cjs.getAllNormalizedVtxos(this.indexerProvider, [
15733
+ const fetchedVtxos = await chunk6FTHFJAN_cjs.getAllNormalizedVtxos(this.indexerProvider, [
15602
15734
  ...scriptMap.keys()
15603
15735
  ]);
15604
15736
  for (const vtxo of fetchedVtxos) {
@@ -15642,7 +15774,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15642
15774
  try {
15643
15775
  const checkpointTxs = pendingTx.signedCheckpointTxs.map((c) => {
15644
15776
  const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(c));
15645
- chunk5J5PDZRR_cjs.assertAllowedSighashTypes(tx);
15777
+ chunk6FTHFJAN_cjs.assertAllowedSighashTypes(tx);
15646
15778
  return tx;
15647
15779
  });
15648
15780
  assertCheckpointsMatchInputs(
@@ -15714,11 +15846,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15714
15846
  * against the current key alone would leave it pending forever.
15715
15847
  */
15716
15848
  checkpointUnrollCandidates(info) {
15717
- const current = chunk5J5PDZRR_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
15849
+ const current = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
15718
15850
  const candidates = [this._serverUnrollScript, current];
15719
15851
  for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
15720
15852
  candidates.push(
15721
- chunk5J5PDZRR_cjs.CSVMultisigTapscript.encode({
15853
+ chunk6FTHFJAN_cjs.CSVMultisigTapscript.encode({
15722
15854
  ...current.params,
15723
15855
  pubkeys: [base.hex.decode(deprecated)]
15724
15856
  })
@@ -15809,7 +15941,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15809
15941
  if (vtxos.length === 0) {
15810
15942
  throw new Error("No VTXOs found for this arkadeCash");
15811
15943
  }
15812
- const myPkScript = chunk5J5PDZRR_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
15944
+ const myPkScript = chunk6FTHFJAN_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
15813
15945
  let { spendable, unclaimed } = this.classifyCashVtxos(vtxos);
15814
15946
  let swept = 0;
15815
15947
  const drainable = vtxos.filter(
@@ -15885,7 +16017,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15885
16017
  const spendable = [];
15886
16018
  const unclaimed = [];
15887
16019
  for (const vtxo of vtxos) {
15888
- if (chunk5J5PDZRR_cjs.hasTerminalSpend(vtxo)) {
16020
+ if (chunk6FTHFJAN_cjs.hasTerminalSpend(vtxo)) {
15889
16021
  unclaimed.push(cashReport(vtxo, "already-spent"));
15890
16022
  } else if (vtxo.isUnrolled) {
15891
16023
  unclaimed.push(cashReport(vtxo, "exited"));
@@ -15907,7 +16039,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15907
16039
  const all = [];
15908
16040
  const seen = /* @__PURE__ */ new Set();
15909
16041
  for (let pageIndex = 0; ; pageIndex++) {
15910
- const { vtxos, page } = await chunk5J5PDZRR_cjs.getNormalizedVtxos(this.indexerProvider, {
16042
+ const { vtxos, page } = await chunk6FTHFJAN_cjs.getNormalizedVtxos(this.indexerProvider, {
15911
16043
  scripts,
15912
16044
  pageIndex,
15913
16045
  pageSize
@@ -15954,7 +16086,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15954
16086
  for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
15955
16087
  const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
15956
16088
  const message = { type: "get-pending-tx", expire_at: 0 };
15957
- const proof = chunk5J5PDZRR_cjs.Intent.create(message, batch, []);
16089
+ const proof = chunk6FTHFJAN_cjs.Intent.create(message, batch, []);
15958
16090
  const signedProof = await identity.sign(
15959
16091
  proof,
15960
16092
  Array.from({ length: batch.length + 1 }, (_, j) => j)
@@ -15976,7 +16108,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
15976
16108
  try {
15977
16109
  const checkpointTxs = pendingTx.signedCheckpointTxs.map((checkpoint) => {
15978
16110
  const tx = btcSigner.Transaction.fromPSBT(base.base64.decode(checkpoint));
15979
- chunk5J5PDZRR_cjs.assertAllowedSighashTypes(tx);
16111
+ chunk6FTHFJAN_cjs.assertAllowedSighashTypes(tx);
15980
16112
  return tx;
15981
16113
  });
15982
16114
  assertCheckpointsMatchInputs(
@@ -16175,7 +16307,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16175
16307
  script: recipient.script,
16176
16308
  amount: BigInt(recipient.amount),
16177
16309
  // Already checked against the recipient address in `validateRecipients`.
16178
- ...recipient.tapTree ? { tapTree: chunk5J5PDZRR_cjs.TapTreeCoder.decode(recipient.tapTree) } : {}
16310
+ ...recipient.tapTree ? { tapTree: chunk6FTHFJAN_cjs.TapTreeCoder.decode(recipient.tapTree) } : {}
16179
16311
  }));
16180
16312
  const totalBtcOutput = outputs.reduce((sum, o) => sum + Number(o.amount), 0);
16181
16313
  let changeAmount = totalBtcSelected - totalBtcOutput;
@@ -16319,10 +16451,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16319
16451
  const serverPubKey = this.arkServerPublicKey;
16320
16452
  const serverUnrollScript = this.serverUnrollScript;
16321
16453
  const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
16322
- const normalizedInputs = inputs.map(chunk5J5PDZRR_cjs.normalizeVtxo);
16323
- const at = now ?? await chunk5J5PDZRR_cjs.resolveTimeHeight(this.onchainProvider);
16454
+ const normalizedInputs = inputs.map(chunk6FTHFJAN_cjs.normalizeVtxo);
16455
+ const at = now ?? await chunk6FTHFJAN_cjs.resolveTimeHeight(this.onchainProvider);
16324
16456
  for (const input of normalizedInputs) {
16325
- if (!chunk5J5PDZRR_cjs.canSpendOffchain(input, at)) {
16457
+ if (!chunk6FTHFJAN_cjs.canSpendOffchain(input, at)) {
16326
16458
  throw new Error(
16327
16459
  `sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
16328
16460
  );
@@ -16392,7 +16524,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16392
16524
  );
16393
16525
  const arkTxJobs = inputs.map((input, index) => ({
16394
16526
  index,
16395
- lookupScript: chunk5J5PDZRR_cjs.VtxoScript.decode(input.tapTree).pkScript
16527
+ lookupScript: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
16396
16528
  }));
16397
16529
  const identity = this.identity;
16398
16530
  const signer = {
@@ -16478,14 +16610,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16478
16610
  const spentBy = checkpointIdByOutpoint.get(`${vtxo.txid}:${vtxo.vout}`);
16479
16611
  spentVtxos.push({
16480
16612
  ...spentFacts,
16481
- virtualStatus: chunk5J5PDZRR_cjs.toVirtualStatus(spentFacts),
16613
+ virtualStatus: chunk6FTHFJAN_cjs.toVirtualStatus(spentFacts),
16482
16614
  ...spentBy ? { spentBy } : {},
16483
16615
  arkTxId: arkTxid
16484
16616
  });
16485
16617
  for (const id of vtxo.commitmentTxIds) {
16486
16618
  commitmentTxIds.add(id);
16487
16619
  }
16488
- const vtxoExpiry = chunk5J5PDZRR_cjs.toBatchExpiry(vtxo);
16620
+ const vtxoExpiry = chunk6FTHFJAN_cjs.toBatchExpiry(vtxo);
16489
16621
  if (vtxoExpiry) {
16490
16622
  batchExpiry = Math.min(batchExpiry, vtxoExpiry);
16491
16623
  }
@@ -16498,7 +16630,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16498
16630
  isSwept: false,
16499
16631
  isPreconfirmed: true,
16500
16632
  commitmentTxIds: Array.from(commitmentTxIds),
16501
- ...chunk5J5PDZRR_cjs.parseLegacyExpiry(batchExpiry)
16633
+ ...chunk6FTHFJAN_cjs.parseLegacyExpiry(batchExpiry)
16502
16634
  };
16503
16635
  changeVtxo = {
16504
16636
  txid: arkTxid,
@@ -16510,7 +16642,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16510
16642
  tapTree: offchainTapscript.encode(),
16511
16643
  value: Number(changeAmount),
16512
16644
  ...changeFacts,
16513
- virtualStatus: chunk5J5PDZRR_cjs.toVirtualStatus(changeFacts),
16645
+ virtualStatus: chunk6FTHFJAN_cjs.toVirtualStatus(changeFacts),
16514
16646
  spentBy: "",
16515
16647
  status: {
16516
16648
  confirmed: false
@@ -16579,12 +16711,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16579
16711
  const spentVtxos = [];
16580
16712
  const inputArkTxIds = /* @__PURE__ */ new Set();
16581
16713
  const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
16582
- const vtxoInputs = inputs.filter(chunk5J5PDZRR_cjs.isVirtualCoin);
16714
+ const vtxoInputs = inputs.filter(chunk6FTHFJAN_cjs.isVirtualCoin);
16583
16715
  const cm = await this.getContractManager();
16584
16716
  const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
16585
16717
  const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
16586
16718
  for (const input of inputs) {
16587
- if (chunk5J5PDZRR_cjs.isVirtualCoin(input)) {
16719
+ if (chunk6FTHFJAN_cjs.isVirtualCoin(input)) {
16588
16720
  const outpoint = `${input.txid}:${input.vout}`;
16589
16721
  const vtxo = annotatedByKey.get(outpoint);
16590
16722
  if (!vtxo) {
@@ -16596,13 +16728,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16596
16728
  const settledFacts = { ...vtxo, isSpent: true };
16597
16729
  spentVtxos.push({
16598
16730
  ...settledFacts,
16599
- virtualStatus: chunk5J5PDZRR_cjs.toVirtualStatus(settledFacts),
16731
+ virtualStatus: chunk6FTHFJAN_cjs.toVirtualStatus(settledFacts),
16600
16732
  settledBy: commitmentTxid
16601
16733
  });
16602
16734
  } else {
16603
16735
  let sourceAddress;
16604
16736
  try {
16605
- sourceAddress = chunk5J5PDZRR_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
16737
+ sourceAddress = chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
16606
16738
  this.network
16607
16739
  );
16608
16740
  } catch {
@@ -16660,9 +16792,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
16660
16792
  }
16661
16793
  };
16662
16794
  function selectVirtualCoins(coins, targetAmount) {
16663
- const sortedCoins = coins.map(chunk5J5PDZRR_cjs.normalizeVtxo).sort((a, b) => {
16664
- const expiryA = chunk5J5PDZRR_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
16665
- const expiryB = chunk5J5PDZRR_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
16795
+ const sortedCoins = coins.map(chunk6FTHFJAN_cjs.normalizeVtxo).sort((a, b) => {
16796
+ const expiryA = chunk6FTHFJAN_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
16797
+ const expiryB = chunk6FTHFJAN_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
16666
16798
  if (expiryA !== expiryB) {
16667
16799
  return expiryA - expiryB;
16668
16800
  }
@@ -17031,7 +17163,7 @@ var MessageBus = class {
17031
17163
  this.initialized = true;
17032
17164
  }
17033
17165
  async buildServices(config) {
17034
- const arkProvider = new chunk5J5PDZRR_cjs.RestArkProvider(config.arkServer.url);
17166
+ const arkProvider = new chunk6FTHFJAN_cjs.RestArkProvider(config.arkServer.url);
17035
17167
  const storage = {
17036
17168
  walletRepository: this.walletRepository,
17037
17169
  contractRepository: this.contractRepository,
@@ -17373,7 +17505,7 @@ var offboardNetworkNames = [
17373
17505
  function offboardDestinationScript(destinationAddress) {
17374
17506
  for (const networkName of offboardNetworkNames) {
17375
17507
  try {
17376
- const network = chunk5J5PDZRR_cjs.networks[networkName];
17508
+ const network = chunk6FTHFJAN_cjs.networks[networkName];
17377
17509
  const addr = btcSigner.Address(network).decode(destinationAddress);
17378
17510
  return btcSigner.OutScript.encode(addr);
17379
17511
  } catch {
@@ -17437,7 +17569,7 @@ var Ramps = class {
17437
17569
  }
17438
17570
  amount = amount ?? totalAmount;
17439
17571
  const offchainAddress = await this.wallet.getAddress();
17440
- const offchainAddr = chunk5J5PDZRR_cjs.ArkAddress.decode(offchainAddress);
17572
+ const offchainAddr = chunk6FTHFJAN_cjs.ArkAddress.decode(offchainAddress);
17441
17573
  const offchainScript = base.hex.encode(offchainAddr.pkScript);
17442
17574
  const outputFee = estimator.evalOffchainOutput({
17443
17575
  amount,
@@ -17497,7 +17629,7 @@ var Ramps = class {
17497
17629
  const filteredVtxos = [];
17498
17630
  let totalAmount = 0n;
17499
17631
  for (const vtxo of vtxos) {
17500
- const inputFee = estimator.evalOffchainInput(chunk5J5PDZRR_cjs.toOffchainInputFeeParams(vtxo));
17632
+ const inputFee = estimator.evalOffchainInput(chunk6FTHFJAN_cjs.toOffchainInputFeeParams(vtxo));
17501
17633
  if (inputFee.satoshis >= vtxo.value) {
17502
17634
  continue;
17503
17635
  }
@@ -17912,8 +18044,7 @@ var WalletMessageHandler = class {
17912
18044
  });
17913
18045
  }
17914
18046
  case "GET_TRANSACTION_HISTORY": {
17915
- const allVtxos = await this.getVtxosFromRepo();
17916
- const transactions = await this.buildTransactionHistoryFromCache(allVtxos) ?? [];
18047
+ const transactions = await this.buildTransactionHistoryFromCache() ?? [];
17917
18048
  return this.tagged({
17918
18049
  id,
17919
18050
  type: "TRANSACTION_HISTORY",
@@ -18369,7 +18500,7 @@ var WalletMessageHandler = class {
18369
18500
  // Wallet methods
18370
18501
  async handleInitWallet({ payload }) {
18371
18502
  const { arkServerUrl } = payload;
18372
- this.indexerProvider = new chunkFM263GKH_cjs.RestIndexerProvider(arkServerUrl);
18503
+ this.indexerProvider = new chunk4C5PMGBB_cjs.RestIndexerProvider(arkServerUrl);
18373
18504
  await this.onWalletInitialized();
18374
18505
  }
18375
18506
  /**
@@ -18395,7 +18526,7 @@ var WalletMessageHandler = class {
18395
18526
  unconfirmed += utxo.value;
18396
18527
  }
18397
18528
  }
18398
- const gated = gatedContracts(snapshot.map((_) => _.contract));
18529
+ const gated = gatedFrom(snapshot);
18399
18530
  const unlocked = new Set(
18400
18531
  (await spendableVtxosExcludingLocked(allVtxos, this.readonlyWallet?.intentRepository)).map((vtxo) => `${vtxo.txid}:${vtxo.vout}`)
18401
18532
  );
@@ -18403,7 +18534,7 @@ var WalletMessageHandler = class {
18403
18534
  const offchain = computeOffchainBalance(allVtxos, {
18404
18535
  now: { timestamp: /* @__PURE__ */ new Date() },
18405
18536
  isPendingRecovery: (vtxo) => pendingOutpoints.has(`${vtxo.txid}:${vtxo.vout}`),
18406
- isGenericallySpendable: (vtxo) => !gated.has(vtxo.script),
18537
+ isGenericallySpendable: (vtxo) => !isGatedVtxo(vtxo, gated),
18407
18538
  isUnlocked: (vtxo) => unlocked.has(`${vtxo.txid}:${vtxo.vout}`)
18408
18539
  });
18409
18540
  return {
@@ -18543,7 +18674,6 @@ var WalletMessageHandler = class {
18543
18674
  if (!this.readonlyWallet || !this.walletRepository) {
18544
18675
  return;
18545
18676
  }
18546
- const vtxos = await this.getVtxosFromRepo();
18547
18677
  const boardingAddresses = await this.readonlyWallet.getBoardingAddresses();
18548
18678
  const fresh = await this.readonlyWallet.getBoardingUtxos();
18549
18679
  const freshKeys = new Set(fresh.map((u) => `${u.txid}:${u.vout}`));
@@ -18555,7 +18685,7 @@ var WalletMessageHandler = class {
18555
18685
  if (kept.length > 0) await this.walletRepository.saveUtxos(addr, kept);
18556
18686
  }
18557
18687
  const address = await this.readonlyWallet.getAddress();
18558
- const txs = await this.buildTransactionHistoryFromCache(vtxos);
18688
+ const txs = await this.buildTransactionHistoryFromCache();
18559
18689
  if (txs) await this.walletRepository.saveTransactions(address, txs);
18560
18690
  }
18561
18691
  /**
@@ -18658,7 +18788,7 @@ var WalletMessageHandler = class {
18658
18788
  if (v.isUnrolled) {
18659
18789
  return withUnrolled;
18660
18790
  }
18661
- if (chunk5J5PDZRR_cjs.hasTerminalSpend(v)) {
18791
+ if (chunk6FTHFJAN_cjs.hasTerminalSpend(v)) {
18662
18792
  return false;
18663
18793
  }
18664
18794
  if (includeRecoverable) {
@@ -18667,10 +18797,10 @@ var WalletMessageHandler = class {
18667
18797
  if (dustAmount != null && isSubdust(v, dustAmount)) {
18668
18798
  return false;
18669
18799
  }
18670
- if (chunk5J5PDZRR_cjs.isRecoverable(v)) {
18800
+ if (chunk6FTHFJAN_cjs.isRecoverable(v)) {
18671
18801
  return false;
18672
18802
  }
18673
- if (chunk5J5PDZRR_cjs.isExpired(v)) {
18803
+ if (chunk6FTHFJAN_cjs.isExpired(v)) {
18674
18804
  return false;
18675
18805
  }
18676
18806
  return true;
@@ -18763,13 +18893,29 @@ var WalletMessageHandler = class {
18763
18893
  /**
18764
18894
  * Build transaction history from cached virtual outputs, hitting the indexer only for
18765
18895
  * uncached timestamps. Best-effort, like the plain Wallet path.
18766
- */
18767
- async buildTransactionHistoryFromCache(vtxos) {
18896
+ *
18897
+ * Takes its own {@link repoSnapshot} rather than a caller-supplied VTXO
18898
+ * list: the coins and the gate that judges them have to come off one read
18899
+ * or they answer about different instants, and being the worker's only
18900
+ * history builder means neither caller can supply one without the other.
18901
+ * The snapshot and the boarding read are independent, so they run together
18902
+ * — the same pairing `handleGetBalance` makes.
18903
+ */
18904
+ async buildTransactionHistoryFromCache() {
18768
18905
  if (!this.readonlyWallet) return null;
18769
- const { boardingTxs, commitmentsToIgnore } = await this.readonlyWallet.getBoardingTxs();
18906
+ const [{ snapshot, vtxos }, { boardingTxs, commitmentsToIgnore }] = await Promise.all([
18907
+ this.repoSnapshot(),
18908
+ this.readonlyWallet.getBoardingTxs()
18909
+ ]);
18770
18910
  const indexerProvider = this.indexerProvider;
18771
- const resolveTxCreatedAt = indexerProvider ? (txids) => chunk5J5PDZRR_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
18772
- return buildTransactionHistory(vtxos, boardingTxs, commitmentsToIgnore, resolveTxCreatedAt);
18911
+ const resolveTxCreatedAt = indexerProvider ? (txids) => chunk6FTHFJAN_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
18912
+ return buildTransactionHistory(
18913
+ vtxos,
18914
+ boardingTxs,
18915
+ commitmentsToIgnore,
18916
+ resolveTxCreatedAt,
18917
+ gatedFrom(snapshot)
18918
+ );
18773
18919
  }
18774
18920
  async ensureContractEventBroadcasting() {
18775
18921
  const wallet = this.readonlyWallet;
@@ -19470,7 +19616,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
19470
19616
  };
19471
19617
  try {
19472
19618
  const response = await this.sendMessage(message);
19473
- return response.payload.vtxos.map(chunk5J5PDZRR_cjs.normalizeVtxo);
19619
+ return response.payload.vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
19474
19620
  } catch (error) {
19475
19621
  throw new Error(`Failed to get vtxos: ${error}`);
19476
19622
  }
@@ -19495,7 +19641,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
19495
19641
  };
19496
19642
  try {
19497
19643
  const response = await this.sendMessage(message);
19498
- return response.payload.vtxos.map(chunk5J5PDZRR_cjs.normalizeVtxo);
19644
+ return response.payload.vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
19499
19645
  } catch (error) {
19500
19646
  throw new Error(`Failed to get spendable vtxos: ${error}`);
19501
19647
  }
@@ -19666,7 +19812,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
19666
19812
  };
19667
19813
  try {
19668
19814
  const response = await sendContractMessage(message);
19669
- return response.payload.vtxos.map(chunk5J5PDZRR_cjs.normalizeVtxo);
19815
+ return response.payload.vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
19670
19816
  } catch (e) {
19671
19817
  throw new Error("Failed to annotate vtxos");
19672
19818
  }
@@ -19865,6 +20011,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
19865
20011
  identity;
19866
20012
  _assetManager;
19867
20013
  hasDelegate;
20014
+ _restoreInFlight;
19868
20015
  get assetManager() {
19869
20016
  return this._assetManager;
19870
20017
  }
@@ -20127,6 +20274,16 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
20127
20274
  * reconstructed here so callers can inspect `.errors`.
20128
20275
  */
20129
20276
  async restore(opts) {
20277
+ if (this._restoreInFlight) return this._restoreInFlight;
20278
+ this._restoreInFlight = (async () => {
20279
+ await this._restoreWorkerWallet(opts);
20280
+ await runWalletRestoreHooks(this);
20281
+ })().finally(() => {
20282
+ this._restoreInFlight = void 0;
20283
+ });
20284
+ return this._restoreInFlight;
20285
+ }
20286
+ async _restoreWorkerWallet(opts) {
20130
20287
  const message = {
20131
20288
  id: getRandomId(),
20132
20289
  tag: this.messageTag,
@@ -20267,7 +20424,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
20267
20424
  };
20268
20425
  try {
20269
20426
  const response = await wallet.sendMessage(message);
20270
- return response.payload.vtxos.map(chunk5J5PDZRR_cjs.normalizeVtxo);
20427
+ return response.payload.vtxos.map(chunk6FTHFJAN_cjs.normalizeVtxo);
20271
20428
  } catch (e) {
20272
20429
  throw new Error(`Failed to get expiring vtxos: ${e}`);
20273
20430
  }
@@ -20379,12 +20536,12 @@ var OnchainWallet = class _OnchainWallet {
20379
20536
  * @returns Configured onchain wallet
20380
20537
  * @throws Error if the configured identity cannot produce a valid x-only public key
20381
20538
  */
20382
- static async create(identity, networkName = chunk5J5PDZRR_cjs.DEFAULT_NETWORK_NAME, provider) {
20539
+ static async create(identity, networkName = chunk6FTHFJAN_cjs.DEFAULT_NETWORK_NAME, provider) {
20383
20540
  const pubkey = await identity.xOnlyPublicKey();
20384
20541
  if (!pubkey) {
20385
20542
  throw new Error("Invalid configured public key");
20386
20543
  }
20387
- const network = chunk5J5PDZRR_cjs.getNetwork(networkName);
20544
+ const network = chunk6FTHFJAN_cjs.getNetwork(networkName);
20388
20545
  const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
20389
20546
  const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
20390
20547
  return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
@@ -20490,7 +20647,7 @@ var OnchainWallet = class _OnchainWallet {
20490
20647
  if (!inputs) {
20491
20648
  throw new Error("Fee estimation failed");
20492
20649
  }
20493
- let tx = new chunk5J5PDZRR_cjs.Transaction();
20650
+ let tx = new chunk6FTHFJAN_cjs.Transaction();
20494
20651
  for (const input of inputs) {
20495
20652
  tx.addInput({
20496
20653
  txid: input.txid,
@@ -20548,7 +20705,7 @@ var OnchainWallet = class _OnchainWallet {
20548
20705
  * @throws If the parent has no anchor, or funding cannot be selected/signed
20549
20706
  */
20550
20707
  async bumpAnchor(parentHex, feeRate) {
20551
- const parent = chunk5J5PDZRR_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
20708
+ const parent = chunk6FTHFJAN_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
20552
20709
  const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
20553
20710
  const child = await this.buildBumpPackage(parent, feeRate, coins);
20554
20711
  return [parent.hex, child.hex];
@@ -21455,7 +21612,7 @@ async function resolvePrevTxs(txids, source, onchain) {
21455
21612
  try {
21456
21613
  const { txs } = await source.getVirtualTxs(wanted);
21457
21614
  for (const psbt of txs) {
21458
- const tx = chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
21615
+ const tx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbt));
21459
21616
  resolved.set(tx.id, tx.toBytes());
21460
21617
  }
21461
21618
  } catch (err) {
@@ -21488,7 +21645,7 @@ async function resolvePrevTxs(txids, source, onchain) {
21488
21645
  async function attachPrevArkTxs(tx, txids, source, onchain) {
21489
21646
  const pending = [];
21490
21647
  for (let i = 0; i < tx.inputsLength; i++) {
21491
- if (chunk5J5PDZRR_cjs.getArkPsbtFields(tx, i, chunk5J5PDZRR_cjs.PrevArkTxField).length === 0) pending.push(i);
21648
+ if (chunk6FTHFJAN_cjs.getArkPsbtFields(tx, i, chunk6FTHFJAN_cjs.PrevArkTxField).length === 0) pending.push(i);
21492
21649
  }
21493
21650
  if (pending.length === 0) return;
21494
21651
  const resolved = await resolvePrevTxs(
@@ -21497,13 +21654,13 @@ async function attachPrevArkTxs(tx, txids, source, onchain) {
21497
21654
  onchain
21498
21655
  );
21499
21656
  for (const i of pending) {
21500
- chunk5J5PDZRR_cjs.setArkPsbtField(tx, i, chunk5J5PDZRR_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
21657
+ chunk6FTHFJAN_cjs.setArkPsbtField(tx, i, chunk6FTHFJAN_cjs.PrevArkTxField, resolved.get(txidAt(txids, i)));
21501
21658
  }
21502
21659
  }
21503
21660
  async function attachPrevoutTxs(tx, source) {
21504
21661
  const pending = [];
21505
21662
  for (let i = 0; i < tx.inputsLength; i++) {
21506
- if (chunk5J5PDZRR_cjs.getArkPsbtFields(tx, i, chunk5J5PDZRR_cjs.PrevoutTxField).length > 0) continue;
21663
+ if (chunk6FTHFJAN_cjs.getArkPsbtFields(tx, i, chunk6FTHFJAN_cjs.PrevoutTxField).length > 0) continue;
21507
21664
  const input = tx.getInput(i);
21508
21665
  if (!input?.txid) throw new PrevTxUnavailableError(`input ${i} has no outpoint`);
21509
21666
  pending.push({ index: i, txid: base.hex.encode(input.txid) });
@@ -21514,7 +21671,7 @@ async function attachPrevoutTxs(tx, source) {
21514
21671
  resolved.set(txid, await source.getRawTransaction(txid));
21515
21672
  }
21516
21673
  for (const { index, txid } of pending) {
21517
- chunk5J5PDZRR_cjs.setArkPsbtField(tx, index, chunk5J5PDZRR_cjs.PrevoutTxField, resolved.get(txid));
21674
+ chunk6FTHFJAN_cjs.setArkPsbtField(tx, index, chunk6FTHFJAN_cjs.PrevoutTxField, resolved.get(txid));
21518
21675
  }
21519
21676
  }
21520
21677
  async function withPrevTxs(coins, source, onchain) {
@@ -21540,7 +21697,7 @@ exports.BIP322 = void 0;
21540
21697
  async function sign2(message, identity, network) {
21541
21698
  const xOnlyPubKey = await identity.xOnlyPublicKey();
21542
21699
  const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
21543
- const toSpend = chunk5J5PDZRR_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
21700
+ const toSpend = chunk6FTHFJAN_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
21544
21701
  const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
21545
21702
  const signed = await identity.sign(toSign, [0]);
21546
21703
  signed.finalizeIdx(0);
@@ -21598,7 +21755,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
21598
21755
  if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
21599
21756
  return false;
21600
21757
  }
21601
- const toSpend = chunk5J5PDZRR_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
21758
+ const toSpend = chunk6FTHFJAN_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
21602
21759
  const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
21603
21760
  const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
21604
21761
  const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
@@ -21619,7 +21776,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
21619
21776
  }
21620
21777
  const sighashType = sigWithHash[sigWithHash.length - 1];
21621
21778
  const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
21622
- const toSpend = chunk5J5PDZRR_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
21779
+ const toSpend = chunk6FTHFJAN_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
21623
21780
  const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
21624
21781
  const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
21625
21782
  const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
@@ -21672,7 +21829,7 @@ function encodeCompactSize(n) {
21672
21829
  return buf;
21673
21830
  }
21674
21831
  function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
21675
- const tx = new chunk5J5PDZRR_cjs.Transaction({ version: 0 });
21832
+ const tx = new chunk6FTHFJAN_cjs.Transaction({ version: 0 });
21676
21833
  tx.addInput({
21677
21834
  txid: toSpend.id,
21678
21835
  index: 0,
@@ -21686,12 +21843,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
21686
21843
  });
21687
21844
  tx.addOutput({
21688
21845
  amount: 0n,
21689
- script: chunk5J5PDZRR_cjs.OP_RETURN_EMPTY_PKSCRIPT
21846
+ script: chunk6FTHFJAN_cjs.OP_RETURN_EMPTY_PKSCRIPT
21690
21847
  });
21691
21848
  return tx;
21692
21849
  }
21693
21850
  function craftBIP322ToSignSimple(toSpend, pkScript) {
21694
- const tx = new chunk5J5PDZRR_cjs.Transaction({ version: 0 });
21851
+ const tx = new chunk6FTHFJAN_cjs.Transaction({ version: 0 });
21695
21852
  tx.addInput({
21696
21853
  txid: toSpend.id,
21697
21854
  index: 0,
@@ -21703,7 +21860,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
21703
21860
  });
21704
21861
  tx.addOutput({
21705
21862
  amount: 0n,
21706
- script: chunk5J5PDZRR_cjs.OP_RETURN_EMPTY_PKSCRIPT
21863
+ script: chunk6FTHFJAN_cjs.OP_RETURN_EMPTY_PKSCRIPT
21707
21864
  });
21708
21865
  return tx;
21709
21866
  }
@@ -21716,7 +21873,7 @@ var RestEmulatorProvider = class {
21716
21873
  serverUrl;
21717
21874
  async getInfo() {
21718
21875
  const url = `${this.serverUrl}/v1/info`;
21719
- const response = await fetch(url);
21876
+ const response = await chunk6FTHFJAN_cjs.baseFetch(url);
21720
21877
  if (!response.ok) {
21721
21878
  const errorText2 = await response.text();
21722
21879
  throw new Error(`Failed to get emulator info: ${errorText2}`);
@@ -21834,7 +21991,7 @@ var RestEmulatorProvider = class {
21834
21991
  }
21835
21992
  };
21836
21993
  function finalizeVirtualTx(type, psbtBase64) {
21837
- const tx = chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
21994
+ const tx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
21838
21995
  if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
21839
21996
  const input = tx.getInput(0);
21840
21997
  if (!input) {
@@ -21861,14 +22018,14 @@ var ExitPathError = class extends Error {
21861
22018
  reason;
21862
22019
  };
21863
22020
  function delayWeight(sequence) {
21864
- const t = chunk5J5PDZRR_cjs.sequenceToTimelock(sequence);
22021
+ const t = chunk6FTHFJAN_cjs.sequenceToTimelock(sequence);
21865
22022
  return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
21866
22023
  }
21867
22024
  async function resolveUnilateralPath(params) {
21868
22025
  const { vtxo, scriptHex, contractRepository } = params;
21869
22026
  const contract = contractRepository ? (await contractRepository.getContracts({ script: scriptHex }))[0] : void 0;
21870
22027
  if (contract) {
21871
- const handler = chunkP6EXRY5L_cjs.contractHandlers.get(contract.type);
22028
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
21872
22029
  if (!handler) {
21873
22030
  throw new ExitPathError(
21874
22031
  "no-handler",
@@ -21891,12 +22048,12 @@ async function resolveUnilateralPath(params) {
21891
22048
  paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
21892
22049
  return { selection: paths[0], label: `${contract.type}:unilateral` };
21893
22050
  }
21894
- const decoded = chunk5J5PDZRR_cjs.VtxoScript.decode(vtxo.tapTree);
22051
+ const decoded = chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree);
21895
22052
  let best;
21896
22053
  for (const exit of decoded.exitPaths()) {
21897
22054
  const leaf = decoded.findLeaf(base.hex.encode(exit.script));
21898
22055
  if (!leaf) continue;
21899
- const sequence = chunk5J5PDZRR_cjs.timelockToSequence(exit.params.timelock);
22056
+ const sequence = chunk6FTHFJAN_cjs.timelockToSequence(exit.params.timelock);
21900
22057
  const weight = delayWeight(sequence);
21901
22058
  if (!best || weight < best.weight) {
21902
22059
  best = { selection: { leaf, sequence }, weight };
@@ -22116,7 +22273,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
22116
22273
  let totalAmount = 0n;
22117
22274
  const txWeightEstimator = TxWeightEstimator.create();
22118
22275
  for (const vtxo of vtxos) {
22119
- if (!chunk5J5PDZRR_cjs.canSweepOnchain(vtxo)) {
22276
+ if (!chunk6FTHFJAN_cjs.canSweepOnchain(vtxo)) {
22120
22277
  throw new Error(
22121
22278
  `Vtxo ${vtxo.txid}:${vtxo.vout} cannot be swept onchain: it is not fully unrolled (use unroll first), or its exit output was already spent`
22122
22279
  );
@@ -22127,14 +22284,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
22127
22284
  }
22128
22285
  const resolved = await resolveUnilateralPath({
22129
22286
  vtxo,
22130
- scriptHex: base.hex.encode(chunk5J5PDZRR_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
22287
+ scriptHex: base.hex.encode(chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
22131
22288
  contractRepository: wallet.contractRepository,
22132
22289
  walletPubKeyHex: base.hex.encode(await wallet.identity.xOnlyPublicKey()),
22133
22290
  currentTime: Date.now()
22134
22291
  });
22135
22292
  const spendingLeaf = resolved.selection.leaf;
22136
22293
  const sequence = resolved.selection.sequence;
22137
- const timelock = chunk5J5PDZRR_cjs.sequenceToTimelock(sequence);
22294
+ const timelock = chunk6FTHFJAN_cjs.sequenceToTimelock(sequence);
22138
22295
  const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
22139
22296
  if (!elapsed) {
22140
22297
  throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
@@ -22147,7 +22304,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
22147
22304
  sequence,
22148
22305
  witnessUtxo: {
22149
22306
  amount: BigInt(vtxo.value),
22150
- script: chunk5J5PDZRR_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
22307
+ script: chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
22151
22308
  },
22152
22309
  sighashType: btcSigner.SigHash.DEFAULT
22153
22310
  });
@@ -22157,7 +22314,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
22157
22314
  btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
22158
22315
  );
22159
22316
  }
22160
- const tx = new chunk5J5PDZRR_cjs.Transaction({ version: 2 });
22317
+ const tx = new chunk6FTHFJAN_cjs.Transaction({ version: 2 });
22161
22318
  for (const input of inputs) {
22162
22319
  tx.addInput(input);
22163
22320
  }
@@ -22240,7 +22397,7 @@ async function buildSignedSweep(params) {
22240
22397
  `uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
22241
22398
  );
22242
22399
  }
22243
- const tx = new chunk5J5PDZRR_cjs.Transaction({ version: 2 });
22400
+ const tx = new chunk6FTHFJAN_cjs.Transaction({ version: 2 });
22244
22401
  tx.addInput({
22245
22402
  txid: vtxo.txid,
22246
22403
  index: vtxo.vout,
@@ -22265,7 +22422,7 @@ async function buildSignedSweep(params) {
22265
22422
  finalScriptWitness: [
22266
22423
  tapScriptSig[0][1],
22267
22424
  ...path.extraWitness,
22268
- chunk5J5PDZRR_cjs.scriptFromTapLeafScript(path.leaf),
22425
+ chunk6FTHFJAN_cjs.scriptFromTapLeafScript(path.leaf),
22269
22426
  btcSigner.TaprootControlBlock.encode(controlBlock)
22270
22427
  ]
22271
22428
  });
@@ -22295,7 +22452,7 @@ async function resolveFeeRate(opts) {
22295
22452
  }
22296
22453
  async function selectExitVtxos(opts) {
22297
22454
  if (!opts.vtxos) return opts.wallet.getVtxos();
22298
- const res = await chunk5J5PDZRR_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
22455
+ const res = await chunk6FTHFJAN_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
22299
22456
  const tapTrees = /* @__PURE__ */ new Map();
22300
22457
  const out = [];
22301
22458
  for (const vtxo of res.vtxos) {
@@ -22310,7 +22467,7 @@ async function selectExitVtxos(opts) {
22310
22467
  `no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
22311
22468
  );
22312
22469
  }
22313
- const handler = chunkP6EXRY5L_cjs.contractHandlers.get(contract.type);
22470
+ const handler = chunkNPM5YZBC_cjs.contractHandlers.get(contract.type);
22314
22471
  if (!handler) {
22315
22472
  throw new Error(`no contract handler registered for type '${contract.type}'`);
22316
22473
  }
@@ -22340,7 +22497,7 @@ async function computeExitLayout(opts, feeRate) {
22340
22497
  if (pendingNodes.length > 0) {
22341
22498
  const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
22342
22499
  for (const psbt of txs) {
22343
- psbts.set(chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
22500
+ psbts.set(chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
22344
22501
  }
22345
22502
  }
22346
22503
  const childVsize = Number(
@@ -22376,7 +22533,7 @@ async function computeExitLayout(opts, feeRate) {
22376
22533
  try {
22377
22534
  const resolved = await resolveUnilateralPath({
22378
22535
  vtxo,
22379
- scriptHex: base.hex.encode(chunk5J5PDZRR_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
22536
+ scriptHex: base.hex.encode(chunk6FTHFJAN_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
22380
22537
  contractRepository: wallet.contractRepository,
22381
22538
  walletPubKeyHex,
22382
22539
  currentTime: Date.now()
@@ -22395,7 +22552,7 @@ async function computeExitLayout(opts, feeRate) {
22395
22552
  });
22396
22553
  continue;
22397
22554
  }
22398
- const t = chunk5J5PDZRR_cjs.sequenceToTimelock(resolved.selection.sequence);
22555
+ const t = chunk6FTHFJAN_cjs.sequenceToTimelock(resolved.selection.sequence);
22399
22556
  const delay = { type: t.type, value: Number(t.value) };
22400
22557
  infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
22401
22558
  sweeps.push({ vtxo, resolved, sweepFee, delay });
@@ -22796,7 +22953,7 @@ async function prepare(opts) {
22796
22953
  txid: sweep.vtxo.txid,
22797
22954
  vout: sweep.vtxo.vout,
22798
22955
  value: sweep.vtxo.value,
22799
- pkScript: chunk5J5PDZRR_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
22956
+ pkScript: chunk6FTHFJAN_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
22800
22957
  },
22801
22958
  path: sweep.resolved.selection,
22802
22959
  outputAddress: opts.sweepAddress,
@@ -22884,7 +23041,7 @@ async function prepare(opts) {
22884
23041
  if (newFee <= splitterFee) break;
22885
23042
  splitterFee = newFee;
22886
23043
  }
22887
- const splitter = new chunk5J5PDZRR_cjs.Transaction({ version: 2 });
23044
+ const splitter = new chunk6FTHFJAN_cjs.Transaction({ version: 2 });
22888
23045
  for (const coin of selected.inputs) {
22889
23046
  splitter.addInput({
22890
23047
  txid: coin.txid,
@@ -23028,41 +23185,41 @@ var UnilateralExit = {
23028
23185
  // src/arkade/index.ts
23029
23186
  var arkade_exports = {};
23030
23187
  chunk5BLDMQED_cjs.__export(arkade_exports, {
23031
- ARKADE_OP: () => chunkP6EXRY5L_cjs.ARKADE_OP,
23032
- ARKADE_OPCODES: () => chunkP6EXRY5L_cjs.ARKADE_OPCODES,
23033
- ARKADE_OPCODE_NAMES: () => chunkP6EXRY5L_cjs.ARKADE_OPCODE_NAMES,
23034
- ARKADE_OPCODE_VALUES: () => chunkP6EXRY5L_cjs.ARKADE_OPCODE_VALUES,
23035
- ARKADE_OPS: () => chunkP6EXRY5L_cjs.ARKADE_OPS,
23188
+ ARKADE_OP: () => chunkNPM5YZBC_cjs.ARKADE_OP,
23189
+ ARKADE_OPCODES: () => chunkNPM5YZBC_cjs.ARKADE_OPCODES,
23190
+ ARKADE_OPCODE_NAMES: () => chunkNPM5YZBC_cjs.ARKADE_OPCODE_NAMES,
23191
+ ARKADE_OPCODE_VALUES: () => chunkNPM5YZBC_cjs.ARKADE_OPCODE_VALUES,
23192
+ ARKADE_OPS: () => chunkNPM5YZBC_cjs.ARKADE_OPS,
23036
23193
  Arkade: () => Arkade,
23037
23194
  ArkadeContract: () => ArkadeContract,
23038
- ArkadeProgramScript: () => chunkP6EXRY5L_cjs.ArkadeProgramScript,
23039
- ArkadeScript: () => chunkP6EXRY5L_cjs.ArkadeScript,
23195
+ ArkadeProgramScript: () => chunkNPM5YZBC_cjs.ArkadeProgramScript,
23196
+ ArkadeScript: () => chunkNPM5YZBC_cjs.ArkadeScript,
23040
23197
  ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
23041
- BigNum: () => chunkP6EXRY5L_cjs.bignum_exports,
23198
+ BigNum: () => chunkNPM5YZBC_cjs.bignum_exports,
23042
23199
  OP: () => btcSigner.OP,
23043
- OPCODE_NAMES: () => chunkP6EXRY5L_cjs.OPCODE_NAMES,
23044
- OPCODE_VALUES: () => chunkP6EXRY5L_cjs.OPCODE_VALUES,
23045
- SUPPORTED_PROGRAM_VERSION: () => chunkP6EXRY5L_cjs.SUPPORTED_PROGRAM_VERSION,
23200
+ OPCODE_NAMES: () => chunkNPM5YZBC_cjs.OPCODE_NAMES,
23201
+ OPCODE_VALUES: () => chunkNPM5YZBC_cjs.OPCODE_VALUES,
23202
+ SUPPORTED_PROGRAM_VERSION: () => chunkNPM5YZBC_cjs.SUPPORTED_PROGRAM_VERSION,
23046
23203
  Script: () => btcSigner.Script,
23047
- arkadeScriptHash: () => chunkP6EXRY5L_cjs.arkadeScriptHash,
23048
- arkadeWitnessHash: () => chunkP6EXRY5L_cjs.arkadeWitnessHash,
23049
- asmToBytes: () => chunkP6EXRY5L_cjs.asmToBytes,
23050
- bytesToASM: () => chunkP6EXRY5L_cjs.bytesToASM,
23051
- computeArkadeScriptPublicKey: () => chunkP6EXRY5L_cjs.computeArkadeScriptPublicKey,
23204
+ arkadeScriptHash: () => chunkNPM5YZBC_cjs.arkadeScriptHash,
23205
+ arkadeWitnessHash: () => chunkNPM5YZBC_cjs.arkadeWitnessHash,
23206
+ asmToBytes: () => chunkNPM5YZBC_cjs.asmToBytes,
23207
+ bytesToASM: () => chunkNPM5YZBC_cjs.bytesToASM,
23208
+ computeArkadeScriptPublicKey: () => chunkNPM5YZBC_cjs.computeArkadeScriptPublicKey,
23052
23209
  createArkadeBatchHandler: () => createArkadeBatchHandler,
23053
- deserializeArkadeContractParams: () => chunkP6EXRY5L_cjs.deserializeArkadeContractParams,
23054
- fromASM: () => chunkP6EXRY5L_cjs.fromASM,
23055
- getOpcodeName: () => chunkP6EXRY5L_cjs.getOpcodeName,
23056
- getOpcodeValue: () => chunkP6EXRY5L_cjs.getOpcodeValue,
23057
- parseArtifact: () => chunkP6EXRY5L_cjs.parseArtifact,
23058
- resolveAsm: () => chunkP6EXRY5L_cjs.resolveAsm,
23059
- serializeArkadeContractParams: () => chunkP6EXRY5L_cjs.serializeArkadeContractParams,
23060
- stringifyArtifact: () => chunkP6EXRY5L_cjs.stringifyArtifact,
23061
- toASM: () => chunkP6EXRY5L_cjs.toASM,
23062
- validateProgram: () => chunkP6EXRY5L_cjs.validateProgram,
23063
- witnessRefToBytes: () => chunkP6EXRY5L_cjs.witnessRefToBytes
23210
+ deserializeArkadeContractParams: () => chunkNPM5YZBC_cjs.deserializeArkadeContractParams,
23211
+ fromASM: () => chunkNPM5YZBC_cjs.fromASM,
23212
+ getOpcodeName: () => chunkNPM5YZBC_cjs.getOpcodeName,
23213
+ getOpcodeValue: () => chunkNPM5YZBC_cjs.getOpcodeValue,
23214
+ parseArtifact: () => chunkNPM5YZBC_cjs.parseArtifact,
23215
+ resolveAsm: () => chunkNPM5YZBC_cjs.resolveAsm,
23216
+ serializeArkadeContractParams: () => chunkNPM5YZBC_cjs.serializeArkadeContractParams,
23217
+ stringifyArtifact: () => chunkNPM5YZBC_cjs.stringifyArtifact,
23218
+ toASM: () => chunkNPM5YZBC_cjs.toASM,
23219
+ validateProgram: () => chunkNPM5YZBC_cjs.validateProgram,
23220
+ witnessRefToBytes: () => chunkNPM5YZBC_cjs.witnessRefToBytes
23064
23221
  });
23065
- var isVtxoCoin = (input) => chunk5J5PDZRR_cjs.isVirtualCoin(input);
23222
+ var isVtxoCoin = (input) => chunk6FTHFJAN_cjs.isVirtualCoin(input);
23066
23223
  function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients, batchExpiryPolicy) {
23067
23224
  let batchId;
23068
23225
  let sweepTapTreeRoot;
@@ -23083,23 +23240,23 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
23083
23240
  );
23084
23241
  await arkProvider.confirmRegistration(intentId);
23085
23242
  batchId = event.id;
23086
- const sweepTapscript = chunk5J5PDZRR_cjs.CSVMultisigTapscript.encode({
23243
+ const sweepTapscript = chunk6FTHFJAN_cjs.CSVMultisigTapscript.encode({
23087
23244
  timelock,
23088
- pubkeys: [chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
23245
+ pubkeys: [chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info.forfeitPubkey), "forfeit key")]
23089
23246
  }).script;
23090
23247
  sweepTapTreeRoot = payment_js.tapLeafHash(sweepTapscript);
23091
23248
  return { skip: false };
23092
23249
  },
23093
23250
  onTreeSigningStarted: async (event, vtxoTree) => {
23094
23251
  const signerPubKey = await session.getPublicKey();
23095
- const xonlySignerPubKey = chunkP6EXRY5L_cjs.toXOnly(signerPubKey, "signer key");
23252
+ const xonlySignerPubKey = chunkNPM5YZBC_cjs.toXOnly(signerPubKey, "signer key");
23096
23253
  const xOnlyPubkeys = event.cosignersPublicKeys.map(
23097
- (k) => base.hex.encode(chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
23254
+ (k) => base.hex.encode(chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(k), "cosigner key"))
23098
23255
  );
23099
23256
  if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
23100
23257
  return { skip: true };
23101
23258
  }
23102
- const commitmentTx = chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
23259
+ const commitmentTx = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
23103
23260
  validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
23104
23261
  if (recipients && recipients.length > 0) {
23105
23262
  validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
@@ -23131,7 +23288,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
23131
23288
  if (connectorTree) {
23132
23289
  validateConnectorsTxGraph(event.commitmentTx, connectorTree);
23133
23290
  }
23134
- let commitmentPsbt = chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
23291
+ let commitmentPsbt = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
23135
23292
  assertFinalCommitmentMatchesValidated(
23136
23293
  commitmentPsbt,
23137
23294
  validatedCommitmentTxid,
@@ -23166,7 +23323,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
23166
23323
  boardingIndices.push(boardingIdx);
23167
23324
  continue;
23168
23325
  }
23169
- if (chunk5J5PDZRR_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
23326
+ if (chunk6FTHFJAN_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
23170
23327
  continue;
23171
23328
  }
23172
23329
  if (connectorIndex >= connectorLeaves.length) {
@@ -23187,7 +23344,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
23187
23344
  index: input.vout,
23188
23345
  witnessUtxo: {
23189
23346
  amount: BigInt(input.value),
23190
- script: chunk5J5PDZRR_cjs.VtxoScript.decode(input.tapTree).pkScript
23347
+ script: chunk6FTHFJAN_cjs.VtxoScript.decode(input.tapTree).pkScript
23191
23348
  },
23192
23349
  sighashType: btcSigner.SigHash.DEFAULT,
23193
23350
  tapLeafScript: [input.forfeitTapLeafScript]
@@ -23278,16 +23435,16 @@ var Arkade = class _Arkade {
23278
23435
  /** Connect and resolve the server key, checkpoint closure and (if present) the co-signer key. */
23279
23436
  static async connect(opts) {
23280
23437
  const info = await opts.arkade.getInfo();
23281
- const serverKey = chunkP6EXRY5L_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
23282
- const checkpoint = chunk5J5PDZRR_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
23283
- const network = opts.network ?? chunk5J5PDZRR_cjs.DEFAULT_NETWORK;
23438
+ const serverKey = chunkNPM5YZBC_cjs.toXOnly(base.hex.decode(info.signerPubkey), "ark signer key");
23439
+ const checkpoint = chunk6FTHFJAN_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
23440
+ const network = opts.network ?? chunk6FTHFJAN_cjs.DEFAULT_NETWORK;
23284
23441
  let emulatorKey;
23285
23442
  if (opts.emulator) {
23286
- emulatorKey = base.hex.decode(chunk5J5PDZRR_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
23443
+ emulatorKey = base.hex.decode(chunk6FTHFJAN_cjs.resolveEmulatorPubkey(network, opts.emulatorPubkey));
23287
23444
  }
23288
23445
  let userKey;
23289
23446
  if (opts.identity) {
23290
- userKey = chunkP6EXRY5L_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
23447
+ userKey = chunkNPM5YZBC_cjs.toXOnly(await opts.identity.xOnlyPublicKey(), "identity key");
23291
23448
  }
23292
23449
  return new _Arkade({
23293
23450
  arkProvider: opts.arkade,
@@ -23313,7 +23470,7 @@ var Arkade = class _Arkade {
23313
23470
  * key respectively; explicit args always win.
23314
23471
  */
23315
23472
  contract(program, args = {}) {
23316
- const declared = (program.params ?? []).map(chunkP6EXRY5L_cjs.inputName);
23473
+ const declared = (program.params ?? []).map(chunkNPM5YZBC_cjs.inputName);
23317
23474
  if (declared.includes("server") && args.server === void 0) {
23318
23475
  args = { ...args, server: this.serverKey };
23319
23476
  }
@@ -23333,7 +23490,7 @@ var ArkadeContract = class _ArkadeContract {
23333
23490
  userKey: client.userKey,
23334
23491
  emulatorKey: client.emulatorKey
23335
23492
  };
23336
- this.vtxoScript = new chunkP6EXRY5L_cjs.ArkadeProgramScript(program, args, this.keys);
23493
+ this.vtxoScript = new chunkNPM5YZBC_cjs.ArkadeProgramScript(program, args, this.keys);
23337
23494
  this.tapTree = this.vtxoScript.encode();
23338
23495
  this.compiled = this.vtxoScript.compiled;
23339
23496
  }
@@ -23361,7 +23518,7 @@ var ArkadeContract = class _ArkadeContract {
23361
23518
  `ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
23362
23519
  );
23363
23520
  }
23364
- const typed = chunkP6EXRY5L_cjs.deserializeArkadeContractParams(contract.params);
23521
+ const typed = chunkNPM5YZBC_cjs.deserializeArkadeContractParams(contract.params);
23365
23522
  return new _ArkadeContract(client, typed.program, typed.args, {
23366
23523
  serverKey: typed.serverKey,
23367
23524
  userKey: typed.userKey,
@@ -23402,7 +23559,7 @@ var ArkadeContract = class _ArkadeContract {
23402
23559
  toContractParams() {
23403
23560
  return {
23404
23561
  type: "arkade",
23405
- params: chunkP6EXRY5L_cjs.serializeArkadeContractParams({
23562
+ params: chunkNPM5YZBC_cjs.serializeArkadeContractParams({
23406
23563
  program: this.program,
23407
23564
  args: this.args,
23408
23565
  serverKey: this.keys.serverKey,
@@ -23452,18 +23609,18 @@ var ArkadeContract = class _ArkadeContract {
23452
23609
  if (registered) {
23453
23610
  const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
23454
23611
  return (withVtxos?.vtxos ?? []).filter(
23455
- (v) => !chunk5J5PDZRR_cjs.hasTerminalSpend(v) && !v.isUnrolled
23612
+ (v) => !chunk6FTHFJAN_cjs.hasTerminalSpend(v) && !v.isUnrolled
23456
23613
  );
23457
23614
  }
23458
23615
  }
23459
23616
  if (!this.client.indexer) {
23460
23617
  throw new Error("ArkadeContract.getUtxos: an indexer is required");
23461
23618
  }
23462
- const { vtxos } = await chunk5J5PDZRR_cjs.getNormalizedVtxos(this.client.indexer, {
23619
+ const { vtxos } = await chunk6FTHFJAN_cjs.getNormalizedVtxos(this.client.indexer, {
23463
23620
  scripts: [scriptHex],
23464
23621
  spendableOnly: true
23465
23622
  });
23466
- return vtxos.filter((v) => !chunk5J5PDZRR_cjs.hasTerminalSpend(v) && !v.isUnrolled);
23623
+ return vtxos.filter((v) => !chunk6FTHFJAN_cjs.hasTerminalSpend(v) && !v.isUnrolled);
23467
23624
  }
23468
23625
  /** Total spendable balance (requires an indexer). */
23469
23626
  async getBalance() {
@@ -23561,7 +23718,7 @@ var ArkadeTransactionBuilder = class {
23561
23718
  this.contract.client.checkpoint
23562
23719
  );
23563
23720
  if (coin.sourceTx) {
23564
- chunk5J5PDZRR_cjs.setArkPsbtField(arkTx, 0, chunk5J5PDZRR_cjs.PrevArkTxField, coin.sourceTx);
23721
+ chunk6FTHFJAN_cjs.setArkPsbtField(arkTx, 0, chunk6FTHFJAN_cjs.PrevArkTxField, coin.sourceTx);
23565
23722
  }
23566
23723
  if (this.fn.arkadeScript) {
23567
23724
  const indexer = this.contract.client.indexer;
@@ -23578,8 +23735,8 @@ var ArkadeTransactionBuilder = class {
23578
23735
  }
23579
23736
  const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
23580
23737
  if (condition.length > 0) {
23581
- chunk5J5PDZRR_cjs.setArkPsbtField(arkTx, 0, chunk5J5PDZRR_cjs.ConditionWitness, condition);
23582
- chunk5J5PDZRR_cjs.setArkPsbtField(checkpoints[0], 0, chunk5J5PDZRR_cjs.ConditionWitness, condition);
23738
+ chunk6FTHFJAN_cjs.setArkPsbtField(arkTx, 0, chunk6FTHFJAN_cjs.ConditionWitness, condition);
23739
+ chunk6FTHFJAN_cjs.setArkPsbtField(checkpoints[0], 0, chunk6FTHFJAN_cjs.ConditionWitness, condition);
23583
23740
  }
23584
23741
  const packets = [];
23585
23742
  if (this.assetSpecs.length > 0) {
@@ -23618,7 +23775,7 @@ var ArkadeTransactionBuilder = class {
23618
23775
  base.base64.encode(signedArk2.toPSBT()),
23619
23776
  signedCps.map((c) => base.base64.encode(c.toPSBT()))
23620
23777
  );
23621
- const txid = chunk5J5PDZRR_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
23778
+ const txid = chunk6FTHFJAN_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
23622
23779
  return {
23623
23780
  txid,
23624
23781
  signedArkTx: res2.signedArkTx,
@@ -23677,23 +23834,23 @@ var ArkadeTransactionBuilder = class {
23677
23834
  }
23678
23835
  buildAssetPacket() {
23679
23836
  const groups = this.assetSpecs.map((s) => {
23680
- const id = typeof s.assetId === "string" ? chunkFM263GKH_cjs.AssetId.fromString(s.assetId) : chunkFM263GKH_cjs.AssetId.fromBytes(s.assetId);
23681
- return chunkFM263GKH_cjs.AssetGroup.create(
23837
+ const id = typeof s.assetId === "string" ? chunk4C5PMGBB_cjs.AssetId.fromString(s.assetId) : chunk4C5PMGBB_cjs.AssetId.fromBytes(s.assetId);
23838
+ return chunk4C5PMGBB_cjs.AssetGroup.create(
23682
23839
  id,
23683
23840
  null,
23684
- s.inputs.map((i) => chunkFM263GKH_cjs.AssetInput.create(i.vin, i.amount)),
23685
- s.outputs.map((o) => chunkFM263GKH_cjs.AssetOutput.create(o.vout, o.amount)),
23686
- (s.metadata ?? []).map((m) => chunkFM263GKH_cjs.Metadata.create(m.key, m.value))
23841
+ s.inputs.map((i) => chunk4C5PMGBB_cjs.AssetInput.create(i.vin, i.amount)),
23842
+ s.outputs.map((o) => chunk4C5PMGBB_cjs.AssetOutput.create(o.vout, o.amount)),
23843
+ (s.metadata ?? []).map((m) => chunk4C5PMGBB_cjs.Metadata.create(m.key, m.value))
23687
23844
  );
23688
23845
  });
23689
- return chunkFM263GKH_cjs.Packet.create(groups);
23846
+ return chunk4C5PMGBB_cjs.Packet.create(groups);
23690
23847
  }
23691
23848
  witnessBytes(ref) {
23692
- return chunkP6EXRY5L_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
23849
+ return chunkNPM5YZBC_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
23693
23850
  }
23694
23851
  };
23695
23852
  function bindInputs(fn, callArgs) {
23696
- const names = (fn.def.inputs ?? []).map(chunkP6EXRY5L_cjs.inputName);
23853
+ const names = (fn.def.inputs ?? []).map(chunkNPM5YZBC_cjs.inputName);
23697
23854
  if (callArgs.length !== names.length) {
23698
23855
  throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
23699
23856
  }
@@ -24345,6 +24502,7 @@ exports.outpointReasons = outpointReasons;
24345
24502
  exports.promisifyRequest = promisifyRequest;
24346
24503
  exports.provisionClaimSecret = provisionClaimSecret;
24347
24504
  exports.provisionRefundKey = provisionRefundKey;
24505
+ exports.registerWalletRestoreHook = registerWalletRestoreHook;
24348
24506
  exports.requiresMigration = requiresMigration;
24349
24507
  exports.resolveAssetAmount = resolveAssetAmount;
24350
24508
  exports.resolveBatchExpiryPolicy = resolveBatchExpiryPolicy;
@@ -24376,5 +24534,5 @@ exports.waitForIncomingFunds = waitForIncomingFunds;
24376
24534
  exports.walletFeeSource = walletFeeSource;
24377
24535
  exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
24378
24536
  exports.withPrevTxs = withPrevTxs;
24379
- //# sourceMappingURL=chunk-MK5EPTTB.cjs.map
24380
- //# sourceMappingURL=chunk-MK5EPTTB.cjs.map
24537
+ //# sourceMappingURL=chunk-U5I3ITV7.cjs.map
24538
+ //# sourceMappingURL=chunk-U5I3ITV7.cjs.map