@arkade-os/sdk 0.4.40 → 0.4.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +24 -0
  2. package/dist/adapters/expo.cjs +5 -5
  3. package/dist/adapters/expo.d.cts +2 -2
  4. package/dist/adapters/expo.d.ts +2 -2
  5. package/dist/adapters/expo.js +3 -3
  6. package/dist/adapters/indexedDB.cjs +5 -5
  7. package/dist/adapters/indexedDB.js +4 -4
  8. package/dist/{ark-BaZ6da8C.d.cts → ark-CSqMJczW.d.cts} +95 -1
  9. package/dist/{ark-BaZ6da8C.d.ts → ark-CSqMJczW.d.ts} +95 -1
  10. package/dist/{asyncStorageTaskQueue-trKcQM7q.d.cts → asyncStorageTaskQueue-79XdGsdW.d.cts} +2 -2
  11. package/dist/{asyncStorageTaskQueue-CvV50MjV.d.ts → asyncStorageTaskQueue-SZPrhw23.d.ts} +2 -2
  12. package/dist/{chunk-GUTKJMSF.cjs → chunk-32YKLQPS.cjs} +29 -29
  13. package/dist/{chunk-GUTKJMSF.cjs.map → chunk-32YKLQPS.cjs.map} +1 -1
  14. package/dist/{chunk-I4Z6KKUH.cjs → chunk-3MPXMLP4.cjs} +365 -208
  15. package/dist/chunk-3MPXMLP4.cjs.map +1 -0
  16. package/dist/{chunk-GF6NPAOJ.js → chunk-5XAYUPK4.js} +4 -4
  17. package/dist/{chunk-GF6NPAOJ.js.map → chunk-5XAYUPK4.js.map} +1 -1
  18. package/dist/{chunk-6EZY43WE.cjs → chunk-ALISWEQ5.cjs} +9 -9
  19. package/dist/{chunk-6EZY43WE.cjs.map → chunk-ALISWEQ5.cjs.map} +1 -1
  20. package/dist/{chunk-OUVTG72A.js → chunk-BE5MUB7T.js} +5 -3
  21. package/dist/chunk-BE5MUB7T.js.map +1 -0
  22. package/dist/{chunk-I2O4Q2EL.js → chunk-D5MQYYYF.js} +184 -30
  23. package/dist/chunk-D5MQYYYF.js.map +1 -0
  24. package/dist/{chunk-SWJBV4UB.js → chunk-DDG4RE5F.js} +4 -4
  25. package/dist/{chunk-SWJBV4UB.js.map → chunk-DDG4RE5F.js.map} +1 -1
  26. package/dist/{chunk-CMPJR3HS.cjs → chunk-HXDZ2QTW.cjs} +5 -3
  27. package/dist/chunk-HXDZ2QTW.cjs.map +1 -0
  28. package/dist/{chunk-TSG74BHI.cjs → chunk-KNASU3QI.cjs} +7 -7
  29. package/dist/{chunk-TSG74BHI.cjs.map → chunk-KNASU3QI.cjs.map} +1 -1
  30. package/dist/{chunk-5TSUGRHP.js → chunk-MYI333YH.js} +3 -3
  31. package/dist/{chunk-5TSUGRHP.js.map → chunk-MYI333YH.js.map} +1 -1
  32. package/dist/{chunk-GWISMFO5.cjs → chunk-WBF3FNS3.cjs} +14 -14
  33. package/dist/{chunk-GWISMFO5.cjs.map → chunk-WBF3FNS3.cjs.map} +1 -1
  34. package/dist/{chunk-CUSABEUQ.js → chunk-YNEDJTX2.js} +3 -3
  35. package/dist/{chunk-CUSABEUQ.js.map → chunk-YNEDJTX2.js.map} +1 -1
  36. package/dist/contracts/handlers/index.cjs +7 -7
  37. package/dist/contracts/handlers/index.d.cts +3 -3
  38. package/dist/contracts/handlers/index.d.ts +3 -3
  39. package/dist/contracts/handlers/index.js +2 -2
  40. package/dist/{delegate-ClaZWxlA.d.ts → delegate-BTn9BK8E.d.ts} +1 -1
  41. package/dist/{delegate-Bt5H1gbW.d.cts → delegate-Bqwe-kbj.d.cts} +1 -1
  42. package/dist/{index-D6kIRfBy.d.cts → index-aYiHTMkX.d.cts} +2 -2
  43. package/dist/{index-ByYBDr1g.d.ts → index-kITujXlS.d.ts} +2 -2
  44. package/dist/index.cjs +157 -141
  45. package/dist/index.d.cts +11 -8
  46. package/dist/index.d.ts +11 -8
  47. package/dist/index.js +4 -4
  48. package/dist/repositories/realm/index.cjs +13 -13
  49. package/dist/repositories/realm/index.d.cts +1 -1
  50. package/dist/repositories/realm/index.d.ts +1 -1
  51. package/dist/repositories/realm/index.js +4 -4
  52. package/dist/repositories/sqlite/index.cjs +13 -13
  53. package/dist/repositories/sqlite/index.d.cts +1 -1
  54. package/dist/repositories/sqlite/index.d.ts +1 -1
  55. package/dist/repositories/sqlite/index.js +4 -4
  56. package/dist/{taskRunner-Bwss4MUW.d.ts → taskRunner-BuBAZQwB.d.ts} +2 -2
  57. package/dist/{taskRunner-D7SuOTOa.d.cts → taskRunner-DRHElPMG.d.cts} +2 -2
  58. package/dist/wallet/expo/background.cjs +14 -14
  59. package/dist/wallet/expo/background.d.cts +3 -3
  60. package/dist/wallet/expo/background.d.ts +3 -3
  61. package/dist/wallet/expo/background.js +6 -6
  62. package/dist/wallet/expo/index.cjs +44 -14
  63. package/dist/wallet/expo/index.cjs.map +1 -1
  64. package/dist/wallet/expo/index.d.cts +14 -4
  65. package/dist/wallet/expo/index.d.ts +14 -4
  66. package/dist/wallet/expo/index.js +36 -6
  67. package/dist/wallet/expo/index.js.map +1 -1
  68. package/dist/{wallet-V5C4Nlhz.d.cts → wallet-BZgRfnAE.d.cts} +15 -2
  69. package/dist/{wallet-l-2dKXVh.d.ts → wallet-CTEQpKG9.d.ts} +15 -2
  70. package/dist/worker/expo/index.cjs +9 -9
  71. package/dist/worker/expo/index.d.cts +4 -4
  72. package/dist/worker/expo/index.d.ts +4 -4
  73. package/dist/worker/expo/index.js +5 -5
  74. package/package.json +1 -1
  75. package/dist/chunk-CMPJR3HS.cjs.map +0 -1
  76. package/dist/chunk-I2O4Q2EL.js.map +0 -1
  77. package/dist/chunk-I4Z6KKUH.cjs.map +0 -1
  78. package/dist/chunk-OUVTG72A.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunk6EZY43WE_cjs = require('./chunk-6EZY43WE.cjs');
4
- var chunkGUTKJMSF_cjs = require('./chunk-GUTKJMSF.cjs');
5
- var chunkCMPJR3HS_cjs = require('./chunk-CMPJR3HS.cjs');
3
+ var chunkALISWEQ5_cjs = require('./chunk-ALISWEQ5.cjs');
4
+ var chunk32YKLQPS_cjs = require('./chunk-32YKLQPS.cjs');
5
+ var chunkHXDZ2QTW_cjs = require('./chunk-HXDZ2QTW.cjs');
6
6
  var utils_js = require('@scure/btc-signer/utils.js');
7
7
  var btcSigner = require('@scure/btc-signer');
8
8
  var base = require('@scure/base');
@@ -181,7 +181,7 @@ var TreeSignerSession = class _TreeSignerSession {
181
181
  noncesByPubkey.set(base.hex.encode(myPublicKey.subarray(1)), myNonce);
182
182
  const tx = this.graph.find(txid);
183
183
  if (!tx) throw new Error(`missing tx for txid ${txid}`);
184
- const cosigners = chunk6EZY43WE_cjs.getArkPsbtFields(tx.root, 0, chunk6EZY43WE_cjs.CosignerPublicKey).map(
184
+ const cosigners = chunkALISWEQ5_cjs.getArkPsbtFields(tx.root, 0, chunkALISWEQ5_cjs.CosignerPublicKey).map(
185
185
  (c) => base.hex.encode(c.key.subarray(1))
186
186
  // xonly pubkey
187
187
  );
@@ -233,7 +233,7 @@ var TreeSignerSession = class _TreeSignerSession {
233
233
  if (!aggNonce) throw new Error("missing aggregate nonce");
234
234
  const prevoutAmounts = [];
235
235
  const prevoutScripts = [];
236
- const cosigners = chunk6EZY43WE_cjs.getArkPsbtFields(g.root, 0, chunk6EZY43WE_cjs.CosignerPublicKey).map((c) => c.key);
236
+ const cosigners = chunkALISWEQ5_cjs.getArkPsbtFields(g.root, 0, chunkALISWEQ5_cjs.CosignerPublicKey).map((c) => c.key);
237
237
  const { finalKey } = aggregateKeys(cosigners, true, {
238
238
  taprootTweak: this.scriptRoot
239
239
  });
@@ -411,7 +411,7 @@ var SeedIdentity = class _SeedIdentity {
411
411
  let network;
412
412
  if ("descriptor" in opts && typeof opts.descriptor === "string") {
413
413
  descriptor = opts.descriptor;
414
- network = chunkGUTKJMSF_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
414
+ network = chunk32YKLQPS_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
415
415
  } else {
416
416
  network = opts.isMainnet ?? true ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
417
417
  descriptor = descriptorsScure.scriptExpressions.trBIP32({
@@ -496,7 +496,7 @@ var SeedIdentity = class _SeedIdentity {
496
496
  * `StaticDescriptorProvider` for legacy single-key wallets.
497
497
  */
498
498
  isOurs(descriptor) {
499
- return chunkGUTKJMSF_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
499
+ return chunk32YKLQPS_cjs.descriptorIsOurs(descriptor, this.descriptor, utils_js.pubSchnorr(this.derivedKey));
500
500
  }
501
501
  /**
502
502
  * Signs each request with the key derived from its descriptor.
@@ -533,7 +533,7 @@ var SeedIdentity = class _SeedIdentity {
533
533
  }
534
534
  // ── internal helpers ─────────────────────────────────────────────
535
535
  derivePrivateKeyForDescriptor(descriptor) {
536
- const network = chunkGUTKJMSF_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
536
+ const network = chunk32YKLQPS_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
537
537
  const expansion = descriptorsScure.expand({ descriptor, network });
538
538
  if (expansion.isRanged) {
539
539
  throw new Error(
@@ -619,7 +619,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
619
619
  */
620
620
  descriptor;
621
621
  constructor(descriptor) {
622
- const network = chunkGUTKJMSF_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
622
+ const network = chunk32YKLQPS_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
623
623
  let expansion;
624
624
  try {
625
625
  expansion = descriptorsScure.expand({ descriptor, network, index: 0 });
@@ -669,7 +669,7 @@ var ReadonlyDescriptorIdentity = class _ReadonlyDescriptorIdentity {
669
669
  * `StaticDescriptorProvider` for legacy single-key wallets.
670
670
  */
671
671
  isOurs(descriptor) {
672
- return chunkGUTKJMSF_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
672
+ return chunk32YKLQPS_cjs.descriptorIsOurs(descriptor, this.descriptor, this.indexZero.pubkey);
673
673
  }
674
674
  };
675
675
  function serializeSeedOwnedSigningIdentity(identity) {
@@ -980,14 +980,14 @@ var RestDelegateProvider = class {
980
980
  */
981
981
  async delegate(intent, forfeitTxs, options) {
982
982
  const url = `${this.url}/v1/delegate`;
983
- const response = await chunk6EZY43WE_cjs.baseFetch(url, {
983
+ const response = await chunkALISWEQ5_cjs.baseFetch(url, {
984
984
  method: "POST",
985
985
  headers: {
986
986
  "Content-Type": "application/json"
987
987
  },
988
988
  body: JSON.stringify({
989
989
  intent: {
990
- message: chunk6EZY43WE_cjs.Intent.encodeMessage(intent.message),
990
+ message: chunkALISWEQ5_cjs.Intent.encodeMessage(intent.message),
991
991
  proof: intent.proof
992
992
  },
993
993
  forfeit_txs: forfeitTxs,
@@ -1007,7 +1007,7 @@ var RestDelegateProvider = class {
1007
1007
  */
1008
1008
  async getDelegateInfo() {
1009
1009
  const url = `${this.url}/v1/delegator/info`;
1010
- const response = await chunk6EZY43WE_cjs.baseFetch(url);
1010
+ const response = await chunkALISWEQ5_cjs.baseFetch(url);
1011
1011
  if (!response.ok) {
1012
1012
  const errorText2 = await response.text();
1013
1013
  throw new Error(`Failed to get delegate info: ${errorText2}`);
@@ -1034,7 +1034,7 @@ var ESPLORA_URL = {
1034
1034
  regtest: "http://localhost:3000/api"
1035
1035
  };
1036
1036
  var EsploraProvider = class {
1037
- constructor(baseUrl = ESPLORA_URL[chunkCMPJR3HS_cjs.DEFAULT_NETWORK_NAME], opts) {
1037
+ constructor(baseUrl = ESPLORA_URL[chunkHXDZ2QTW_cjs.DEFAULT_NETWORK_NAME], opts) {
1038
1038
  this.baseUrl = baseUrl;
1039
1039
  this.pollingInterval = opts?.pollingInterval ?? 15e3;
1040
1040
  this.forcePolling = opts?.forcePolling ?? false;
@@ -1042,14 +1042,14 @@ var EsploraProvider = class {
1042
1042
  pollingInterval;
1043
1043
  forcePolling;
1044
1044
  async getCoins(address) {
1045
- const response = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1045
+ const response = await chunkALISWEQ5_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1046
1046
  if (!response.ok) {
1047
1047
  throw new Error(`Failed to fetch UTXOs: ${response.statusText}`);
1048
1048
  }
1049
1049
  return response.json();
1050
1050
  }
1051
1051
  async getFeeRate() {
1052
- const response = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
1052
+ const response = await chunkALISWEQ5_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
1053
1053
  if (response.status === 404) {
1054
1054
  return void 0;
1055
1055
  }
@@ -1070,7 +1070,7 @@ var EsploraProvider = class {
1070
1070
  }
1071
1071
  }
1072
1072
  async getTxOutspends(txid) {
1073
- const response = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1073
+ const response = await chunkALISWEQ5_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1074
1074
  if (!response.ok) {
1075
1075
  const error = await response.text();
1076
1076
  throw new Error(`Failed to get transaction outspends: ${error}`);
@@ -1078,7 +1078,7 @@ var EsploraProvider = class {
1078
1078
  return response.json();
1079
1079
  }
1080
1080
  async getTransactions(address) {
1081
- const response = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1081
+ const response = await chunkALISWEQ5_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1082
1082
  if (!response.ok) {
1083
1083
  const error = await response.text();
1084
1084
  throw new Error(`Failed to get transactions: ${error}`);
@@ -1086,7 +1086,7 @@ var EsploraProvider = class {
1086
1086
  return response.json();
1087
1087
  }
1088
1088
  async getTxStatus(txid) {
1089
- const txresponse = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1089
+ const txresponse = await chunkALISWEQ5_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1090
1090
  if (!txresponse.ok) {
1091
1091
  throw new Error(txresponse.statusText);
1092
1092
  }
@@ -1094,7 +1094,7 @@ var EsploraProvider = class {
1094
1094
  if (!tx.status.confirmed) {
1095
1095
  return { confirmed: false };
1096
1096
  }
1097
- const response = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1097
+ const response = await chunkALISWEQ5_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1098
1098
  if (!response.ok) {
1099
1099
  throw new Error(`Failed to get transaction status: ${response.statusText}`);
1100
1100
  }
@@ -1178,7 +1178,7 @@ var EsploraProvider = class {
1178
1178
  return stopFunc;
1179
1179
  }
1180
1180
  async getChainTip() {
1181
- const tipBlocks = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/blocks`);
1181
+ const tipBlocks = await chunkALISWEQ5_cjs.baseFetch(`${this.baseUrl}/blocks`);
1182
1182
  if (!tipBlocks.ok) {
1183
1183
  throw new Error(`Failed to get chain tip: ${tipBlocks.statusText}`);
1184
1184
  }
@@ -1197,7 +1197,7 @@ var EsploraProvider = class {
1197
1197
  };
1198
1198
  }
1199
1199
  async broadcastPackage(parent, child) {
1200
- const response = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
1200
+ const response = await chunkALISWEQ5_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
1201
1201
  method: "POST",
1202
1202
  headers: {
1203
1203
  "Content-Type": "application/json"
@@ -1211,7 +1211,7 @@ var EsploraProvider = class {
1211
1211
  return response.json();
1212
1212
  }
1213
1213
  async broadcastTx(tx) {
1214
- const response = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/tx`, {
1214
+ const response = await chunkALISWEQ5_cjs.baseFetch(`${this.baseUrl}/tx`, {
1215
1215
  method: "POST",
1216
1216
  headers: {
1217
1217
  "Content-Type": "text/plain"
@@ -1282,7 +1282,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
1282
1282
  );
1283
1283
  }
1284
1284
  function buildForfeitTxWithOutput(inputs, output, txLocktime) {
1285
- const tx = new chunk6EZY43WE_cjs.Transaction({
1285
+ const tx = new chunkALISWEQ5_cjs.Transaction({
1286
1286
  version: 3,
1287
1287
  lockTime: txLocktime
1288
1288
  });
@@ -1358,7 +1358,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
1358
1358
  if (previousScriptKey.length !== 32) {
1359
1359
  throw new Error(`parent output ${childIndex} has invalid script`);
1360
1360
  }
1361
- const cosigners = chunk6EZY43WE_cjs.getArkPsbtFields(child.root, 0, chunk6EZY43WE_cjs.CosignerPublicKey);
1361
+ const cosigners = chunkALISWEQ5_cjs.getArkPsbtFields(child.root, 0, chunkALISWEQ5_cjs.CosignerPublicKey);
1362
1362
  if (cosigners.length === 0) {
1363
1363
  throw ErrMissingCosignersPublicKeys;
1364
1364
  }
@@ -1458,7 +1458,7 @@ var Extension = class _Extension {
1458
1458
  `expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
1459
1459
  );
1460
1460
  }
1461
- const reader = new chunk6EZY43WE_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
1461
+ const reader = new chunkALISWEQ5_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
1462
1462
  const packets = [];
1463
1463
  while (reader.remaining() > 0) {
1464
1464
  const packetType = reader.readByte();
@@ -1532,7 +1532,7 @@ var Extension = class _Extension {
1532
1532
  */
1533
1533
  getAssetPacket() {
1534
1534
  for (const p of this.packets) {
1535
- if (p instanceof chunk6EZY43WE_cjs.Packet) {
1535
+ if (p instanceof chunkALISWEQ5_cjs.Packet) {
1536
1536
  return p;
1537
1537
  }
1538
1538
  }
@@ -1540,8 +1540,8 @@ var Extension = class _Extension {
1540
1540
  }
1541
1541
  };
1542
1542
  function parsePacket(packetType, data) {
1543
- if (packetType === chunk6EZY43WE_cjs.Packet.PACKET_TYPE) {
1544
- return chunk6EZY43WE_cjs.Packet.fromBytes(data);
1543
+ if (packetType === chunkALISWEQ5_cjs.Packet.PACKET_TYPE) {
1544
+ return chunkALISWEQ5_cjs.Packet.fromBytes(data);
1545
1545
  }
1546
1546
  return new UnknownPacket(packetType, data);
1547
1547
  }
@@ -1599,7 +1599,7 @@ function validateBatchRecipients(commitmentTx, vtxoTreeLeaves, recipients, netwo
1599
1599
  for (const recipient of recipients) {
1600
1600
  let arkAddress;
1601
1601
  try {
1602
- arkAddress = chunkCMPJR3HS_cjs.ArkAddress.decode(recipient.address);
1602
+ arkAddress = chunkHXDZ2QTW_cjs.ArkAddress.decode(recipient.address);
1603
1603
  } catch {
1604
1604
  validateOnchainRecipient(commitmentTx, recipient, network, usedOnchainOutputs);
1605
1605
  continue;
@@ -1700,6 +1700,122 @@ function validateAssetGroupOutput(packet, outputIndex, assetId, expectedAmount)
1700
1700
  }
1701
1701
  }
1702
1702
 
1703
+ // src/wallet/activity.ts
1704
+ async function buildActivities(txs, resolvers) {
1705
+ const preparedResolvers = (await Promise.all(
1706
+ resolvers.map(async (r) => {
1707
+ try {
1708
+ await r.prepare?.();
1709
+ return r;
1710
+ } catch {
1711
+ return void 0;
1712
+ }
1713
+ })
1714
+ )).filter((r) => r !== void 0);
1715
+ const keyOf = (tx) => tx.key.arkTxid || tx.key.commitmentTxid || tx.key.boardingTxid;
1716
+ const merge = (a, b) => ({
1717
+ groupId: a.groupId,
1718
+ label: a.label ?? b.label,
1719
+ kind: a.kind ?? b.kind,
1720
+ metadata: { ...b.metadata, ...a.metadata },
1721
+ amount: a.amount ?? b.amount
1722
+ });
1723
+ const isSent = (tx) => tx.type === "SENT" /* TxSent */;
1724
+ const signedAmount = (tx, amount = tx.amount) => {
1725
+ const magnitude = Math.abs(amount);
1726
+ return isSent(tx) ? -magnitude : magnitude;
1727
+ };
1728
+ const buckets = /* @__PURE__ */ new Map();
1729
+ for (const tx of txs) {
1730
+ const perGroup = /* @__PURE__ */ new Map();
1731
+ for (const r of preparedResolvers) {
1732
+ let ms;
1733
+ try {
1734
+ ms = r.resolve(tx);
1735
+ } catch {
1736
+ ms = void 0;
1737
+ }
1738
+ for (const m of ms ?? []) {
1739
+ if (!m.groupId) continue;
1740
+ if (m.amount !== void 0 && !Number.isFinite(m.amount)) continue;
1741
+ const existing = perGroup.get(m.groupId);
1742
+ perGroup.set(m.groupId, existing ? merge(existing, m) : { ...m });
1743
+ }
1744
+ }
1745
+ if (perGroup.size === 0) {
1746
+ const id = keyOf(tx);
1747
+ const b = buckets.get(id) ?? { members: [] };
1748
+ b.members.push({ tx, amount: signedAmount(tx) });
1749
+ buckets.set(id, b);
1750
+ continue;
1751
+ }
1752
+ for (const m of perGroup.values()) {
1753
+ const b = buckets.get(m.groupId) ?? { members: [] };
1754
+ b.intent = {
1755
+ label: b.intent?.label ?? m.label,
1756
+ kind: b.intent?.kind ?? m.kind,
1757
+ metadata: { ...m.metadata, ...b.intent?.metadata }
1758
+ };
1759
+ b.members.push({ tx, amount: signedAmount(tx, m.amount ?? tx.amount) });
1760
+ buckets.set(m.groupId, b);
1761
+ }
1762
+ }
1763
+ const netAmount = (members) => {
1764
+ const sentKeys = new Set(members.filter((x) => isSent(x.tx)).map((x) => keyOf(x.tx)));
1765
+ return members.reduce((s, x) => {
1766
+ if (!isSent(x.tx) && sentKeys.has(keyOf(x.tx))) return s;
1767
+ return s + x.amount;
1768
+ }, 0);
1769
+ };
1770
+ const latest = (a) => a.txs[a.txs.length - 1].createdAt;
1771
+ return [...buckets.entries()].map(([id, b]) => {
1772
+ const members = [...b.members].sort((x, y) => x.tx.createdAt - y.tx.createdAt);
1773
+ return {
1774
+ id,
1775
+ intent: b.intent,
1776
+ txs: members.map((x) => x.tx),
1777
+ amount: netAmount(members),
1778
+ createdAt: members[0].tx.createdAt,
1779
+ settled: members.every((x) => x.tx.settled)
1780
+ };
1781
+ }).sort((a, c) => latest(c) - latest(a));
1782
+ }
1783
+ var ActivityRegistry = class {
1784
+ resolvers = /* @__PURE__ */ new Map();
1785
+ /** Add a resolver, or override an existing one with the same id (kept in place). */
1786
+ use(resolver) {
1787
+ this.resolvers.set(resolver.id, resolver);
1788
+ }
1789
+ /** Remove a resolver (built-in or custom) by id. */
1790
+ remove(id) {
1791
+ this.resolvers.delete(id);
1792
+ }
1793
+ /** The registered resolver ids, in registration order. */
1794
+ list() {
1795
+ return [...this.resolvers.keys()];
1796
+ }
1797
+ /** All registered resolvers, in registration (priority) order. */
1798
+ all() {
1799
+ return [...this.resolvers.values()];
1800
+ }
1801
+ };
1802
+ function boardingResolver() {
1803
+ return {
1804
+ id: "boarding",
1805
+ resolve(tx) {
1806
+ if (!tx.key.boardingTxid) return void 0;
1807
+ return [
1808
+ { groupId: `boarding:${tx.key.boardingTxid}`, label: "Deposit", kind: "boarding" }
1809
+ ];
1810
+ }
1811
+ };
1812
+ }
1813
+ function createDefaultActivityRegistry() {
1814
+ const registry = new ActivityRegistry();
1815
+ registry.use(boardingResolver());
1816
+ return registry;
1817
+ }
1818
+
1703
1819
  // src/wallet/index.ts
1704
1820
  var TxType = /* @__PURE__ */ ((TxType2) => {
1705
1821
  TxType2["TxSent"] = "SENT";
@@ -1732,7 +1848,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
1732
1848
  const existing = inputsByAssetId.get(asset.assetId);
1733
1849
  inputsByAssetId.set(asset.assetId, [
1734
1850
  ...existing ?? [],
1735
- chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount)
1851
+ chunkALISWEQ5_cjs.AssetInput.create(inputIndex, asset.amount)
1736
1852
  ]);
1737
1853
  }
1738
1854
  }
@@ -1744,7 +1860,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
1744
1860
  const existing = outputsByAssetId.get(asset.assetId);
1745
1861
  outputsByAssetId.set(asset.assetId, [
1746
1862
  ...existing ?? [],
1747
- chunk6EZY43WE_cjs.AssetOutput.create(outputIndex, asset.amount)
1863
+ chunkALISWEQ5_cjs.AssetOutput.create(outputIndex, asset.amount)
1748
1864
  ]);
1749
1865
  }
1750
1866
  }
@@ -1755,7 +1871,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
1755
1871
  const existing = outputsByAssetId.get(asset.assetId);
1756
1872
  outputsByAssetId.set(asset.assetId, [
1757
1873
  ...existing ?? [],
1758
- chunk6EZY43WE_cjs.AssetOutput.create(outputIndex, asset.amount)
1874
+ chunkALISWEQ5_cjs.AssetOutput.create(outputIndex, asset.amount)
1759
1875
  ]);
1760
1876
  }
1761
1877
  }
@@ -1764,11 +1880,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
1764
1880
  for (const assetIdStr of allAssetIds) {
1765
1881
  const inputs = inputsByAssetId.get(assetIdStr);
1766
1882
  const outputs = outputsByAssetId.get(assetIdStr);
1767
- const assetId = chunk6EZY43WE_cjs.AssetId.fromString(assetIdStr);
1768
- const group = chunk6EZY43WE_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
1883
+ const assetId = chunkALISWEQ5_cjs.AssetId.fromString(assetIdStr);
1884
+ const group = chunkALISWEQ5_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
1769
1885
  groups.push(group);
1770
1886
  }
1771
- return chunk6EZY43WE_cjs.Packet.create(groups);
1887
+ return chunkALISWEQ5_cjs.Packet.create(groups);
1772
1888
  }
1773
1889
  function selectCoinsWithAsset(coins, assetId, requiredAmount) {
1774
1890
  const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
@@ -1873,8 +1989,8 @@ function buildOffchainTx(inputs, outputs, serverUnrollScript) {
1873
1989
  function buildVirtualTx(inputs, outputs) {
1874
1990
  let lockTime = 0n;
1875
1991
  for (const input of inputs) {
1876
- const tapscript = chunkCMPJR3HS_cjs.decodeTapscript(chunkCMPJR3HS_cjs.scriptFromTapLeafScript(input.tapLeafScript));
1877
- if (chunkCMPJR3HS_cjs.CLTVMultisigTapscript.is(tapscript)) {
1992
+ const tapscript = chunkHXDZ2QTW_cjs.decodeTapscript(chunkHXDZ2QTW_cjs.scriptFromTapLeafScript(input.tapLeafScript));
1993
+ if (chunkHXDZ2QTW_cjs.CLTVMultisigTapscript.is(tapscript)) {
1878
1994
  if (lockTime !== 0n) {
1879
1995
  if (isSeconds(lockTime) !== isSeconds(tapscript.params.absoluteTimelock)) {
1880
1996
  throw new Error("cannot mix seconds and blocks locktime");
@@ -1885,7 +2001,7 @@ function buildVirtualTx(inputs, outputs) {
1885
2001
  }
1886
2002
  }
1887
2003
  }
1888
- const tx = new chunk6EZY43WE_cjs.Transaction({
2004
+ const tx = new chunkALISWEQ5_cjs.Transaction({
1889
2005
  version: 3,
1890
2006
  lockTime: Number(lockTime)
1891
2007
  });
@@ -1895,12 +2011,12 @@ function buildVirtualTx(inputs, outputs) {
1895
2011
  index: input.vout,
1896
2012
  sequence: lockTime ? btcSigner.DEFAULT_SEQUENCE - 1 : void 0,
1897
2013
  witnessUtxo: {
1898
- script: chunkCMPJR3HS_cjs.VtxoScript.decode(input.tapTree).pkScript,
2014
+ script: chunkHXDZ2QTW_cjs.VtxoScript.decode(input.tapTree).pkScript,
1899
2015
  amount: BigInt(input.value)
1900
2016
  },
1901
2017
  tapLeafScript: [input.tapLeafScript]
1902
2018
  });
1903
- chunk6EZY43WE_cjs.setArkPsbtField(tx, i, chunk6EZY43WE_cjs.VtxoTaprootTree, input.tapTree);
2019
+ chunkALISWEQ5_cjs.setArkPsbtField(tx, i, chunkALISWEQ5_cjs.VtxoTaprootTree, input.tapTree);
1904
2020
  }
1905
2021
  for (const output of outputs) {
1906
2022
  tx.addOutput(output);
@@ -1909,8 +2025,8 @@ function buildVirtualTx(inputs, outputs) {
1909
2025
  return tx;
1910
2026
  }
1911
2027
  function buildCheckpointTx(vtxo, serverUnrollScript) {
1912
- const collaborativeClosure = chunkCMPJR3HS_cjs.decodeTapscript(chunkCMPJR3HS_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
1913
- const checkpointVtxoScript = new chunkCMPJR3HS_cjs.VtxoScript([
2028
+ const collaborativeClosure = chunkHXDZ2QTW_cjs.decodeTapscript(chunkHXDZ2QTW_cjs.scriptFromTapLeafScript(vtxo.tapLeafScript));
2029
+ const checkpointVtxoScript = new chunkHXDZ2QTW_cjs.VtxoScript([
1914
2030
  serverUnrollScript.script,
1915
2031
  collaborativeClosure.script
1916
2032
  ]);
@@ -2054,7 +2170,7 @@ function combineTapscriptSigs(signedTx, originalTx) {
2054
2170
  }
2055
2171
  function isValidArkAddress(address) {
2056
2172
  try {
2057
- chunkCMPJR3HS_cjs.ArkAddress.decode(address);
2173
+ chunkHXDZ2QTW_cjs.ArkAddress.decode(address);
2058
2174
  return true;
2059
2175
  } catch (e) {
2060
2176
  return false;
@@ -2333,7 +2449,7 @@ function extendCoinWithTapscript(boardingTapscript, utxo) {
2333
2449
  };
2334
2450
  }
2335
2451
  function deriveContractTapscripts(contract) {
2336
- const handler = chunkGUTKJMSF_cjs.contractHandlers.get(contract.type);
2452
+ const handler = chunk32YKLQPS_cjs.contractHandlers.get(contract.type);
2337
2453
  if (!handler) {
2338
2454
  throw new Error(`No handler for contract type '${contract.type}'`);
2339
2455
  }
@@ -2403,7 +2519,7 @@ function validateRecipients(recipients, dustAmount) {
2403
2519
  for (const recipient of recipients) {
2404
2520
  let address;
2405
2521
  try {
2406
- address = chunkCMPJR3HS_cjs.ArkAddress.decode(recipient.address);
2522
+ address = chunkHXDZ2QTW_cjs.ArkAddress.decode(recipient.address);
2407
2523
  } catch (e) {
2408
2524
  throw new Error(`Invalid Arkade address: ${recipient.address}`);
2409
2525
  }
@@ -3008,11 +3124,11 @@ var VtxoManager = class _VtxoManager {
3008
3124
  `Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
3009
3125
  );
3010
3126
  }
3011
- const tx = new chunk6EZY43WE_cjs.Transaction();
3127
+ const tx = new chunkALISWEQ5_cjs.Transaction();
3012
3128
  for (const utxo of expiredUtxos) {
3013
- const utxoScript = chunkCMPJR3HS_cjs.VtxoScript.decode(utxo.tapTree);
3129
+ const utxoScript = chunkHXDZ2QTW_cjs.VtxoScript.decode(utxo.tapTree);
3014
3130
  const utxoExitLeaf = utxoScript.leaves.find(
3015
- (leaf) => chunkCMPJR3HS_cjs.CSVMultisigTapscript.isScriptValid(chunkCMPJR3HS_cjs.scriptFromTapLeafScript(leaf)) === true
3131
+ (leaf) => chunkHXDZ2QTW_cjs.CSVMultisigTapscript.isScriptValid(chunkHXDZ2QTW_cjs.scriptFromTapLeafScript(leaf)) === true
3016
3132
  );
3017
3133
  if (!utxoExitLeaf) {
3018
3134
  throw new Error(
@@ -3027,7 +3143,7 @@ var VtxoManager = class _VtxoManager {
3027
3143
  amount: BigInt(utxo.value)
3028
3144
  },
3029
3145
  tapLeafScript: [utxoExitLeaf],
3030
- sequence: chunkCMPJR3HS_cjs.getSequence(utxoExitLeaf)
3146
+ sequence: chunkHXDZ2QTW_cjs.getSequence(utxoExitLeaf)
3031
3147
  });
3032
3148
  }
3033
3149
  tx.addOutputAddress(boardingAddress, outputAmount, this.getNetwork());
@@ -3515,7 +3631,7 @@ var VtxoManager = class _VtxoManager {
3515
3631
  /** Decodes the boarding tapscript exit path to extract the CSV timelock. */
3516
3632
  getBoardingTimelock() {
3517
3633
  const wallet = this.getSweepWallet();
3518
- const exitScript = chunkCMPJR3HS_cjs.CSVMultisigTapscript.decode(
3634
+ const exitScript = chunkHXDZ2QTW_cjs.CSVMultisigTapscript.decode(
3519
3635
  base.hex.decode(wallet.boardingTapscript.exitScript)
3520
3636
  );
3521
3637
  return exitScript.params.timelock;
@@ -3646,7 +3762,7 @@ var VtxoManager = class _VtxoManager {
3646
3762
  * or doesn't carry the metadata.
3647
3763
  */
3648
3764
  extractSpentOutpoint(error) {
3649
- const ark = chunk6EZY43WE_cjs.maybeArkError(error);
3765
+ const ark = chunkALISWEQ5_cjs.maybeArkError(error);
3650
3766
  if (!ark || ark.name !== "VTXO_ALREADY_SPENT") return void 0;
3651
3767
  const raw = ark.metadata?.vtxo_outpoint;
3652
3768
  if (typeof raw !== "string") return void 0;
@@ -3861,7 +3977,7 @@ var VtxoManager = class _VtxoManager {
3861
3977
  const arkAddress = await this.wallet.getAddress();
3862
3978
  const outputFee = estimator.evalOffchainOutput({
3863
3979
  amount: totalAmount,
3864
- script: base.hex.encode(chunkCMPJR3HS_cjs.ArkAddress.decode(arkAddress).pkScript)
3980
+ script: base.hex.encode(chunkHXDZ2QTW_cjs.ArkAddress.decode(arkAddress).pkScript)
3865
3981
  });
3866
3982
  totalAmount -= BigInt(outputFee.satoshis);
3867
3983
  if (totalAmount < dustAmount) return;
@@ -3941,7 +4057,7 @@ var ArkNote = class _ArkNote {
3941
4057
  this.value = value;
3942
4058
  this.HRP = HRP;
3943
4059
  const preimageHash = utils_js.sha256(this.preimage);
3944
- this.vtxoScript = new chunkCMPJR3HS_cjs.VtxoScript([noteTapscript(preimageHash)]);
4060
+ this.vtxoScript = new chunkHXDZ2QTW_cjs.VtxoScript([noteTapscript(preimageHash)]);
3945
4061
  const leaf = this.vtxoScript.leaves[0];
3946
4062
  this.txid = base.hex.encode(new Uint8Array(preimageHash).reverse());
3947
4063
  this.tapTree = this.vtxoScript.encode();
@@ -4557,7 +4673,7 @@ var AssetManager = class extends ReadonlyAssetManager {
4557
4673
  const virtualCoins = await this.wallet.getVtxos({
4558
4674
  withRecoverable: false
4559
4675
  });
4560
- const controlAssetRef = params.controlAssetId ? chunk6EZY43WE_cjs.AssetRef.fromId(chunk6EZY43WE_cjs.AssetId.fromString(params.controlAssetId)) : null;
4676
+ const controlAssetRef = params.controlAssetId ? chunkALISWEQ5_cjs.AssetRef.fromId(chunkALISWEQ5_cjs.AssetId.fromString(params.controlAssetId)) : null;
4561
4677
  const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
4562
4678
  let totalBtcSelected = 0n;
4563
4679
  const assetChanges = /* @__PURE__ */ new Map();
@@ -4570,8 +4686,8 @@ var AssetManager = class extends ReadonlyAssetManager {
4570
4686
  }
4571
4687
  }
4572
4688
  const groups = [];
4573
- const issuedAssetOutput = chunk6EZY43WE_cjs.AssetOutput.create(0, params.amount);
4574
- const issuedAssetGroup = chunk6EZY43WE_cjs.AssetGroup.create(
4689
+ const issuedAssetOutput = chunkALISWEQ5_cjs.AssetOutput.create(0, params.amount);
4690
+ const issuedAssetGroup = chunkALISWEQ5_cjs.AssetGroup.create(
4575
4691
  null,
4576
4692
  controlAssetRef,
4577
4693
  [],
@@ -4586,28 +4702,28 @@ var AssetManager = class extends ReadonlyAssetManager {
4586
4702
  for (const [inputIndex, assets] of assetInputs) {
4587
4703
  for (const asset of assets) {
4588
4704
  if (asset.assetId !== assetId) continue;
4589
- changeInputs.push(chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount));
4705
+ changeInputs.push(chunkALISWEQ5_cjs.AssetInput.create(inputIndex, asset.amount));
4590
4706
  }
4591
4707
  }
4592
4708
  groups.push(
4593
- chunk6EZY43WE_cjs.AssetGroup.create(
4594
- chunk6EZY43WE_cjs.AssetId.fromString(assetId),
4709
+ chunkALISWEQ5_cjs.AssetGroup.create(
4710
+ chunkALISWEQ5_cjs.AssetId.fromString(assetId),
4595
4711
  null,
4596
4712
  changeInputs,
4597
- [chunk6EZY43WE_cjs.AssetOutput.create(0, amount)],
4713
+ [chunkALISWEQ5_cjs.AssetOutput.create(0, amount)],
4598
4714
  []
4599
4715
  )
4600
4716
  );
4601
4717
  }
4602
4718
  }
4603
4719
  const address = await this.wallet.getAddress();
4604
- const outputAddress = chunkCMPJR3HS_cjs.ArkAddress.decode(address);
4720
+ const outputAddress = chunkHXDZ2QTW_cjs.ArkAddress.decode(address);
4605
4721
  const outputs = [
4606
4722
  {
4607
4723
  script: outputAddress.pkScript,
4608
4724
  amount: BigInt(totalBtcSelected)
4609
4725
  },
4610
- Extension.create([chunk6EZY43WE_cjs.Packet.create(groups)]).txOut()
4726
+ Extension.create([chunkALISWEQ5_cjs.Packet.create(groups)]).txOut()
4611
4727
  ];
4612
4728
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
4613
4729
  coinSelection.inputs,
@@ -4615,7 +4731,7 @@ var AssetManager = class extends ReadonlyAssetManager {
4615
4731
  );
4616
4732
  return {
4617
4733
  arkTxId: arkTxid,
4618
- assetId: chunk6EZY43WE_cjs.AssetId.create(arkTxid, 0).toString()
4734
+ assetId: chunkALISWEQ5_cjs.AssetId.create(arkTxid, 0).toString()
4619
4735
  };
4620
4736
  }
4621
4737
  /**
@@ -4687,16 +4803,16 @@ var AssetManager = class extends ReadonlyAssetManager {
4687
4803
  for (const [inputIndex, assets] of assetInputs) {
4688
4804
  for (const asset of assets) {
4689
4805
  if (asset.assetId !== params.assetId) continue;
4690
- reissueInputs.push(chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount));
4806
+ reissueInputs.push(chunkALISWEQ5_cjs.AssetInput.create(inputIndex, asset.amount));
4691
4807
  }
4692
4808
  }
4693
4809
  const totalAssetAmount = assetToReissueAmount + params.amount;
4694
- const reissueAssetIdObj = chunk6EZY43WE_cjs.AssetId.fromString(params.assetId);
4695
- const reissueAssetGroup = chunk6EZY43WE_cjs.AssetGroup.create(
4810
+ const reissueAssetIdObj = chunkALISWEQ5_cjs.AssetId.fromString(params.assetId);
4811
+ const reissueAssetGroup = chunkALISWEQ5_cjs.AssetGroup.create(
4696
4812
  reissueAssetIdObj,
4697
4813
  null,
4698
4814
  reissueInputs,
4699
- [chunk6EZY43WE_cjs.AssetOutput.create(0, totalAssetAmount)],
4815
+ [chunkALISWEQ5_cjs.AssetOutput.create(0, totalAssetAmount)],
4700
4816
  []
4701
4817
  );
4702
4818
  const groups = [reissueAssetGroup];
@@ -4705,27 +4821,27 @@ var AssetManager = class extends ReadonlyAssetManager {
4705
4821
  for (const [inputIndex, assets] of assetInputs) {
4706
4822
  for (const asset of assets) {
4707
4823
  if (asset.assetId !== assetId) continue;
4708
- changeInputs.push(chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount));
4824
+ changeInputs.push(chunkALISWEQ5_cjs.AssetInput.create(inputIndex, asset.amount));
4709
4825
  }
4710
4826
  }
4711
4827
  groups.push(
4712
- chunk6EZY43WE_cjs.AssetGroup.create(
4713
- chunk6EZY43WE_cjs.AssetId.fromString(assetId),
4828
+ chunkALISWEQ5_cjs.AssetGroup.create(
4829
+ chunkALISWEQ5_cjs.AssetId.fromString(assetId),
4714
4830
  null,
4715
4831
  changeInputs,
4716
- [chunk6EZY43WE_cjs.AssetOutput.create(0, amount)],
4832
+ [chunkALISWEQ5_cjs.AssetOutput.create(0, amount)],
4717
4833
  []
4718
4834
  )
4719
4835
  );
4720
4836
  }
4721
4837
  const address = await this.wallet.getAddress();
4722
- const outputAddress = chunkCMPJR3HS_cjs.ArkAddress.decode(address);
4838
+ const outputAddress = chunkHXDZ2QTW_cjs.ArkAddress.decode(address);
4723
4839
  const outputs = [
4724
4840
  {
4725
4841
  script: outputAddress.pkScript,
4726
4842
  amount: BigInt(totalBtcSelected)
4727
4843
  },
4728
- Extension.create([chunk6EZY43WE_cjs.Packet.create(groups)]).txOut()
4844
+ Extension.create([chunkALISWEQ5_cjs.Packet.create(groups)]).txOut()
4729
4845
  ];
4730
4846
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
4731
4847
  return arkTxid;
@@ -4792,27 +4908,27 @@ var AssetManager = class extends ReadonlyAssetManager {
4792
4908
  for (const [inputIndex, assets] of assetInputs) {
4793
4909
  for (const asset of assets) {
4794
4910
  if (asset.assetId !== assetId) continue;
4795
- changeInputs.push(chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount));
4911
+ changeInputs.push(chunkALISWEQ5_cjs.AssetInput.create(inputIndex, asset.amount));
4796
4912
  }
4797
4913
  }
4798
4914
  groups.push(
4799
- chunk6EZY43WE_cjs.AssetGroup.create(
4800
- chunk6EZY43WE_cjs.AssetId.fromString(assetId),
4915
+ chunkALISWEQ5_cjs.AssetGroup.create(
4916
+ chunkALISWEQ5_cjs.AssetId.fromString(assetId),
4801
4917
  null,
4802
4918
  changeInputs,
4803
- amount > 0n ? [chunk6EZY43WE_cjs.AssetOutput.create(0, amount)] : [],
4919
+ amount > 0n ? [chunkALISWEQ5_cjs.AssetOutput.create(0, amount)] : [],
4804
4920
  []
4805
4921
  )
4806
4922
  );
4807
4923
  }
4808
4924
  const address = await this.wallet.getAddress();
4809
- const outputAddress = chunkCMPJR3HS_cjs.ArkAddress.decode(address);
4925
+ const outputAddress = chunkHXDZ2QTW_cjs.ArkAddress.decode(address);
4810
4926
  const outputs = [
4811
4927
  {
4812
4928
  script: outputAddress.pkScript,
4813
4929
  amount: BigInt(totalBtcSelected)
4814
4930
  },
4815
- Extension.create([chunk6EZY43WE_cjs.Packet.create(groups)]).txOut()
4931
+ Extension.create([chunkALISWEQ5_cjs.Packet.create(groups)]).txOut()
4816
4932
  ];
4817
4933
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
4818
4934
  return arkTxid;
@@ -4837,7 +4953,7 @@ function castMetadata(metadata) {
4837
4953
  } else {
4838
4954
  throw new Error("Invalid metadata value type");
4839
4955
  }
4840
- md.push(chunk6EZY43WE_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
4956
+ md.push(chunkALISWEQ5_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
4841
4957
  }
4842
4958
  return md;
4843
4959
  }
@@ -4855,7 +4971,7 @@ var DelegateManagerImpl = class {
4855
4971
  if (vtxos.length === 0) {
4856
4972
  return { delegated: [], failed: [] };
4857
4973
  }
4858
- const destinationScript = chunkCMPJR3HS_cjs.ArkAddress.decode(destination).pkScript;
4974
+ const destinationScript = chunkHXDZ2QTW_cjs.ArkAddress.decode(destination).pkScript;
4859
4975
  const arkInfo = await this.arkInfoProvider.getInfo();
4860
4976
  const delegateInfo = await this.delegateProvider.getDelegateInfo();
4861
4977
  const eligible = vtxos.filter(
@@ -5003,7 +5119,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
5003
5119
  const delegateFee = BigInt(Number(fee));
5004
5120
  if (delegateFee > 0n) {
5005
5121
  outputs.push({
5006
- script: chunkCMPJR3HS_cjs.ArkAddress.decode(delegateAddress).pkScript,
5122
+ script: chunkHXDZ2QTW_cjs.ArkAddress.decode(delegateAddress).pkScript,
5007
5123
  amount: delegateFee
5008
5124
  });
5009
5125
  }
@@ -5036,7 +5152,7 @@ async function delegate(identity, delegateProvider, arkInfo, delegateInfo, vtxos
5036
5152
  destinationScript
5037
5153
  );
5038
5154
  const forfeitOutputScript = btcSigner.OutScript.encode(
5039
- btcSigner.Address(chunkCMPJR3HS_cjs.getNetwork(network)).decode(forfeitAddress)
5155
+ btcSigner.Address(chunkHXDZ2QTW_cjs.getNetwork(network)).decode(forfeitAddress)
5040
5156
  );
5041
5157
  const forfeits = await Promise.all(
5042
5158
  vtxos.filter((v) => !isRecoverable(v)).map(async (coin) => {
@@ -5064,7 +5180,7 @@ async function makeDelegateForfeitTx(input, connectorAmount, delegatePubkey, for
5064
5180
  index: input.vout,
5065
5181
  witnessUtxo: {
5066
5182
  amount: BigInt(input.value),
5067
- script: chunkCMPJR3HS_cjs.VtxoScript.decode(input.tapTree).pkScript
5183
+ script: chunkHXDZ2QTW_cjs.VtxoScript.decode(input.tapTree).pkScript
5068
5184
  },
5069
5185
  sighashType: btcSigner.SigHash.ALL_ANYONECANPAY,
5070
5186
  tapLeafScript: [delegateTapLeaf]
@@ -5122,7 +5238,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
5122
5238
  expire_at: 0,
5123
5239
  cosigners_public_keys: cosignerPubKeys
5124
5240
  };
5125
- const proof = chunk6EZY43WE_cjs.Intent.create(message, coins, outputs);
5241
+ const proof = chunkALISWEQ5_cjs.Intent.create(message, coins, outputs);
5126
5242
  const signedProof = await identity.sign(proof);
5127
5243
  return {
5128
5244
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -5140,10 +5256,10 @@ function getDayTimestamp(timestamp) {
5140
5256
  function findDelegateTapLeaf(vtxo, delegatePubkey) {
5141
5257
  if (!vtxo.tapTree) return void 0;
5142
5258
  const pk = delegatePubkey.length === 66 ? delegatePubkey.slice(2) : delegatePubkey;
5143
- const vtxoScript = chunkCMPJR3HS_cjs.VtxoScript.decode(vtxo.tapTree);
5259
+ const vtxoScript = chunkHXDZ2QTW_cjs.VtxoScript.decode(vtxo.tapTree);
5144
5260
  return vtxoScript.leaves.find((tapLeaf) => {
5145
- const arkTapscript = chunkCMPJR3HS_cjs.decodeTapscript(chunkCMPJR3HS_cjs.scriptFromTapLeafScript(tapLeaf));
5146
- if (!chunkCMPJR3HS_cjs.MultisigTapscript.is(arkTapscript)) return false;
5261
+ const arkTapscript = chunkHXDZ2QTW_cjs.decodeTapscript(chunkHXDZ2QTW_cjs.scriptFromTapLeafScript(tapLeaf));
5262
+ if (!chunkHXDZ2QTW_cjs.MultisigTapscript.is(arkTapscript)) return false;
5147
5263
  return arkTapscript.params.pubkeys.map(base.hex.encode).includes(pk);
5148
5264
  });
5149
5265
  }
@@ -5347,7 +5463,7 @@ var InMemoryContractRepository = class {
5347
5463
  }
5348
5464
  };
5349
5465
  function scriptFromArkAddress(address) {
5350
- return base.hex.encode(chunkCMPJR3HS_cjs.ArkAddress.decode(address).pkScript);
5466
+ return base.hex.encode(chunkHXDZ2QTW_cjs.ArkAddress.decode(address).pkScript);
5351
5467
  }
5352
5468
 
5353
5469
  // src/repositories/indexedDB/schema.ts
@@ -5627,7 +5743,13 @@ async function openDatabase(dbName, dbVersion, initDatabase2) {
5627
5743
  reject(request.error);
5628
5744
  };
5629
5745
  request.onsuccess = () => {
5630
- resolve(request.result);
5746
+ const db = request.result;
5747
+ db.onversionchange = () => {
5748
+ db.close();
5749
+ dbCache.delete(dbName);
5750
+ refCounts.delete(dbName);
5751
+ };
5752
+ resolve(db);
5631
5753
  };
5632
5754
  request.onupgradeneeded = (event) => {
5633
5755
  const db = request.result;
@@ -6865,7 +6987,7 @@ var ContractWatcher = class {
6865
6987
  this.connectionState = "connected";
6866
6988
  this.reconnectAttempts = 0;
6867
6989
  this.listenLoop().catch((e) => {
6868
- if (chunk6EZY43WE_cjs.isEventSourceError(e)) {
6990
+ if (chunkALISWEQ5_cjs.isEventSourceError(e)) {
6869
6991
  console.debug("ContractWatcher subscription disconnected; reconnecting");
6870
6992
  } else {
6871
6993
  console.error(e);
@@ -7309,7 +7431,7 @@ var ContractManager = class _ContractManager {
7309
7431
  * `persisted` is `true`.
7310
7432
  */
7311
7433
  async upsertContract(params) {
7312
- const handler = chunkGUTKJMSF_cjs.contractHandlers.get(params.type);
7434
+ const handler = chunk32YKLQPS_cjs.contractHandlers.get(params.type);
7313
7435
  if (!handler) {
7314
7436
  throw new Error(`No handler registered for contract type '${params.type}'`);
7315
7437
  }
@@ -7392,7 +7514,7 @@ var ContractManager = class _ContractManager {
7392
7514
  `scanContracts: batchSize must be a positive integer (got ${String(opts.batchSize)})`
7393
7515
  );
7394
7516
  }
7395
- const registered = chunkGUTKJMSF_cjs.contractHandlers.getRegisteredTypes().map((t) => chunkGUTKJMSF_cjs.contractHandlers.get(t)).filter(isDiscoverable);
7517
+ const registered = chunk32YKLQPS_cjs.contractHandlers.getRegisteredTypes().map((t) => chunk32YKLQPS_cjs.contractHandlers.get(t)).filter(isDiscoverable);
7396
7518
  const discoverables = [
7397
7519
  ...registered.filter((h) => h.type === "boarding"),
7398
7520
  ...registered.filter((h) => h.type !== "boarding")
@@ -7576,7 +7698,7 @@ var ContractManager = class _ContractManager {
7576
7698
  const { contractScript, collaborative = true, walletPubKey, vtxo } = options;
7577
7699
  const [contract] = await this.getContracts({ script: contractScript });
7578
7700
  if (!contract) return [];
7579
- const handler = chunkGUTKJMSF_cjs.contractHandlers.get(contract.type);
7701
+ const handler = chunk32YKLQPS_cjs.contractHandlers.get(contract.type);
7580
7702
  if (!handler) return [];
7581
7703
  const script = handler.createScript(contract.params);
7582
7704
  const context = {
@@ -7596,7 +7718,7 @@ var ContractManager = class _ContractManager {
7596
7718
  const { contractScript, collaborative = true, walletPubKey } = options;
7597
7719
  const [contract] = await this.getContracts({ script: contractScript });
7598
7720
  if (!contract) return [];
7599
- const handler = chunkGUTKJMSF_cjs.contractHandlers.get(contract.type);
7721
+ const handler = chunk32YKLQPS_cjs.contractHandlers.get(contract.type);
7600
7722
  if (!handler) return [];
7601
7723
  const script = handler.createScript(contract.params);
7602
7724
  const context = {
@@ -7830,7 +7952,7 @@ var ContractManager = class _ContractManager {
7830
7952
  }
7831
7953
  return result;
7832
7954
  }
7833
- async fetchContractVtxosBulk(contracts, pageSize = chunkGUTKJMSF_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
7955
+ async fetchContractVtxosBulk(contracts, pageSize = chunk32YKLQPS_cjs.DEFAULT_PAGE_SIZE, syncWindow) {
7834
7956
  if (contracts.length === 0) {
7835
7957
  return /* @__PURE__ */ new Map();
7836
7958
  }
@@ -8006,7 +8128,7 @@ var HDDescriptorProvider = class _HDDescriptorProvider {
8006
8128
  */
8007
8129
  materializeDescriptorAt(index) {
8008
8130
  const descriptor = this.identity.descriptor;
8009
- const network = chunkGUTKJMSF_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
8131
+ const network = chunk32YKLQPS_cjs.isMainnetDescriptor(descriptor) ? descriptorsScure.networks.bitcoin : descriptorsScure.networks.testnet;
8010
8132
  const expansion = descriptorsScure.expand({ descriptor, network, index });
8011
8133
  const keyInfo = expansion.expansionMap?.["@0"];
8012
8134
  if (!keyInfo?.keyExpression) {
@@ -8149,7 +8271,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
8149
8271
  const provider = await resolveDescriptorProvider(config, setup.walletRepository);
8150
8272
  if (!provider) return void 0;
8151
8273
  const allowSilentFallback = (config.walletMode ?? "auto") === "auto";
8152
- const expectedContractType = setup.offchainTapscript instanceof chunkGUTKJMSF_cjs.DelegateVtxo.Script ? "delegate" : "default";
8274
+ const expectedContractType = setup.offchainTapscript instanceof chunk32YKLQPS_cjs.DelegateVtxo.Script ? "delegate" : "default";
8153
8275
  const factoryOpts = {
8154
8276
  walletRepository: setup.walletRepository,
8155
8277
  contractRepository: setup.contractRepository,
@@ -8332,7 +8454,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
8332
8454
  const newAddress = newTapscript.address(wallet.network.hrp, wallet.arkServerPublicKey).encode();
8333
8455
  const manager = await wallet.getContractManager();
8334
8456
  const csvTimelock = newTapscript.options.csvTimelock;
8335
- const csvTimelockStr = chunkCMPJR3HS_cjs.timelockToSequence(csvTimelock).toString();
8457
+ const csvTimelockStr = chunkHXDZ2QTW_cjs.timelockToSequence(csvTimelock).toString();
8336
8458
  const serverPubKeyHex = base.hex.encode(newTapscript.options.serverPubKey);
8337
8459
  const baseParams = {
8338
8460
  script: newScript,
@@ -8346,11 +8468,11 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
8346
8468
  // produce unsigned PSBTs that the server rejects with
8347
8469
  // `INVALID_PSBT_INPUT (5): missing tapscript spend sig`.
8348
8470
  metadata: {
8349
- source: chunkGUTKJMSF_cjs.WALLET_RECEIVE_SOURCE,
8471
+ source: chunk32YKLQPS_cjs.WALLET_RECEIVE_SOURCE,
8350
8472
  signingDescriptor: descriptor
8351
8473
  }
8352
8474
  };
8353
- if (newTapscript instanceof chunkGUTKJMSF_cjs.DelegateVtxo.Script) {
8475
+ if (newTapscript instanceof chunk32YKLQPS_cjs.DelegateVtxo.Script) {
8354
8476
  await manager.createContract({
8355
8477
  ...baseParams,
8356
8478
  type: "delegate",
@@ -8382,7 +8504,7 @@ var WalletReceiveRotator = class _WalletReceiveRotator {
8382
8504
  };
8383
8505
  function deriveLeafPubkey(descriptor) {
8384
8506
  try {
8385
- return chunkGUTKJMSF_cjs.deriveDescriptorLeafPubKey(descriptor);
8507
+ return chunk32YKLQPS_cjs.deriveDescriptorLeafPubKey(descriptor);
8386
8508
  } catch (e) {
8387
8509
  throw new NonRangeableDescriptorError(
8388
8510
  "Cannot derive leaf pubkey: descriptor is not a materialized, parsable tr(...) shape.",
@@ -8391,10 +8513,10 @@ function deriveLeafPubkey(descriptor) {
8391
8513
  }
8392
8514
  }
8393
8515
  function rebuildTapscript(current, pubKey) {
8394
- if (current instanceof chunkGUTKJMSF_cjs.DelegateVtxo.Script) {
8395
- return new chunkGUTKJMSF_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
8516
+ if (current instanceof chunk32YKLQPS_cjs.DelegateVtxo.Script) {
8517
+ return new chunk32YKLQPS_cjs.DelegateVtxo.Script({ ...current.options, pubKey });
8396
8518
  }
8397
- return new chunkGUTKJMSF_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
8519
+ return new chunk32YKLQPS_cjs.DefaultVtxo.Script({ ...current.options, pubKey });
8398
8520
  }
8399
8521
  async function pickActiveReceive(contractRepository, serverPubKey, expectedType) {
8400
8522
  const candidates = await contractRepository.getContracts({
@@ -8403,7 +8525,7 @@ async function pickActiveReceive(contractRepository, serverPubKey, expectedType)
8403
8525
  });
8404
8526
  const serverPubKeyHex = base.hex.encode(serverPubKey);
8405
8527
  const matching = candidates.filter(
8406
- (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkGUTKJMSF_cjs.WALLET_RECEIVE_SOURCE
8528
+ (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk32YKLQPS_cjs.WALLET_RECEIVE_SOURCE
8407
8529
  ).sort((a, b) => {
8408
8530
  if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
8409
8531
  return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
@@ -8576,12 +8698,12 @@ var InputSignerRouter = class {
8576
8698
  };
8577
8699
 
8578
8700
  // src/wallet/wallet.ts
8579
- var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunkCMPJR3HS_cjs.DEFAULT_ARKADE_SERVER_URL;
8701
+ var getArkadeServerUrl = ({ arkServerUrl }) => arkServerUrl || chunkHXDZ2QTW_cjs.DEFAULT_ARKADE_SERVER_URL;
8580
8702
  function intentProofJobs(coins) {
8581
8703
  if (coins.length === 0) return [];
8582
8704
  const coinJobs = coins.map((coin, i) => ({
8583
8705
  index: i + 1,
8584
- lookupScript: chunkCMPJR3HS_cjs.VtxoScript.decode(coin.tapTree).pkScript
8706
+ lookupScript: chunkHXDZ2QTW_cjs.VtxoScript.decode(coin.tapTree).pkScript
8585
8707
  }));
8586
8708
  return [{ index: 0, lookupScript: coinJobs[0].lookupScript }, ...coinJobs];
8587
8709
  }
@@ -8605,7 +8727,7 @@ function dedupeTimelocks(timelocks) {
8605
8727
  const seen = /* @__PURE__ */ new Set();
8606
8728
  const deduped = [];
8607
8729
  for (const timelock of timelocks) {
8608
- const sequence = chunkCMPJR3HS_cjs.timelockToSequence(timelock).toString();
8730
+ const sequence = chunkHXDZ2QTW_cjs.timelockToSequence(timelock).toString();
8609
8731
  if (seen.has(sequence)) continue;
8610
8732
  seen.add(sequence);
8611
8733
  deduped.push(timelock);
@@ -8622,7 +8744,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
8622
8744
  state: "active"
8623
8745
  });
8624
8746
  const newest = candidates.filter(
8625
- (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunkGUTKJMSF_cjs.WALLET_RECEIVE_SOURCE
8747
+ (c) => c.params.serverPubKey === serverPubKeyHex && c.metadata?.source === chunk32YKLQPS_cjs.WALLET_RECEIVE_SOURCE
8626
8748
  ).sort((a, b) => {
8627
8749
  if (b.createdAt !== a.createdAt) return b.createdAt - a.createdAt;
8628
8750
  return signingDescriptorIndex(b.metadata?.signingDescriptor) - signingDescriptorIndex(a.metadata?.signingDescriptor);
@@ -8630,7 +8752,7 @@ async function resolveBoardingBootTapscript(contractRepository, serverPubKey, ba
8630
8752
  if (!newest?.params.pubKey) return baseline;
8631
8753
  try {
8632
8754
  const pubKey = base.hex.decode(newest.params.pubKey);
8633
- return new chunkGUTKJMSF_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
8755
+ return new chunk32YKLQPS_cjs.DefaultVtxo.Script({ ...baseline.options, pubKey });
8634
8756
  } catch (e) {
8635
8757
  console.warn("Skipping malformed boarding contract at boot", newest.script, e);
8636
8758
  return baseline;
@@ -8677,6 +8799,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
8677
8799
  // already on their way out. The set is in-memory only: a process crash
8678
8800
  // clears it, and a stale entry only hides a VTXO (never spends one).
8679
8801
  _pendingSpendOutpoints = /* @__PURE__ */ new Set();
8802
+ /** Activity resolvers consumed by {@link getActivityHistory}. */
8803
+ activity = createDefaultActivityRegistry();
8680
8804
  get assetManager() {
8681
8805
  return this._assetManager;
8682
8806
  }
@@ -8821,7 +8945,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
8821
8945
  */
8822
8946
  static async setupWalletConfig(config, pubKey) {
8823
8947
  const arkadeServerUrl = getArkadeServerUrl(config);
8824
- const arkProvider = config.arkProvider || new chunk6EZY43WE_cjs.RestArkProvider(arkadeServerUrl);
8948
+ const arkProvider = config.arkProvider || new chunkALISWEQ5_cjs.RestArkProvider(arkadeServerUrl);
8825
8949
  let indexerProvider = config.indexerProvider;
8826
8950
  if (!indexerProvider) {
8827
8951
  let indexerUrl = config.indexerUrl;
@@ -8838,10 +8962,10 @@ var ReadonlyWallet = class _ReadonlyWallet {
8838
8962
  indexerUrl = arkadeServerUrl;
8839
8963
  }
8840
8964
  }
8841
- indexerProvider = new chunk6EZY43WE_cjs.RestIndexerProvider(indexerUrl);
8965
+ indexerProvider = new chunkALISWEQ5_cjs.RestIndexerProvider(indexerUrl);
8842
8966
  }
8843
8967
  const info = await arkProvider.getInfo();
8844
- const network = chunkCMPJR3HS_cjs.getNetwork(info.network);
8968
+ const network = chunkHXDZ2QTW_cjs.getNetwork(info.network);
8845
8969
  if ("descriptor" in config.identity) {
8846
8970
  const descriptor = config.identity.descriptor;
8847
8971
  const identityIsMainnet = !descriptor.includes("tpub");
@@ -8882,17 +9006,17 @@ var ReadonlyWallet = class _ReadonlyWallet {
8882
9006
  type: info.boardingExitDelay < 512n ? "blocks" : "seconds"
8883
9007
  };
8884
9008
  const serverPubKey = base.hex.decode(info.signerPubkey).slice(1);
8885
- const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => base.hex.decode(info2.pubkey).slice(1)) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => base.hex.decode(info2.pubkey).slice(1)) : void 0;
9009
+ const delegatePubKey = config.delegateProvider ? await config.delegateProvider.getDelegateInfo().then((info2) => base.hex.decode(info2.pubkey).slice(1)).catch(() => void 0) : config.delegatorProvider ? await config.delegatorProvider.getDelegateInfo().then((info2) => base.hex.decode(info2.pubkey).slice(1)).catch(() => void 0) : void 0;
8886
9010
  const offchainOptions = {
8887
9011
  pubKey,
8888
9012
  serverPubKey,
8889
9013
  csvTimelock: exitTimelock
8890
9014
  };
8891
- const offchainTapscript = !delegatePubKey ? new chunkGUTKJMSF_cjs.DefaultVtxo.Script(offchainOptions) : new chunkGUTKJMSF_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
8892
- const boardingTapscript = chunkGUTKJMSF_cjs.BoardingContractHandler.createScript({
9015
+ const offchainTapscript = !delegatePubKey ? new chunk32YKLQPS_cjs.DefaultVtxo.Script(offchainOptions) : new chunk32YKLQPS_cjs.DelegateVtxo.Script({ ...offchainOptions, delegatePubKey });
9016
+ const boardingTapscript = chunk32YKLQPS_cjs.BoardingContractHandler.createScript({
8893
9017
  pubKey: base.hex.encode(pubKey),
8894
9018
  serverPubKey: base.hex.encode(serverPubKey),
8895
- csvTimelock: chunkCMPJR3HS_cjs.timelockToSequence(boardingTimelock).toString()
9019
+ csvTimelock: chunkHXDZ2QTW_cjs.timelockToSequence(boardingTimelock).toString()
8896
9020
  });
8897
9021
  const walletRepository = config.storage?.walletRepository ?? new IndexedDBWalletRepository();
8898
9022
  const contractRepository = config.storage?.contractRepository ?? new IndexedDBContractRepository();
@@ -9073,6 +9197,13 @@ var ReadonlyWallet = class _ReadonlyWallet {
9073
9197
  const getTxCreatedAt = (txid) => this.indexerProvider.getVtxos({ outpoints: [{ txid, vout: 0 }] }).then((res) => res.vtxos[0]?.createdAt.getTime());
9074
9198
  return buildTransactionHistory(allVtxos, boardingTxs, commitmentsToIgnore, getTxCreatedAt);
9075
9199
  }
9200
+ /**
9201
+ * Wallet history grouped by registered activity resolvers. With no resolver match,
9202
+ * rows bucket by transaction key so send/change pairs stay together.
9203
+ */
9204
+ async getActivityHistory() {
9205
+ return buildActivities(await this.getTransactionHistory(), this.activity.all());
9206
+ }
9076
9207
  /**
9077
9208
  * Clear the global VTXO sync cursor, forcing a full re-bootstrap on next sync.
9078
9209
  * Useful for recovery after indexer reprocessing or debugging.
@@ -9080,6 +9211,17 @@ var ReadonlyWallet = class _ReadonlyWallet {
9080
9211
  async clearSyncCursor() {
9081
9212
  await clearSyncCursor(this.walletRepository);
9082
9213
  }
9214
+ /**
9215
+ * Wipe all locally persisted wallet data (VTXOs, UTXOs, history, sync
9216
+ * cursor, contracts). Create a fresh wallet instance afterward.
9217
+ */
9218
+ async clear() {
9219
+ try {
9220
+ await this.dispose();
9221
+ } finally {
9222
+ await Promise.all([this.walletRepository.clear(), this.contractRepository.clear()]);
9223
+ }
9224
+ }
9083
9225
  /**
9084
9226
  * The on-chain (P2TR) addresses of every boarding tapscript this wallet
9085
9227
  * uses — the current address plus any historical rotated boarding
@@ -9192,9 +9334,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
9192
9334
  async getBoardingTapscripts(allowedSigners) {
9193
9335
  const byScript = /* @__PURE__ */ new Map();
9194
9336
  const add = (s) => byScript.set(base.hex.encode(s.pkScript), s);
9195
- const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunkGUTKJMSF_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
9337
+ const boardingCsv = this.boardingTapscript.options.csvTimelock ?? chunk32YKLQPS_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
9196
9338
  add(
9197
- new chunkGUTKJMSF_cjs.DefaultVtxo.Script({
9339
+ new chunk32YKLQPS_cjs.DefaultVtxo.Script({
9198
9340
  pubKey: await this.identity.xOnlyPublicKey(),
9199
9341
  serverPubKey: this.boardingTapscript.options.serverPubKey,
9200
9342
  csvTimelock: boardingCsv
@@ -9209,7 +9351,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
9209
9351
  for (const c of boardingContracts) {
9210
9352
  if (!allowed.has(toXOnlySignerHex(c.params.serverPubKey))) continue;
9211
9353
  try {
9212
- add(chunkGUTKJMSF_cjs.BoardingContractHandler.createScript(c.params));
9354
+ add(chunk32YKLQPS_cjs.BoardingContractHandler.createScript(c.params));
9213
9355
  } catch (e) {
9214
9356
  console.warn("Skipping malformed boarding contract", c.script, e);
9215
9357
  }
@@ -9247,7 +9389,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
9247
9389
  // Per-row CSV delay decoded from THIS tapscript's exit leaf —
9248
9390
  // not the wallet's current boarding timelock, which a signer
9249
9391
  // rotation may have changed.
9250
- csvTimelock: chunkCMPJR3HS_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
9392
+ csvTimelock: chunkHXDZ2QTW_cjs.CSVMultisigTapscript.decode(base.hex.decode(tapscript.exitScript)).params.timelock,
9251
9393
  coins: utxos
9252
9394
  });
9253
9395
  }
@@ -9413,7 +9555,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
9413
9555
  });
9414
9556
  for (const contract of contracts) {
9415
9557
  if (map.has(contract.script)) continue;
9416
- const handler = chunkGUTKJMSF_cjs.contractHandlers.get(contract.type);
9558
+ const handler = chunk32YKLQPS_cjs.contractHandlers.get(contract.type);
9417
9559
  if (handler) {
9418
9560
  const script = handler.createScript(contract.params);
9419
9561
  map.set(contract.script, script);
@@ -9478,7 +9620,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
9478
9620
  watcherConfig: this.watcherConfig
9479
9621
  });
9480
9622
  const baselinePubkey = await this.identity.xOnlyPublicKey();
9481
- const delegatePubKey = this.offchainTapscript instanceof chunkGUTKJMSF_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
9623
+ const delegatePubKey = this.offchainTapscript instanceof chunk32YKLQPS_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
9482
9624
  const baselineSigners = [
9483
9625
  this.offchainTapscript.options.serverPubKey,
9484
9626
  ...[...this._deprecatedSigners.keys()].map((h) => base.hex.decode(h))
@@ -9486,8 +9628,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
9486
9628
  const seenBaselineScripts = /* @__PURE__ */ new Set();
9487
9629
  for (const serverPubKey of baselineSigners) {
9488
9630
  for (const csvTimelock of this.walletContractTimelocks) {
9489
- const csvTimelockStr = chunkCMPJR3HS_cjs.timelockToSequence(csvTimelock).toString();
9490
- const defaultScript = new chunkGUTKJMSF_cjs.DefaultVtxo.Script({
9631
+ const csvTimelockStr = chunkHXDZ2QTW_cjs.timelockToSequence(csvTimelock).toString();
9632
+ const defaultScript = new chunk32YKLQPS_cjs.DefaultVtxo.Script({
9491
9633
  pubKey: baselinePubkey,
9492
9634
  serverPubKey,
9493
9635
  csvTimelock
@@ -9508,7 +9650,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
9508
9650
  });
9509
9651
  }
9510
9652
  if (delegatePubKey) {
9511
- const delegateScript = new chunkGUTKJMSF_cjs.DelegateVtxo.Script({
9653
+ const delegateScript = new chunk32YKLQPS_cjs.DelegateVtxo.Script({
9512
9654
  pubKey: baselinePubkey,
9513
9655
  serverPubKey,
9514
9656
  delegatePubKey,
@@ -9532,9 +9674,9 @@ var ReadonlyWallet = class _ReadonlyWallet {
9532
9674
  }
9533
9675
  }
9534
9676
  }
9535
- const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunkGUTKJMSF_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
9677
+ const boardingCsvTimelock = this.boardingTapscript.options.csvTimelock ?? chunk32YKLQPS_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
9536
9678
  for (const serverPubKey of baselineSigners) {
9537
- const baselineBoarding = new chunkGUTKJMSF_cjs.DefaultVtxo.Script({
9679
+ const baselineBoarding = new chunk32YKLQPS_cjs.DefaultVtxo.Script({
9538
9680
  pubKey: baselinePubkey,
9539
9681
  serverPubKey,
9540
9682
  csvTimelock: boardingCsvTimelock
@@ -9547,7 +9689,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
9547
9689
  params: {
9548
9690
  pubKey: base.hex.encode(baselineBoarding.options.pubKey),
9549
9691
  serverPubKey: base.hex.encode(serverPubKey),
9550
- csvTimelock: chunkCMPJR3HS_cjs.timelockToSequence(boardingCsvTimelock).toString()
9692
+ csvTimelock: chunkHXDZ2QTW_cjs.timelockToSequence(boardingCsvTimelock).toString()
9551
9693
  },
9552
9694
  script: boardingScriptHex,
9553
9695
  address: baselineBoarding.address(this.network.hrp, serverPubKey).encode(),
@@ -9767,25 +9909,25 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
9767
9909
  return this.getBoardingAddress();
9768
9910
  }
9769
9911
  const descriptor = await provider.getNextSigningDescriptor();
9770
- const pubKey = chunkGUTKJMSF_cjs.deriveDescriptorLeafPubKey(descriptor);
9771
- const newBoarding = new chunkGUTKJMSF_cjs.DefaultVtxo.Script({
9912
+ const pubKey = chunk32YKLQPS_cjs.deriveDescriptorLeafPubKey(descriptor);
9913
+ const newBoarding = new chunk32YKLQPS_cjs.DefaultVtxo.Script({
9772
9914
  ...this._boardingTapscript.options,
9773
9915
  pubKey
9774
9916
  });
9775
- const csvTimelock = newBoarding.options.csvTimelock ?? chunkGUTKJMSF_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
9917
+ const csvTimelock = newBoarding.options.csvTimelock ?? chunk32YKLQPS_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
9776
9918
  const manager = await this.getContractManager();
9777
9919
  await manager.createContract({
9778
9920
  type: "boarding",
9779
9921
  params: {
9780
9922
  pubKey: base.hex.encode(pubKey),
9781
9923
  serverPubKey: base.hex.encode(newBoarding.options.serverPubKey),
9782
- csvTimelock: chunkCMPJR3HS_cjs.timelockToSequence(csvTimelock).toString()
9924
+ csvTimelock: chunkHXDZ2QTW_cjs.timelockToSequence(csvTimelock).toString()
9783
9925
  },
9784
9926
  script: base.hex.encode(newBoarding.pkScript),
9785
9927
  address: newBoarding.address(this.network.hrp, this.arkServerPublicKey).encode(),
9786
9928
  state: "active",
9787
9929
  metadata: {
9788
- source: chunkGUTKJMSF_cjs.WALLET_RECEIVE_SOURCE,
9930
+ source: chunk32YKLQPS_cjs.WALLET_RECEIVE_SOURCE,
9789
9931
  signingDescriptor: descriptor
9790
9932
  }
9791
9933
  });
@@ -9824,7 +9966,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
9824
9966
  const xonly = toXOnlyPubKey(newServerPubKey);
9825
9967
  let newServerUnrollScript;
9826
9968
  try {
9827
- newServerUnrollScript = chunkCMPJR3HS_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
9969
+ newServerUnrollScript = chunkHXDZ2QTW_cjs.CSVMultisigTapscript.decode(base.hex.decode(checkpointTapscript));
9828
9970
  } catch (e) {
9829
9971
  throw new Error("Invalid checkpointTapscript from server");
9830
9972
  }
@@ -9852,21 +9994,21 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
9852
9994
  const [currentBoardingRow] = await manager.getContracts({
9853
9995
  script: currentBoardingScript
9854
9996
  });
9855
- const newOffchain = this.offchainTapscript instanceof chunkGUTKJMSF_cjs.DelegateVtxo.Script ? new chunkGUTKJMSF_cjs.DelegateVtxo.Script({
9997
+ const newOffchain = this.offchainTapscript instanceof chunk32YKLQPS_cjs.DelegateVtxo.Script ? new chunk32YKLQPS_cjs.DelegateVtxo.Script({
9856
9998
  ...this.offchainTapscript.options,
9857
9999
  serverPubKey: xonly
9858
- }) : new chunkGUTKJMSF_cjs.DefaultVtxo.Script({
10000
+ }) : new chunk32YKLQPS_cjs.DefaultVtxo.Script({
9859
10001
  ...this.offchainTapscript.options,
9860
10002
  serverPubKey: xonly
9861
10003
  });
9862
- const newBoarding = new chunkGUTKJMSF_cjs.DefaultVtxo.Script({
10004
+ const newBoarding = new chunk32YKLQPS_cjs.DefaultVtxo.Script({
9863
10005
  ...this._boardingTapscript.options,
9864
10006
  serverPubKey: xonly
9865
10007
  });
9866
- const offchainCsv = chunkCMPJR3HS_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
10008
+ const offchainCsv = chunkHXDZ2QTW_cjs.timelockToSequence(newOffchain.options.csvTimelock).toString();
9867
10009
  const newOffchainScript = base.hex.encode(newOffchain.pkScript);
9868
10010
  const newOffchainAddress = newOffchain.address(this.network.hrp, xonly).encode();
9869
- if (newOffchain instanceof chunkGUTKJMSF_cjs.DelegateVtxo.Script) {
10011
+ if (newOffchain instanceof chunk32YKLQPS_cjs.DelegateVtxo.Script) {
9870
10012
  await manager.createContract({
9871
10013
  type: "delegate",
9872
10014
  params: {
@@ -9894,13 +10036,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
9894
10036
  metadata: currentOffchainRow?.metadata
9895
10037
  });
9896
10038
  }
9897
- const boardingCsv = newBoarding.options.csvTimelock ?? chunkGUTKJMSF_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
10039
+ const boardingCsv = newBoarding.options.csvTimelock ?? chunk32YKLQPS_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK;
9898
10040
  await manager.createContract({
9899
10041
  type: "boarding",
9900
10042
  params: {
9901
10043
  pubKey: base.hex.encode(newBoarding.options.pubKey),
9902
10044
  serverPubKey: base.hex.encode(xonly),
9903
- csvTimelock: chunkCMPJR3HS_cjs.timelockToSequence(boardingCsv).toString()
10045
+ csvTimelock: chunkHXDZ2QTW_cjs.timelockToSequence(boardingCsv).toString()
9904
10046
  },
9905
10047
  script: base.hex.encode(newBoarding.pkScript),
9906
10048
  address: newBoarding.address(this.network.hrp, xonly).encode(),
@@ -9995,7 +10137,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
9995
10137
  const hd = provider instanceof HDDescriptorProvider;
9996
10138
  const staticDescriptor = hd ? void 0 : `tr(${base.hex.encode(await this.identity.xOnlyPublicKey())})`;
9997
10139
  const materialize = (index) => hd ? provider.materializeDescriptorAt(index) : staticDescriptor;
9998
- const delegatePubKey = this.offchainTapscript instanceof chunkGUTKJMSF_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
10140
+ const delegatePubKey = this.offchainTapscript instanceof chunk32YKLQPS_cjs.DelegateVtxo.Script ? this.offchainTapscript.options.delegatePubKey : void 0;
9999
10141
  const arkInfo = await this.arkProvider.getInfo();
10000
10142
  const currentSignerPubKey = toXOnlyPubKey(base.hex.decode(arkInfo.signerPubkey));
10001
10143
  const deprecatedSignerPubKeys = arkInfo.deprecatedSigners.map(
@@ -10014,7 +10156,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10014
10156
  csvTimelocks: this.walletContractTimelocks,
10015
10157
  // Boarding-exit CSV so the boarding handler can build its
10016
10158
  // candidate script (distinct from the unilateral-exit matrix).
10017
- boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunkGUTKJMSF_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
10159
+ boardingTimelock: this.boardingTapscript.options.csvTimelock ?? chunk32YKLQPS_cjs.DefaultVtxo.Script.DEFAULT_TIMELOCK,
10018
10160
  delegatePubKey
10019
10161
  };
10020
10162
  const result = await manager.scanContracts({
@@ -10118,7 +10260,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10118
10260
  let serverUnrollScript;
10119
10261
  try {
10120
10262
  const raw = base.hex.decode(setup.info.checkpointTapscript);
10121
- serverUnrollScript = chunkCMPJR3HS_cjs.CSVMultisigTapscript.decode(raw);
10263
+ serverUnrollScript = chunkHXDZ2QTW_cjs.CSVMultisigTapscript.decode(raw);
10122
10264
  } catch (e) {
10123
10265
  throw new Error("Invalid checkpointTapscript from server");
10124
10266
  }
@@ -10244,7 +10386,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10244
10386
  inputs: params.selectedVtxos,
10245
10387
  changeAmount: BigInt(changeAmount)
10246
10388
  };
10247
- const outputAddress = chunkCMPJR3HS_cjs.ArkAddress.decode(params.address);
10389
+ const outputAddress = chunkHXDZ2QTW_cjs.ArkAddress.decode(params.address);
10248
10390
  const outputScript = BigInt(params.amount) < this.dustAmount ? outputAddress.subdustPkScript : outputAddress.pkScript;
10249
10391
  const outputs = [
10250
10392
  {
@@ -10297,13 +10439,13 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10297
10439
  }
10298
10440
  }
10299
10441
  const offchainAddress = await this.getAddress();
10300
- const offchainPkScript = chunkCMPJR3HS_cjs.ArkAddress.decode(offchainAddress).pkScript;
10442
+ const offchainPkScript = chunkHXDZ2QTW_cjs.ArkAddress.decode(offchainAddress).pkScript;
10301
10443
  const offchainOutputScript = base.hex.encode(offchainPkScript);
10302
10444
  if (!params) {
10303
10445
  const { fees, vtxoMaxAmount } = await this.arkProvider.getInfo();
10304
10446
  const estimator = new Estimator(fees.intentFee);
10305
10447
  let amount = 0;
10306
- const exitScript = chunkCMPJR3HS_cjs.CSVMultisigTapscript.decode(
10448
+ const exitScript = chunkHXDZ2QTW_cjs.CSVMultisigTapscript.decode(
10307
10449
  base.hex.decode(this.boardingTapscript.exitScript)
10308
10450
  );
10309
10451
  const boardingTimelock = exitScript.params.timelock;
@@ -10383,7 +10525,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10383
10525
  for (const [index, output] of params.outputs.entries()) {
10384
10526
  let script;
10385
10527
  try {
10386
- const addr = chunkCMPJR3HS_cjs.ArkAddress.decode(output.address);
10528
+ const addr = chunkHXDZ2QTW_cjs.ArkAddress.decode(output.address);
10387
10529
  script = addr.pkScript;
10388
10530
  hasOffchainOutputs = true;
10389
10531
  } catch {
@@ -10558,6 +10700,9 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10558
10700
  settlementPsbt = await this._signerRouter.sign(settlementPsbt, [
10559
10701
  { index: i, lookupScript: script }
10560
10702
  ]);
10703
+ if (!settlementPsbt.getInput(i).tapScriptSig?.length) {
10704
+ throw new Error(await this.unsignableBoardingInputError(input, script));
10705
+ }
10561
10706
  hasBoardingUtxos = true;
10562
10707
  break;
10563
10708
  }
@@ -10591,7 +10736,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10591
10736
  index: input.vout,
10592
10737
  witnessUtxo: {
10593
10738
  amount: BigInt(input.value),
10594
- script: chunkCMPJR3HS_cjs.VtxoScript.decode(input.tapTree).pkScript
10739
+ script: chunkHXDZ2QTW_cjs.VtxoScript.decode(input.tapTree).pkScript
10595
10740
  },
10596
10741
  sighashType: btcSigner.SigHash.DEFAULT,
10597
10742
  tapLeafScript: [input.forfeitTapLeafScript]
@@ -10610,7 +10755,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10610
10755
  forfeitTx = await this._signerRouter.sign(forfeitTx, [
10611
10756
  {
10612
10757
  index: 0,
10613
- lookupScript: chunkCMPJR3HS_cjs.VtxoScript.decode(input.tapTree).pkScript
10758
+ lookupScript: chunkHXDZ2QTW_cjs.VtxoScript.decode(input.tapTree).pkScript
10614
10759
  }
10615
10760
  ]);
10616
10761
  signedForfeits.push(base.base64.encode(forfeitTx.toPSBT()));
@@ -10622,6 +10767,24 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10622
10767
  );
10623
10768
  }
10624
10769
  }
10770
+ // Best-effort: every enrichment is guarded so a secondary failure can't
10771
+ // mask the original signing error.
10772
+ async unsignableBoardingInputError(input, script) {
10773
+ const scriptHex = base.hex.encode(script);
10774
+ let unresolvedAddress = "<undecodable>";
10775
+ try {
10776
+ unresolvedAddress = btcSigner.Address(this.network).encode(btcSigner.OutScript.decode(script));
10777
+ } catch {
10778
+ }
10779
+ let recognized = "<unavailable>";
10780
+ try {
10781
+ const current = await this.getBoardingAddress();
10782
+ const all = await this.getBoardingAddresses();
10783
+ recognized = `current=${current}; all=[${all.join(", ")}]`;
10784
+ } catch {
10785
+ }
10786
+ return `failed to sign boarding input ${input.txid}:${input.vout}: signer did not recognize script ${scriptHex} (${unresolvedAddress}); would have reached arkd unsigned and been rejected as "not a wallet script". Recognized boarding addresses: ${recognized}. Likely a rotated boarding address with a missing contract row.`;
10787
+ }
10625
10788
  /**
10626
10789
  * Create a batch event handler for settlement flows.
10627
10790
  *
@@ -10650,7 +10813,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10650
10813
  if (skip) {
10651
10814
  return { skip };
10652
10815
  }
10653
- const sweepTapscript = chunkCMPJR3HS_cjs.CSVMultisigTapscript.encode({
10816
+ const sweepTapscript = chunkHXDZ2QTW_cjs.CSVMultisigTapscript.encode({
10654
10817
  timelock: {
10655
10818
  value: event.batchExpiry,
10656
10819
  type: event.batchExpiry >= 512n ? "seconds" : "blocks"
@@ -10754,7 +10917,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10754
10917
  try {
10755
10918
  return await this.arkProvider.registerIntent(intent);
10756
10919
  } catch (error) {
10757
- if (error instanceof chunk6EZY43WE_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
10920
+ if (error instanceof chunkALISWEQ5_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
10758
10921
  const deleteIntent = await this.makeDeleteIntentSignature(inputs);
10759
10922
  await this.arkProvider.deleteIntent(deleteIntent);
10760
10923
  return this.arkProvider.registerIntent(intent);
@@ -10770,7 +10933,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10770
10933
  expire_at: 0,
10771
10934
  cosigners_public_keys: cosignerPubKeys
10772
10935
  };
10773
- const proof = chunk6EZY43WE_cjs.Intent.create(message, coins, outputs);
10936
+ const proof = chunkALISWEQ5_cjs.Intent.create(message, coins, outputs);
10774
10937
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
10775
10938
  return {
10776
10939
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -10782,7 +10945,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10782
10945
  type: "delete",
10783
10946
  expire_at: 0
10784
10947
  };
10785
- const proof = chunk6EZY43WE_cjs.Intent.create(message, coins, []);
10948
+ const proof = chunkALISWEQ5_cjs.Intent.create(message, coins, []);
10786
10949
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
10787
10950
  return {
10788
10951
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -10794,7 +10957,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10794
10957
  type: "get-pending-tx",
10795
10958
  expire_at: 0
10796
10959
  };
10797
- const proof = chunk6EZY43WE_cjs.Intent.create(message, coins, []);
10960
+ const proof = chunkALISWEQ5_cjs.Intent.create(message, coins, []);
10798
10961
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
10799
10962
  return {
10800
10963
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -11210,7 +11373,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
11210
11373
  );
11211
11374
  const arkTxJobs = inputs.map((input, index) => ({
11212
11375
  index,
11213
- lookupScript: chunkCMPJR3HS_cjs.VtxoScript.decode(input.tapTree).pkScript
11376
+ lookupScript: chunkHXDZ2QTW_cjs.VtxoScript.decode(input.tapTree).pkScript
11214
11377
  }));
11215
11378
  const checkpointJobs = offchainTx.checkpoints.map(
11216
11379
  (c) => this.inputSigningJobsFromWitnessUtxos(c)
@@ -11443,7 +11606,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
11443
11606
  } else {
11444
11607
  let sourceAddress;
11445
11608
  try {
11446
- sourceAddress = chunkCMPJR3HS_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
11609
+ sourceAddress = chunkHXDZ2QTW_cjs.VtxoScript.decode(input.tapTree).onchainAddress(
11447
11610
  this.network
11448
11611
  );
11449
11612
  } catch {
@@ -11752,7 +11915,7 @@ var MessageBus = class {
11752
11915
  this.initialized = true;
11753
11916
  }
11754
11917
  async buildServices(config) {
11755
- const arkProvider = new chunk6EZY43WE_cjs.RestArkProvider(config.arkServer.url);
11918
+ const arkProvider = new chunkALISWEQ5_cjs.RestArkProvider(config.arkServer.url);
11756
11919
  const storage = {
11757
11920
  walletRepository: this.walletRepository,
11758
11921
  contractRepository: this.contractRepository
@@ -12134,7 +12297,7 @@ var Ramps = class {
12134
12297
  }
12135
12298
  amount = amount ?? totalAmount;
12136
12299
  const offchainAddress = await this.wallet.getAddress();
12137
- const offchainAddr = chunkCMPJR3HS_cjs.ArkAddress.decode(offchainAddress);
12300
+ const offchainAddr = chunkHXDZ2QTW_cjs.ArkAddress.decode(offchainAddress);
12138
12301
  const offchainScript = base.hex.encode(offchainAddr.pkScript);
12139
12302
  const outputFee = estimator.evalOffchainOutput({
12140
12303
  amount,
@@ -12232,7 +12395,7 @@ var Ramps = class {
12232
12395
  let destinationScript;
12233
12396
  for (const networkName of networkNames) {
12234
12397
  try {
12235
- const network = chunkCMPJR3HS_cjs.networks[networkName];
12398
+ const network = chunkHXDZ2QTW_cjs.networks[networkName];
12236
12399
  const addr = btcSigner.Address(network).decode(destinationAddress);
12237
12400
  destinationScript = btcSigner.OutScript.encode(addr);
12238
12401
  break;
@@ -12909,7 +13072,7 @@ var WalletMessageHandler = class {
12909
13072
  // Wallet methods
12910
13073
  async handleInitWallet({ payload }) {
12911
13074
  const { arkServerUrl } = payload;
12912
- this.indexerProvider = new chunk6EZY43WE_cjs.RestIndexerProvider(arkServerUrl);
13075
+ this.indexerProvider = new chunkALISWEQ5_cjs.RestIndexerProvider(arkServerUrl);
12913
13076
  await this.onWalletInitialized();
12914
13077
  }
12915
13078
  async handleGetBalance() {
@@ -13210,26 +13373,19 @@ var WalletMessageHandler = class {
13210
13373
  });
13211
13374
  return filteredVtxos;
13212
13375
  }
13376
+ /** Tear down handler subscriptions, then delegate the full wipe to the wallet. */
13213
13377
  async clear() {
13214
- if (!this.readonlyWallet) return;
13215
- if (this.incomingFundsSubscription) this.incomingFundsSubscription();
13378
+ const wallet = this.wallet ?? this.readonlyWallet;
13379
+ if (!wallet) return;
13380
+ if (this.incomingFundsSubscription) {
13381
+ this.incomingFundsSubscription();
13382
+ this.incomingFundsSubscription = void 0;
13383
+ }
13216
13384
  if (this.contractEventsSubscription) {
13217
13385
  this.contractEventsSubscription();
13218
13386
  this.contractEventsSubscription = void 0;
13219
13387
  }
13220
- try {
13221
- if (this.wallet) {
13222
- await this.wallet.dispose();
13223
- } else {
13224
- await this.readonlyWallet.dispose();
13225
- }
13226
- } catch (_) {
13227
- }
13228
- try {
13229
- await this.walletRepository?.clear();
13230
- } catch (_) {
13231
- console.warn("Failed to clear vtxos from wallet repository");
13232
- }
13388
+ await wallet.clear();
13233
13389
  this.wallet = void 0;
13234
13390
  this.readonlyWallet = void 0;
13235
13391
  this.arkProvider = void 0;
@@ -13520,6 +13676,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
13520
13676
  walletRepository;
13521
13677
  contractRepository;
13522
13678
  identity;
13679
+ activity = createDefaultActivityRegistry();
13523
13680
  _readonlyAssetManager;
13524
13681
  initConfig = null;
13525
13682
  initWalletPayload = null;
@@ -13878,19 +14035,13 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
13878
14035
  );
13879
14036
  }
13880
14037
  }
13881
- /** Clear cached wallet state from both the page and service worker storage. */
14038
+ /** This tells the service worker to wipe all locally persisted wallet data. */
13882
14039
  async clear() {
13883
14040
  const message = {
13884
14041
  id: getRandomId(),
13885
14042
  tag: this.messageTag,
13886
14043
  type: "CLEAR"
13887
14044
  };
13888
- try {
13889
- const address = await this.getAddress();
13890
- await this.walletRepository.deleteVtxos(address);
13891
- } catch (_) {
13892
- console.warn("Failed to clear vtxos from wallet repository");
13893
- }
13894
14045
  await this.sendMessage(message);
13895
14046
  }
13896
14047
  async getAddress() {
@@ -13963,6 +14114,9 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
13963
14114
  throw new Error(`Failed to get status: ${error}`);
13964
14115
  }
13965
14116
  }
14117
+ async getActivityHistory() {
14118
+ return buildActivities(await this.getTransactionHistory(), this.activity.all());
14119
+ }
13966
14120
  async getTransactionHistory() {
13967
14121
  const message = {
13968
14122
  id: getRandomId(),
@@ -14614,12 +14768,12 @@ var OnchainWallet = class _OnchainWallet {
14614
14768
  * @returns Configured onchain wallet
14615
14769
  * @throws Error if the configured identity cannot produce a valid x-only public key
14616
14770
  */
14617
- static async create(identity, networkName = chunkCMPJR3HS_cjs.DEFAULT_NETWORK_NAME, provider) {
14771
+ static async create(identity, networkName = chunkHXDZ2QTW_cjs.DEFAULT_NETWORK_NAME, provider) {
14618
14772
  const pubkey = await identity.xOnlyPublicKey();
14619
14773
  if (!pubkey) {
14620
14774
  throw new Error("Invalid configured public key");
14621
14775
  }
14622
- const network = chunkCMPJR3HS_cjs.getNetwork(networkName);
14776
+ const network = chunkHXDZ2QTW_cjs.getNetwork(networkName);
14623
14777
  const onchainProvider = provider || new EsploraProvider(ESPLORA_URL[networkName]);
14624
14778
  const onchainP2TR = btcSigner.p2tr(pubkey, void 0, network);
14625
14779
  return new _OnchainWallet(identity, network, onchainP2TR, onchainProvider);
@@ -14725,7 +14879,7 @@ var OnchainWallet = class _OnchainWallet {
14725
14879
  if (!inputs) {
14726
14880
  throw new Error("Fee estimation failed");
14727
14881
  }
14728
- let tx = new chunk6EZY43WE_cjs.Transaction();
14882
+ let tx = new chunkALISWEQ5_cjs.Transaction();
14729
14883
  for (const input of inputs) {
14730
14884
  tx.addInput({
14731
14885
  txid: input.txid,
@@ -14756,7 +14910,7 @@ var OnchainWallet = class _OnchainWallet {
14756
14910
  */
14757
14911
  async bumpP2A(parent) {
14758
14912
  const parentVsize = parent.vsize;
14759
- let child = new chunk6EZY43WE_cjs.Transaction({
14913
+ let child = new chunkALISWEQ5_cjs.Transaction({
14760
14914
  version: 3,
14761
14915
  allowLegacyWitnessUtxo: true
14762
14916
  });
@@ -15522,7 +15676,7 @@ exports.BIP322 = void 0;
15522
15676
  async function sign2(message, identity, network) {
15523
15677
  const xOnlyPubKey = await identity.xOnlyPublicKey();
15524
15678
  const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
15525
- const toSpend = chunk6EZY43WE_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
15679
+ const toSpend = chunkALISWEQ5_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
15526
15680
  const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
15527
15681
  const signed = await identity.sign(toSign, [0]);
15528
15682
  signed.finalizeIdx(0);
@@ -15580,7 +15734,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
15580
15734
  if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
15581
15735
  return false;
15582
15736
  }
15583
- const toSpend = chunk6EZY43WE_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
15737
+ const toSpend = chunkALISWEQ5_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
15584
15738
  const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
15585
15739
  const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
15586
15740
  const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
@@ -15601,7 +15755,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
15601
15755
  }
15602
15756
  const sighashType = sigWithHash[sigWithHash.length - 1];
15603
15757
  const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
15604
- const toSpend = chunk6EZY43WE_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
15758
+ const toSpend = chunkALISWEQ5_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
15605
15759
  const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
15606
15760
  const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
15607
15761
  const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
@@ -15654,7 +15808,7 @@ function encodeCompactSize(n) {
15654
15808
  return buf;
15655
15809
  }
15656
15810
  function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
15657
- const tx = new chunk6EZY43WE_cjs.Transaction({ version: 0 });
15811
+ const tx = new chunkALISWEQ5_cjs.Transaction({ version: 0 });
15658
15812
  tx.addInput({
15659
15813
  txid: toSpend.id,
15660
15814
  index: 0,
@@ -15668,12 +15822,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
15668
15822
  });
15669
15823
  tx.addOutput({
15670
15824
  amount: 0n,
15671
- script: chunk6EZY43WE_cjs.OP_RETURN_EMPTY_PKSCRIPT
15825
+ script: chunkALISWEQ5_cjs.OP_RETURN_EMPTY_PKSCRIPT
15672
15826
  });
15673
15827
  return tx;
15674
15828
  }
15675
15829
  function craftBIP322ToSignSimple(toSpend, pkScript) {
15676
- const tx = new chunk6EZY43WE_cjs.Transaction({ version: 0 });
15830
+ const tx = new chunkALISWEQ5_cjs.Transaction({ version: 0 });
15677
15831
  tx.addInput({
15678
15832
  txid: toSpend.id,
15679
15833
  index: 0,
@@ -15685,7 +15839,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
15685
15839
  });
15686
15840
  tx.addOutput({
15687
15841
  amount: 0n,
15688
- script: chunk6EZY43WE_cjs.OP_RETURN_EMPTY_PKSCRIPT
15842
+ script: chunkALISWEQ5_cjs.OP_RETURN_EMPTY_PKSCRIPT
15689
15843
  });
15690
15844
  return tx;
15691
15845
  }
@@ -15746,7 +15900,7 @@ exports.Unroll = void 0;
15746
15900
  if (virtualTxs.txs.length === 0) {
15747
15901
  throw new Error(`Tx ${nextTxToBroadcast.txid} not found`);
15748
15902
  }
15749
- const tx = chunk6EZY43WE_cjs.Transaction.fromPSBT(base.base64.decode(virtualTxs.txs[0]));
15903
+ const tx = chunkALISWEQ5_cjs.Transaction.fromPSBT(base.base64.decode(virtualTxs.txs[0]));
15750
15904
  if (nextTxToBroadcast.type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
15751
15905
  const input = tx.getInput(0);
15752
15906
  if (!input) {
@@ -15823,12 +15977,12 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
15823
15977
  if (!exit) {
15824
15978
  throw new Error(`no available exit path found for vtxo ${vtxo.txid}:${vtxo.vout}`);
15825
15979
  }
15826
- const spendingLeaf = chunkCMPJR3HS_cjs.VtxoScript.decode(vtxo.tapTree).findLeaf(base.hex.encode(exit.script));
15980
+ const spendingLeaf = chunkHXDZ2QTW_cjs.VtxoScript.decode(vtxo.tapTree).findLeaf(base.hex.encode(exit.script));
15827
15981
  if (!spendingLeaf) {
15828
15982
  throw new Error(`spending leaf not found for vtxo ${vtxo.txid}:${vtxo.vout}`);
15829
15983
  }
15830
15984
  totalAmount += BigInt(vtxo.value);
15831
- const sequence = chunkCMPJR3HS_cjs.timelockToSequence(exit.params.timelock);
15985
+ const sequence = chunkHXDZ2QTW_cjs.timelockToSequence(exit.params.timelock);
15832
15986
  inputs.push({
15833
15987
  txid: vtxo.txid,
15834
15988
  index: vtxo.vout,
@@ -15836,7 +15990,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
15836
15990
  sequence,
15837
15991
  witnessUtxo: {
15838
15992
  amount: BigInt(vtxo.value),
15839
- script: chunkCMPJR3HS_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
15993
+ script: chunkHXDZ2QTW_cjs.VtxoScript.decode(vtxo.tapTree).pkScript
15840
15994
  },
15841
15995
  sighashType: btcSigner.SigHash.DEFAULT
15842
15996
  });
@@ -15846,7 +16000,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
15846
16000
  btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
15847
16001
  );
15848
16002
  }
15849
- const tx = new chunk6EZY43WE_cjs.Transaction({ version: 2 });
16003
+ const tx = new chunkALISWEQ5_cjs.Transaction({ version: 2 });
15850
16004
  for (const input of inputs) {
15851
16005
  tx.addInput(input);
15852
16006
  }
@@ -15893,7 +16047,7 @@ function doWait(onchainProvider, txid) {
15893
16047
  };
15894
16048
  }
15895
16049
  function availableExitPath(confirmedAt, current, vtxo) {
15896
- const exits = chunkCMPJR3HS_cjs.VtxoScript.decode(vtxo.tapTree).exitPaths();
16050
+ const exits = chunkHXDZ2QTW_cjs.VtxoScript.decode(vtxo.tapTree).exitPaths();
15897
16051
  for (const exit of exits) {
15898
16052
  if (exit.params.timelock.type === "blocks") {
15899
16053
  if (current.height >= confirmedAt.height + Number(exit.params.timelock.value)) {
@@ -15932,7 +16086,7 @@ function decodeArkContract(encoded) {
15932
16086
  }
15933
16087
  function contractFromArkContract(encoded, options = {}) {
15934
16088
  const parsed = decodeArkContract(encoded);
15935
- const handler = chunkGUTKJMSF_cjs.contractHandlers.get(parsed.type);
16089
+ const handler = chunk32YKLQPS_cjs.contractHandlers.get(parsed.type);
15936
16090
  if (!handler) {
15937
16091
  throw new Error(`No handler registered for contract type '${parsed.type}'`);
15938
16092
  }
@@ -15946,9 +16100,9 @@ function contractFromArkContract(encoded, options = {}) {
15946
16100
  metadata: options.metadata
15947
16101
  };
15948
16102
  }
15949
- function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunkCMPJR3HS_cjs.DEFAULT_NETWORK.hrp, options = {}) {
16103
+ function contractFromArkContractWithAddress(encoded, serverPubKey, addressPrefix = chunkHXDZ2QTW_cjs.DEFAULT_NETWORK.hrp, options = {}) {
15950
16104
  const parsed = decodeArkContract(encoded);
15951
- const handler = chunkGUTKJMSF_cjs.contractHandlers.getOrThrow(parsed.type);
16105
+ const handler = chunk32YKLQPS_cjs.contractHandlers.getOrThrow(parsed.type);
15952
16106
  const params = parsed.data;
15953
16107
  const vtxoScript = handler.createScript(params);
15954
16108
  return {
@@ -15966,6 +16120,7 @@ function isArkContract(str) {
15966
16120
  return str.startsWith(ARKCONTRACT_PREFIX + "=");
15967
16121
  }
15968
16122
 
16123
+ exports.ActivityRegistry = ActivityRegistry;
15969
16124
  exports.ArkNote = ArkNote;
15970
16125
  exports.AssetManager = AssetManager;
15971
16126
  exports.ContractManager = ContractManager;
@@ -16022,6 +16177,7 @@ exports.WalletMessageHandler = WalletMessageHandler;
16022
16177
  exports.WalletNotInitializedError = WalletNotInitializedError;
16023
16178
  exports.WalletRepositoryImpl = WalletRepositoryImpl;
16024
16179
  exports.WsElectrumChainSource = WsElectrumChainSource;
16180
+ exports.boardingResolver = boardingResolver;
16025
16181
  exports.buildForfeitTx = buildForfeitTx;
16026
16182
  exports.buildOffchainTx = buildOffchainTx;
16027
16183
  exports.classifyAgainstSignerSet = classifyAgainstSignerSet;
@@ -16030,6 +16186,7 @@ exports.closeDatabase = closeDatabase;
16030
16186
  exports.combineTapscriptSigs = combineTapscriptSigs;
16031
16187
  exports.contractFromArkContract = contractFromArkContract;
16032
16188
  exports.contractFromArkContractWithAddress = contractFromArkContractWithAddress;
16189
+ exports.createDefaultActivityRegistry = createDefaultActivityRegistry;
16033
16190
  exports.decodeArkContract = decodeArkContract;
16034
16191
  exports.deserializeAssets = deserializeAssets;
16035
16192
  exports.deserializeUtxo = deserializeUtxo;
@@ -16067,5 +16224,5 @@ exports.validateVtxoTxGraph = validateVtxoTxGraph;
16067
16224
  exports.verifyTapscriptSignatures = verifyTapscriptSignatures;
16068
16225
  exports.waitForIncomingFunds = waitForIncomingFunds;
16069
16226
  exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
16070
- //# sourceMappingURL=chunk-I4Z6KKUH.cjs.map
16071
- //# sourceMappingURL=chunk-I4Z6KKUH.cjs.map
16227
+ //# sourceMappingURL=chunk-3MPXMLP4.cjs.map
16228
+ //# sourceMappingURL=chunk-3MPXMLP4.cjs.map