@arkade-os/sdk 0.4.54 → 0.4.56

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 (77) hide show
  1. package/dist/adapters/expo.cjs +5 -5
  2. package/dist/adapters/expo.d.cts +2 -2
  3. package/dist/adapters/expo.d.ts +2 -2
  4. package/dist/adapters/expo.js +3 -3
  5. package/dist/adapters/indexedDB.cjs +5 -5
  6. package/dist/adapters/indexedDB.js +4 -4
  7. package/dist/{ark-acFuA57I.d.cts → ark-Cgsd9tMd.d.cts} +40 -3
  8. package/dist/{ark-acFuA57I.d.ts → ark-Cgsd9tMd.d.ts} +40 -3
  9. package/dist/{asyncStorageTaskQueue-BO3cvMpP.d.cts → asyncStorageTaskQueue-C0ZsDE60.d.cts} +2 -2
  10. package/dist/{asyncStorageTaskQueue-DACXtP0I.d.ts → asyncStorageTaskQueue-CXz4PRBW.d.ts} +2 -2
  11. package/dist/{chunk-RNECH3TA.cjs → chunk-24YNIQSW.cjs} +15 -15
  12. package/dist/{chunk-RNECH3TA.cjs.map → chunk-24YNIQSW.cjs.map} +1 -1
  13. package/dist/{chunk-53XNU2EL.cjs → chunk-37XKN5DZ.cjs} +60 -40
  14. package/dist/chunk-37XKN5DZ.cjs.map +1 -0
  15. package/dist/{chunk-7L3P3EP5.js → chunk-5IMBONCK.js} +4 -4
  16. package/dist/{chunk-7L3P3EP5.js.map → chunk-5IMBONCK.js.map} +1 -1
  17. package/dist/{chunk-GMUVWKOK.cjs → chunk-CDWLZQQW.cjs} +11 -3
  18. package/dist/chunk-CDWLZQQW.cjs.map +1 -0
  19. package/dist/{chunk-D5LUPJJP.cjs → chunk-ENRRZFZ4.cjs} +774 -399
  20. package/dist/chunk-ENRRZFZ4.cjs.map +1 -0
  21. package/dist/{chunk-4EIKOJLD.js → chunk-IFGN2GB2.js} +11 -4
  22. package/dist/chunk-IFGN2GB2.js.map +1 -0
  23. package/dist/{chunk-YRLBZJYO.cjs → chunk-IMVKQQHU.cjs} +9 -9
  24. package/dist/{chunk-YRLBZJYO.cjs.map → chunk-IMVKQQHU.cjs.map} +1 -1
  25. package/dist/{chunk-BYJJIITU.cjs → chunk-MXPBHDOI.cjs} +17 -17
  26. package/dist/{chunk-BYJJIITU.cjs.map → chunk-MXPBHDOI.cjs.map} +1 -1
  27. package/dist/{chunk-ZOY5JSVA.js → chunk-NN7BNNF5.js} +3 -3
  28. package/dist/{chunk-ZOY5JSVA.js.map → chunk-NN7BNNF5.js.map} +1 -1
  29. package/dist/{chunk-A37WVZ5T.js → chunk-OOPDT2WV.js} +23 -4
  30. package/dist/chunk-OOPDT2WV.js.map +1 -0
  31. package/dist/{chunk-TEHJCEF3.js → chunk-T22257HW.js} +422 -56
  32. package/dist/chunk-T22257HW.js.map +1 -0
  33. package/dist/{chunk-QY2YVFZT.js → chunk-VNDVUM2W.js} +4 -4
  34. package/dist/{chunk-QY2YVFZT.js.map → chunk-VNDVUM2W.js.map} +1 -1
  35. package/dist/contracts/handlers/index.cjs +8 -8
  36. package/dist/contracts/handlers/index.d.cts +3 -3
  37. package/dist/contracts/handlers/index.d.ts +3 -3
  38. package/dist/contracts/handlers/index.js +2 -2
  39. package/dist/{delegate-DjwZZi6L.d.ts → delegate-CZPXtd2F.d.ts} +1 -1
  40. package/dist/{delegate-Ca_wXiYE.d.cts → delegate-xXT8O-Kn.d.cts} +1 -1
  41. package/dist/{index-Ddq0mIKX.d.ts → index-BBJ466mM.d.ts} +2 -2
  42. package/dist/{index-DFfefdpc.d.cts → index-BYG2eKOA.d.cts} +2 -2
  43. package/dist/index.cjs +246 -202
  44. package/dist/index.d.cts +169 -16
  45. package/dist/index.d.ts +169 -16
  46. package/dist/index.js +4 -4
  47. package/dist/repositories/realm/index.cjs +19 -19
  48. package/dist/repositories/realm/index.d.cts +2 -2
  49. package/dist/repositories/realm/index.d.ts +2 -2
  50. package/dist/repositories/realm/index.js +5 -5
  51. package/dist/repositories/sqlite/index.cjs +18 -18
  52. package/dist/repositories/sqlite/index.d.cts +2 -2
  53. package/dist/repositories/sqlite/index.d.ts +2 -2
  54. package/dist/repositories/sqlite/index.js +5 -5
  55. package/dist/{taskRunner-DEwlrgId.d.cts → taskRunner-BG1PRFps.d.cts} +2 -2
  56. package/dist/{taskRunner-DbCNRP31.d.ts → taskRunner-C46NnRsY.d.ts} +2 -2
  57. package/dist/wallet/expo/background.cjs +14 -14
  58. package/dist/wallet/expo/background.d.cts +3 -3
  59. package/dist/wallet/expo/background.d.ts +3 -3
  60. package/dist/wallet/expo/background.js +6 -6
  61. package/dist/wallet/expo/index.cjs +14 -14
  62. package/dist/wallet/expo/index.d.cts +5 -5
  63. package/dist/wallet/expo/index.d.ts +5 -5
  64. package/dist/wallet/expo/index.js +5 -5
  65. package/dist/{wallet-B9rpddG2.d.ts → wallet-1yWg75gN.d.cts} +100 -6
  66. package/dist/{wallet-ByjM6L20.d.cts → wallet-DuCm55EC.d.ts} +100 -6
  67. package/dist/worker/expo/index.cjs +9 -9
  68. package/dist/worker/expo/index.d.cts +4 -4
  69. package/dist/worker/expo/index.d.ts +4 -4
  70. package/dist/worker/expo/index.js +5 -5
  71. package/package.json +1 -1
  72. package/dist/chunk-4EIKOJLD.js.map +0 -1
  73. package/dist/chunk-53XNU2EL.cjs.map +0 -1
  74. package/dist/chunk-A37WVZ5T.js.map +0 -1
  75. package/dist/chunk-D5LUPJJP.cjs.map +0 -1
  76. package/dist/chunk-GMUVWKOK.cjs.map +0 -1
  77. package/dist/chunk-TEHJCEF3.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkRNECH3TA_cjs = require('./chunk-RNECH3TA.cjs');
4
- var chunk53XNU2EL_cjs = require('./chunk-53XNU2EL.cjs');
5
- var chunkGMUVWKOK_cjs = require('./chunk-GMUVWKOK.cjs');
3
+ var chunk24YNIQSW_cjs = require('./chunk-24YNIQSW.cjs');
4
+ var chunk37XKN5DZ_cjs = require('./chunk-37XKN5DZ.cjs');
5
+ var chunkCDWLZQQW_cjs = require('./chunk-CDWLZQQW.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 = chunkGMUVWKOK_cjs.getArkPsbtFields(tx.root, 0, chunkGMUVWKOK_cjs.CosignerPublicKey).map(
191
+ const cosigners = chunkCDWLZQQW_cjs.getArkPsbtFields(tx.root, 0, chunkCDWLZQQW_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 = chunkGMUVWKOK_cjs.getArkPsbtFields(g.root, 0, chunkGMUVWKOK_cjs.CosignerPublicKey).map((c) => c.key);
243
+ const cosigners = chunkCDWLZQQW_cjs.getArkPsbtFields(g.root, 0, chunkCDWLZQQW_cjs.CosignerPublicKey).map((c) => c.key);
244
244
  const { finalKey } = aggregateKeys(cosigners, true, {
245
245
  taprootTweak: this.scriptRoot
246
246
  });
@@ -419,7 +419,7 @@ var SeedIdentity = class _SeedIdentity {
419
419
  let network;
420
420
  if ("descriptor" in opts && typeof opts.descriptor === "string") {
421
421
  descriptor = opts.descriptor;
422
- network = chunk53XNU2EL_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
422
+ network = chunk37XKN5DZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
423
423
  } else {
424
424
  network = opts.isMainnet ?? true ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
425
425
  descriptor = descriptorsScure.scriptExpressions.trBIP32({
@@ -504,7 +504,7 @@ var SeedIdentity = class _SeedIdentity {
504
504
  * `StaticDescriptorProvider` for legacy single-key wallets.
505
505
  */
506
506
  isOurs(descriptor) {
507
- return chunk53XNU2EL_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
507
+ return chunk37XKN5DZ_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
508
508
  }
509
509
  /**
510
510
  * Signs each request with the key derived from its descriptor.
@@ -539,9 +539,21 @@ var SeedIdentity = class _SeedIdentity {
539
539
  const key = this.derivePrivateKeyForDescriptor(descriptor);
540
540
  return this.signMessageWithKey(key, message, signatureType);
541
541
  }
542
+ /**
543
+ * BIP-340 sign `messageHash` with the key derived from `descriptor`,
544
+ * aux_rand = 0. Backs {@link DescriptorIdentity.signSchnorrDeterministic},
545
+ * which swap preimage derivation reads through.
546
+ */
547
+ async signSchnorrDeterministicWithDescriptor(descriptor, messageHash) {
548
+ if (!this.isOurs(descriptor)) {
549
+ throw new Error(`Descriptor ${descriptor} does not belong to this identity`);
550
+ }
551
+ const key = this.derivePrivateKeyForDescriptor(descriptor);
552
+ return secp256k1.schnorr.signAsync(messageHash, key, new Uint8Array(32));
553
+ }
542
554
  // ── internal helpers ─────────────────────────────────────────────
543
555
  derivePrivateKeyForDescriptor(descriptor) {
544
- const network = chunk53XNU2EL_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
556
+ const network = chunk37XKN5DZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
545
557
  const expansion = descriptorsScure.expand({ descriptor, network });
546
558
  if (expansion.isRanged) {
547
559
  throw new Error(
@@ -627,7 +639,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
627
639
  */
628
640
  descriptor;
629
641
  constructor(descriptor) {
630
- const network = chunk53XNU2EL_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
642
+ const network = chunk37XKN5DZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
631
643
  let expansion;
632
644
  try {
633
645
  expansion = descriptorsScure.expand({ descriptor, network, index: 0 });
@@ -677,7 +689,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
677
689
  * `StaticDescriptorProvider` for legacy single-key wallets.
678
690
  */
679
691
  isOurs(descriptor) {
680
- return chunk53XNU2EL_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
692
+ return chunk37XKN5DZ_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
681
693
  }
682
694
  };
683
695
  function serializeSeedOwnedSigningIdentity(identity) {
@@ -825,6 +837,59 @@ function assertValidSerializedIdentity(s) {
825
837
  }
826
838
  }
827
839
 
840
+ // src/identity/descriptorIdentity.ts
841
+ function isHDDeterministicSignCapable(value) {
842
+ return typeof value === "object" && value !== null && typeof value.signSchnorrDeterministicWithDescriptor === "function";
843
+ }
844
+ var DescriptorIdentity = class {
845
+ descriptor;
846
+ signer;
847
+ base;
848
+ constructor({ descriptor, signer, base }) {
849
+ this.descriptor = descriptor;
850
+ this.signer = signer;
851
+ this.base = base;
852
+ }
853
+ async xOnlyPublicKey() {
854
+ return chunk37XKN5DZ_cjs.deriveDescriptorLeafPubKey(this.descriptor);
855
+ }
856
+ async compressedPublicKey() {
857
+ return chunk37XKN5DZ_cjs.deriveDescriptorLeafCompressedPubKey(this.descriptor);
858
+ }
859
+ async sign(tx, inputIndexes) {
860
+ const [signed] = await this.signer.signWithDescriptor([
861
+ { descriptor: this.descriptor, tx, inputIndexes }
862
+ ]);
863
+ if (!signed) {
864
+ throw new Error(`Descriptor signer returned no transaction for ${this.descriptor}`);
865
+ }
866
+ return signed;
867
+ }
868
+ async signMessage(message, signatureType = "schnorr") {
869
+ return this.signer.signMessageWithDescriptor(this.descriptor, message, signatureType);
870
+ }
871
+ /**
872
+ * Delegated: `TreeSignerSession.random()` consults no key material, so the
873
+ * session is index-independent.
874
+ */
875
+ signerSession() {
876
+ return this.base.signerSession();
877
+ }
878
+ /**
879
+ * Throws rather than falling back to the baseline key: a preimage derived
880
+ * from the wrong index is unrecoverable, and callers probe this member
881
+ * through a structural guard that cannot tell the two apart.
882
+ */
883
+ async signSchnorrDeterministic(messageHash) {
884
+ if (!isHDDeterministicSignCapable(this.base)) {
885
+ throw new Error(
886
+ `Identity cannot sign deterministically for descriptor ${this.descriptor}`
887
+ );
888
+ }
889
+ return this.base.signSchnorrDeterministicWithDescriptor(this.descriptor, messageHash);
890
+ }
891
+ };
892
+
828
893
  // src/identity/hdCapableIdentity.ts
829
894
  function isHDCapableIdentity(value) {
830
895
  if (typeof value !== "object" || value === null) return false;
@@ -837,6 +902,13 @@ function isBatchSignable(identity) {
837
902
  return "signMultiple" in identity && typeof identity.signMultiple === "function";
838
903
  }
839
904
 
905
+ // src/wallet/hdWalletCapable.ts
906
+ function isHDWalletCapable(value) {
907
+ if (typeof value !== "object" || value === null) return false;
908
+ const v = value;
909
+ return typeof v.getCurrentSigningDescriptor === "function" && typeof v.getUsedSigningDescriptors === "function" && typeof v.signerForDescriptor === "function";
910
+ }
911
+
840
912
  // src/worker/browser/service-worker-manager.ts
841
913
  var registrations = /* @__PURE__ */ new Map();
842
914
  var handshakes = /* @__PURE__ */ new WeakSet();
@@ -989,14 +1061,14 @@ var RestDelegateProvider = class {
989
1061
  */
990
1062
  async delegate(intent, forfeitTxs, options) {
991
1063
  const url = `${this.url}/v1/delegate`;
992
- const response = await chunkGMUVWKOK_cjs.baseFetch(url, {
1064
+ const response = await chunkCDWLZQQW_cjs.baseFetch(url, {
993
1065
  method: "POST",
994
1066
  headers: {
995
1067
  "Content-Type": "application/json"
996
1068
  },
997
1069
  body: JSON.stringify({
998
1070
  intent: {
999
- message: chunkGMUVWKOK_cjs.Intent.encodeMessage(intent.message),
1071
+ message: chunkCDWLZQQW_cjs.Intent.encodeMessage(intent.message),
1000
1072
  proof: intent.proof
1001
1073
  },
1002
1074
  forfeit_txs: forfeitTxs,
@@ -1016,7 +1088,7 @@ var RestDelegateProvider = class {
1016
1088
  */
1017
1089
  async getDelegateInfo() {
1018
1090
  const url = `${this.url}/v1/delegator/info`;
1019
- const response = await chunkGMUVWKOK_cjs.rateGate.runHttp(url, () => chunkGMUVWKOK_cjs.baseFetch(url));
1091
+ const response = await chunkCDWLZQQW_cjs.rateGate.runHttp(url, () => chunkCDWLZQQW_cjs.baseFetch(url));
1020
1092
  if (!response.ok) {
1021
1093
  const errorText2 = await response.text();
1022
1094
  throw new Error(`Failed to get delegate info: ${errorText2}`);
@@ -1043,7 +1115,7 @@ var ESPLORA_URL = {
1043
1115
  regtest: "http://localhost:3000/api"
1044
1116
  };
1045
1117
  var EsploraProvider = class {
1046
- constructor(baseUrl = ESPLORA_URL[chunkGMUVWKOK_cjs.DEFAULT_NETWORK_NAME], opts) {
1118
+ constructor(baseUrl = ESPLORA_URL[chunkCDWLZQQW_cjs.DEFAULT_NETWORK_NAME], opts) {
1047
1119
  this.baseUrl = baseUrl;
1048
1120
  this.pollingInterval = opts?.pollingInterval ?? 15e3;
1049
1121
  this.forcePolling = opts?.forcePolling ?? false;
@@ -1052,14 +1124,14 @@ var EsploraProvider = class {
1052
1124
  pollingInterval;
1053
1125
  forcePolling;
1054
1126
  async getCoins(address) {
1055
- const response = await chunkGMUVWKOK_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1127
+ const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1056
1128
  if (!response.ok) {
1057
1129
  throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
1058
1130
  }
1059
1131
  return response.json();
1060
1132
  }
1061
1133
  async getFeeRate() {
1062
- const response = await chunkGMUVWKOK_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
1134
+ const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
1063
1135
  if (response.status === 404) {
1064
1136
  return void 0;
1065
1137
  }
@@ -1080,7 +1152,7 @@ var EsploraProvider = class {
1080
1152
  }
1081
1153
  }
1082
1154
  async getTxOutspends(txid) {
1083
- const response = await chunkGMUVWKOK_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1155
+ const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1084
1156
  if (!response.ok) {
1085
1157
  const error = await response.text();
1086
1158
  throw new Error(`Failed to get transaction outspends: ${error}`);
@@ -1088,7 +1160,7 @@ var EsploraProvider = class {
1088
1160
  return response.json();
1089
1161
  }
1090
1162
  async getTransactions(address) {
1091
- const response = await chunkGMUVWKOK_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1163
+ const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1092
1164
  if (!response.ok) {
1093
1165
  const error = await response.text();
1094
1166
  throw new Error(`Failed to get transactions: ${error}`);
@@ -1096,7 +1168,7 @@ var EsploraProvider = class {
1096
1168
  return response.json();
1097
1169
  }
1098
1170
  async getTxStatus(txid) {
1099
- const txresponse = await chunkGMUVWKOK_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1171
+ const txresponse = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1100
1172
  if (!txresponse.ok) {
1101
1173
  throw new Error(txresponse.statusText);
1102
1174
  }
@@ -1104,7 +1176,7 @@ var EsploraProvider = class {
1104
1176
  if (!tx.status.confirmed) {
1105
1177
  return { confirmed: false };
1106
1178
  }
1107
- const response = await chunkGMUVWKOK_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1179
+ const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1108
1180
  if (!response.ok) {
1109
1181
  throw new Error(`Failed to get transaction status: ${response.statusText}`);
1110
1182
  }
@@ -1188,7 +1260,7 @@ var EsploraProvider = class {
1188
1260
  return stopFunc;
1189
1261
  }
1190
1262
  async getChainTip() {
1191
- const tipBlocks = await chunkGMUVWKOK_cjs.baseFetch(`${this.baseUrl}/blocks`);
1263
+ const tipBlocks = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/blocks`);
1192
1264
  if (!tipBlocks.ok) {
1193
1265
  throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
1194
1266
  }
@@ -1207,7 +1279,7 @@ var EsploraProvider = class {
1207
1279
  };
1208
1280
  }
1209
1281
  async broadcastPackage(parent, child) {
1210
- const response = await chunkGMUVWKOK_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
1282
+ const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
1211
1283
  method: "POST",
1212
1284
  headers: {
1213
1285
  "Content-Type": "application/json"
@@ -1221,7 +1293,7 @@ var EsploraProvider = class {
1221
1293
  return response.json();
1222
1294
  }
1223
1295
  async broadcastTx(tx) {
1224
- const response = await chunkGMUVWKOK_cjs.baseFetch(`${this.baseUrl}/tx`, {
1296
+ const response = await chunkCDWLZQQW_cjs.baseFetch(`${this.baseUrl}/tx`, {
1225
1297
  method: "POST",
1226
1298
  headers: {
1227
1299
  "Content-Type": "text/plain"
@@ -1383,7 +1455,7 @@ function findP2AOutput(tx) {
1383
1455
  var CHILD_DUST_AMOUNT = 546;
1384
1456
  function buildAnchorChild(params) {
1385
1457
  const { parent, feeRate, fundingCoins, changeAddress, tapInternalKey, network } = params;
1386
- const child = new chunkGMUVWKOK_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
1458
+ const child = new chunkCDWLZQQW_cjs.Transaction({ version: 3, allowLegacyWitnessUtxo: true });
1387
1459
  child.addInput(findP2AOutput(parent));
1388
1460
  const estimator = TxWeightEstimator.create().addP2AInput();
1389
1461
  for (const _ of fundingCoins) {
@@ -1431,7 +1503,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
1431
1503
  );
1432
1504
  }
1433
1505
  function buildForfeitTxWithOutput(inputs, output, txLocktime) {
1434
- const tx = new chunkGMUVWKOK_cjs.Transaction({
1506
+ const tx = new chunkCDWLZQQW_cjs.Transaction({
1435
1507
  version: 3,
1436
1508
  lockTime: txLocktime
1437
1509
  });
@@ -1507,7 +1579,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
1507
1579
  if (previousScriptKey.length !== 32) {
1508
1580
  throw new Error(`parent output ${childIndex} has invalid script`);
1509
1581
  }
1510
- const cosigners = chunkGMUVWKOK_cjs.getArkPsbtFields(child.root, 0, chunkGMUVWKOK_cjs.CosignerPublicKey);
1582
+ const cosigners = chunkCDWLZQQW_cjs.getArkPsbtFields(child.root, 0, chunkCDWLZQQW_cjs.CosignerPublicKey);
1511
1583
  if (cosigners.length === 0) {
1512
1584
  throw ErrMissingCosignersPublicKeys;
1513
1585
  }
@@ -1565,7 +1637,7 @@ var EmulatorPacket = class _EmulatorPacket {
1565
1637
  return new _EmulatorPacket(entries);
1566
1638
  }
1567
1639
  static fromBytes(data) {
1568
- const reader = new chunkRNECH3TA_cjs.BufferReader(data);
1640
+ const reader = new chunk24YNIQSW_cjs.BufferReader(data);
1569
1641
  const entryCount = reader.readCompactSize();
1570
1642
  const entries = [];
1571
1643
  for (let i = 0; i < entryCount; i++) {
@@ -1583,7 +1655,7 @@ var EmulatorPacket = class _EmulatorPacket {
1583
1655
  return _EmulatorPacket.PACKET_TYPE;
1584
1656
  }
1585
1657
  serialize() {
1586
- const writer = new chunkRNECH3TA_cjs.BufferWriter();
1658
+ const writer = new chunk24YNIQSW_cjs.BufferWriter();
1587
1659
  writer.writeCompactSize(this.entries.length);
1588
1660
  for (const entry of this.entries) {
1589
1661
  writer.writeUint16LE(entry.vin);
@@ -1670,7 +1742,7 @@ var Extension = class _Extension {
1670
1742
  `expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
1671
1743
  );
1672
1744
  }
1673
- const reader = new chunkRNECH3TA_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
1745
+ const reader = new chunk24YNIQSW_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
1674
1746
  const packets = [];
1675
1747
  while (reader.remaining() > 0) {
1676
1748
  const packetType = reader.readByte();
@@ -1744,7 +1816,7 @@ var Extension = class _Extension {
1744
1816
  */
1745
1817
  getAssetPacket() {
1746
1818
  for (const p of this.packets) {
1747
- if (p instanceof chunkRNECH3TA_cjs.Packet) {
1819
+ if (p instanceof chunk24YNIQSW_cjs.Packet) {
1748
1820
  return p;
1749
1821
  }
1750
1822
  }
@@ -1782,8 +1854,8 @@ var Extension = class _Extension {
1782
1854
  };
1783
1855
  function parsePacket(packetType, data) {
1784
1856
  switch (packetType) {
1785
- case chunkRNECH3TA_cjs.Packet.PACKET_TYPE:
1786
- return chunkRNECH3TA_cjs.Packet.fromBytes(data);
1857
+ case chunk24YNIQSW_cjs.Packet.PACKET_TYPE:
1858
+ return chunk24YNIQSW_cjs.Packet.fromBytes(data);
1787
1859
  case EmulatorPacket.PACKET_TYPE:
1788
1860
  return EmulatorPacket.fromBytes(data);
1789
1861
  default:
@@ -1830,21 +1902,35 @@ function buildOpReturnScript(data) {
1830
1902
  }
1831
1903
  return script;
1832
1904
  }
1833
- var ErrOffchainOutputNotFound = (address) => new Error(`offchain send output not found: ${address}`);
1834
- var ErrInvalidAssetOutputAmount = (got, want, assetId) => new Error(`invalid asset output amount for ${assetId}: got ${got}, want ${want}`);
1835
- var ErrAssetGroupNotFound = (assetId) => new Error(`asset group not found in batch leaf: ${assetId}`);
1836
- var ErrAssetOutputNotFound = (assetId, outputIndex) => new Error(`asset output not found in asset group ${assetId} at index ${outputIndex}`);
1905
+ var ErrOffchainOutputNotFound = (address) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(`offchain send output not found: ${address}`);
1906
+ var ErrInvalidAssetOutputAmount = (got, want, assetId) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
1907
+ `invalid asset output amount for ${assetId}: got ${got}, want ${want}`
1908
+ );
1909
+ var ErrAssetGroupNotFound = (assetId) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(`asset group not found in batch leaf: ${assetId}`);
1910
+ var ErrAssetOutputNotFound = (assetId, outputIndex) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
1911
+ `asset output not found in asset group ${assetId} at index ${outputIndex}`
1912
+ );
1913
+ var ErrOnchainOutputNotFound = (address) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(`onchain output not found: ${address}`);
1914
+ var ErrUnvalidatedOffchainOutput = (address) => new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
1915
+ `offchain output ${address} cannot be validated: virtual output tree signing did not run`
1916
+ );
1837
1917
  var ErrInvalidOnchainOutputAmount = (address) => new Error(`invalid onchain output amount: ${address}`);
1838
1918
  var ErrInvalidOnchainOutputAssets = (address) => new Error(`onchain output ${address} cannot have assets`);
1839
- var ErrOnchainOutputNotFound = (address) => new Error(`onchain output not found: ${address}`);
1840
1919
  var ErrInvalidOffchainOutputAmount = (address) => new Error(`invalid offchain output ${address}, missing amount`);
1920
+ function assertFinalCommitmentMatchesValidated(finalCommitmentTx, validatedCommitmentTxid, context) {
1921
+ if (!validatedCommitmentTxid) return;
1922
+ if (finalCommitmentTx.id === validatedCommitmentTxid) return;
1923
+ throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
1924
+ `${context}: finalization commitment tx ${finalCommitmentTx.id} differs from the validated commitment tx ${validatedCommitmentTxid}`
1925
+ );
1926
+ }
1841
1927
  function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, network) {
1842
1928
  const usedOutputs = /* @__PURE__ */ new Set();
1843
1929
  const usedOnchainOutputs = /* @__PURE__ */ new Set();
1844
1930
  for (const recipient of recipients) {
1845
1931
  let arkAddress;
1846
1932
  try {
1847
- arkAddress = chunkGMUVWKOK_cjs.ArkAddress.decode(recipient.address);
1933
+ arkAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(recipient.address);
1848
1934
  } catch {
1849
1935
  validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
1850
1936
  continue;
@@ -1852,6 +1938,18 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
1852
1938
  validateOffchainRecipient(vtxoTreeLeaves, arkAddress, recipient, usedOutputs);
1853
1939
  }
1854
1940
  }
1941
+ function validateBatchRecipientsWithoutTree(commitmentTx, recipients, network) {
1942
+ const usedOnchainOutputs = /* @__PURE__ */ new Set();
1943
+ for (const recipient of recipients) {
1944
+ try {
1945
+ chunkCDWLZQQW_cjs.ArkAddress.decode(recipient.address);
1946
+ } catch {
1947
+ validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
1948
+ continue;
1949
+ }
1950
+ throw ErrUnvalidatedOffchainOutput(recipient.address);
1951
+ }
1952
+ }
1855
1953
  function validateOnchainRecipient(commitmentTx, recipient, network, usedOutputs) {
1856
1954
  const addr = btcSigner.Address(network).decode(recipient.address);
1857
1955
  const expectedPkScript = btcSigner.OutScript.encode(addr);
@@ -1944,8 +2042,6 @@ function validateAssetGroupOutput(packet, outputIndex, assetId, expectedAmount)
1944
2042
  throw ErrInvalidAssetOutputAmount(assetOutput.amount, expectedAmount, assetId);
1945
2043
  }
1946
2044
  }
1947
-
1948
- // src/wallet/activity.ts
1949
2045
  async function buildActivities(txs, resolvers) {
1950
2046
  const preparedResolvers = (await Promise.all(
1951
2047
  resolvers.map(async (r) => {
@@ -2055,9 +2151,49 @@ function boardingResolver() {
2055
2151
  }
2056
2152
  };
2057
2153
  }
2154
+ function collabExitResolver() {
2155
+ return {
2156
+ id: "collab-exit",
2157
+ resolve(tx) {
2158
+ if (tx.tag !== "exit" || !tx.key.commitmentTxid) return void 0;
2159
+ return [
2160
+ {
2161
+ groupId: `exit:${tx.key.commitmentTxid}`,
2162
+ label: "Collaborative exit",
2163
+ kind: "exit"
2164
+ }
2165
+ ];
2166
+ }
2167
+ };
2168
+ }
2169
+ function assetMintResolver() {
2170
+ return {
2171
+ id: "asset-mint",
2172
+ resolve(tx) {
2173
+ if (!tx.assets?.length || !tx.key.arkTxid) return void 0;
2174
+ const minted = tx.assets.filter((a) => {
2175
+ try {
2176
+ return base.hex.encode(chunk24YNIQSW_cjs.AssetId.fromString(a.assetId).txid) === tx.key.arkTxid;
2177
+ } catch {
2178
+ return false;
2179
+ }
2180
+ });
2181
+ if (minted.length === 0) return void 0;
2182
+ const received = tx.type === "RECEIVED" /* TxReceived */;
2183
+ return minted.map((a) => ({
2184
+ groupId: `mint:${a.assetId}`,
2185
+ label: received ? "Asset receive" : "Asset mint",
2186
+ kind: received ? "asset-receive" : "asset-mint",
2187
+ metadata: { assetId: a.assetId, amount: a.amount.toString() }
2188
+ }));
2189
+ }
2190
+ };
2191
+ }
2058
2192
  function createDefaultActivityRegistry() {
2059
2193
  const registry = new ActivityRegistry();
2060
2194
  registry.use(boardingResolver());
2195
+ registry.use(collabExitResolver());
2196
+ registry.use(assetMintResolver());
2061
2197
  return registry;
2062
2198
  }
2063
2199
 
@@ -2080,7 +2216,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
2080
2216
  const existing = inputsByAssetId.get(asset.assetId);
2081
2217
  inputsByAssetId.set(asset.assetId, [
2082
2218
  ...existing ?? [],
2083
- chunkRNECH3TA_cjs.AssetInput.create(inputIndex, asset.amount)
2219
+ chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount)
2084
2220
  ]);
2085
2221
  }
2086
2222
  }
@@ -2092,7 +2228,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
2092
2228
  const existing = outputsByAssetId.get(asset.assetId);
2093
2229
  outputsByAssetId.set(asset.assetId, [
2094
2230
  ...existing ?? [],
2095
- chunkRNECH3TA_cjs.AssetOutput.create(outputIndex, asset.amount)
2231
+ chunk24YNIQSW_cjs.AssetOutput.create(outputIndex, asset.amount)
2096
2232
  ]);
2097
2233
  }
2098
2234
  }
@@ -2103,7 +2239,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
2103
2239
  const existing = outputsByAssetId.get(asset.assetId);
2104
2240
  outputsByAssetId.set(asset.assetId, [
2105
2241
  ...existing ?? [],
2106
- chunkRNECH3TA_cjs.AssetOutput.create(outputIndex, asset.amount)
2242
+ chunk24YNIQSW_cjs.AssetOutput.create(outputIndex, asset.amount)
2107
2243
  ]);
2108
2244
  }
2109
2245
  }
@@ -2112,11 +2248,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
2112
2248
  for (const assetIdStr of allAssetIds) {
2113
2249
  const inputs = inputsByAssetId.get(assetIdStr);
2114
2250
  const outputs = outputsByAssetId.get(assetIdStr);
2115
- const assetId = chunkRNECH3TA_cjs.AssetId.fromString(assetIdStr);
2116
- const group = chunkRNECH3TA_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
2251
+ const assetId = chunk24YNIQSW_cjs.AssetId.fromString(assetIdStr);
2252
+ const group = chunk24YNIQSW_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
2117
2253
  groups.push(group);
2118
2254
  }
2119
- return chunkRNECH3TA_cjs.Packet.create(groups);
2255
+ return chunk24YNIQSW_cjs.Packet.create(groups);
2120
2256
  }
2121
2257
  function selectCoinsWithAsset(coins, assetId, requiredAmount) {
2122
2258
  const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
@@ -2221,8 +2357,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
2221
2357
  function buildVirtualTx(inputs, outputs) {
2222
2358
  let lockTime = 0n;
2223
2359
  for (const input of inputs) {
2224
- const tapscript = chunkGMUVWKOK_cjs.decodeTapscript(chunkGMUVWKOK_cjs.scriptFromTapLeafScript(input.tapLeafScript));
2225
- if (chunkGMUVWKOK_cjs.CLTVMultisigTapscript.is(tapscript)) {
2360
+ const tapscript = chunkCDWLZQQW_cjs.decodeTapscript(chunkCDWLZQQW_cjs.scriptFromTapLeafScript(input.tapLeafScript));
2361
+ if (chunkCDWLZQQW_cjs.CLTVMultisigTapscript.is(tapscript)) {
2226
2362
  if (lockTime !== 0n) {
2227
2363
  if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
2228
2364
  throw new Error("cannot mix seconds and blocks locktime");
@@ -2233,7 +2369,7 @@ function buildVirtualTx(inputs, outputs) {
2233
2369
  }
2234
2370
  }
2235
2371
  }
2236
- const tx = new chunkGMUVWKOK_cjs.Transaction({
2372
+ const tx = new chunkCDWLZQQW_cjs.Transaction({
2237
2373
  version: 3,
2238
2374
  lockTime: Number(lockTime)
2239
2375
  });
@@ -2243,12 +2379,12 @@ function buildVirtualTx(inputs, outputs) {
2243
2379
  index: input.vout,
2244
2380
  sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
2245
2381
  witnessUtxo: {
2246
- script: chunkGMUVWKOK_cjs.VtxoScript.decode(input.tapTree).pkScript,
2382
+ script: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript,
2247
2383
  amount: BigInt(input.value)
2248
2384
  },
2249
2385
  tapLeafScript: [input.tapLeafScript]
2250
2386
  });
2251
- chunkGMUVWKOK_cjs.setArkPsbtField(tx, i, chunkGMUVWKOK_cjs.VtxoTaprootTree, input.tapTree);
2387
+ chunkCDWLZQQW_cjs.setArkPsbtField(tx, i, chunkCDWLZQQW_cjs.VtxoTaprootTree, input.tapTree);
2252
2388
  }
2253
2389
  for (const output of outputs) {
2254
2390
  tx.addOutput(output);
@@ -2257,8 +2393,8 @@ function buildVirtualTx(inputs, outputs) {
2257
2393
  return tx;
2258
2394
  }
2259
2395
  function buildCheckpointTx(vtxo, serverUnrollScript) {
2260
- const collaborativeClosure = chunkGMUVWKOK_cjs.decodeTapscript(chunkGMUVWKOK_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
2261
- const checkpointVtxoScript = new chunkGMUVWKOK_cjs.VtxoScript([
2396
+ const collaborativeClosure = chunkCDWLZQQW_cjs.decodeTapscript(chunkCDWLZQQW_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
2397
+ const checkpointVtxoScript = new chunkCDWLZQQW_cjs.VtxoScript([
2262
2398
  serverUnrollScript.script,
2263
2399
  collaborativeClosure.script
2264
2400
  ]);
@@ -2411,12 +2547,76 @@ function combineTapscriptSigs(signedTx, originalTx) {
2411
2547
  }
2412
2548
  function isValidArkAddress(address) {
2413
2549
  try {
2414
- chunkGMUVWKOK_cjs.ArkAddress.decode(address);
2550
+ chunkCDWLZQQW_cjs.ArkAddress.decode(address);
2415
2551
  return true;
2416
2552
  } catch (e) {
2417
2553
  return false;
2418
2554
  }
2419
2555
  }
2556
+ function matchServerCheckpoints(serverCheckpointTxs, expectedCheckpoints, context) {
2557
+ if (serverCheckpointTxs.length !== expectedCheckpoints.length) {
2558
+ throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
2559
+ `${context} returned ${serverCheckpointTxs.length} checkpoints, expected ${expectedCheckpoints.length}`
2560
+ );
2561
+ }
2562
+ const byTxid = new Map(expectedCheckpoints.map((c) => [c.id, c]));
2563
+ return serverCheckpointTxs.map((encoded, index) => {
2564
+ const server = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(encoded));
2565
+ const local = byTxid.get(server.id);
2566
+ if (!local) {
2567
+ throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
2568
+ `${context} checkpoint ${index} txid ${server.id} does not match any submitted checkpoint`
2569
+ );
2570
+ }
2571
+ byTxid.delete(server.id);
2572
+ return { server, local };
2573
+ });
2574
+ }
2575
+ function assertSubmittedArkTxid(response, signedArkTx, context) {
2576
+ if (response.arkTxid !== signedArkTx.id) {
2577
+ throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
2578
+ `${context} returned ark txid ${response.arkTxid}, expected ${signedArkTx.id}`
2579
+ );
2580
+ }
2581
+ if (response.finalArkTx === void 0) return;
2582
+ const finalTxid = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(response.finalArkTx)).id;
2583
+ if (finalTxid !== signedArkTx.id) {
2584
+ throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
2585
+ `${context} returned final ark tx ${finalTxid}, expected ${signedArkTx.id}`
2586
+ );
2587
+ }
2588
+ }
2589
+ function assertCheckpointsMatchInputs(checkpoints, inputs, unrollCandidates, context) {
2590
+ const byOutpoint = new Map(inputs.map((input) => [`${input.txid}:${input.vout}`, input]));
2591
+ for (const [index, checkpoint] of checkpoints.entries()) {
2592
+ if (checkpoint.inputsLength !== 1) {
2593
+ throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
2594
+ `${context}: checkpoint ${index} spends ${checkpoint.inputsLength} inputs, expected 1`
2595
+ );
2596
+ }
2597
+ const spent = checkpoint.getInput(0);
2598
+ if (!spent.txid || spent.index === void 0) {
2599
+ throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
2600
+ `${context}: checkpoint ${index} has no input outpoint`
2601
+ );
2602
+ }
2603
+ const outpoint = `${base.hex.encode(spent.txid)}:${spent.index}`;
2604
+ const input = byOutpoint.get(outpoint);
2605
+ if (!input) {
2606
+ throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
2607
+ `${context}: checkpoint ${index} spends ${outpoint}, which is not one of the requested virtual outputs`
2608
+ );
2609
+ }
2610
+ const rebuilt = unrollCandidates.some(
2611
+ (unroll) => buildCheckpointTx(input, unroll).tx.id === checkpoint.id
2612
+ );
2613
+ if (!rebuilt) {
2614
+ throw new chunkCDWLZQQW_cjs.ServerResponseMismatchError(
2615
+ `${context}: checkpoint ${index} txid ${checkpoint.id} differs from the checkpoint built locally for ${outpoint}`
2616
+ );
2617
+ }
2618
+ }
2619
+ }
2420
2620
  async function submitOffchainTx(provider, offchainTx, signer, hooks) {
2421
2621
  const { arkTx: signedArkTx, userSignedCheckpoints } = await signer.signArkTx(
2422
2622
  offchainTx.arkTx,
@@ -2428,27 +2628,26 @@ async function submitOffchainTx(provider, offchainTx, signer, hooks) {
2428
2628
  );
2429
2629
  }
2430
2630
  await hooks?.beforeSubmit?.();
2431
- const { arkTxid, signedCheckpointTxs } = await provider.submitTx(
2631
+ const response = await provider.submitTx(
2432
2632
  base.base64.encode(signedArkTx.toPSBT()),
2433
2633
  offchainTx.checkpoints.map((c) => base.base64.encode(c.toPSBT()))
2434
2634
  );
2435
- if (signedCheckpointTxs.length !== offchainTx.checkpoints.length) {
2436
- throw new Error(
2437
- `submitTx returned ${signedCheckpointTxs.length} checkpoints, expected ${offchainTx.checkpoints.length}`
2438
- );
2439
- }
2635
+ assertSubmittedArkTxid(response, signedArkTx, "submitTx");
2636
+ const { arkTxid, signedCheckpointTxs } = response;
2637
+ const matched = matchServerCheckpoints(signedCheckpointTxs, offchainTx.checkpoints, "submitTx");
2440
2638
  let finalCheckpoints;
2441
2639
  if (userSignedCheckpoints) {
2442
- finalCheckpoints = signedCheckpointTxs.map((c, i) => {
2443
- const serverSigned = chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(c));
2444
- combineTapscriptSigs(userSignedCheckpoints[i], serverSigned);
2445
- return base.base64.encode(serverSigned.toPSBT());
2640
+ const userByTxid = new Map(
2641
+ userSignedCheckpoints.map((c, i) => [offchainTx.checkpoints[i].id, c])
2642
+ );
2643
+ finalCheckpoints = matched.map(({ server, local }) => {
2644
+ combineTapscriptSigs(userByTxid.get(local.id), server);
2645
+ return base.base64.encode(server.toPSBT());
2446
2646
  });
2447
2647
  } else {
2448
2648
  finalCheckpoints = await Promise.all(
2449
- signedCheckpointTxs.map(async (c) => {
2450
- const tx = chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(c));
2451
- const signed = await signer.signCheckpoint(tx);
2649
+ matched.map(async ({ server }) => {
2650
+ const signed = await signer.signCheckpoint(server);
2452
2651
  return base.base64.encode(signed.toPSBT());
2453
2652
  })
2454
2653
  );
@@ -2646,7 +2845,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
2646
2845
  };
2647
2846
  }
2648
2847
  function deriveContractTapscripts(contract) {
2649
- const handler = chunk53XNU2EL_cjs.contractHandlers.get(contract.type);
2848
+ const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
2650
2849
  if (!handler) {
2651
2850
  throw new Error(`No handler for contract type '${contract.type}'`);
2652
2851
  }
@@ -2717,21 +2916,41 @@ function getRandomId() {
2717
2916
  }
2718
2917
  function isValidArkAddress2(address) {
2719
2918
  try {
2720
- chunkGMUVWKOK_cjs.ArkAddress.decode(address);
2919
+ chunkCDWLZQQW_cjs.ArkAddress.decode(address);
2721
2920
  return true;
2722
2921
  } catch (e) {
2723
2922
  return false;
2724
2923
  }
2725
2924
  }
2726
- function validateRecipients(recipients, dustAmount) {
2925
+ function assertRecipientArkAddress(encoded, address, context) {
2926
+ if (address.hrp !== context.hrp) {
2927
+ throw new Error(
2928
+ `Invalid Arkade address ${encoded}: expected prefix "${context.hrp}", got "${address.hrp}"`
2929
+ );
2930
+ }
2931
+ const { status } = classifyAgainstSignerSet(
2932
+ base.hex.encode(address.serverPubKey),
2933
+ context.signerSet
2934
+ );
2935
+ if (status === "UNKNOWN_SIGNER") {
2936
+ throw new Error(`Invalid Arkade address ${encoded}: unknown operator signer key`);
2937
+ }
2938
+ if (status === "EXPIRED") {
2939
+ throw new Error(
2940
+ `Invalid Arkade address ${encoded}: operator signer key is past its rotation cutoff`
2941
+ );
2942
+ }
2943
+ }
2944
+ function validateRecipients(recipients, dustAmount, context) {
2727
2945
  const validatedRecipients = [];
2728
2946
  for (const recipient of recipients) {
2729
2947
  let address;
2730
2948
  try {
2731
- address = chunkGMUVWKOK_cjs.ArkAddress.decode(recipient.address);
2949
+ address = chunkCDWLZQQW_cjs.ArkAddress.decode(recipient.address);
2732
2950
  } catch (e) {
2733
2951
  throw new Error(`Invalid Arkade address: ${recipient.address}`);
2734
2952
  }
2953
+ assertRecipientArkAddress(recipient.address, address, context);
2735
2954
  const amount = recipient.amount || dustAmount;
2736
2955
  if (amount <= 0) {
2737
2956
  throw new Error("Amount must be positive");
@@ -2756,7 +2975,7 @@ function selectPendingRecoveryOutpoints(contractsWithVtxos, signerSet, nowSecond
2756
2975
  continue;
2757
2976
  }
2758
2977
  for (const v of vtxos) {
2759
- if (!chunkGMUVWKOK_cjs.hasTerminalSpend(v) && !v.isSwept) out.add(`${v.txid}:${v.vout}`);
2978
+ if (!chunkCDWLZQQW_cjs.hasTerminalSpend(v) && !v.isSwept) out.add(`${v.txid}:${v.vout}`);
2760
2979
  }
2761
2980
  }
2762
2981
  return out;
@@ -2789,10 +3008,10 @@ function byValueDescending(vtxos) {
2789
3008
  return [...vtxos].sort((a, b) => b.value - a.value);
2790
3009
  }
2791
3010
  async function fetchTimeHeight(wallet) {
2792
- return chunkGMUVWKOK_cjs.resolveTimeHeight(wallet.onchainProvider);
3011
+ return chunkCDWLZQQW_cjs.resolveTimeHeight(wallet.onchainProvider);
2793
3012
  }
2794
3013
  function canMigrateBySend(vtxo, now) {
2795
- if (!chunkGMUVWKOK_cjs.canSpendOffchain(vtxo, now)) return false;
3014
+ if (!chunkCDWLZQQW_cjs.canSpendOffchain(vtxo, now)) return false;
2796
3015
  return vtxo.expiresAt !== void 0 || vtxo.expiresAtHeight !== void 0;
2797
3016
  }
2798
3017
  function byExpiryAscending(vtxos, now) {
@@ -2800,7 +3019,7 @@ function byExpiryAscending(vtxos, now) {
2800
3019
  if (vtxo.isSwept) return -Infinity;
2801
3020
  if (vtxo.expiresAt !== void 0) return vtxo.expiresAt.getTime();
2802
3021
  if (vtxo.expiresAtHeight !== void 0) {
2803
- return chunkGMUVWKOK_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
3022
+ return chunkCDWLZQQW_cjs.isPastExpiry(vtxo, now) ? -Infinity : Infinity;
2804
3023
  }
2805
3024
  return Infinity;
2806
3025
  };
@@ -2837,10 +3056,10 @@ var DEFAULT_SETTLEMENT_CONFIG = {
2837
3056
  };
2838
3057
  function getRecoverableVtxos(vtxos, dustAmount, now) {
2839
3058
  return vtxos.filter((vtxo) => {
2840
- if (chunkGMUVWKOK_cjs.canRecoverOnchain(vtxo, now)) {
3059
+ if (chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now)) {
2841
3060
  return true;
2842
3061
  }
2843
- if (chunkGMUVWKOK_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
3062
+ if (chunkCDWLZQQW_cjs.canSpendOffchain(vtxo, now) && vtxo.isPreconfirmed && isSubdust(vtxo, dustAmount)) {
2844
3063
  return true;
2845
3064
  }
2846
3065
  return false;
@@ -2871,7 +3090,7 @@ function getRecoverableWithSubdust(vtxos, dustAmount, now) {
2871
3090
  }
2872
3091
  function isVtxoExpiringSoon(vtxo, thresholdMs) {
2873
3092
  const realThresholdMs = thresholdMs <= 100 ? DEFAULT_THRESHOLD_MS : thresholdMs;
2874
- const expiresAt = chunkGMUVWKOK_cjs.normalizeVtxo(vtxo).expiresAt;
3093
+ const expiresAt = chunkCDWLZQQW_cjs.normalizeVtxo(vtxo).expiresAt;
2875
3094
  if (expiresAt === void 0) return false;
2876
3095
  const now = Date.now();
2877
3096
  const batchExpiry = expiresAt.getTime();
@@ -2880,7 +3099,7 @@ function isVtxoExpiringSoon(vtxo, thresholdMs) {
2880
3099
  }
2881
3100
  function getExpiringAndRecoverableVtxos(vtxos, thresholdMs, dustAmount, now) {
2882
3101
  return vtxos.filter(
2883
- (vtxo) => isVtxoExpiringSoon(vtxo, thresholdMs) || chunkGMUVWKOK_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount)
3102
+ (vtxo) => isVtxoExpiringSoon(vtxo, thresholdMs) || chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now) || isSubdust(vtxo, dustAmount)
2884
3103
  );
2885
3104
  }
2886
3105
  function isMigrationCapable(wallet) {
@@ -3362,11 +3581,11 @@ var VtxoManager = class _VtxoManager {
3362
3581
  `Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
3363
3582
  );
3364
3583
  }
3365
- const tx = new chunkGMUVWKOK_cjs.Transaction();
3584
+ const tx = new chunkCDWLZQQW_cjs.Transaction();
3366
3585
  for (const utxo of expiredUtxos) {
3367
- const utxoScript = chunkGMUVWKOK_cjs.VtxoScript.decode(utxo.tapTree);
3586
+ const utxoScript = chunkCDWLZQQW_cjs.VtxoScript.decode(utxo.tapTree);
3368
3587
  const utxoExitLeaf = utxoScript.leaves.find(
3369
- (leaf) => chunkGMUVWKOK_cjs.CSVMultisigTapscript.isScriptValid(chunkGMUVWKOK_cjs.scriptFromTapLeafScript(leaf)) === true
3588
+ (leaf) => chunkCDWLZQQW_cjs.CSVMultisigTapscript.isScriptValid(chunkCDWLZQQW_cjs.scriptFromTapLeafScript(leaf)) === true
3370
3589
  );
3371
3590
  if (!utxoExitLeaf) {
3372
3591
  throw new Error(
@@ -3381,7 +3600,7 @@ var VtxoManager = class _VtxoManager {
3381
3600
  amount: BigInt(utxo.value)
3382
3601
  },
3383
3602
  tapLeafScript: [utxoExitLeaf],
3384
- sequence: chunkGMUVWKOK_cjs.getSequence(utxoExitLeaf)
3603
+ sequence: chunkCDWLZQQW_cjs.getSequence(utxoExitLeaf)
3385
3604
  });
3386
3605
  }
3387
3606
  tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
@@ -3615,8 +3834,8 @@ var VtxoManager = class _VtxoManager {
3615
3834
  if (!serverPubKey) continue;
3616
3835
  const cls = classifyAgainstSignerSet(serverPubKey, signerSet, nowSeconds);
3617
3836
  if (cls.status === "CURRENT") continue;
3618
- const recoverable = vtxos.filter((v) => v.isSwept && !chunkGMUVWKOK_cjs.hasTerminalSpend(v));
3619
- const spendable = vtxos.filter((v) => !chunkGMUVWKOK_cjs.hasTerminalSpend(v) && !v.isSwept);
3837
+ const recoverable = vtxos.filter((v) => v.isSwept && !chunkCDWLZQQW_cjs.hasTerminalSpend(v));
3838
+ const spendable = vtxos.filter((v) => !chunkCDWLZQQW_cjs.hasTerminalSpend(v) && !v.isSwept);
3620
3839
  const value = spendable.reduce((sum, v) => sum + v.value, 0);
3621
3840
  let recoverableCount = 0;
3622
3841
  let recoverableValue = 0;
@@ -3629,7 +3848,7 @@ var VtxoManager = class _VtxoManager {
3629
3848
  awaitingSweepCount = spendable.length;
3630
3849
  awaitingSweepValue = value;
3631
3850
  for (const v of spendable) {
3632
- const exp = chunkGMUVWKOK_cjs.toBatchExpiry(v);
3851
+ const exp = chunkCDWLZQQW_cjs.toBatchExpiry(v);
3633
3852
  if (exp !== void 0 && (nextSweepEta === void 0 || exp < nextSweepEta)) {
3634
3853
  nextSweepEta = exp;
3635
3854
  }
@@ -3890,7 +4109,7 @@ var VtxoManager = class _VtxoManager {
3890
4109
  /** Decodes the boarding tapscript exit path to extract the CSV timelock. */
3891
4110
  getBoardingTimelock() {
3892
4111
  const wallet = this.getSweepWallet();
3893
- const exitScript = chunkGMUVWKOK_cjs.CSVMultisigTapscript.decode(
4112
+ const exitScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(
3894
4113
  base.hex.decode(wallet.boardingTapscript.exitScript)
3895
4114
  );
3896
4115
  return exitScript.params.timelock;
@@ -4021,8 +4240,8 @@ var VtxoManager = class _VtxoManager {
4021
4240
  * or doesn't carry the metadata.
4022
4241
  */
4023
4242
  extractSpentOutpoint(error) {
4024
- const ark = chunkGMUVWKOK_cjs.maybeArkError(error);
4025
- if (!chunkGMUVWKOK_cjs.isArkError(ark, chunkGMUVWKOK_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
4243
+ const ark = chunkCDWLZQQW_cjs.maybeArkError(error);
4244
+ if (!chunkCDWLZQQW_cjs.isArkError(ark, chunkCDWLZQQW_cjs.ArkErrorName.VTXO_ALREADY_SPENT)) return void 0;
4026
4245
  const raw = ark.metadata?.vtxo_outpoint;
4027
4246
  if (typeof raw !== "string") return void 0;
4028
4247
  const [txid, voutStr] = raw.split(":");
@@ -4212,7 +4431,7 @@ var VtxoManager = class _VtxoManager {
4212
4431
  if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
4213
4432
  break;
4214
4433
  }
4215
- const inputFee = estimator.evalOffchainInput(chunkGMUVWKOK_cjs.toOffchainInputFeeParams(v));
4434
+ const inputFee = estimator.evalOffchainInput(chunkCDWLZQQW_cjs.toOffchainInputFeeParams(v));
4216
4435
  if (inputFee.satoshis >= v.value) {
4217
4436
  continue;
4218
4437
  }
@@ -4232,7 +4451,7 @@ var VtxoManager = class _VtxoManager {
4232
4451
  const arkAddress = await this.wallet.getAddress();
4233
4452
  const outputFee = estimator.evalOffchainOutput({
4234
4453
  amount: totalAmount,
4235
- script: base.hex.encode(chunkGMUVWKOK_cjs.ArkAddress.decode(arkAddress).pkScript)
4454
+ script: base.hex.encode(chunkCDWLZQQW_cjs.ArkAddress.decode(arkAddress).pkScript)
4236
4455
  });
4237
4456
  totalAmount -= BigInt(outputFee.satoshis);
4238
4457
  if (totalAmount < dustAmount) return;
@@ -4312,7 +4531,7 @@ var ArkNote = class _ArkNote {
4312
4531
  this.value = value;
4313
4532
  this.HRP = HRP;
4314
4533
  const preimageHash = utils_js.sha256(this.preimage);
4315
- this.vtxoScript = new chunkGMUVWKOK_cjs.VtxoScript([noteTapscript(preimageHash)]);
4534
+ this.vtxoScript = new chunkCDWLZQQW_cjs.VtxoScript([noteTapscript(preimageHash)]);
4316
4535
  const leaf = this.vtxoScript.leaves[0];
4317
4536
  this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
4318
4537
  this.tapTree = this.vtxoScript.encode();
@@ -4479,7 +4698,7 @@ var ArkadeCash = class _ArkadeCash {
4479
4698
  const privateKey = data.slice(1, 33);
4480
4699
  const serverPubKey = data.slice(33, 65);
4481
4700
  const sequence = new DataView(data.buffer, data.byteOffset + 65, 4).getUint32(0, false);
4482
- const csvTimelock = chunkGMUVWKOK_cjs.sequenceToTimelock(sequence);
4701
+ const csvTimelock = chunkCDWLZQQW_cjs.sequenceToTimelock(sequence);
4483
4702
  return new _ArkadeCash(privateKey, serverPubKey, csvTimelock, decoded.prefix);
4484
4703
  }
4485
4704
  toString() {
@@ -4487,7 +4706,7 @@ var ArkadeCash = class _ArkadeCash {
4487
4706
  data[0] = _ArkadeCash.Version;
4488
4707
  data.set(this._privateKey, 1);
4489
4708
  data.set(this._serverPubKey, 33);
4490
- const sequence = chunkGMUVWKOK_cjs.timelockToSequence(this.csvTimelock);
4709
+ const sequence = chunkCDWLZQQW_cjs.timelockToSequence(this.csvTimelock);
4491
4710
  new DataView(data.buffer, data.byteOffset + 65, 4).setUint32(0, sequence, false);
4492
4711
  const words = base.bech32m.toWords(data);
4493
4712
  return base.bech32m.encode(this.hrp, words, 1023);
@@ -4496,7 +4715,7 @@ var ArkadeCash = class _ArkadeCash {
4496
4715
  return SingleKey.fromPrivateKey(this._privateKey);
4497
4716
  }
4498
4717
  get vtxoScript() {
4499
- return new chunk53XNU2EL_cjs.DefaultVtxo.Script({
4718
+ return new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
4500
4719
  pubKey: this._publicKey,
4501
4720
  serverPubKey: this._serverPubKey,
4502
4721
  csvTimelock: this.csvTimelock
@@ -4757,7 +4976,7 @@ async function captureExitBranch(params) {
4757
4976
  const nonCommitment = ordered.filter((c) => chainTxTypeToChainedExit(c.type) !== 1 /* Commitment */).map((c) => c.txid);
4758
4977
  if (nonCommitment.length > 0) {
4759
4978
  for (const psbt of await resolver.getVirtualTxs(nonCommitment)) {
4760
- psbtByTxid.set(chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
4979
+ psbtByTxid.set(chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
4761
4980
  }
4762
4981
  }
4763
4982
  }
@@ -4800,10 +5019,10 @@ var IndexerExitDataSource = class {
4800
5019
  while (hasMore) {
4801
5020
  const { chain: page, page: meta } = await this.indexer.getVtxoChain(
4802
5021
  { txid: vtxo.txid, vout: vtxo.vout },
4803
- { pageIndex, pageSize: chunkGMUVWKOK_cjs.DEFAULT_PAGE_SIZE }
5022
+ { pageIndex, pageSize: chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE }
4804
5023
  );
4805
5024
  chain.push(...page);
4806
- hasMore = meta ? page.length === chunkGMUVWKOK_cjs.DEFAULT_PAGE_SIZE : false;
5025
+ hasMore = meta ? page.length === chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE : false;
4807
5026
  pageIndex++;
4808
5027
  }
4809
5028
  return chain;
@@ -4815,12 +5034,12 @@ var IndexerExitDataSource = class {
4815
5034
  while (hasMore) {
4816
5035
  const { txs, page } = await this.indexer.getVirtualTxs(txids, {
4817
5036
  pageIndex,
4818
- pageSize: chunkGMUVWKOK_cjs.DEFAULT_PAGE_SIZE
5037
+ pageSize: chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE
4819
5038
  });
4820
5039
  for (const psbt of txs) {
4821
- out.set(chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
5040
+ out.set(chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
4822
5041
  }
4823
- hasMore = page ? txs.length === chunkGMUVWKOK_cjs.DEFAULT_PAGE_SIZE : false;
5042
+ hasMore = page ? txs.length === chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE : false;
4824
5043
  pageIndex++;
4825
5044
  }
4826
5045
  return out;
@@ -4841,7 +5060,7 @@ function chainedTxTypeToChainTxType(t) {
4841
5060
  }
4842
5061
  }
4843
5062
  function psbtInputTxids(psbtBase64) {
4844
- const tx = chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
5063
+ const tx = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
4845
5064
  const ids = [];
4846
5065
  for (let i = 0; i < tx.inputsLength; i++) {
4847
5066
  const txid = tx.getInput(i).txid;
@@ -5189,10 +5408,10 @@ async function resolveArkInfo(arkProvider, walletRepository) {
5189
5408
  try {
5190
5409
  info = await arkProvider.getInfo();
5191
5410
  } catch (err) {
5192
- if (!chunkGMUVWKOK_cjs.isRetryableProviderError(err)) throw err;
5411
+ if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
5193
5412
  const snapshot = await loadArkInfoSnapshot(walletRepository);
5194
5413
  if (!snapshot) {
5195
- throw new chunkGMUVWKOK_cjs.ProviderUnavailableError(
5414
+ throw new chunkCDWLZQQW_cjs.ProviderUnavailableError(
5196
5415
  "Arkade server info is unavailable and no cached snapshot exists",
5197
5416
  { cause: err }
5198
5417
  );
@@ -5575,7 +5794,7 @@ function collectArkTxidsNeedingCreatedAt(vtxos) {
5575
5794
  return [...txids];
5576
5795
  }
5577
5796
  async function buildTransactionHistory(vtxos, allBoardingTxs, commitmentsToIgnore, resolveTxCreatedAt) {
5578
- const fromOldestVtxo = vtxos.map(chunkGMUVWKOK_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
5797
+ const fromOldestVtxo = vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
5579
5798
  const txidsNeedingCreatedAt = resolveTxCreatedAt ? collectArkTxidsNeedingCreatedAt(fromOldestVtxo) : [];
5580
5799
  const resolvedCreatedAt = resolveTxCreatedAt && txidsNeedingCreatedAt.length > 0 ? await resolveTxCreatedAt(txidsNeedingCreatedAt) : /* @__PURE__ */ new Map();
5581
5800
  const unmatchedSettledBoardingTxs = allBoardingTxs.filter(isSettledBoardingReceive).sort((a, b) => a.createdAt - b.createdAt);
@@ -5739,7 +5958,7 @@ var AssetManager = class extends ReadonlyAssetManager {
5739
5958
  const virtualCoins = await this.wallet.getVtxos({
5740
5959
  withRecoverable: false
5741
5960
  });
5742
- const controlAssetRef = params.controlAssetId ? chunkRNECH3TA_cjs.AssetRef.fromId(chunkRNECH3TA_cjs.AssetId.fromString(params.controlAssetId)) : null;
5961
+ const controlAssetRef = params.controlAssetId ? chunk24YNIQSW_cjs.AssetRef.fromId(chunk24YNIQSW_cjs.AssetId.fromString(params.controlAssetId)) : null;
5743
5962
  const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
5744
5963
  let totalBtcSelected = 0n;
5745
5964
  const assetChanges = /* @__PURE__ */ new Map();
@@ -5752,8 +5971,8 @@ var AssetManager = class extends ReadonlyAssetManager {
5752
5971
  }
5753
5972
  }
5754
5973
  const groups = [];
5755
- const issuedAssetOutput = chunkRNECH3TA_cjs.AssetOutput.create(0, params.amount);
5756
- const issuedAssetGroup = chunkRNECH3TA_cjs.AssetGroup.create(
5974
+ const issuedAssetOutput = chunk24YNIQSW_cjs.AssetOutput.create(0, params.amount);
5975
+ const issuedAssetGroup = chunk24YNIQSW_cjs.AssetGroup.create(
5757
5976
  null,
5758
5977
  controlAssetRef,
5759
5978
  [],
@@ -5768,28 +5987,28 @@ var AssetManager = class extends ReadonlyAssetManager {
5768
5987
  for (const [inputIndex, assets] of assetInputs) {
5769
5988
  for (const asset of assets) {
5770
5989
  if (asset.assetId !== assetId) continue;
5771
- changeInputs.push(chunkRNECH3TA_cjs.AssetInput.create(inputIndex, asset.amount));
5990
+ changeInputs.push(chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount));
5772
5991
  }
5773
5992
  }
5774
5993
  groups.push(
5775
- chunkRNECH3TA_cjs.AssetGroup.create(
5776
- chunkRNECH3TA_cjs.AssetId.fromString(assetId),
5994
+ chunk24YNIQSW_cjs.AssetGroup.create(
5995
+ chunk24YNIQSW_cjs.AssetId.fromString(assetId),
5777
5996
  null,
5778
5997
  changeInputs,
5779
- [chunkRNECH3TA_cjs.AssetOutput.create(0, amount)],
5998
+ [chunk24YNIQSW_cjs.AssetOutput.create(0, amount)],
5780
5999
  []
5781
6000
  )
5782
6001
  );
5783
6002
  }
5784
6003
  }
5785
6004
  const address = await this.wallet.getAddress();
5786
- const outputAddress = chunkGMUVWKOK_cjs.ArkAddress.decode(address);
6005
+ const outputAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(address);
5787
6006
  const outputs = [
5788
6007
  {
5789
6008
  script: outputAddress.pkScript,
5790
6009
  amount: BigInt(totalBtcSelected)
5791
6010
  },
5792
- Extension.create([chunkRNECH3TA_cjs.Packet.create(groups)]).txOut()
6011
+ Extension.create([chunk24YNIQSW_cjs.Packet.create(groups)]).txOut()
5793
6012
  ];
5794
6013
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
5795
6014
  coinSelection.inputs,
@@ -5797,7 +6016,7 @@ var AssetManager = class extends ReadonlyAssetManager {
5797
6016
  );
5798
6017
  return {
5799
6018
  arkTxId: arkTxid,
5800
- assetId: chunkRNECH3TA_cjs.AssetId.create(arkTxid, 0).toString()
6019
+ assetId: chunk24YNIQSW_cjs.AssetId.create(arkTxid, 0).toString()
5801
6020
  };
5802
6021
  }
5803
6022
  /**
@@ -5869,16 +6088,16 @@ var AssetManager = class extends ReadonlyAssetManager {
5869
6088
  for (const [inputIndex, assets] of assetInputs) {
5870
6089
  for (const asset of assets) {
5871
6090
  if (asset.assetId !== params.assetId) continue;
5872
- reissueInputs.push(chunkRNECH3TA_cjs.AssetInput.create(inputIndex, asset.amount));
6091
+ reissueInputs.push(chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount));
5873
6092
  }
5874
6093
  }
5875
6094
  const totalAssetAmount = assetToReissueAmount + params.amount;
5876
- const reissueAssetIdObj = chunkRNECH3TA_cjs.AssetId.fromString(params.assetId);
5877
- const reissueAssetGroup = chunkRNECH3TA_cjs.AssetGroup.create(
6095
+ const reissueAssetIdObj = chunk24YNIQSW_cjs.AssetId.fromString(params.assetId);
6096
+ const reissueAssetGroup = chunk24YNIQSW_cjs.AssetGroup.create(
5878
6097
  reissueAssetIdObj,
5879
6098
  null,
5880
6099
  reissueInputs,
5881
- [chunkRNECH3TA_cjs.AssetOutput.create(0, totalAssetAmount)],
6100
+ [chunk24YNIQSW_cjs.AssetOutput.create(0, totalAssetAmount)],
5882
6101
  []
5883
6102
  );
5884
6103
  const groups = [reissueAssetGroup];
@@ -5887,27 +6106,27 @@ var AssetManager = class extends ReadonlyAssetManager {
5887
6106
  for (const [inputIndex, assets] of assetInputs) {
5888
6107
  for (const asset of assets) {
5889
6108
  if (asset.assetId !== assetId) continue;
5890
- changeInputs.push(chunkRNECH3TA_cjs.AssetInput.create(inputIndex, asset.amount));
6109
+ changeInputs.push(chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount));
5891
6110
  }
5892
6111
  }
5893
6112
  groups.push(
5894
- chunkRNECH3TA_cjs.AssetGroup.create(
5895
- chunkRNECH3TA_cjs.AssetId.fromString(assetId),
6113
+ chunk24YNIQSW_cjs.AssetGroup.create(
6114
+ chunk24YNIQSW_cjs.AssetId.fromString(assetId),
5896
6115
  null,
5897
6116
  changeInputs,
5898
- [chunkRNECH3TA_cjs.AssetOutput.create(0, amount)],
6117
+ [chunk24YNIQSW_cjs.AssetOutput.create(0, amount)],
5899
6118
  []
5900
6119
  )
5901
6120
  );
5902
6121
  }
5903
6122
  const address = await this.wallet.getAddress();
5904
- const outputAddress = chunkGMUVWKOK_cjs.ArkAddress.decode(address);
6123
+ const outputAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(address);
5905
6124
  const outputs = [
5906
6125
  {
5907
6126
  script: outputAddress.pkScript,
5908
6127
  amount: BigInt(totalBtcSelected)
5909
6128
  },
5910
- Extension.create([chunkRNECH3TA_cjs.Packet.create(groups)]).txOut()
6129
+ Extension.create([chunk24YNIQSW_cjs.Packet.create(groups)]).txOut()
5911
6130
  ];
5912
6131
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
5913
6132
  return arkTxid;
@@ -5974,27 +6193,27 @@ var AssetManager = class extends ReadonlyAssetManager {
5974
6193
  for (const [inputIndex, assets] of assetInputs) {
5975
6194
  for (const asset of assets) {
5976
6195
  if (asset.assetId !== assetId) continue;
5977
- changeInputs.push(chunkRNECH3TA_cjs.AssetInput.create(inputIndex, asset.amount));
6196
+ changeInputs.push(chunk24YNIQSW_cjs.AssetInput.create(inputIndex, asset.amount));
5978
6197
  }
5979
6198
  }
5980
6199
  groups.push(
5981
- chunkRNECH3TA_cjs.AssetGroup.create(
5982
- chunkRNECH3TA_cjs.AssetId.fromString(assetId),
6200
+ chunk24YNIQSW_cjs.AssetGroup.create(
6201
+ chunk24YNIQSW_cjs.AssetId.fromString(assetId),
5983
6202
  null,
5984
6203
  changeInputs,
5985
- amount > 0n ? [chunkRNECH3TA_cjs.AssetOutput.create(0, amount)] : [],
6204
+ amount > 0n ? [chunk24YNIQSW_cjs.AssetOutput.create(0, amount)] : [],
5986
6205
  []
5987
6206
  )
5988
6207
  );
5989
6208
  }
5990
6209
  const address = await this.wallet.getAddress();
5991
- const outputAddress = chunkGMUVWKOK_cjs.ArkAddress.decode(address);
6210
+ const outputAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(address);
5992
6211
  const outputs = [
5993
6212
  {
5994
6213
  script: outputAddress.pkScript,
5995
6214
  amount: BigInt(totalBtcSelected)
5996
6215
  },
5997
- Extension.create([chunkRNECH3TA_cjs.Packet.create(groups)]).txOut()
6216
+ Extension.create([chunk24YNIQSW_cjs.Packet.create(groups)]).txOut()
5998
6217
  ];
5999
6218
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
6000
6219
  return arkTxid;
@@ -6019,7 +6238,7 @@ function castMetadata(metadata) {
6019
6238
  } else {
6020
6239
  throw new Error("Invalid metadata value type");
6021
6240
  }
6022
- md.push(chunkRNECH3TA_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
6241
+ md.push(chunk24YNIQSW_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
6023
6242
  }
6024
6243
  return md;
6025
6244
  }
@@ -6040,10 +6259,10 @@ var DelegateManagerImpl = class {
6040
6259
  if (vtxos.length === 0) {
6041
6260
  return { delegated: [], failed: [] };
6042
6261
  }
6043
- const destinationScript = chunkGMUVWKOK_cjs.ArkAddress.decode(destination).pkScript;
6262
+ const destinationScript = chunkCDWLZQQW_cjs.ArkAddress.decode(destination).pkScript;
6044
6263
  const arkInfo = await this.arkInfoProvider.getInfo();
6045
6264
  const delegateInfo = await this.delegateProvider.getDelegateInfo();
6046
- const eligible = vtxos.map(chunkGMUVWKOK_cjs.normalizeVtxo).filter(
6265
+ const eligible = vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo).filter(
6047
6266
  (v) => isAnnotated(v) && findDelegateTapLeaf(v, delegateInfo.pubkey) !== void 0
6048
6267
  );
6049
6268
  if (eligible.length === 0) {
@@ -6072,11 +6291,11 @@ var DelegateManagerImpl = class {
6072
6291
  const groupByExpiry = /* @__PURE__ */ new Map();
6073
6292
  let recoverableVtxos = [];
6074
6293
  for (const vtxo of eligible) {
6075
- if (chunkGMUVWKOK_cjs.canRecoverOnchain(vtxo, now)) {
6294
+ if (chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now)) {
6076
6295
  recoverableVtxos.push(vtxo);
6077
6296
  continue;
6078
6297
  }
6079
- const expiry = chunkGMUVWKOK_cjs.toBatchExpiry(vtxo);
6298
+ const expiry = chunkCDWLZQQW_cjs.toBatchExpiry(vtxo);
6080
6299
  if (!expiry) continue;
6081
6300
  const dayKey = getDayTimestamp(expiry);
6082
6301
  groupByExpiry.set(dayKey, [...groupByExpiry.get(dayKey) ?? [], vtxo]);
@@ -6141,7 +6360,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
6141
6360
  }
6142
6361
  if (!delegateAt) {
6143
6362
  const now = { timestamp: /* @__PURE__ */ new Date() };
6144
- const expiryTimestamp = vtxos.filter((coin) => !chunkGMUVWKOK_cjs.canRecoverOnchain(coin, now) && chunkGMUVWKOK_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunkGMUVWKOK_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
6363
+ const expiryTimestamp = vtxos.filter((coin) => !chunkCDWLZQQW_cjs.canRecoverOnchain(coin, now) && chunkCDWLZQQW_cjs.toBatchExpiry(coin)).reduce((min, coin) => Math.min(min, chunkCDWLZQQW_cjs.toBatchExpiry(coin)), Number.MAX_SAFE_INTEGER);
6145
6364
  if (!expiryTimestamp || expiryTimestamp === Number.MAX_SAFE_INTEGER) {
6146
6365
  delegateAt = new Date(Date.now() + 1 * 60 * 1e3);
6147
6366
  } else {
@@ -6170,7 +6389,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
6170
6389
  let amount = 0n;
6171
6390
  for (const coin of vtxos) {
6172
6391
  const inputFee = estimator.evalOffchainInput({
6173
- ...chunkGMUVWKOK_cjs.toOffchainInputFeeParams(coin),
6392
+ ...chunkCDWLZQQW_cjs.toOffchainInputFeeParams(coin),
6174
6393
  type: "vtxo"
6175
6394
  });
6176
6395
  if (inputFee.value >= coin.value) {
@@ -6184,7 +6403,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
6184
6403
  const delegateFee = BigInt(Number(fee));
6185
6404
  if (delegateFee > 0n) {
6186
6405
  outputs.push({
6187
- script: chunkGMUVWKOK_cjs.ArkAddress.decode(delegateAddress).pkScript,
6406
+ script: chunkCDWLZQQW_cjs.ArkAddress.decode(delegateAddress).pkScript,
6188
6407
  amount: delegateFee
6189
6408
  });
6190
6409
  }
@@ -6217,10 +6436,10 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
6217
6436
  destinationScript
6218
6437
  );
6219
6438
  const forfeitOutputScript = btcSigner.OutScript.encode(
6220
- btcSigner.Address(chunkGMUVWKOK_cjs.getNetwork(network)).decode(forfeitAddress)
6439
+ btcSigner.Address(chunkCDWLZQQW_cjs.getNetwork(network)).decode(forfeitAddress)
6221
6440
  );
6222
6441
  const forfeits = await Promise.all(
6223
- vtxos.filter((v) => !chunkGMUVWKOK_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
6442
+ vtxos.filter((v) => !chunkCDWLZQQW_cjs.canRecoverOnchain(v, { timestamp: /* @__PURE__ */ new Date() })).map(async (coin) => {
6224
6443
  const forfeit = await makeDelegateForfeitTx(
6225
6444
  coin,
6226
6445
  dust,
@@ -6245,7 +6464,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
6245
6464
  index: input.vout,
6246
6465
  witnessUtxo: {
6247
6466
  amount: BigInt(input.value),
6248
- script: chunkGMUVWKOK_cjs.VtxoScript.decode(input.tapTree).pkScript
6467
+ script: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
6249
6468
  },
6250
6469
  sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
6251
6470
  tapLeafScript: [delegateTapLeaf]
@@ -6303,7 +6522,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
6303
6522
  expire_at: 0,
6304
6523
  cosigners_public_keys: cosignerPubKeys
6305
6524
  };
6306
- const proof = chunkGMUVWKOK_cjs.Intent.create(message, coins, outputs);
6525
+ const proof = chunkCDWLZQQW_cjs.Intent.create(message, coins, outputs);
6307
6526
  const signedProof = await identity.sign(proof);
6308
6527
  return {
6309
6528
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -6321,10 +6540,10 @@ function getDayTimestamp(timestamp) {
6321
6540
  function findDelegateTapLeaf(vtxo, delegatePubkey) {
6322
6541
  if (!vtxo.tapTree) return void 0;
6323
6542
  const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
6324
- const vtxoScript = chunkGMUVWKOK_cjs.VtxoScript.decode(vtxo.tapTree);
6543
+ const vtxoScript = chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree);
6325
6544
  return vtxoScript.leaves.find((tapLeaf) => {
6326
- const arkTapscript = chunkGMUVWKOK_cjs.decodeTapscript(chunkGMUVWKOK_cjs.scriptFromTapLeafScript(tapLeaf));
6327
- if (!chunkGMUVWKOK_cjs.MultisigTapscript.is(arkTapscript)) return false;
6545
+ const arkTapscript = chunkCDWLZQQW_cjs.decodeTapscript(chunkCDWLZQQW_cjs.scriptFromTapLeafScript(tapLeaf));
6546
+ if (!chunkCDWLZQQW_cjs.MultisigTapscript.is(arkTapscript)) return false;
6328
6547
  return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
6329
6548
  });
6330
6549
  }
@@ -6512,7 +6731,7 @@ async function closeDatabase(dbName) {
6512
6731
  return true;
6513
6732
  }
6514
6733
  function scriptFromArkAddress(address) {
6515
- return base.hex.encode(chunkGMUVWKOK_cjs.ArkAddress.decode(address).pkScript);
6734
+ return base.hex.encode(chunkCDWLZQQW_cjs.ArkAddress.decode(address).pkScript);
6516
6735
  }
6517
6736
 
6518
6737
  // src/repositories/indexedDB/schema.ts
@@ -7009,7 +7228,7 @@ function validateVtxosForScript(vtxos, script, context) {
7009
7228
  }
7010
7229
  async function getVtxosForContract(repo, contract) {
7011
7230
  const vtxos = repo.getVtxosForScript ? await repo.getVtxosForScript(contract.script) : filterVtxosForScript(await repo.getVtxos(contract.address), contract.script);
7012
- return vtxos.map(chunkGMUVWKOK_cjs.normalizeVtxo);
7231
+ return vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo);
7013
7232
  }
7014
7233
  async function saveVtxosForContract(repo, contract, vtxos) {
7015
7234
  if (repo.saveVtxosForScript) {
@@ -7213,7 +7432,7 @@ var deserializeTapLeaf = (t) => {
7213
7432
  const s = base.hex.decode(t.s);
7214
7433
  return [cb, s];
7215
7434
  };
7216
- var deserializeVtxo = (o) => chunkGMUVWKOK_cjs.normalizeVtxo({
7435
+ var deserializeVtxo = (o) => chunkCDWLZQQW_cjs.normalizeVtxo({
7217
7436
  ...o,
7218
7437
  createdAt: new Date(o.createdAt),
7219
7438
  tapTree: base.hex.decode(o.tapTree),
@@ -8352,7 +8571,7 @@ var ContractWatcher = class {
8352
8571
  this.connectionState = "connected";
8353
8572
  this.reconnectAttempts = 0;
8354
8573
  this.listenLoop().catch((e) => {
8355
- if (chunkGMUVWKOK_cjs.isEventSourceError(e)) {
8574
+ if (chunkCDWLZQQW_cjs.isEventSourceError(e)) {
8356
8575
  console.debug("ContractWatcher subscription disconnected; reconnecting");
8357
8576
  } else {
8358
8577
  console.error(e);
@@ -8581,14 +8800,14 @@ var ContractWatcher = class {
8581
8800
  const timestamp = Date.now();
8582
8801
  if (update.newVtxos?.length) {
8583
8802
  this.processSubscriptionVtxos(
8584
- update.newVtxos.map(chunkGMUVWKOK_cjs.normalizeVtxo),
8803
+ update.newVtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo),
8585
8804
  "vtxo_received",
8586
8805
  timestamp
8587
8806
  );
8588
8807
  }
8589
8808
  if (update.spentVtxos?.length) {
8590
8809
  this.processSubscriptionVtxos(
8591
- update.spentVtxos.map(chunkGMUVWKOK_cjs.normalizeVtxo),
8810
+ update.spentVtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo),
8592
8811
  "vtxo_spent",
8593
8812
  timestamp
8594
8813
  );
@@ -8721,7 +8940,7 @@ async function reconcileIntents(deps) {
8721
8940
  let vtxosByOutpoint = /* @__PURE__ */ new Map();
8722
8941
  if (outpoints.length > 0) {
8723
8942
  try {
8724
- const { vtxos } = await chunkGMUVWKOK_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
8943
+ const { vtxos } = await chunkCDWLZQQW_cjs.getNormalizedVtxos(deps.indexerProvider, { outpoints });
8725
8944
  vtxosByOutpoint = new Map(vtxos.map((v) => [outpointKey(v), v]));
8726
8945
  } catch (e) {
8727
8946
  console.error("reconcileIntents: failed to fetch input VTXO state", e);
@@ -8841,7 +9060,7 @@ var ContractManager = class _ContractManager {
8841
9060
  await this.reconcileWatched();
8842
9061
  this.markSyncOnline();
8843
9062
  } catch (err) {
8844
- if (!chunkGMUVWKOK_cjs.isRetryableProviderError(err)) throw err;
9063
+ if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
8845
9064
  this.markSyncDegraded(err);
8846
9065
  }
8847
9066
  this.initialized = true;
@@ -8953,7 +9172,7 @@ var ContractManager = class _ContractManager {
8953
9172
  const from = Math.max(0, watermark - lookAhead.size);
8954
9173
  const to = watermark + lookAhead.size;
8955
9174
  const deps = lookAhead.candidateDeps();
8956
- const handlers = chunk53XNU2EL_cjs.contractHandlers.getRegisteredTypes().map((t) => chunk53XNU2EL_cjs.contractHandlers.get(t)).filter(hasCandidates);
9175
+ const handlers = chunk37XKN5DZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunk37XKN5DZ_cjs.contractHandlers.get(t)).filter(hasCandidates);
8957
9176
  const band = /* @__PURE__ */ new Map();
8958
9177
  for (let index = from; index <= to; index++) {
8959
9178
  const descriptor = lookAhead.materialize(index);
@@ -8964,7 +9183,7 @@ var ContractManager = class _ContractManager {
8964
9183
  index,
8965
9184
  params: {
8966
9185
  ...candidate,
8967
- ...chunk53XNU2EL_cjs.speculativeReceiveMetadata(descriptor)
9186
+ ...chunk37XKN5DZ_cjs.speculativeReceiveMetadata(descriptor)
8968
9187
  }
8969
9188
  });
8970
9189
  }
@@ -9024,7 +9243,7 @@ var ContractManager = class _ContractManager {
9024
9243
  });
9025
9244
  for (const entry of pending) entry.catchUpPending = false;
9026
9245
  } catch (err) {
9027
- if (!chunkGMUVWKOK_cjs.isRetryableProviderError(err)) throw err;
9246
+ if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
9028
9247
  this.markSyncDegraded(err);
9029
9248
  }
9030
9249
  }
@@ -9068,7 +9287,7 @@ var ContractManager = class _ContractManager {
9068
9287
  await this.fetchContractVxosFromIndexer([contract]);
9069
9288
  this.markSyncOnline();
9070
9289
  } catch (err) {
9071
- if (!chunkGMUVWKOK_cjs.isRetryableProviderError(err)) throw err;
9290
+ if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
9072
9291
  this.markSyncDegraded(err);
9073
9292
  }
9074
9293
  await this.watcher.addContract(contract);
@@ -9105,7 +9324,7 @@ var ContractManager = class _ContractManager {
9105
9324
  return result;
9106
9325
  }
9107
9326
  async upsertContractRow(params) {
9108
- const handler = chunk53XNU2EL_cjs.contractHandlers.get(params.type);
9327
+ const handler = chunk37XKN5DZ_cjs.contractHandlers.get(params.type);
9109
9328
  if (!handler) {
9110
9329
  throw new Error(`No handler registered for contract type '${params.type}'`);
9111
9330
  }
@@ -9205,7 +9424,7 @@ var ContractManager = class _ContractManager {
9205
9424
  `scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
9206
9425
  );
9207
9426
  }
9208
- const registered = chunk53XNU2EL_cjs.contractHandlers.getRegisteredTypes().map((t) => chunk53XNU2EL_cjs.contractHandlers.get(t)).filter(isDiscoverable);
9427
+ const registered = chunk37XKN5DZ_cjs.contractHandlers.getRegisteredTypes().map((t) => chunk37XKN5DZ_cjs.contractHandlers.get(t)).filter(isDiscoverable);
9209
9428
  const discoverables = [
9210
9429
  ...registered.filter((h) => h.type === "boarding"),
9211
9430
  ...registered.filter((h) => h.type !== "boarding")
@@ -9340,7 +9559,7 @@ var ContractManager = class _ContractManager {
9340
9559
  await this.syncContracts({ contracts, pageSize });
9341
9560
  this.markSyncOnline();
9342
9561
  } catch (err) {
9343
- if (!chunkGMUVWKOK_cjs.isRetryableProviderError(err)) throw err;
9562
+ if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
9344
9563
  this.markSyncDegraded(err);
9345
9564
  }
9346
9565
  const vtxos = await this.getVtxosForContracts(contracts);
@@ -9361,7 +9580,7 @@ var ContractManager = class _ContractManager {
9361
9580
  }
9362
9581
  const tapscriptCache = /* @__PURE__ */ new Map();
9363
9582
  return vtxos.map(
9364
- (vtxo) => extendVirtualCoinForContract(chunkGMUVWKOK_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
9583
+ (vtxo) => extendVirtualCoinForContract(chunkCDWLZQQW_cjs.normalizeVtxo(vtxo), byScript, tapscriptCache)
9365
9584
  );
9366
9585
  }
9367
9586
  buildContractsDbFilter(filter) {
@@ -9446,7 +9665,7 @@ var ContractManager = class _ContractManager {
9446
9665
  const { contractScript, collaborative = true, walletPubKey, vtxo } = options;
9447
9666
  const [contract] = await this.getContracts({ script: contractScript });
9448
9667
  if (!contract) return [];
9449
- const handler = chunk53XNU2EL_cjs.contractHandlers.get(contract.type);
9668
+ const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
9450
9669
  if (!handler) return [];
9451
9670
  const script = handler.createScript(contract.params);
9452
9671
  const context = {
@@ -9466,7 +9685,7 @@ var ContractManager = class _ContractManager {
9466
9685
  const { contractScript, collaborative = true, walletPubKey } = options;
9467
9686
  const [contract] = await this.getContracts({ script: contractScript });
9468
9687
  if (!contract) return [];
9469
- const handler = chunk53XNU2EL_cjs.contractHandlers.get(contract.type);
9688
+ const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
9470
9689
  if (!handler) return [];
9471
9690
  const script = handler.createScript(contract.params);
9472
9691
  const context = {
@@ -9522,7 +9741,7 @@ var ContractManager = class _ContractManager {
9522
9741
  }
9523
9742
  async refreshOutpoints(outpoints) {
9524
9743
  if (outpoints.length === 0) return;
9525
- const { vtxos } = await chunkGMUVWKOK_cjs.getNormalizedVtxos(this.config.indexerProvider, {
9744
+ const { vtxos } = await chunkCDWLZQQW_cjs.getNormalizedVtxos(this.config.indexerProvider, {
9526
9745
  outpoints
9527
9746
  });
9528
9747
  if (vtxos.length === 0) return;
@@ -9600,7 +9819,7 @@ var ContractManager = class _ContractManager {
9600
9819
  break;
9601
9820
  }
9602
9821
  } catch (err) {
9603
- if (!chunkGMUVWKOK_cjs.isRetryableProviderError(err)) throw err;
9822
+ if (!chunkCDWLZQQW_cjs.isRetryableProviderError(err)) throw err;
9604
9823
  this.markSyncDegraded(err);
9605
9824
  }
9606
9825
  this.emitEvent(event);
@@ -9649,7 +9868,7 @@ var ContractManager = class _ContractManager {
9649
9868
  */
9650
9869
  async reconcilePendingFrontier(contracts) {
9651
9870
  const scriptToContract = new Map(contracts.map((c) => [c.script, c]));
9652
- const vtxos = await chunkGMUVWKOK_cjs.getAllNormalizedVtxos(
9871
+ const vtxos = await chunkCDWLZQQW_cjs.getAllNormalizedVtxos(
9653
9872
  this.config.indexerProvider,
9654
9873
  contracts.map((c) => c.script),
9655
9874
  { pendingOnly: true }
@@ -9730,7 +9949,7 @@ var ContractManager = class _ContractManager {
9730
9949
  }
9731
9950
  return result;
9732
9951
  }
9733
- async fetchContractVtxosBulk(contracts, pageSize = chunkGMUVWKOK_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
9952
+ async fetchContractVtxosBulk(contracts, pageSize = chunkCDWLZQQW_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
9734
9953
  if (contracts.length === 0) {
9735
9954
  return { vtxosByScript: /* @__PURE__ */ new Map(), promoted: /* @__PURE__ */ new Map() };
9736
9955
  }
@@ -9746,7 +9965,7 @@ var ContractManager = class _ContractManager {
9746
9965
  before: syncWindow.before
9747
9966
  }
9748
9967
  } : {};
9749
- const vtxos = await chunkGMUVWKOK_cjs.getAllNormalizedVtxos(
9968
+ const vtxos = await chunkCDWLZQQW_cjs.getAllNormalizedVtxos(
9750
9969
  this.config.indexerProvider,
9751
9970
  contracts.map((c) => c.script),
9752
9971
  { ...windowOpts, pageSize }
@@ -9913,7 +10132,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
9913
10132
  */
9914
10133
  materializeDescriptorAt(index) {
9915
10134
  const descriptor = this.identity.descriptor;
9916
- const network = chunk53XNU2EL_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
10135
+ const network = chunk37XKN5DZ_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
9917
10136
  const expansion = descriptorsScure.expand({ descriptor, network, index });
9918
10137
  const keyInfo = expansion.expansionMap?.["@0"];
9919
10138
  if (!keyInfo?.keyExpression) {
@@ -10057,7 +10276,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
10057
10276
  const provider = await resolveDescriptorProvider(config, setup.walletRepository);
10058
10277
  if (!provider) return void 0;
10059
10278
  const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
10060
- const expectedContractType = setup.offchainTapscript instanceof chunk53XNU2EL_cjs.DelegateVtxo.Script ? "delegate" : "default";
10279
+ const expectedContractType = setup.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? "delegate" : "default";
10061
10280
  const factoryOpts = {
10062
10281
  walletRepository: setup.walletRepository,
10063
10282
  contractRepository: setup.contractRepository,
@@ -10256,7 +10475,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
10256
10475
  };
10257
10476
  function deriveLeafPubkey(descriptor) {
10258
10477
  try {
10259
- return chunk53XNU2EL_cjs.deriveDescriptorLeafPubKey(descriptor);
10478
+ return chunk37XKN5DZ_cjs.deriveDescriptorLeafPubKey(descriptor);
10260
10479
  } catch (e) {
10261
10480
  throw new NonRangeableDescriptorError(
10262
10481
  "Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
@@ -10268,7 +10487,7 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
10268
10487
  const pubKey = deriveLeafPubkey(descriptor);
10269
10488
  const tapscript = rebuildTapscript(current, pubKey);
10270
10489
  const serverPubKey = tapscript.options.serverPubKey;
10271
- const csvTimelock = chunkGMUVWKOK_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
10490
+ const csvTimelock = chunkCDWLZQQW_cjs.timelockToSequence(tapscript.options.csvTimelock).toString();
10272
10491
  const base$1 = {
10273
10492
  script: base.hex.encode(tapscript.pkScript),
10274
10493
  address: tapscript.address(hrp, serverPubKey).encode(),
@@ -10279,11 +10498,11 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
10279
10498
  // index-0 key. Without it, spends produce unsigned PSBTs that the
10280
10499
  // server rejects with `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
10281
10500
  metadata: {
10282
- ...{ source: chunk53XNU2EL_cjs.WALLET_RECEIVE_SOURCE },
10501
+ ...{ source: chunk37XKN5DZ_cjs.WALLET_RECEIVE_SOURCE },
10283
10502
  signingDescriptor: descriptor
10284
10503
  }
10285
10504
  };
10286
- const params = tapscript instanceof chunk53XNU2EL_cjs.DelegateVtxo.Script ? {
10505
+ const params = tapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? {
10287
10506
  ...base$1,
10288
10507
  type: "delegate",
10289
10508
  params: {
@@ -10304,10 +10523,10 @@ function buildReceiveContract(current, descriptor, hrp, tagSource) {
10304
10523
  return { tapscript, params };
10305
10524
  }
10306
10525
  function rebuildTapscript(current, pubKey) {
10307
- if (current instanceof chunk53XNU2EL_cjs.DelegateVtxo.Script) {
10308
- return new chunk53XNU2EL_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
10526
+ if (current instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script) {
10527
+ return new chunk37XKN5DZ_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
10309
10528
  }
10310
- return new chunk53XNU2EL_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
10529
+ return new chunk37XKN5DZ_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
10311
10530
  }
10312
10531
  async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
10313
10532
  const candidates = await contractRepository.getContracts({
@@ -10316,7 +10535,7 @@ async function pickActiveReceive(contractRepository, serverPubKey, expectedType)
10316
10535
  });
10317
10536
  const serverPubKeyHex = base.hex.encode(serverPubKey);
10318
10537
  const matching = candidates.filter(
10319
- (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk53XNU2EL_cjs.WALLET_RECEIVE_SOURCE
10538
+ (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk37XKN5DZ_cjs.WALLET_RECEIVE_SOURCE
10320
10539
  ).sort((a, b) => {
10321
10540
  if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
10322
10541
  return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
@@ -10492,12 +10711,12 @@ var InputSignerRouter = class {
10492
10711
  };
10493
10712
 
10494
10713
  // src/wallet/wallet.ts
10495
- var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunkGMUVWKOK_cjs.DEFAULT_ARKADE_SERVER_URL;
10714
+ var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunkCDWLZQQW_cjs.DEFAULT_ARKADE_SERVER_URL;
10496
10715
  function intentProofJobs(coins) {
10497
10716
  if (coins.length === 0) return [];
10498
10717
  const coinJobs = coins.map((coin, i) => ({
10499
10718
  index: i + 1,
10500
- lookupScript: chunkGMUVWKOK_cjs.VtxoScript.decode(coin.tapTree).pkScript
10719
+ lookupScript: chunkCDWLZQQW_cjs.VtxoScript.decode(coin.tapTree).pkScript
10501
10720
  }));
10502
10721
  return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
10503
10722
  }
@@ -10522,7 +10741,7 @@ function dedupeTimelocks(timelocks) {
10522
10741
  const seen = /* @__PURE__ */ new Set();
10523
10742
  const deduped = [];
10524
10743
  for (const timelock of timelocks) {
10525
- const sequence = chunkGMUVWKOK_cjs.timelockToSequence(timelock).toString();
10744
+ const sequence = chunkCDWLZQQW_cjs.timelockToSequence(timelock).toString();
10526
10745
  if (seen.has(sequence)) continue;
10527
10746
  seen.add(sequence);
10528
10747
  deduped.push(timelock);
@@ -10539,7 +10758,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
10539
10758
  state: "active"
10540
10759
  });
10541
10760
  const newest = candidates.filter(
10542
- (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk53XNU2EL_cjs.WALLET_RECEIVE_SOURCE
10761
+ (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk37XKN5DZ_cjs.WALLET_RECEIVE_SOURCE
10543
10762
  ).sort((a, b) => {
10544
10763
  if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
10545
10764
  return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
@@ -10547,7 +10766,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
10547
10766
  if (!newest?.params.pubKey) return baseline;
10548
10767
  try {
10549
10768
  const pubKey = base.hex.decode(newest.params.pubKey);
10550
- return new chunk53XNU2EL_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
10769
+ return new chunk37XKN5DZ_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
10551
10770
  } catch (e) {
10552
10771
  console.warn("Skipping malformed boarding contract at boot", newest.script, e);
10553
10772
  return baseline;
@@ -10797,6 +11016,20 @@ var ReadonlyWallet = class _ReadonlyWallet {
10797
11016
  ...this._deprecatedSigners.keys()
10798
11017
  ]);
10799
11018
  }
11019
+ /**
11020
+ * `serverPubKey` defaults to the live key; spend paths that snapshot it
11021
+ * against mid-flight rotation pass their snapshot, so the check reads from
11022
+ * one rotation epoch.
11023
+ */
11024
+ recipientAddressContext(serverPubKey = this._arkServerPublicKey) {
11025
+ return {
11026
+ hrp: this.network.hrp,
11027
+ signerSet: {
11028
+ active: toXOnlySignerHex(base.hex.encode(serverPubKey)),
11029
+ deprecated: this._deprecatedSigners
11030
+ }
11031
+ };
11032
+ }
10800
11033
  /**
10801
11034
  * Currently-active receive tapscript. Read-only from the outside;
10802
11035
  * mutated only via {@link Wallet.setOffchainTapscriptForRotation}
@@ -10867,7 +11100,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
10867
11100
  */
10868
11101
  static async setupWalletConfig(config, pubKey) {
10869
11102
  const arkadeServerUrl = getArkadeServerUrl(config);
10870
- const arkProvider = config.arkProvider || new chunkGMUVWKOK_cjs.RestArkProvider(arkadeServerUrl);
11103
+ const arkProvider = config.arkProvider || new chunkCDWLZQQW_cjs.RestArkProvider(arkadeServerUrl);
10871
11104
  let indexerProvider = config.indexerProvider;
10872
11105
  if (!indexerProvider) {
10873
11106
  let indexerUrl = config.indexerUrl;
@@ -10884,7 +11117,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
10884
11117
  indexerUrl = arkadeServerUrl;
10885
11118
  }
10886
11119
  }
10887
- indexerProvider = new chunkRNECH3TA_cjs.RestIndexerProvider(indexerUrl);
11120
+ indexerProvider = new chunk24YNIQSW_cjs.RestIndexerProvider(indexerUrl);
10888
11121
  }
10889
11122
  const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
10890
11123
  const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
@@ -10893,7 +11126,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
10893
11126
  source: serverInfoSource,
10894
11127
  lastOnlineAt: serverInfoLastOnlineAt
10895
11128
  } = await resolveArkInfo(arkProvider, walletRepository);
10896
- const network = chunkGMUVWKOK_cjs.getNetwork(info.network);
11129
+ const network = chunkCDWLZQQW_cjs.getNetwork(info.network);
10897
11130
  if ("descriptor" in config.identity) {
10898
11131
  const descriptor = config.identity.descriptor;
10899
11132
  const identityIsMainnet = !descriptor.includes("tpub");
@@ -10940,11 +11173,11 @@ var ReadonlyWallet = class _ReadonlyWallet {
10940
11173
  serverPubKey,
10941
11174
  csvTimelock: exitTimelock
10942
11175
  };
10943
- const offchainTapscript = !delegatePubKey ? new chunk53XNU2EL_cjs.DefaultVtxo.Script(offchainOptions) : new chunk53XNU2EL_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
10944
- const boardingTapscript = chunk53XNU2EL_cjs.BoardingContractHandler.createScript({
11176
+ const offchainTapscript = !delegatePubKey ? new chunk37XKN5DZ_cjs.DefaultVtxo.Script(offchainOptions) : new chunk37XKN5DZ_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
11177
+ const boardingTapscript = chunk37XKN5DZ_cjs.BoardingContractHandler.createScript({
10945
11178
  pubKey: base.hex.encode(pubKey),
10946
11179
  serverPubKey: base.hex.encode(serverPubKey),
10947
- csvTimelock: chunkGMUVWKOK_cjs.timelockToSequence(boardingTimelock).toString()
11180
+ csvTimelock: chunkCDWLZQQW_cjs.timelockToSequence(boardingTimelock).toString()
10948
11181
  });
10949
11182
  return {
10950
11183
  arkProvider,
@@ -11050,19 +11283,19 @@ var ReadonlyWallet = class _ReadonlyWallet {
11050
11283
  let pendingRecovery = 0;
11051
11284
  const now = { timestamp: /* @__PURE__ */ new Date() };
11052
11285
  const settled = vtxos.filter(
11053
- (coin) => chunkGMUVWKOK_cjs.canSpendOffchain(coin, now) && !coin.isPreconfirmed && !isPendingRecovery(coin)
11286
+ (coin) => chunkCDWLZQQW_cjs.canSpendOffchain(coin, now) && !coin.isPreconfirmed && !isPendingRecovery(coin)
11054
11287
  ).reduce((sum, coin) => sum + coin.value, 0);
11055
11288
  const preconfirmed = vtxos.filter(
11056
- (coin) => chunkGMUVWKOK_cjs.canSpendOffchain(coin, now) && coin.isPreconfirmed && !isPendingRecovery(coin)
11289
+ (coin) => chunkCDWLZQQW_cjs.canSpendOffchain(coin, now) && coin.isPreconfirmed && !isPendingRecovery(coin)
11057
11290
  ).reduce((sum, coin) => sum + coin.value, 0);
11058
- const available = unlockedVtxos.filter((coin) => chunkGMUVWKOK_cjs.canSpendOffchain(coin, now) && !isPendingRecovery(coin)).reduce((sum, coin) => sum + coin.value, 0);
11059
- recoverable = vtxos.filter((coin) => chunkGMUVWKOK_cjs.canRecoverOnchain(coin, now) && !isPendingRecovery(coin)).reduce((sum, coin) => sum + coin.value, 0);
11291
+ const available = unlockedVtxos.filter((coin) => chunkCDWLZQQW_cjs.canSpendOffchain(coin, now) && !isPendingRecovery(coin)).reduce((sum, coin) => sum + coin.value, 0);
11292
+ recoverable = vtxos.filter((coin) => chunkCDWLZQQW_cjs.canRecoverOnchain(coin, now) && !isPendingRecovery(coin)).reduce((sum, coin) => sum + coin.value, 0);
11060
11293
  pendingRecovery = vtxos.filter(isPendingRecovery).reduce((sum, coin) => sum + coin.value, 0);
11061
11294
  const totalBoarding = confirmed + unconfirmed;
11062
11295
  const totalOffchain = settled + preconfirmed + recoverable + pendingRecovery;
11063
11296
  const assetBalances = /* @__PURE__ */ new Map();
11064
11297
  for (const vtxo of vtxos) {
11065
- if (chunkGMUVWKOK_cjs.hasTerminalSpend(vtxo)) continue;
11298
+ if (chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) continue;
11066
11299
  if (vtxo.assets) {
11067
11300
  for (const a of vtxo.assets) {
11068
11301
  const current = assetBalances.get(a.assetId) ?? 0n;
@@ -11103,8 +11336,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
11103
11336
  if (this._pendingSpendOutpoints.has(`${vtxo.txid}:${vtxo.vout}`)) {
11104
11337
  return false;
11105
11338
  }
11106
- if (!chunkGMUVWKOK_cjs.hasTerminalSpend(vtxo)) {
11107
- if (!f.withRecoverable && chunkGMUVWKOK_cjs.canRecoverOnchain(vtxo, now)) {
11339
+ if (!chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) {
11340
+ if (!f.withRecoverable && chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now)) {
11108
11341
  return false;
11109
11342
  }
11110
11343
  return true;
@@ -11137,7 +11370,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
11137
11370
  const response = await contractManager.getContractsWithVtxos();
11138
11371
  const allVtxos = response.flatMap((_) => _.vtxos);
11139
11372
  const { boardingTxs, commitmentsToIgnore } = await this.getBoardingTxs();
11140
- const resolveTxCreatedAt = (txids) => chunkGMUVWKOK_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
11373
+ const resolveTxCreatedAt = (txids) => chunkCDWLZQQW_cjs.fetchVtxoCreatedAtByTxid(this.indexerProvider, txids);
11141
11374
  return buildTransactionHistory(
11142
11375
  allVtxos,
11143
11376
  boardingTxs,
@@ -11231,7 +11464,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
11231
11464
  },
11232
11465
  isUnrolled: true,
11233
11466
  ...boardingFacts,
11234
- virtualStatus: chunkGMUVWKOK_cjs.toVirtualStatus(boardingFacts),
11467
+ virtualStatus: chunkCDWLZQQW_cjs.toVirtualStatus(boardingFacts),
11235
11468
  spentBy: "",
11236
11469
  createdAt: tx.status.confirmed ? new Date(tx.status.block_time * 1e3) : /* @__PURE__ */ new Date(0),
11237
11470
  script: scriptHex
@@ -11287,9 +11520,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
11287
11520
  async getBoardingTapscripts(allowedSigners) {
11288
11521
  const byScript = /* @__PURE__ */ new Map();
11289
11522
  const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
11290
- const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunk53XNU2EL_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
11523
+ const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
11291
11524
  add(
11292
- new chunk53XNU2EL_cjs.DefaultVtxo.Script({
11525
+ new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
11293
11526
  pubKey: await this.identity.xOnlyPublicKey(),
11294
11527
  serverPubKey: this.boardingTapscript.options.serverPubKey,
11295
11528
  csvTimelock: boardingCsv
@@ -11304,7 +11537,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
11304
11537
  for (const c of boardingContracts) {
11305
11538
  if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
11306
11539
  try {
11307
- add(chunk53XNU2EL_cjs.BoardingContractHandler.createScript(c.params));
11540
+ add(chunk37XKN5DZ_cjs.BoardingContractHandler.createScript(c.params));
11308
11541
  } catch (e) {
11309
11542
  console.warn("Skipping malformed boarding contract", c.script, e);
11310
11543
  }
@@ -11342,7 +11575,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
11342
11575
  // Per-row CSV delay decoded from THIS tapscript's exit leaf —
11343
11576
  // not the wallet's current boarding timelock, which a signer
11344
11577
  // rotation may have changed.
11345
- csvTimelock: chunkGMUVWKOK_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
11578
+ csvTimelock: chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
11346
11579
  coins: utxos
11347
11580
  });
11348
11581
  }
@@ -11475,7 +11708,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
11475
11708
  /** Fetch Arkade transaction ids that are still pending final settlement. */
11476
11709
  async fetchPendingTxs() {
11477
11710
  const scripts = await this.getWalletScripts();
11478
- const vtxos = await chunkGMUVWKOK_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
11711
+ const vtxos = await chunkCDWLZQQW_cjs.getAllNormalizedVtxos(this.indexerProvider, scripts);
11479
11712
  return vtxos.filter(
11480
11713
  (vtxo) => (vtxo.isSpent || vtxo.isPreconfirmed && !vtxo.isSwept) && vtxo.arkTxId !== void 0
11481
11714
  ).map((_) => _.arkTxId);
@@ -11506,7 +11739,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
11506
11739
  });
11507
11740
  for (const contract of contracts) {
11508
11741
  if (map.has(contract.script)) continue;
11509
- const handler = chunk53XNU2EL_cjs.contractHandlers.get(contract.type);
11742
+ const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
11510
11743
  if (handler) {
11511
11744
  const script = handler.createScript(contract.params);
11512
11745
  map.set(contract.script, script);
@@ -11609,7 +11842,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
11609
11842
  lookAhead: this.lookAheadConfig()
11610
11843
  });
11611
11844
  const baselinePubkey = await this.identity.xOnlyPublicKey();
11612
- const delegatePubKey = this.offchainTapscript instanceof chunk53XNU2EL_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
11845
+ const delegatePubKey = this.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
11613
11846
  const baselineSigners = [
11614
11847
  this.offchainTapscript.options.serverPubKey,
11615
11848
  ...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
@@ -11617,8 +11850,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
11617
11850
  const seenBaselineScripts = /* @__PURE__ */ new Set();
11618
11851
  for (const serverPubKey of baselineSigners) {
11619
11852
  for (const csvTimelock of this.walletContractTimelocks) {
11620
- const csvTimelockStr = chunkGMUVWKOK_cjs.timelockToSequence(csvTimelock).toString();
11621
- const defaultScript = new chunk53XNU2EL_cjs.DefaultVtxo.Script({
11853
+ const csvTimelockStr = chunkCDWLZQQW_cjs.timelockToSequence(csvTimelock).toString();
11854
+ const defaultScript = new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
11622
11855
  pubKey: baselinePubkey,
11623
11856
  serverPubKey,
11624
11857
  csvTimelock
@@ -11639,7 +11872,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
11639
11872
  });
11640
11873
  }
11641
11874
  if (delegatePubKey) {
11642
- const delegateScript = new chunk53XNU2EL_cjs.DelegateVtxo.Script({
11875
+ const delegateScript = new chunk37XKN5DZ_cjs.DelegateVtxo.Script({
11643
11876
  pubKey: baselinePubkey,
11644
11877
  serverPubKey,
11645
11878
  delegatePubKey,
@@ -11663,9 +11896,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
11663
11896
  }
11664
11897
  }
11665
11898
  }
11666
- const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunk53XNU2EL_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
11899
+ const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
11667
11900
  for (const serverPubKey of baselineSigners) {
11668
- const baselineBoarding = new chunk53XNU2EL_cjs.DefaultVtxo.Script({
11901
+ const baselineBoarding = new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
11669
11902
  pubKey: baselinePubkey,
11670
11903
  serverPubKey,
11671
11904
  csvTimelock: boardingCsvTimelock
@@ -11678,7 +11911,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
11678
11911
  params: {
11679
11912
  pubKey: base.hex.encode(baselineBoarding.options.pubKey),
11680
11913
  serverPubKey: base.hex.encode(serverPubKey),
11681
- csvTimelock: chunkGMUVWKOK_cjs.timelockToSequence(boardingCsvTimelock).toString()
11914
+ csvTimelock: chunkCDWLZQQW_cjs.timelockToSequence(boardingCsvTimelock).toString()
11682
11915
  },
11683
11916
  script: boardingScriptHex,
11684
11917
  address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
@@ -11852,7 +12085,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
11852
12085
  serverPubKey: this.offchainTapscript.options.serverPubKey,
11853
12086
  deprecatedSignerPubKeys: [...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h)),
11854
12087
  csvTimelocks: this.walletContractTimelocks,
11855
- delegatePubKey: this.offchainTapscript instanceof chunk53XNU2EL_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
12088
+ delegatePubKey: this.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0
11856
12089
  };
11857
12090
  }
11858
12091
  _signerRouter;
@@ -11944,25 +12177,25 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
11944
12177
  return this.getBoardingAddress();
11945
12178
  }
11946
12179
  const descriptor = await provider.getNextSigningDescriptor();
11947
- const pubKey = chunk53XNU2EL_cjs.deriveDescriptorLeafPubKey(descriptor);
11948
- const newBoarding = new chunk53XNU2EL_cjs.DefaultVtxo.Script({
12180
+ const pubKey = chunk37XKN5DZ_cjs.deriveDescriptorLeafPubKey(descriptor);
12181
+ const newBoarding = new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
11949
12182
  ...this._boardingTapscript.options,
11950
12183
  pubKey
11951
12184
  });
11952
- const csvTimelock = newBoarding.options.csvTimelock ?? chunk53XNU2EL_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
12185
+ const csvTimelock = newBoarding.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
11953
12186
  const manager = await this.getContractManager();
11954
12187
  await manager.createContract({
11955
12188
  type: "boarding",
11956
12189
  params: {
11957
12190
  pubKey: base.hex.encode(pubKey),
11958
12191
  serverPubKey: base.hex.encode(newBoarding.options.serverPubKey),
11959
- csvTimelock: chunkGMUVWKOK_cjs.timelockToSequence(csvTimelock).toString()
12192
+ csvTimelock: chunkCDWLZQQW_cjs.timelockToSequence(csvTimelock).toString()
11960
12193
  },
11961
12194
  script: base.hex.encode(newBoarding.pkScript),
11962
12195
  address: newBoarding.address(this.network.hrp, this.arkServerPublicKey).encode(),
11963
12196
  state: "active",
11964
12197
  metadata: {
11965
- source: chunk53XNU2EL_cjs.WALLET_RECEIVE_SOURCE,
12198
+ source: chunk37XKN5DZ_cjs.WALLET_RECEIVE_SOURCE,
11966
12199
  signingDescriptor: descriptor
11967
12200
  }
11968
12201
  });
@@ -11974,6 +12207,51 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
11974
12207
  }
11975
12208
  return newBoarding.onchainAddress(this.network);
11976
12209
  }
12210
+ /**
12211
+ * @see HDWalletCapable.getCurrentSigningDescriptor
12212
+ */
12213
+ async getCurrentSigningDescriptor() {
12214
+ const provider = this._descriptorProvider;
12215
+ if (!(provider instanceof HDDescriptorProvider)) return void 0;
12216
+ return provider.getCurrentSigningDescriptor();
12217
+ }
12218
+ /**
12219
+ * @see HDWalletCapable.getUsedSigningDescriptors
12220
+ *
12221
+ * Union of the watermark band and the descriptors persisted on contracts:
12222
+ * the band alone would miss rows a restore scan wrote, and the contracts
12223
+ * alone would miss indices allocated for something the wallet never
12224
+ * persisted (a swap, an externally issued invoice).
12225
+ */
12226
+ async getUsedSigningDescriptors() {
12227
+ const provider = this._descriptorProvider;
12228
+ const descriptors = /* @__PURE__ */ new Set();
12229
+ if (provider instanceof HDDescriptorProvider) {
12230
+ const lastIndexUsed = await provider.getLastIndexUsed();
12231
+ for (let i = 0; i <= (lastIndexUsed ?? -1); i++) {
12232
+ descriptors.add(provider.materializeDescriptorAt(i));
12233
+ }
12234
+ }
12235
+ for (const contract of await this.contractRepository.getContracts()) {
12236
+ const descriptor = contract.metadata?.signingDescriptor;
12237
+ if (typeof descriptor === "string" && descriptor.length > 0) {
12238
+ descriptors.add(descriptor);
12239
+ }
12240
+ }
12241
+ return [...descriptors].sort(
12242
+ (a, b) => signingDescriptorIndex(a) - signingDescriptorIndex(b)
12243
+ );
12244
+ }
12245
+ /**
12246
+ * @see HDWalletCapable.signerForDescriptor
12247
+ */
12248
+ async signerForDescriptor(descriptor) {
12249
+ const provider = this._descriptorProvider;
12250
+ if (!(provider instanceof HDDescriptorProvider) || !provider.isOurs(descriptor)) {
12251
+ return this.identity;
12252
+ }
12253
+ return new DescriptorIdentity({ descriptor, signer: provider, base: this.identity });
12254
+ }
11977
12255
  /**
11978
12256
  * Mid-session server-signer rotation (plan §4). When arkd rotates its
11979
12257
  * active signer mid-session — the case the long-lived service worker and
@@ -12006,7 +12284,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12006
12284
  const xonly = toXOnlyPubKey(newServerPubKey);
12007
12285
  let newServerUnrollScript;
12008
12286
  try {
12009
- newServerUnrollScript = chunkGMUVWKOK_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
12287
+ newServerUnrollScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
12010
12288
  } catch (e) {
12011
12289
  throw new Error("Invalid checkpointTapscript from server");
12012
12290
  }
@@ -12034,21 +12312,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12034
12312
  const [currentBoardingRow] = await manager.getContracts({
12035
12313
  script: currentBoardingScript
12036
12314
  });
12037
- const newOffchain = this.offchainTapscript instanceof chunk53XNU2EL_cjs.DelegateVtxo.Script ? new chunk53XNU2EL_cjs.DelegateVtxo.Script({
12315
+ const newOffchain = this.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? new chunk37XKN5DZ_cjs.DelegateVtxo.Script({
12038
12316
  ...this.offchainTapscript.options,
12039
12317
  serverPubKey: xonly
12040
- }) : new chunk53XNU2EL_cjs.DefaultVtxo.Script({
12318
+ }) : new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
12041
12319
  ...this.offchainTapscript.options,
12042
12320
  serverPubKey: xonly
12043
12321
  });
12044
- const newBoarding = new chunk53XNU2EL_cjs.DefaultVtxo.Script({
12322
+ const newBoarding = new chunk37XKN5DZ_cjs.DefaultVtxo.Script({
12045
12323
  ...this._boardingTapscript.options,
12046
12324
  serverPubKey: xonly
12047
12325
  });
12048
- const offchainCsv = chunkGMUVWKOK_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
12326
+ const offchainCsv = chunkCDWLZQQW_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
12049
12327
  const newOffchainScript = base.hex.encode(newOffchain.pkScript);
12050
12328
  const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
12051
- if (newOffchain instanceof chunk53XNU2EL_cjs.DelegateVtxo.Script) {
12329
+ if (newOffchain instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script) {
12052
12330
  await manager.createContract({
12053
12331
  type: "delegate",
12054
12332
  params: {
@@ -12076,13 +12354,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12076
12354
  metadata: currentOffchainRow?.metadata
12077
12355
  });
12078
12356
  }
12079
- const boardingCsv = newBoarding.options.csvTimelock ?? chunk53XNU2EL_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
12357
+ const boardingCsv = newBoarding.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
12080
12358
  await manager.createContract({
12081
12359
  type: "boarding",
12082
12360
  params: {
12083
12361
  pubKey: base.hex.encode(newBoarding.options.pubKey),
12084
12362
  serverPubKey: base.hex.encode(xonly),
12085
- csvTimelock: chunkGMUVWKOK_cjs.timelockToSequence(boardingCsv).toString()
12363
+ csvTimelock: chunkCDWLZQQW_cjs.timelockToSequence(boardingCsv).toString()
12086
12364
  },
12087
12365
  script: base.hex.encode(newBoarding.pkScript),
12088
12366
  address: newBoarding.address(this.network.hrp, xonly).encode(),
@@ -12115,14 +12393,14 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12115
12393
  _restoreInFlight;
12116
12394
  _addPendingSpends(inputs) {
12117
12395
  for (const input of inputs) {
12118
- if (chunkGMUVWKOK_cjs.isVirtualCoin(input)) {
12396
+ if (chunkCDWLZQQW_cjs.isVirtualCoin(input)) {
12119
12397
  this._pendingSpendOutpoints.add(`${input.txid}:${input.vout}`);
12120
12398
  }
12121
12399
  }
12122
12400
  }
12123
12401
  _removePendingSpends(inputs) {
12124
12402
  for (const input of inputs) {
12125
- if (chunkGMUVWKOK_cjs.isVirtualCoin(input)) {
12403
+ if (chunkCDWLZQQW_cjs.isVirtualCoin(input)) {
12126
12404
  this._pendingSpendOutpoints.delete(`${input.txid}:${input.vout}`);
12127
12405
  }
12128
12406
  }
@@ -12182,7 +12460,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12182
12460
  const hd = provider instanceof HDDescriptorProvider;
12183
12461
  const staticDescriptor = hd ? void 0 : `tr(${base.hex.encode(await this.identity.xOnlyPublicKey())})`;
12184
12462
  const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
12185
- const delegatePubKey = this.offchainTapscript instanceof chunk53XNU2EL_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
12463
+ const delegatePubKey = this.offchainTapscript instanceof chunk37XKN5DZ_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
12186
12464
  const arkInfo = await this.arkProvider.getInfo();
12187
12465
  const currentSignerPubKey = toXOnlyPubKey(base.hex.decode(arkInfo.signerPubkey));
12188
12466
  const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
@@ -12201,7 +12479,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12201
12479
  csvTimelocks: this.walletContractTimelocks,
12202
12480
  // Boarding-exit CSV so the boarding handler can build its
12203
12481
  // candidate script (distinct from the unilateral-exit matrix).
12204
- boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunk53XNU2EL_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
12482
+ boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunk37XKN5DZ_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
12205
12483
  delegatePubKey
12206
12484
  };
12207
12485
  const result = await manager.scanContracts({
@@ -12318,7 +12596,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12318
12596
  let serverUnrollScript;
12319
12597
  try {
12320
12598
  const raw = base.hex.decode(setup.info.checkpointTapscript);
12321
- serverUnrollScript = chunkGMUVWKOK_cjs.CSVMultisigTapscript.decode(raw);
12599
+ serverUnrollScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(raw);
12322
12600
  } catch (e) {
12323
12601
  throw new Error("Invalid checkpointTapscript from server");
12324
12602
  }
@@ -12456,7 +12734,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12456
12734
  inputs: params.selectedVtxos,
12457
12735
  changeAmount: BigInt(changeAmount)
12458
12736
  };
12459
- const outputAddress = chunkGMUVWKOK_cjs.ArkAddress.decode(params.address);
12737
+ const outputAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(params.address);
12738
+ assertRecipientArkAddress(
12739
+ params.address,
12740
+ outputAddress,
12741
+ this.recipientAddressContext(serverPubKey)
12742
+ );
12460
12743
  const outputScript = BigInt(params.amount) < this.dustAmount ? outputAddress.subdustPkScript : outputAddress.pkScript;
12461
12744
  const outputs = [
12462
12745
  {
@@ -12509,13 +12792,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12509
12792
  }
12510
12793
  }
12511
12794
  const offchainAddress = await this.getAddress();
12512
- const offchainPkScript = chunkGMUVWKOK_cjs.ArkAddress.decode(offchainAddress).pkScript;
12795
+ const offchainPkScript = chunkCDWLZQQW_cjs.ArkAddress.decode(offchainAddress).pkScript;
12513
12796
  const offchainOutputScript = base.hex.encode(offchainPkScript);
12514
12797
  if (!params) {
12515
12798
  const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
12516
12799
  const estimator = new Estimator(fees.intentFee);
12517
12800
  let amount = 0;
12518
- const exitScript = chunkGMUVWKOK_cjs.CSVMultisigTapscript.decode(
12801
+ const exitScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(
12519
12802
  base.hex.decode(this.boardingTapscript.exitScript)
12520
12803
  );
12521
12804
  const boardingTimelock = exitScript.params.timelock;
@@ -12544,7 +12827,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12544
12827
  if (filteredVtxos.length >= MAX_VTXOS_PER_SETTLEMENT) {
12545
12828
  break;
12546
12829
  }
12547
- const inputFee = estimator.evalOffchainInput(chunkGMUVWKOK_cjs.toOffchainInputFeeParams(vtxo));
12830
+ const inputFee = estimator.evalOffchainInput(chunkCDWLZQQW_cjs.toOffchainInputFeeParams(vtxo));
12548
12831
  if (inputFee.satoshis >= vtxo.value) {
12549
12832
  continue;
12550
12833
  }
@@ -12586,13 +12869,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12586
12869
  const onchainOutputIndexes = [];
12587
12870
  const outputs = [];
12588
12871
  let hasOffchainOutputs = false;
12872
+ let recipientContext;
12589
12873
  for (const [index, output] of params.outputs.entries()) {
12590
12874
  let script;
12875
+ let arkAddress;
12591
12876
  try {
12592
- const addr = chunkGMUVWKOK_cjs.ArkAddress.decode(output.address);
12593
- script = addr.pkScript;
12594
- hasOffchainOutputs = true;
12877
+ arkAddress = chunkCDWLZQQW_cjs.ArkAddress.decode(output.address);
12595
12878
  } catch {
12879
+ arkAddress = void 0;
12880
+ }
12881
+ if (arkAddress) {
12882
+ recipientContext ??= this.recipientAddressContext();
12883
+ assertRecipientArkAddress(output.address, arkAddress, recipientContext);
12884
+ script = arkAddress.pkScript;
12885
+ hasOffchainOutputs = true;
12886
+ } else {
12596
12887
  const addr = btcSigner.Address(this.network).decode(output.address);
12597
12888
  script = btcSigner.OutScript.encode(addr);
12598
12889
  onchainOutputIndexes.push(index);
@@ -12775,7 +13066,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12775
13066
  async maybeRotateBoardingAfterBoard(inputs) {
12776
13067
  if (!this._descriptorProvider) return;
12777
13068
  const consumedBoarding = inputs.some(
12778
- (input) => typeof input !== "string" && !chunkGMUVWKOK_cjs.isVirtualCoin(input)
13069
+ (input) => typeof input !== "string" && !chunkCDWLZQQW_cjs.isVirtualCoin(input)
12779
13070
  );
12780
13071
  if (!consumedBoarding) return;
12781
13072
  try {
@@ -12784,14 +13075,22 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12784
13075
  console.warn("Failed to rotate boarding address after board", e);
12785
13076
  }
12786
13077
  }
12787
- async handleSettlementFinalizationEvent(event, inputs, forfeitOutputScript, connectorsGraph) {
13078
+ async handleSettlementFinalizationEvent(event, inputs, forfeitOutputScript, expectedRecipients, connectorsGraph, validatedCommitmentTxid) {
12788
13079
  const signedForfeits = [];
12789
13080
  let settlementPsbt = btcSigner.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
13081
+ assertFinalCommitmentMatchesValidated(
13082
+ settlementPsbt,
13083
+ validatedCommitmentTxid,
13084
+ "settlement finalization"
13085
+ );
13086
+ if (!validatedCommitmentTxid && expectedRecipients.length > 0) {
13087
+ validateBatchRecipientsWithoutTree(settlementPsbt, expectedRecipients, this.network);
13088
+ }
12790
13089
  let hasBoardingUtxos = false;
12791
13090
  let connectorIndex = 0;
12792
13091
  const connectorsLeaves = connectorsGraph?.leaves() || [];
12793
13092
  for (const input of inputs) {
12794
- if (!chunkGMUVWKOK_cjs.isVirtualCoin(input)) {
13093
+ if (!chunkCDWLZQQW_cjs.isVirtualCoin(input)) {
12795
13094
  for (let i = 0; i < settlementPsbt.inputsLength; i++) {
12796
13095
  const settlementInput = settlementPsbt.getInput(i);
12797
13096
  if (!settlementInput.txid || settlementInput.index === void 0) {
@@ -12822,7 +13121,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12822
13121
  }
12823
13122
  continue;
12824
13123
  }
12825
- if (chunkGMUVWKOK_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
13124
+ if (chunkCDWLZQQW_cjs.canRecoverOnchain(input, { timestamp: /* @__PURE__ */ new Date() }) || isSubdust({ value: input.value }, this.dustAmount)) {
12826
13125
  continue;
12827
13126
  }
12828
13127
  if (connectorsLeaves.length === 0) {
@@ -12850,7 +13149,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12850
13149
  index: input.vout,
12851
13150
  witnessUtxo: {
12852
13151
  amount: BigInt(input.value),
12853
- script: chunkGMUVWKOK_cjs.VtxoScript.decode(input.tapTree).pkScript
13152
+ script: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
12854
13153
  },
12855
13154
  sighashType: btcSigner.SigHash.DEFAULT,
12856
13155
  tapLeafScript: [input.forfeitTapLeafScript]
@@ -12869,7 +13168,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12869
13168
  forfeitTx = await this._signerRouter.sign(forfeitTx, [
12870
13169
  {
12871
13170
  index: 0,
12872
- lookupScript: chunkGMUVWKOK_cjs.VtxoScript.decode(input.tapTree).pkScript
13171
+ lookupScript: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
12873
13172
  }
12874
13173
  ]);
12875
13174
  signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
@@ -12909,6 +13208,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12909
13208
  */
12910
13209
  createBatchHandler(intentId, inputs, expectedRecipients, session) {
12911
13210
  let sweepTapTreeRoot;
13211
+ let validatedCommitmentTxid;
12912
13212
  return {
12913
13213
  onBatchStarted: async (event) => {
12914
13214
  const utf8IntentId = new TextEncoder().encode(intentId);
@@ -12927,7 +13227,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12927
13227
  if (skip) {
12928
13228
  return { skip };
12929
13229
  }
12930
- const sweepTapscript = chunkGMUVWKOK_cjs.CSVMultisigTapscript.encode({
13230
+ const sweepTapscript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.encode({
12931
13231
  timelock: {
12932
13232
  value: event.batchExpiry,
12933
13233
  type: event.batchExpiry >= 512n ? "seconds" : "blocks"
@@ -12966,6 +13266,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12966
13266
  if (!sharedOutput?.amount) {
12967
13267
  throw new Error("Shared output not found");
12968
13268
  }
13269
+ validatedCommitmentTxid = commitmentTx.id;
12969
13270
  await session.init(vtxoTree, sweepTapTreeRoot, sharedOutput.amount);
12970
13271
  const pubkey = base.hex.encode(await session.getPublicKey());
12971
13272
  const nonces = await session.getNonces();
@@ -12994,7 +13295,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
12994
13295
  event,
12995
13296
  inputs,
12996
13297
  this.forfeitOutputScript,
12997
- connectorTree
13298
+ expectedRecipients,
13299
+ connectorTree,
13300
+ validatedCommitmentTxid
12998
13301
  );
12999
13302
  }
13000
13303
  };
@@ -13033,9 +13336,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13033
13336
  ...existing ?? {},
13034
13337
  intentTxId,
13035
13338
  registerProof: intent.proof,
13036
- registerProofMessage: chunkGMUVWKOK_cjs.Intent.encodeMessage(intent.message),
13339
+ registerProofMessage: chunkCDWLZQQW_cjs.Intent.encodeMessage(intent.message),
13037
13340
  deleteProof: deleteIntent.proof,
13038
- deleteProofMessage: chunkGMUVWKOK_cjs.Intent.encodeMessage(deleteIntent.message),
13341
+ deleteProofMessage: chunkCDWLZQQW_cjs.Intent.encodeMessage(deleteIntent.message),
13039
13342
  intentVtxos: inputs.map((i) => ({
13040
13343
  txid: i.txid,
13041
13344
  vout: i.vout
@@ -13067,7 +13370,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13067
13370
  try {
13068
13371
  return await this.arkProvider.registerIntent(intent);
13069
13372
  } catch (error) {
13070
- if (error instanceof chunkGMUVWKOK_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
13373
+ if (error instanceof chunkCDWLZQQW_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
13071
13374
  const deleteIntent = await this.makeDeleteIntentSignature(inputs);
13072
13375
  await this.arkProvider.deleteIntent(deleteIntent);
13073
13376
  return this.arkProvider.registerIntent(intent);
@@ -13083,7 +13386,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13083
13386
  expire_at: 0,
13084
13387
  cosigners_public_keys: cosignerPubKeys
13085
13388
  };
13086
- const proof = chunkGMUVWKOK_cjs.Intent.create(message, coins, outputs);
13389
+ const proof = chunkCDWLZQQW_cjs.Intent.create(message, coins, outputs);
13087
13390
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
13088
13391
  return {
13089
13392
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -13095,7 +13398,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13095
13398
  type: "delete",
13096
13399
  expire_at: 0
13097
13400
  };
13098
- const proof = chunkGMUVWKOK_cjs.Intent.create(message, coins, []);
13401
+ const proof = chunkCDWLZQQW_cjs.Intent.create(message, coins, []);
13099
13402
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
13100
13403
  return {
13101
13404
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -13107,7 +13410,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13107
13410
  type: "get-pending-tx",
13108
13411
  expire_at: 0
13109
13412
  };
13110
- const proof = chunkGMUVWKOK_cjs.Intent.create(message, coins, []);
13413
+ const proof = chunkCDWLZQQW_cjs.Intent.create(message, coins, []);
13111
13414
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
13112
13415
  return {
13113
13416
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -13128,7 +13431,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13128
13431
  if (!vtxos || vtxos.length === 0) {
13129
13432
  const scriptMap = await this.getScriptMap();
13130
13433
  const allExtended = [];
13131
- const fetchedVtxos = await chunkGMUVWKOK_cjs.getAllNormalizedVtxos(this.indexerProvider, [
13434
+ const fetchedVtxos = await chunkCDWLZQQW_cjs.getAllNormalizedVtxos(this.indexerProvider, [
13132
13435
  ...scriptMap.keys()
13133
13436
  ]);
13134
13437
  for (const vtxo of fetchedVtxos) {
@@ -13153,6 +13456,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13153
13456
  for (let i = 0; i < vtxos.length; i += MAX_INPUTS_PER_INTENT) {
13154
13457
  batches.push(vtxos.slice(i, i + MAX_INPUTS_PER_INTENT));
13155
13458
  }
13459
+ const unrollCandidates = this.checkpointUnrollCandidates(await this.arkProvider.getInfo());
13460
+ const checkpointInputs = vtxos.map((vtxo) => ({
13461
+ ...vtxo,
13462
+ tapLeafScript: vtxo.forfeitTapLeafScript
13463
+ }));
13156
13464
  const seen = /* @__PURE__ */ new Set();
13157
13465
  const results = await Promise.all(
13158
13466
  batches.map(async (batch) => {
@@ -13168,6 +13476,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13168
13476
  const checkpointTxs = pendingTx.signedCheckpointTxs.map(
13169
13477
  (c) => btcSigner.Transaction.fromPSBT(base.base64.decode(c))
13170
13478
  );
13479
+ assertCheckpointsMatchInputs(
13480
+ checkpointTxs,
13481
+ checkpointInputs,
13482
+ unrollCandidates,
13483
+ `pending tx ${pendingTx.arkTxid}`
13484
+ );
13171
13485
  const checkpointJobs = checkpointTxs.map(
13172
13486
  (tx) => this.inputSigningJobsFromWitnessUtxos(tx)
13173
13487
  );
@@ -13223,6 +13537,32 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13223
13537
  }
13224
13538
  return { finalized, pending };
13225
13539
  }
13540
+ /**
13541
+ * The server unroll scripts a pending checkpoint may legitimately have been
13542
+ * built under: this wallet's configured one, the server's current one, and
13543
+ * one per deprecated signer (same closure, deprecated key). A tx submitted
13544
+ * before a signer rotation was built under the old key, so rebuilding
13545
+ * against the current key alone would leave it pending forever.
13546
+ */
13547
+ checkpointUnrollCandidates(info) {
13548
+ const current = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
13549
+ const candidates = [this._serverUnrollScript, current];
13550
+ for (const deprecated of signerSetFromInfo(info).deprecated.keys()) {
13551
+ candidates.push(
13552
+ chunkCDWLZQQW_cjs.CSVMultisigTapscript.encode({
13553
+ ...current.params,
13554
+ pubkeys: [base.hex.decode(deprecated)]
13555
+ })
13556
+ );
13557
+ }
13558
+ const seen = /* @__PURE__ */ new Set();
13559
+ return candidates.filter((candidate) => {
13560
+ const script = base.hex.encode(candidate.script);
13561
+ if (seen.has(script)) return false;
13562
+ seen.add(script);
13563
+ return true;
13564
+ });
13565
+ }
13226
13566
  async hasPendingTxFlag() {
13227
13567
  const state = await this.walletRepository.getWalletState();
13228
13568
  return state?.settings?.hasPendingTx === true;
@@ -13300,7 +13640,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13300
13640
  if (vtxos.length === 0) {
13301
13641
  throw new Error("No VTXOs found for this arkadeCash");
13302
13642
  }
13303
- const myPkScript = chunkGMUVWKOK_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
13643
+ const myPkScript = chunkCDWLZQQW_cjs.ArkAddress.decode(await this.getAddress()).pkScript;
13304
13644
  let { spendable, unclaimed } = this.classifyCashVtxos(vtxos);
13305
13645
  let swept = 0;
13306
13646
  const drainable = vtxos.filter((vtxo) => !isSubdust(vtxo, this.dustAmount));
@@ -13327,7 +13667,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13327
13667
  }
13328
13668
  if (spendable.length > 0) {
13329
13669
  const info = await this.arkProvider.getInfo();
13330
- const serverUnrollScript = chunkGMUVWKOK_cjs.CSVMultisigTapscript.decode(
13670
+ const serverUnrollScript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(
13331
13671
  base.hex.decode(info.checkpointTapscript)
13332
13672
  );
13333
13673
  for (const vtxo of spendable) {
@@ -13373,7 +13713,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13373
13713
  const spendable = [];
13374
13714
  const unclaimed = [];
13375
13715
  for (const vtxo of vtxos) {
13376
- if (chunkGMUVWKOK_cjs.hasTerminalSpend(vtxo)) {
13716
+ if (chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) {
13377
13717
  unclaimed.push(cashReport(vtxo, "already-spent"));
13378
13718
  } else if (isSubdust(vtxo, this.dustAmount)) {
13379
13719
  unclaimed.push(cashReport(vtxo, "subdust"));
@@ -13393,7 +13733,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13393
13733
  const all = [];
13394
13734
  const seen = /* @__PURE__ */ new Set();
13395
13735
  for (let pageIndex = 0; ; pageIndex++) {
13396
- const { vtxos, page } = await chunkGMUVWKOK_cjs.getNormalizedVtxos(this.indexerProvider, {
13736
+ const { vtxos, page } = await chunkCDWLZQQW_cjs.getNormalizedVtxos(this.indexerProvider, {
13397
13737
  scripts,
13398
13738
  pageIndex,
13399
13739
  pageSize
@@ -13440,7 +13780,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13440
13780
  for (let i = 0; i < inputs.length; i += MAX_INPUTS_PER_INTENT) {
13441
13781
  const batch = inputs.slice(i, i + MAX_INPUTS_PER_INTENT);
13442
13782
  const message = { type: "get-pending-tx", expire_at: 0 };
13443
- const proof = chunkGMUVWKOK_cjs.Intent.create(message, batch, []);
13783
+ const proof = chunkCDWLZQQW_cjs.Intent.create(message, batch, []);
13444
13784
  const signedProof = await identity.sign(
13445
13785
  proof,
13446
13786
  Array.from({ length: batch.length + 1 }, (_, j) => j)
@@ -13455,12 +13795,23 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13455
13795
  pendingTxs.push(pendingTx);
13456
13796
  }
13457
13797
  }
13798
+ if (pendingTxs.length === 0) return result;
13458
13799
  const myPkScriptHex = base.hex.encode(myPkScript);
13800
+ const unrollCandidates = this.checkpointUnrollCandidates(await this.arkProvider.getInfo());
13459
13801
  for (const pendingTx of pendingTxs) {
13460
13802
  try {
13461
13803
  const checkpointTxs = pendingTx.signedCheckpointTxs.map(
13462
13804
  (checkpoint) => btcSigner.Transaction.fromPSBT(base.base64.decode(checkpoint))
13463
13805
  );
13806
+ assertCheckpointsMatchInputs(
13807
+ checkpointTxs,
13808
+ inputs.map((input) => ({
13809
+ ...input,
13810
+ tapLeafScript: input.forfeitTapLeafScript
13811
+ })),
13812
+ unrollCandidates,
13813
+ `pending arkadeCash tx ${pendingTx.arkTxid}`
13814
+ );
13464
13815
  const finalCheckpoints = await Promise.all(
13465
13816
  checkpointTxs.map(
13466
13817
  async (checkpoint) => base.base64.encode((await identity.sign(checkpoint)).toPSBT())
@@ -13525,7 +13876,11 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13525
13876
  const serverUnrollScript = this.serverUnrollScript;
13526
13877
  const outputAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
13527
13878
  const address = outputAddress.encode();
13528
- const recipients = validateRecipients(args, Number(this.dustAmount));
13879
+ const recipients = validateRecipients(
13880
+ args,
13881
+ Number(this.dustAmount),
13882
+ this.recipientAddressContext(serverPubKey)
13883
+ );
13529
13884
  const allVirtualCoins = await this.getVtxos({
13530
13885
  withRecoverable: false
13531
13886
  });
@@ -13735,10 +14090,10 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13735
14090
  const serverPubKey = this.arkServerPublicKey;
13736
14091
  const serverUnrollScript = this.serverUnrollScript;
13737
14092
  const arkAddress = offchainTapscript.address(this.network.hrp, serverPubKey);
13738
- const normalizedInputs = inputs.map(chunkGMUVWKOK_cjs.normalizeVtxo);
13739
- const at = now ?? await chunkGMUVWKOK_cjs.resolveTimeHeight(this.onchainProvider);
14093
+ const normalizedInputs = inputs.map(chunkCDWLZQQW_cjs.normalizeVtxo);
14094
+ const at = now ?? await chunkCDWLZQQW_cjs.resolveTimeHeight(this.onchainProvider);
13740
14095
  for (const input of normalizedInputs) {
13741
- if (!chunkGMUVWKOK_cjs.canSpendOffchain(input, at)) {
14096
+ if (!chunkCDWLZQQW_cjs.canSpendOffchain(input, at)) {
13742
14097
  throw new Error(
13743
14098
  `sendSelectedVtxosToSelf: input ${input.txid}:${input.vout} is not cooperatively spendable`
13744
14099
  );
@@ -13803,7 +14158,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13803
14158
  );
13804
14159
  const arkTxJobs = inputs.map((input, index) => ({
13805
14160
  index,
13806
- lookupScript: chunkGMUVWKOK_cjs.VtxoScript.decode(input.tapTree).pkScript
14161
+ lookupScript: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
13807
14162
  }));
13808
14163
  const identity = this.identity;
13809
14164
  const signer = {
@@ -13870,32 +14225,33 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13870
14225
  `updateDbAfterOffchainTx: inputs length (${inputs.length}) differs from signedCheckpointTxs length (${signedCheckpointTxs.length})`
13871
14226
  );
13872
14227
  }
13873
- const safeLength = Math.min(inputs.length, signedCheckpointTxs.length);
14228
+ const checkpointIdByOutpoint = /* @__PURE__ */ new Map();
14229
+ for (const encoded of signedCheckpointTxs) {
14230
+ const checkpoint = btcSigner.Transaction.fromPSBT(base.base64.decode(encoded));
14231
+ for (let i = 0; i < checkpoint.inputsLength; i++) {
14232
+ const input = checkpoint.getInput(i);
14233
+ if (!input.txid) continue;
14234
+ checkpointIdByOutpoint.set(
14235
+ `${base.hex.encode(input.txid)}:${input.index}`,
14236
+ checkpoint.id
14237
+ );
14238
+ }
14239
+ }
13874
14240
  const cm = await this.getContractManager();
13875
14241
  const annotatedInputs = await cm.annotateVtxos(inputs);
13876
- for (const [inputIndex, vtxo] of annotatedInputs.entries()) {
14242
+ for (const vtxo of annotatedInputs) {
13877
14243
  const spentFacts = { ...vtxo, isSpent: true };
13878
- if (inputIndex < safeLength && signedCheckpointTxs[inputIndex]) {
13879
- const checkpoint = btcSigner.Transaction.fromPSBT(
13880
- base.base64.decode(signedCheckpointTxs[inputIndex])
13881
- );
13882
- spentVtxos.push({
13883
- ...spentFacts,
13884
- virtualStatus: chunkGMUVWKOK_cjs.toVirtualStatus(spentFacts),
13885
- spentBy: checkpoint.id,
13886
- arkTxId: arkTxid
13887
- });
13888
- } else {
13889
- spentVtxos.push({
13890
- ...spentFacts,
13891
- virtualStatus: chunkGMUVWKOK_cjs.toVirtualStatus(spentFacts),
13892
- arkTxId: arkTxid
13893
- });
13894
- }
14244
+ const spentBy = checkpointIdByOutpoint.get(`${vtxo.txid}:${vtxo.vout}`);
14245
+ spentVtxos.push({
14246
+ ...spentFacts,
14247
+ virtualStatus: chunkCDWLZQQW_cjs.toVirtualStatus(spentFacts),
14248
+ ...spentBy ? { spentBy } : {},
14249
+ arkTxId: arkTxid
14250
+ });
13895
14251
  for (const id of vtxo.commitmentTxIds) {
13896
14252
  commitmentTxIds.add(id);
13897
14253
  }
13898
- const vtxoExpiry = chunkGMUVWKOK_cjs.toBatchExpiry(vtxo);
14254
+ const vtxoExpiry = chunkCDWLZQQW_cjs.toBatchExpiry(vtxo);
13899
14255
  if (vtxoExpiry) {
13900
14256
  batchExpiry = Math.min(batchExpiry, vtxoExpiry);
13901
14257
  }
@@ -13908,7 +14264,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13908
14264
  isSwept: false,
13909
14265
  isPreconfirmed: true,
13910
14266
  commitmentTxIds: Array.from(commitmentTxIds),
13911
- ...chunkGMUVWKOK_cjs.parseLegacyExpiry(batchExpiry)
14267
+ ...chunkCDWLZQQW_cjs.parseLegacyExpiry(batchExpiry)
13912
14268
  };
13913
14269
  changeVtxo = {
13914
14270
  txid: arkTxid,
@@ -13920,7 +14276,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13920
14276
  tapTree: offchainTapscript.encode(),
13921
14277
  value: Number(changeAmount),
13922
14278
  ...changeFacts,
13923
- virtualStatus: chunkGMUVWKOK_cjs.toVirtualStatus(changeFacts),
14279
+ virtualStatus: chunkCDWLZQQW_cjs.toVirtualStatus(changeFacts),
13924
14280
  spentBy: "",
13925
14281
  status: {
13926
14282
  confirmed: false
@@ -13989,12 +14345,12 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
13989
14345
  const spentVtxos = [];
13990
14346
  const inputArkTxIds = /* @__PURE__ */ new Set();
13991
14347
  const boardingRemovalsByAddress = /* @__PURE__ */ new Map();
13992
- const vtxoInputs = inputs.filter(chunkGMUVWKOK_cjs.isVirtualCoin);
14348
+ const vtxoInputs = inputs.filter(chunkCDWLZQQW_cjs.isVirtualCoin);
13993
14349
  const cm = await this.getContractManager();
13994
14350
  const annotatedVtxos = await cm.annotateVtxos(vtxoInputs);
13995
14351
  const annotatedByKey = new Map(annotatedVtxos.map((v) => [`${v.txid}:${v.vout}`, v]));
13996
14352
  for (const input of inputs) {
13997
- if (chunkGMUVWKOK_cjs.isVirtualCoin(input)) {
14353
+ if (chunkCDWLZQQW_cjs.isVirtualCoin(input)) {
13998
14354
  const outpoint = `${input.txid}:${input.vout}`;
13999
14355
  const vtxo = annotatedByKey.get(outpoint);
14000
14356
  if (!vtxo) {
@@ -14006,13 +14362,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14006
14362
  const settledFacts = { ...vtxo, isSpent: true };
14007
14363
  spentVtxos.push({
14008
14364
  ...settledFacts,
14009
- virtualStatus: chunkGMUVWKOK_cjs.toVirtualStatus(settledFacts),
14365
+ virtualStatus: chunkCDWLZQQW_cjs.toVirtualStatus(settledFacts),
14010
14366
  settledBy: commitmentTxid
14011
14367
  });
14012
14368
  } else {
14013
14369
  let sourceAddress;
14014
14370
  try {
14015
- sourceAddress = chunkGMUVWKOK_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
14371
+ sourceAddress = chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
14016
14372
  this.network
14017
14373
  );
14018
14374
  } catch {
@@ -14070,9 +14426,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
14070
14426
  }
14071
14427
  };
14072
14428
  function selectVirtualCoins(coins, targetAmount) {
14073
- const sortedCoins = coins.map(chunkGMUVWKOK_cjs.normalizeVtxo).sort((a, b) => {
14074
- const expiryA = chunkGMUVWKOK_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
14075
- const expiryB = chunkGMUVWKOK_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
14429
+ const sortedCoins = coins.map(chunkCDWLZQQW_cjs.normalizeVtxo).sort((a, b) => {
14430
+ const expiryA = chunkCDWLZQQW_cjs.toBatchExpiry(a) || Number.MAX_SAFE_INTEGER;
14431
+ const expiryB = chunkCDWLZQQW_cjs.toBatchExpiry(b) || Number.MAX_SAFE_INTEGER;
14076
14432
  if (expiryA !== expiryB) {
14077
14433
  return expiryA - expiryB;
14078
14434
  }
@@ -14329,7 +14685,7 @@ var MessageBus = class {
14329
14685
  this.initialized = true;
14330
14686
  }
14331
14687
  async buildServices(config) {
14332
- const arkProvider = new chunkGMUVWKOK_cjs.RestArkProvider(config.arkServer.url);
14688
+ const arkProvider = new chunkCDWLZQQW_cjs.RestArkProvider(config.arkServer.url);
14333
14689
  const storage = {
14334
14690
  walletRepository: this.walletRepository,
14335
14691
  contractRepository: this.contractRepository
@@ -14668,7 +15024,7 @@ var offboardNetworkNames = [
14668
15024
  function offboardDestinationScript(destinationAddress) {
14669
15025
  for (const networkName of offboardNetworkNames) {
14670
15026
  try {
14671
- const network = chunkGMUVWKOK_cjs.networks[networkName];
15027
+ const network = chunkCDWLZQQW_cjs.networks[networkName];
14672
15028
  const addr = btcSigner.Address(network).decode(destinationAddress);
14673
15029
  return btcSigner.OutScript.encode(addr);
14674
15030
  } catch {
@@ -14732,7 +15088,7 @@ var Ramps = class {
14732
15088
  }
14733
15089
  amount = amount ?? totalAmount;
14734
15090
  const offchainAddress = await this.wallet.getAddress();
14735
- const offchainAddr = chunkGMUVWKOK_cjs.ArkAddress.decode(offchainAddress);
15091
+ const offchainAddr = chunkCDWLZQQW_cjs.ArkAddress.decode(offchainAddress);
14736
15092
  const offchainScript = base.hex.encode(offchainAddr.pkScript);
14737
15093
  const outputFee = estimator.evalOffchainOutput({
14738
15094
  amount,
@@ -14792,7 +15148,7 @@ var Ramps = class {
14792
15148
  const filteredVtxos = [];
14793
15149
  let totalAmount = 0n;
14794
15150
  for (const vtxo of vtxos) {
14795
- const inputFee = estimator.evalOffchainInput(chunkGMUVWKOK_cjs.toOffchainInputFeeParams(vtxo));
15151
+ const inputFee = estimator.evalOffchainInput(chunkCDWLZQQW_cjs.toOffchainInputFeeParams(vtxo));
14796
15152
  if (inputFee.satoshis >= vtxo.value) {
14797
15153
  continue;
14798
15154
  }
@@ -15489,7 +15845,7 @@ var WalletMessageHandler = class {
15489
15845
  // Wallet methods
15490
15846
  async handleInitWallet({ payload }) {
15491
15847
  const { arkServerUrl } = payload;
15492
- this.indexerProvider = new chunkRNECH3TA_cjs.RestIndexerProvider(arkServerUrl);
15848
+ this.indexerProvider = new chunk24YNIQSW_cjs.RestIndexerProvider(arkServerUrl);
15493
15849
  await this.onWalletInitialized();
15494
15850
  }
15495
15851
  async handleGetBalance() {
@@ -15513,12 +15869,12 @@ var WalletMessageHandler = class {
15513
15869
  let recoverable = 0;
15514
15870
  let pendingRecovery = 0;
15515
15871
  for (const vtxo of allVtxos) {
15516
- if (chunkGMUVWKOK_cjs.hasTerminalSpend(vtxo)) continue;
15872
+ if (chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) continue;
15517
15873
  if (pendingOutpoints.has(`${vtxo.txid}:${vtxo.vout}`)) {
15518
15874
  pendingRecovery += vtxo.value;
15519
- } else if (chunkGMUVWKOK_cjs.canRecoverOnchain(vtxo, now)) {
15875
+ } else if (chunkCDWLZQQW_cjs.canRecoverOnchain(vtxo, now)) {
15520
15876
  recoverable += vtxo.value;
15521
- } else if (chunkGMUVWKOK_cjs.canSpendOffchain(vtxo, now)) {
15877
+ } else if (chunkCDWLZQQW_cjs.canSpendOffchain(vtxo, now)) {
15522
15878
  if (vtxo.isPreconfirmed) {
15523
15879
  preconfirmed += vtxo.value;
15524
15880
  } else {
@@ -15530,7 +15886,7 @@ var WalletMessageHandler = class {
15530
15886
  const totalOffchain = settled + preconfirmed + recoverable + pendingRecovery;
15531
15887
  const assetBalances = /* @__PURE__ */ new Map();
15532
15888
  for (const vtxo of allVtxos) {
15533
- if (chunkGMUVWKOK_cjs.hasTerminalSpend(vtxo)) continue;
15889
+ if (chunkCDWLZQQW_cjs.hasTerminalSpend(vtxo)) continue;
15534
15890
  if (vtxo.assets) {
15535
15891
  for (const a of vtxo.assets) {
15536
15892
  const current = assetBalances.get(a.assetId) ?? 0n;
@@ -15566,7 +15922,7 @@ var WalletMessageHandler = class {
15566
15922
  */
15567
15923
  async getSpendableVtxos() {
15568
15924
  const vtxos = await this.getVtxosFromRepo();
15569
- return vtxos.filter((v) => !chunkGMUVWKOK_cjs.hasTerminalSpend(v));
15925
+ return vtxos.filter((v) => !chunkCDWLZQQW_cjs.hasTerminalSpend(v));
15570
15926
  }
15571
15927
  async onWalletInitialized() {
15572
15928
  if (!this.readonlyWallet || !this.arkProvider || !this.indexerProvider || !this.walletRepository) {
@@ -15778,10 +16134,10 @@ var WalletMessageHandler = class {
15778
16134
  if (dustAmount != null && isSubdust(v, dustAmount)) {
15779
16135
  return false;
15780
16136
  }
15781
- if (chunkGMUVWKOK_cjs.isRecoverable(v)) {
16137
+ if (chunkCDWLZQQW_cjs.isRecoverable(v)) {
15782
16138
  return false;
15783
16139
  }
15784
- if (chunkGMUVWKOK_cjs.isExpired(v)) {
16140
+ if (chunkCDWLZQQW_cjs.isExpired(v)) {
15785
16141
  return false;
15786
16142
  }
15787
16143
  return true;
@@ -15853,7 +16209,7 @@ var WalletMessageHandler = class {
15853
16209
  if (!this.readonlyWallet) return null;
15854
16210
  const { boardingTxs, commitmentsToIgnore } = await this.readonlyWallet.getBoardingTxs();
15855
16211
  const indexerProvider = this.indexerProvider;
15856
- const resolveTxCreatedAt = indexerProvider ? (txids) => chunkGMUVWKOK_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
16212
+ const resolveTxCreatedAt = indexerProvider ? (txids) => chunkCDWLZQQW_cjs.fetchVtxoCreatedAtByTxid(indexerProvider, txids) : void 0;
15857
16213
  return buildTransactionHistory(vtxos, boardingTxs, commitmentsToIgnore, resolveTxCreatedAt);
15858
16214
  }
15859
16215
  async ensureContractEventBroadcasting() {
@@ -16538,7 +16894,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
16538
16894
  };
16539
16895
  try {
16540
16896
  const response = await this.sendMessage(message);
16541
- return response.payload.vtxos.map(chunkGMUVWKOK_cjs.normalizeVtxo);
16897
+ return response.payload.vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo);
16542
16898
  } catch (error) {
16543
16899
  throw new Error(`Failed to get vtxos: ${error}`);
16544
16900
  }
@@ -16651,7 +17007,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
16651
17007
  };
16652
17008
  try {
16653
17009
  const response = await sendContractMessage(message);
16654
- return response.payload.vtxos.map(chunkGMUVWKOK_cjs.normalizeVtxo);
17010
+ return response.payload.vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo);
16655
17011
  } catch (e) {
16656
17012
  throw new Error("Failed to annotate vtxos");
16657
17013
  }
@@ -17105,7 +17461,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
17105
17461
  };
17106
17462
  try {
17107
17463
  const response = await wallet.sendMessage(message);
17108
- return response.payload.vtxos.map(chunkGMUVWKOK_cjs.normalizeVtxo);
17464
+ return response.payload.vtxos.map(chunkCDWLZQQW_cjs.normalizeVtxo);
17109
17465
  } catch (e) {
17110
17466
  throw new Error(`Failed to get expiring vtxos: ${e}`);
17111
17467
  }
@@ -17217,12 +17573,12 @@ var OnchainWallet = class _OnchainWallet {
17217
17573
  * @returns Configured onchain wallet
17218
17574
  * @throws Error if the configured identity cannot produce a valid x-only public key
17219
17575
  */
17220
- static async create(identity, networkName = chunkGMUVWKOK_cjs.DEFAULT_NETWORK_NAME, provider) {
17576
+ static async create(identity, networkName = chunkCDWLZQQW_cjs.DEFAULT_NETWORK_NAME, provider) {
17221
17577
  const pubkey = await identity.xOnlyPublicKey();
17222
17578
  if (!pubkey) {
17223
17579
  throw new Error("Invalid configured public key");
17224
17580
  }
17225
- const network = chunkGMUVWKOK_cjs.getNetwork(networkName);
17581
+ const network = chunkCDWLZQQW_cjs.getNetwork(networkName);
17226
17582
  const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
17227
17583
  const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
17228
17584
  return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
@@ -17328,7 +17684,7 @@ var OnchainWallet = class _OnchainWallet {
17328
17684
  if (!inputs) {
17329
17685
  throw new Error("Fee estimation failed");
17330
17686
  }
17331
- let tx = new chunkGMUVWKOK_cjs.Transaction();
17687
+ let tx = new chunkCDWLZQQW_cjs.Transaction();
17332
17688
  for (const input of inputs) {
17333
17689
  tx.addInput({
17334
17690
  txid: input.txid,
@@ -17386,7 +17742,7 @@ var OnchainWallet = class _OnchainWallet {
17386
17742
  * @throws If the parent has no anchor, or funding cannot be selected/signed
17387
17743
  */
17388
17744
  async bumpAnchor(parentHex, feeRate) {
17389
- const parent = chunkGMUVWKOK_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
17745
+ const parent = chunkCDWLZQQW_cjs.Transaction.fromRaw(base.hex.decode(parentHex));
17390
17746
  const coins = (await this.getCoins()).filter((c) => c.status.confirmed);
17391
17747
  const child = await this.buildBumpPackage(parent, feeRate, coins);
17392
17748
  return [parent.hex, child.hex];
@@ -18151,7 +18507,7 @@ exports.BIP322 = void 0;
18151
18507
  async function sign2(message, identity, network) {
18152
18508
  const xOnlyPubKey = await identity.xOnlyPublicKey();
18153
18509
  const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
18154
- const toSpend = chunkGMUVWKOK_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
18510
+ const toSpend = chunkCDWLZQQW_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
18155
18511
  const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
18156
18512
  const signed = await identity.sign(toSign, [0]);
18157
18513
  signed.finalizeIdx(0);
@@ -18209,7 +18565,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
18209
18565
  if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
18210
18566
  return false;
18211
18567
  }
18212
- const toSpend = chunkGMUVWKOK_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
18568
+ const toSpend = chunkCDWLZQQW_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
18213
18569
  const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
18214
18570
  const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
18215
18571
  const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
@@ -18230,7 +18586,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
18230
18586
  }
18231
18587
  const sighashType = sigWithHash[sigWithHash.length - 1];
18232
18588
  const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
18233
- const toSpend = chunkGMUVWKOK_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
18589
+ const toSpend = chunkCDWLZQQW_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
18234
18590
  const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
18235
18591
  const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
18236
18592
  const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
@@ -18283,7 +18639,7 @@ function encodeCompactSize(n) {
18283
18639
  return buf;
18284
18640
  }
18285
18641
  function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
18286
- const tx = new chunkGMUVWKOK_cjs.Transaction({ version: 0 });
18642
+ const tx = new chunkCDWLZQQW_cjs.Transaction({ version: 0 });
18287
18643
  tx.addInput({
18288
18644
  txid: toSpend.id,
18289
18645
  index: 0,
@@ -18297,12 +18653,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
18297
18653
  });
18298
18654
  tx.addOutput({
18299
18655
  amount: 0n,
18300
- script: chunkGMUVWKOK_cjs.OP_RETURN_EMPTY_PKSCRIPT
18656
+ script: chunkCDWLZQQW_cjs.OP_RETURN_EMPTY_PKSCRIPT
18301
18657
  });
18302
18658
  return tx;
18303
18659
  }
18304
18660
  function craftBIP322ToSignSimple(toSpend, pkScript) {
18305
- const tx = new chunkGMUVWKOK_cjs.Transaction({ version: 0 });
18661
+ const tx = new chunkCDWLZQQW_cjs.Transaction({ version: 0 });
18306
18662
  tx.addInput({
18307
18663
  txid: toSpend.id,
18308
18664
  index: 0,
@@ -18314,7 +18670,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
18314
18670
  });
18315
18671
  tx.addOutput({
18316
18672
  amount: 0n,
18317
- script: chunkGMUVWKOK_cjs.OP_RETURN_EMPTY_PKSCRIPT
18673
+ script: chunkCDWLZQQW_cjs.OP_RETURN_EMPTY_PKSCRIPT
18318
18674
  });
18319
18675
  return tx;
18320
18676
  }
@@ -18445,7 +18801,7 @@ var RestEmulatorProvider = class {
18445
18801
  }
18446
18802
  };
18447
18803
  function finalizeVirtualTx(type, psbtBase64) {
18448
- const tx = chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
18804
+ const tx = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbtBase64));
18449
18805
  if (type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
18450
18806
  const input = tx.getInput(0);
18451
18807
  if (!input) {
@@ -18472,14 +18828,14 @@ var ExitPathError = class extends Error {
18472
18828
  reason;
18473
18829
  };
18474
18830
  function delayWeight(sequence) {
18475
- const t = chunkGMUVWKOK_cjs.sequenceToTimelock(sequence);
18831
+ const t = chunkCDWLZQQW_cjs.sequenceToTimelock(sequence);
18476
18832
  return t.type === "blocks" ? Number(t.value) : Number(t.value) / 600;
18477
18833
  }
18478
18834
  async function resolveUnilateralPath(params) {
18479
18835
  const { vtxo, scriptHex, contractRepository } = params;
18480
18836
  const contract = contractRepository ? (await contractRepository.getContracts({ script: scriptHex }))[0] : void 0;
18481
18837
  if (contract) {
18482
- const handler = chunk53XNU2EL_cjs.contractHandlers.get(contract.type);
18838
+ const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
18483
18839
  if (!handler) {
18484
18840
  throw new ExitPathError(
18485
18841
  "no-handler",
@@ -18502,12 +18858,12 @@ async function resolveUnilateralPath(params) {
18502
18858
  paths.sort((a, b) => delayWeight(a.sequence) - delayWeight(b.sequence));
18503
18859
  return { selection: paths[0], label: `${contract.type}:unilateral` };
18504
18860
  }
18505
- const decoded = chunkGMUVWKOK_cjs.VtxoScript.decode(vtxo.tapTree);
18861
+ const decoded = chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree);
18506
18862
  let best;
18507
18863
  for (const exit of decoded.exitPaths()) {
18508
18864
  const leaf = decoded.findLeaf(base.hex.encode(exit.script));
18509
18865
  if (!leaf) continue;
18510
- const sequence = chunkGMUVWKOK_cjs.timelockToSequence(exit.params.timelock);
18866
+ const sequence = chunkCDWLZQQW_cjs.timelockToSequence(exit.params.timelock);
18511
18867
  const weight = delayWeight(sequence);
18512
18868
  if (!best || weight < best.weight) {
18513
18869
  best = { selection: { leaf, sequence }, weight };
@@ -18693,14 +19049,14 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
18693
19049
  }
18694
19050
  const resolved = await resolveUnilateralPath({
18695
19051
  vtxo,
18696
- scriptHex: base.hex.encode(chunkGMUVWKOK_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
19052
+ scriptHex: base.hex.encode(chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
18697
19053
  contractRepository: wallet.contractRepository,
18698
19054
  walletPubKeyHex: base.hex.encode(await wallet.identity.xOnlyPublicKey()),
18699
19055
  currentTime: Date.now()
18700
19056
  });
18701
19057
  const spendingLeaf = resolved.selection.leaf;
18702
19058
  const sequence = resolved.selection.sequence;
18703
- const timelock = chunkGMUVWKOK_cjs.sequenceToTimelock(sequence);
19059
+ const timelock = chunkCDWLZQQW_cjs.sequenceToTimelock(sequence);
18704
19060
  const elapsed = timelock.type === "blocks" ? chainTip.height >= txStatus.blockHeight + Number(timelock.value) : chainTip.time >= txStatus.blockTime + Number(timelock.value);
18705
19061
  if (!elapsed) {
18706
19062
  throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
@@ -18713,7 +19069,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
18713
19069
  sequence,
18714
19070
  witnessUtxo: {
18715
19071
  amount: BigInt(vtxo.value),
18716
- script: chunkGMUVWKOK_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
19072
+ script: chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
18717
19073
  },
18718
19074
  sighashType: btcSigner.SigHash.DEFAULT
18719
19075
  });
@@ -18723,7 +19079,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
18723
19079
  btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
18724
19080
  );
18725
19081
  }
18726
- const tx = new chunkGMUVWKOK_cjs.Transaction({ version: 2 });
19082
+ const tx = new chunkCDWLZQQW_cjs.Transaction({ version: 2 });
18727
19083
  for (const input of inputs) {
18728
19084
  tx.addInput(input);
18729
19085
  }
@@ -18790,7 +19146,7 @@ async function buildSignedSweep(params) {
18790
19146
  `uneconomic vtxo ${vtxo.txid}:${vtxo.vout}: value ${vtxo.value} - fee ${fee} < dust`
18791
19147
  );
18792
19148
  }
18793
- const tx = new chunkGMUVWKOK_cjs.Transaction({ version: 2 });
19149
+ const tx = new chunkCDWLZQQW_cjs.Transaction({ version: 2 });
18794
19150
  tx.addInput({
18795
19151
  txid: vtxo.txid,
18796
19152
  index: vtxo.vout,
@@ -18815,7 +19171,7 @@ async function buildSignedSweep(params) {
18815
19171
  finalScriptWitness: [
18816
19172
  tapScriptSig[0][1],
18817
19173
  ...path.extraWitness,
18818
- chunkGMUVWKOK_cjs.scriptFromTapLeafScript(path.leaf),
19174
+ chunkCDWLZQQW_cjs.scriptFromTapLeafScript(path.leaf),
18819
19175
  btcSigner.TaprootControlBlock.encode(controlBlock)
18820
19176
  ]
18821
19177
  });
@@ -18845,7 +19201,7 @@ async function resolveFeeRate(opts) {
18845
19201
  }
18846
19202
  async function selectExitVtxos(opts) {
18847
19203
  if (!opts.vtxos) return opts.wallet.getVtxos();
18848
- const res = await chunkGMUVWKOK_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
19204
+ const res = await chunkCDWLZQQW_cjs.getNormalizedVtxos(opts.wallet.indexerProvider, { outpoints: opts.vtxos });
18849
19205
  const tapTrees = /* @__PURE__ */ new Map();
18850
19206
  const out = [];
18851
19207
  for (const vtxo of res.vtxos) {
@@ -18860,7 +19216,7 @@ async function selectExitVtxos(opts) {
18860
19216
  `no contract registered for vtxo script ${vtxo.script} \u2014 register the contract before exiting`
18861
19217
  );
18862
19218
  }
18863
- const handler = chunk53XNU2EL_cjs.contractHandlers.get(contract.type);
19219
+ const handler = chunk37XKN5DZ_cjs.contractHandlers.get(contract.type);
18864
19220
  if (!handler) {
18865
19221
  throw new Error(`no contract handler registered for type '${contract.type}'`);
18866
19222
  }
@@ -18890,7 +19246,7 @@ async function computeExitLayout(opts, feeRate) {
18890
19246
  if (pendingNodes.length > 0) {
18891
19247
  const txs = await resolver.getVirtualTxs(pendingNodes.map((n) => n.txid));
18892
19248
  for (const psbt of txs) {
18893
- psbts.set(chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
19249
+ psbts.set(chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(psbt)).id, psbt);
18894
19250
  }
18895
19251
  }
18896
19252
  const childVsize = Number(
@@ -18926,7 +19282,7 @@ async function computeExitLayout(opts, feeRate) {
18926
19282
  try {
18927
19283
  const resolved = await resolveUnilateralPath({
18928
19284
  vtxo,
18929
- scriptHex: base.hex.encode(chunkGMUVWKOK_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
19285
+ scriptHex: base.hex.encode(chunkCDWLZQQW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript),
18930
19286
  contractRepository: wallet.contractRepository,
18931
19287
  walletPubKeyHex,
18932
19288
  currentTime: Date.now()
@@ -18945,7 +19301,7 @@ async function computeExitLayout(opts, feeRate) {
18945
19301
  });
18946
19302
  continue;
18947
19303
  }
18948
- const t = chunkGMUVWKOK_cjs.sequenceToTimelock(resolved.selection.sequence);
19304
+ const t = chunkCDWLZQQW_cjs.sequenceToTimelock(resolved.selection.sequence);
18949
19305
  const delay = { type: t.type, value: Number(t.value) };
18950
19306
  infos.push({ outpoint, value: vtxo.value, sweepFee, path: resolved.label, delay });
18951
19307
  sweeps.push({ vtxo, resolved, sweepFee, delay });
@@ -19284,7 +19640,7 @@ async function prepare(opts) {
19284
19640
  txid: sweep.vtxo.txid,
19285
19641
  vout: sweep.vtxo.vout,
19286
19642
  value: sweep.vtxo.value,
19287
- pkScript: chunkGMUVWKOK_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
19643
+ pkScript: chunkCDWLZQQW_cjs.VtxoScript.decode(sweep.vtxo.tapTree).pkScript
19288
19644
  },
19289
19645
  path: sweep.resolved.selection,
19290
19646
  outputAddress: opts.sweepAddress,
@@ -19369,7 +19725,7 @@ async function prepare(opts) {
19369
19725
  if (newFee <= splitterFee) break;
19370
19726
  splitterFee = newFee;
19371
19727
  }
19372
- const splitter = new chunkGMUVWKOK_cjs.Transaction({ version: 2 });
19728
+ const splitter = new chunkCDWLZQQW_cjs.Transaction({ version: 2 });
19373
19729
  for (const coin of selected.inputs) {
19374
19730
  splitter.addInput({
19375
19731
  txid: coin.txid,
@@ -19512,44 +19868,45 @@ var UnilateralExit = {
19512
19868
  // src/arkade/index.ts
19513
19869
  var arkade_exports = {};
19514
19870
  chunk5BLDMQED_cjs.__export(arkade_exports, {
19515
- ARKADE_OP: () => chunk53XNU2EL_cjs.ARKADE_OP,
19516
- ARKADE_OPCODES: () => chunk53XNU2EL_cjs.ARKADE_OPCODES,
19517
- ARKADE_OPCODE_NAMES: () => chunk53XNU2EL_cjs.ARKADE_OPCODE_NAMES,
19518
- ARKADE_OPCODE_VALUES: () => chunk53XNU2EL_cjs.ARKADE_OPCODE_VALUES,
19519
- ARKADE_OPS: () => chunk53XNU2EL_cjs.ARKADE_OPS,
19871
+ ARKADE_OP: () => chunk37XKN5DZ_cjs.ARKADE_OP,
19872
+ ARKADE_OPCODES: () => chunk37XKN5DZ_cjs.ARKADE_OPCODES,
19873
+ ARKADE_OPCODE_NAMES: () => chunk37XKN5DZ_cjs.ARKADE_OPCODE_NAMES,
19874
+ ARKADE_OPCODE_VALUES: () => chunk37XKN5DZ_cjs.ARKADE_OPCODE_VALUES,
19875
+ ARKADE_OPS: () => chunk37XKN5DZ_cjs.ARKADE_OPS,
19520
19876
  Arkade: () => Arkade,
19521
19877
  ArkadeContract: () => ArkadeContract,
19522
- ArkadeProgramScript: () => chunk53XNU2EL_cjs.ArkadeProgramScript,
19523
- ArkadeScript: () => chunk53XNU2EL_cjs.ArkadeScript,
19878
+ ArkadeProgramScript: () => chunk37XKN5DZ_cjs.ArkadeProgramScript,
19879
+ ArkadeScript: () => chunk37XKN5DZ_cjs.ArkadeScript,
19524
19880
  ArkadeTransactionBuilder: () => ArkadeTransactionBuilder,
19525
- BigNum: () => chunk53XNU2EL_cjs.bignum_exports,
19881
+ BigNum: () => chunk37XKN5DZ_cjs.bignum_exports,
19526
19882
  OP: () => btcSigner.OP,
19527
- OPCODE_NAMES: () => chunk53XNU2EL_cjs.OPCODE_NAMES,
19528
- OPCODE_VALUES: () => chunk53XNU2EL_cjs.OPCODE_VALUES,
19529
- SUPPORTED_PROGRAM_VERSION: () => chunk53XNU2EL_cjs.SUPPORTED_PROGRAM_VERSION,
19883
+ OPCODE_NAMES: () => chunk37XKN5DZ_cjs.OPCODE_NAMES,
19884
+ OPCODE_VALUES: () => chunk37XKN5DZ_cjs.OPCODE_VALUES,
19885
+ SUPPORTED_PROGRAM_VERSION: () => chunk37XKN5DZ_cjs.SUPPORTED_PROGRAM_VERSION,
19530
19886
  Script: () => btcSigner.Script,
19531
- arkadeScriptHash: () => chunk53XNU2EL_cjs.arkadeScriptHash,
19532
- arkadeWitnessHash: () => chunk53XNU2EL_cjs.arkadeWitnessHash,
19533
- asmToBytes: () => chunk53XNU2EL_cjs.asmToBytes,
19534
- bytesToASM: () => chunk53XNU2EL_cjs.bytesToASM,
19535
- computeArkadeScriptPublicKey: () => chunk53XNU2EL_cjs.computeArkadeScriptPublicKey,
19887
+ arkadeScriptHash: () => chunk37XKN5DZ_cjs.arkadeScriptHash,
19888
+ arkadeWitnessHash: () => chunk37XKN5DZ_cjs.arkadeWitnessHash,
19889
+ asmToBytes: () => chunk37XKN5DZ_cjs.asmToBytes,
19890
+ bytesToASM: () => chunk37XKN5DZ_cjs.bytesToASM,
19891
+ computeArkadeScriptPublicKey: () => chunk37XKN5DZ_cjs.computeArkadeScriptPublicKey,
19536
19892
  createArkadeBatchHandler: () => createArkadeBatchHandler,
19537
- deserializeArkadeContractParams: () => chunk53XNU2EL_cjs.deserializeArkadeContractParams,
19538
- fromASM: () => chunk53XNU2EL_cjs.fromASM,
19539
- getOpcodeName: () => chunk53XNU2EL_cjs.getOpcodeName,
19540
- getOpcodeValue: () => chunk53XNU2EL_cjs.getOpcodeValue,
19541
- parseArtifact: () => chunk53XNU2EL_cjs.parseArtifact,
19542
- resolveAsm: () => chunk53XNU2EL_cjs.resolveAsm,
19543
- serializeArkadeContractParams: () => chunk53XNU2EL_cjs.serializeArkadeContractParams,
19544
- stringifyArtifact: () => chunk53XNU2EL_cjs.stringifyArtifact,
19545
- toASM: () => chunk53XNU2EL_cjs.toASM,
19546
- validateProgram: () => chunk53XNU2EL_cjs.validateProgram,
19547
- witnessRefToBytes: () => chunk53XNU2EL_cjs.witnessRefToBytes
19893
+ deserializeArkadeContractParams: () => chunk37XKN5DZ_cjs.deserializeArkadeContractParams,
19894
+ fromASM: () => chunk37XKN5DZ_cjs.fromASM,
19895
+ getOpcodeName: () => chunk37XKN5DZ_cjs.getOpcodeName,
19896
+ getOpcodeValue: () => chunk37XKN5DZ_cjs.getOpcodeValue,
19897
+ parseArtifact: () => chunk37XKN5DZ_cjs.parseArtifact,
19898
+ resolveAsm: () => chunk37XKN5DZ_cjs.resolveAsm,
19899
+ serializeArkadeContractParams: () => chunk37XKN5DZ_cjs.serializeArkadeContractParams,
19900
+ stringifyArtifact: () => chunk37XKN5DZ_cjs.stringifyArtifact,
19901
+ toASM: () => chunk37XKN5DZ_cjs.toASM,
19902
+ validateProgram: () => chunk37XKN5DZ_cjs.validateProgram,
19903
+ witnessRefToBytes: () => chunk37XKN5DZ_cjs.witnessRefToBytes
19548
19904
  });
19549
- var isVtxoCoin = (input) => chunkGMUVWKOK_cjs.isVirtualCoin(input);
19905
+ var isVtxoCoin = (input) => chunkCDWLZQQW_cjs.isVirtualCoin(input);
19550
19906
  function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message, session, arkProvider, emulator, network, recipients) {
19551
19907
  let batchId;
19552
19908
  let sweepTapTreeRoot;
19909
+ let validatedCommitmentTxid;
19553
19910
  return {
19554
19911
  onBatchStarted: async (event) => {
19555
19912
  const utf8IntentId = new TextEncoder().encode(intentId);
@@ -19558,7 +19915,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
19558
19915
  if (!event.intentIdHashes.includes(intentIdHashStr)) return { skip: true };
19559
19916
  await arkProvider.confirmRegistration(intentId);
19560
19917
  batchId = event.id;
19561
- const sweepTapscript = chunkGMUVWKOK_cjs.CSVMultisigTapscript.encode({
19918
+ const sweepTapscript = chunkCDWLZQQW_cjs.CSVMultisigTapscript.encode({
19562
19919
  timelock: {
19563
19920
  value: event.batchExpiry,
19564
19921
  // BIP-65: values >= 512 are interpreted as seconds, below as blocks
@@ -19576,7 +19933,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
19576
19933
  if (!xOnlyPubkeys.includes(base.hex.encode(xonlySignerPubKey))) {
19577
19934
  return { skip: true };
19578
19935
  }
19579
- const commitmentTx = chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
19936
+ const commitmentTx = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(event.unsignedCommitmentTx));
19580
19937
  validateVtxoTxGraph(vtxoTree, commitmentTx, sweepTapTreeRoot);
19581
19938
  if (recipients && recipients.length > 0) {
19582
19939
  validateBatchRecipients(commitmentTx, vtxoTree.leaves(), recipients, network);
@@ -19585,6 +19942,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
19585
19942
  if (!sharedOutput?.amount) {
19586
19943
  throw new Error("Shared output not found");
19587
19944
  }
19945
+ validatedCommitmentTxid = commitmentTx.id;
19588
19946
  await session.init(vtxoTree, sweepTapTreeRoot, sharedOutput.amount);
19589
19947
  const pubkey = base.hex.encode(await session.getPublicKey());
19590
19948
  const nonces = await session.getNonces();
@@ -19607,7 +19965,15 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
19607
19965
  if (connectorTree) {
19608
19966
  validateConnectorsTxGraph(event.commitmentTx, connectorTree);
19609
19967
  }
19610
- let commitmentPsbt = chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
19968
+ let commitmentPsbt = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(event.commitmentTx));
19969
+ assertFinalCommitmentMatchesValidated(
19970
+ commitmentPsbt,
19971
+ validatedCommitmentTxid,
19972
+ "arkade batch finalization"
19973
+ );
19974
+ if (!validatedCommitmentTxid && recipients && recipients.length > 0) {
19975
+ validateBatchRecipientsWithoutTree(commitmentPsbt, recipients, network);
19976
+ }
19611
19977
  const signedForfeits = [];
19612
19978
  let connectorIndex = 0;
19613
19979
  const connectorLeaves = connectorTree?.leaves() || [];
@@ -19634,7 +20000,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
19634
20000
  boardingIndices.push(boardingIdx);
19635
20001
  continue;
19636
20002
  }
19637
- if (chunkGMUVWKOK_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
20003
+ if (chunkCDWLZQQW_cjs.isRecoverable(input) || isSubdust(input, info.dust)) {
19638
20004
  continue;
19639
20005
  }
19640
20006
  if (connectorIndex >= connectorLeaves.length) {
@@ -19655,7 +20021,7 @@ function createArkadeBatchHandler(intentId, inputs, signer, signedProof, message
19655
20021
  index: input.vout,
19656
20022
  witnessUtxo: {
19657
20023
  amount: BigInt(input.value),
19658
- script: chunkGMUVWKOK_cjs.VtxoScript.decode(input.tapTree).pkScript
20024
+ script: chunkCDWLZQQW_cjs.VtxoScript.decode(input.tapTree).pkScript
19659
20025
  },
19660
20026
  sighashType: btcSigner.SigHash.DEFAULT,
19661
20027
  tapLeafScript: [input.forfeitTapLeafScript]
@@ -19738,7 +20104,7 @@ var Arkade = class _Arkade {
19738
20104
  static async connect(opts) {
19739
20105
  const info = await opts.arkade.getInfo();
19740
20106
  const serverKey = base.hex.decode(info.signerPubkey).slice(1);
19741
- const checkpoint = chunkGMUVWKOK_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
20107
+ const checkpoint = chunkCDWLZQQW_cjs.CSVMultisigTapscript.decode(base.hex.decode(info.checkpointTapscript));
19742
20108
  let emulatorKey;
19743
20109
  if (opts.emulator) {
19744
20110
  const eInfo = await opts.emulator.getInfo();
@@ -19752,7 +20118,7 @@ var Arkade = class _Arkade {
19752
20118
  return new _Arkade({
19753
20119
  arkProvider: opts.arkade,
19754
20120
  emulator: opts.emulator,
19755
- network: opts.network ?? chunkGMUVWKOK_cjs.DEFAULT_NETWORK,
20121
+ network: opts.network ?? chunkCDWLZQQW_cjs.DEFAULT_NETWORK,
19756
20122
  serverKey,
19757
20123
  emulatorKey,
19758
20124
  checkpoint,
@@ -19773,7 +20139,7 @@ var Arkade = class _Arkade {
19773
20139
  * key respectively; explicit args always win.
19774
20140
  */
19775
20141
  contract(program, args = {}) {
19776
- const declared = (program.params ?? []).map(chunk53XNU2EL_cjs.inputName);
20142
+ const declared = (program.params ?? []).map(chunk37XKN5DZ_cjs.inputName);
19777
20143
  if (declared.includes("server") && args.server === void 0) {
19778
20144
  args = { ...args, server: this.serverKey };
19779
20145
  }
@@ -19793,7 +20159,7 @@ var ArkadeContract = class _ArkadeContract {
19793
20159
  userKey: client.userKey,
19794
20160
  emulatorKey: client.emulatorKey
19795
20161
  };
19796
- this.vtxoScript = new chunk53XNU2EL_cjs.ArkadeProgramScript(program, args, this.keys);
20162
+ this.vtxoScript = new chunk37XKN5DZ_cjs.ArkadeProgramScript(program, args, this.keys);
19797
20163
  this.tapTree = this.vtxoScript.encode();
19798
20164
  this.compiled = this.vtxoScript.compiled;
19799
20165
  }
@@ -19821,7 +20187,7 @@ var ArkadeContract = class _ArkadeContract {
19821
20187
  `ArkadeContract.fromContract: expected contract type 'arkade', got '${contract.type}'`
19822
20188
  );
19823
20189
  }
19824
- const typed = chunk53XNU2EL_cjs.deserializeArkadeContractParams(contract.params);
20190
+ const typed = chunk37XKN5DZ_cjs.deserializeArkadeContractParams(contract.params);
19825
20191
  return new _ArkadeContract(client, typed.program, typed.args, {
19826
20192
  serverKey: typed.serverKey,
19827
20193
  userKey: typed.userKey,
@@ -19862,7 +20228,7 @@ var ArkadeContract = class _ArkadeContract {
19862
20228
  toContractParams() {
19863
20229
  return {
19864
20230
  type: "arkade",
19865
- params: chunk53XNU2EL_cjs.serializeArkadeContractParams({
20231
+ params: chunk37XKN5DZ_cjs.serializeArkadeContractParams({
19866
20232
  program: this.program,
19867
20233
  args: this.args,
19868
20234
  serverKey: this.keys.serverKey,
@@ -19907,13 +20273,13 @@ var ArkadeContract = class _ArkadeContract {
19907
20273
  const [registered] = await manager.getContracts({ script: scriptHex });
19908
20274
  if (registered) {
19909
20275
  const [withVtxos] = await manager.getContractsWithVtxos({ script: scriptHex });
19910
- return (withVtxos?.vtxos ?? []).filter((v) => !chunkGMUVWKOK_cjs.hasTerminalSpend(v));
20276
+ return (withVtxos?.vtxos ?? []).filter((v) => !chunkCDWLZQQW_cjs.hasTerminalSpend(v));
19911
20277
  }
19912
20278
  }
19913
20279
  if (!this.client.indexer) {
19914
20280
  throw new Error("ArkadeContract.getUtxos: an indexer is required");
19915
20281
  }
19916
- const { vtxos } = await chunkGMUVWKOK_cjs.getNormalizedVtxos(this.client.indexer, {
20282
+ const { vtxos } = await chunkCDWLZQQW_cjs.getNormalizedVtxos(this.client.indexer, {
19917
20283
  scripts: [scriptHex],
19918
20284
  spendableOnly: true
19919
20285
  });
@@ -20015,12 +20381,12 @@ var ArkadeTransactionBuilder = class {
20015
20381
  this.contract.client.checkpoint
20016
20382
  );
20017
20383
  if (coin.sourceTx) {
20018
- chunkGMUVWKOK_cjs.setArkPsbtField(arkTx, 0, chunkGMUVWKOK_cjs.PrevArkTxField, coin.sourceTx);
20384
+ chunkCDWLZQQW_cjs.setArkPsbtField(arkTx, 0, chunkCDWLZQQW_cjs.PrevArkTxField, coin.sourceTx);
20019
20385
  }
20020
20386
  const condition = (def.tapscript.witness ?? []).map((w) => this.witnessBytes(w));
20021
20387
  if (condition.length > 0) {
20022
- chunkGMUVWKOK_cjs.setArkPsbtField(arkTx, 0, chunkGMUVWKOK_cjs.ConditionWitness, condition);
20023
- chunkGMUVWKOK_cjs.setArkPsbtField(checkpoints[0], 0, chunkGMUVWKOK_cjs.ConditionWitness, condition);
20388
+ chunkCDWLZQQW_cjs.setArkPsbtField(arkTx, 0, chunkCDWLZQQW_cjs.ConditionWitness, condition);
20389
+ chunkCDWLZQQW_cjs.setArkPsbtField(checkpoints[0], 0, chunkCDWLZQQW_cjs.ConditionWitness, condition);
20024
20390
  }
20025
20391
  const packets = [];
20026
20392
  if (this.assetSpecs.length > 0) {
@@ -20059,7 +20425,7 @@ var ArkadeTransactionBuilder = class {
20059
20425
  base.base64.encode(signedArk2.toPSBT()),
20060
20426
  signedCps.map((c) => base.base64.encode(c.toPSBT()))
20061
20427
  );
20062
- const txid = chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
20428
+ const txid = chunkCDWLZQQW_cjs.Transaction.fromPSBT(base.base64.decode(res2.signedArkTx)).id;
20063
20429
  return {
20064
20430
  txid,
20065
20431
  signedArkTx: res2.signedArkTx,
@@ -20074,11 +20440,11 @@ var ArkadeTransactionBuilder = class {
20074
20440
  base.base64.encode(signedArk.toPSBT()),
20075
20441
  checkpoints.map((c) => base.base64.encode(c.toPSBT()))
20076
20442
  );
20443
+ assertSubmittedArkTxid(res, signedArk, "submitTx");
20444
+ const matched = matchServerCheckpoints(res.signedCheckpointTxs, checkpoints, "submitTx");
20077
20445
  const finalCps = await Promise.all(
20078
- res.signedCheckpointTxs.map(
20079
- async (b) => base.base64.encode(
20080
- (await client.identity.sign(chunkGMUVWKOK_cjs.Transaction.fromPSBT(base.base64.decode(b)), [0])).toPSBT()
20081
- )
20446
+ matched.map(
20447
+ async ({ server }) => base.base64.encode((await client.identity.sign(server, [0])).toPSBT())
20082
20448
  )
20083
20449
  );
20084
20450
  await client.arkProvider.finalizeTx(res.arkTxid, finalCps);
@@ -20118,23 +20484,23 @@ var ArkadeTransactionBuilder = class {
20118
20484
  }
20119
20485
  buildAssetPacket() {
20120
20486
  const groups = this.assetSpecs.map((s) => {
20121
- const id = typeof s.assetId === "string" ? chunkRNECH3TA_cjs.AssetId.fromString(s.assetId) : chunkRNECH3TA_cjs.AssetId.fromBytes(s.assetId);
20122
- return chunkRNECH3TA_cjs.AssetGroup.create(
20487
+ const id = typeof s.assetId === "string" ? chunk24YNIQSW_cjs.AssetId.fromString(s.assetId) : chunk24YNIQSW_cjs.AssetId.fromBytes(s.assetId);
20488
+ return chunk24YNIQSW_cjs.AssetGroup.create(
20123
20489
  id,
20124
20490
  null,
20125
- s.inputs.map((i) => chunkRNECH3TA_cjs.AssetInput.create(i.vin, i.amount)),
20126
- s.outputs.map((o) => chunkRNECH3TA_cjs.AssetOutput.create(o.vout, o.amount)),
20127
- (s.metadata ?? []).map((m) => chunkRNECH3TA_cjs.Metadata.create(m.key, m.value))
20491
+ s.inputs.map((i) => chunk24YNIQSW_cjs.AssetInput.create(i.vin, i.amount)),
20492
+ s.outputs.map((o) => chunk24YNIQSW_cjs.AssetOutput.create(o.vout, o.amount)),
20493
+ (s.metadata ?? []).map((m) => chunk24YNIQSW_cjs.Metadata.create(m.key, m.value))
20128
20494
  );
20129
20495
  });
20130
- return chunkRNECH3TA_cjs.Packet.create(groups);
20496
+ return chunk24YNIQSW_cjs.Packet.create(groups);
20131
20497
  }
20132
20498
  witnessBytes(ref) {
20133
- return chunk53XNU2EL_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
20499
+ return chunk37XKN5DZ_cjs.witnessRefToBytes(ref, this.args, this.contract.args);
20134
20500
  }
20135
20501
  };
20136
20502
  function bindInputs(fn, callArgs) {
20137
- const names = (fn.def.inputs ?? []).map(chunk53XNU2EL_cjs.inputName);
20503
+ const names = (fn.def.inputs ?? []).map(chunk37XKN5DZ_cjs.inputName);
20138
20504
  if (callArgs.length !== names.length) {
20139
20505
  throw new Error(`${fn.name}: expected ${names.length} argument(s), got ${callArgs.length}`);
20140
20506
  }
@@ -20541,7 +20907,7 @@ function decodeArkContract(encoded) {
20541
20907
  }
20542
20908
  function contractFromArkContract(encoded, options = {}) {
20543
20909
  const parsed = decodeArkContract(encoded);
20544
- const handler = chunk53XNU2EL_cjs.contractHandlers.get(parsed.type);
20910
+ const handler = chunk37XKN5DZ_cjs.contractHandlers.get(parsed.type);
20545
20911
  if (!handler) {
20546
20912
  throw new Error(`No handler registered for contract type '${parsed.type}'`);
20547
20913
  }
@@ -20555,9 +20921,9 @@ function contractFromArkContract(encoded, options = {}) {
20555
20921
  metadata: options.metadata
20556
20922
  };
20557
20923
  }
20558
- function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunkGMUVWKOK_cjs.DEFAULT_NETWORK.hrp, options = {}) {
20924
+ function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunkCDWLZQQW_cjs.DEFAULT_NETWORK.hrp, options = {}) {
20559
20925
  const parsed = decodeArkContract(encoded);
20560
- const handler = chunk53XNU2EL_cjs.contractHandlers.getOrThrow(parsed.type);
20926
+ const handler = chunk37XKN5DZ_cjs.contractHandlers.getOrThrow(parsed.type);
20561
20927
  const params = parsed.data;
20562
20928
  const vtxoScript = handler.createScript(params);
20563
20929
  return {
@@ -20594,6 +20960,7 @@ exports.DelegateManagerImpl = DelegateManagerImpl;
20594
20960
  exports.DelegateNotConfiguredError = DelegateNotConfiguredError;
20595
20961
  exports.DelegatorManagerImpl = DelegatorManagerImpl;
20596
20962
  exports.DelegatorNotConfiguredError = DelegatorNotConfiguredError;
20963
+ exports.DescriptorIdentity = DescriptorIdentity;
20597
20964
  exports.DescriptorSigningProviderMissingError = DescriptorSigningProviderMissingError;
20598
20965
  exports.DustChangeError = DustChangeError;
20599
20966
  exports.ELECTRUM_TCP_HOST = ELECTRUM_TCP_HOST;
@@ -20654,8 +21021,11 @@ exports.WsElectrumChainSource = WsElectrumChainSource;
20654
21021
  exports.arkRail = arkRail;
20655
21022
  exports.arkTarget = arkTarget;
20656
21023
  exports.arkade_exports = arkade_exports;
21024
+ exports.assertFinalCommitmentMatchesValidated = assertFinalCommitmentMatchesValidated;
20657
21025
  exports.assertIntentIdUnique = assertIntentIdUnique;
20658
21026
  exports.assertSendableAmount = assertSendableAmount;
21027
+ exports.assertSubmittedArkTxid = assertSubmittedArkTxid;
21028
+ exports.assetMintResolver = assetMintResolver;
20659
21029
  exports.boardingResolver = boardingResolver;
20660
21030
  exports.btcTarget = btcTarget;
20661
21031
  exports.buildForfeitTx = buildForfeitTx;
@@ -20663,6 +21033,7 @@ exports.buildOffchainTx = buildOffchainTx;
20663
21033
  exports.classifyAgainstSignerSet = classifyAgainstSignerSet;
20664
21034
  exports.classifyContractSigner = classifyContractSigner;
20665
21035
  exports.closeDatabase = closeDatabase;
21036
+ exports.collabExitResolver = collabExitResolver;
20666
21037
  exports.combineTapscriptSigs = combineTapscriptSigs;
20667
21038
  exports.contractFromArkContract = contractFromArkContract;
20668
21039
  exports.contractFromArkContractWithAddress = contractFromArkContractWithAddress;
@@ -20689,6 +21060,8 @@ exports.isBatchSignable = isBatchSignable;
20689
21060
  exports.isBtcAddress = isBtcAddress;
20690
21061
  exports.isCooperativelyMigratable = isCooperativelyMigratable;
20691
21062
  exports.isDiscoverable = isDiscoverable;
21063
+ exports.isHDDeterministicSignCapable = isHDDeterministicSignCapable;
21064
+ exports.isHDWalletCapable = isHDWalletCapable;
20692
21065
  exports.isLightningInvoice = isLightningInvoice;
20693
21066
  exports.isLnurl = isLnurl;
20694
21067
  exports.isMessageBusInitializingError = isMessageBusInitializingError;
@@ -20699,6 +21072,7 @@ exports.isValidArkAddress = isValidArkAddress;
20699
21072
  exports.isVtxoExpiringSoon = isVtxoExpiringSoon;
20700
21073
  exports.isVtxoForScript = isVtxoForScript;
20701
21074
  exports.makeHandle = makeHandle;
21075
+ exports.matchServerCheckpoints = matchServerCheckpoints;
20702
21076
  exports.mergeChainedTxType = mergeChainedTxType;
20703
21077
  exports.migrateWalletRepository = migrateWalletRepository;
20704
21078
  exports.onchainRail = onchainRail;
@@ -20718,10 +21092,11 @@ exports.setupServiceWorker = setupServiceWorker;
20718
21092
  exports.signerSetFromInfo = signerSetFromInfo;
20719
21093
  exports.toXOnlySignerHex = toXOnlySignerHex;
20720
21094
  exports.tryResolveSendAmount = tryResolveSendAmount;
21095
+ exports.validateBatchRecipients = validateBatchRecipients;
20721
21096
  exports.validateConnectorsTxGraph = validateConnectorsTxGraph;
20722
21097
  exports.validateVtxoTxGraph = validateVtxoTxGraph;
20723
21098
  exports.verifyTapscriptSignatures = verifyTapscriptSignatures;
20724
21099
  exports.waitForIncomingFunds = waitForIncomingFunds;
20725
21100
  exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
20726
- //# sourceMappingURL=chunk-D5LUPJJP.cjs.map
20727
- //# sourceMappingURL=chunk-D5LUPJJP.cjs.map
21101
+ //# sourceMappingURL=chunk-ENRRZFZ4.cjs.map
21102
+ //# sourceMappingURL=chunk-ENRRZFZ4.cjs.map