@arkade-os/sdk 0.4.39 → 0.4.40

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 (65) hide show
  1. package/dist/adapters/expo.cjs +4 -4
  2. package/dist/adapters/expo.d.cts +2 -2
  3. package/dist/adapters/expo.d.ts +2 -2
  4. package/dist/adapters/expo.js +2 -2
  5. package/dist/adapters/indexedDB.cjs +3 -3
  6. package/dist/adapters/indexedDB.js +2 -2
  7. package/dist/{ark-BzUNnkoc.d.cts → ark-BaZ6da8C.d.cts} +17 -4
  8. package/dist/{ark-BzUNnkoc.d.ts → ark-BaZ6da8C.d.ts} +17 -4
  9. package/dist/{asyncStorageTaskQueue-CIYeI6GM.d.ts → asyncStorageTaskQueue-CvV50MjV.d.ts} +2 -2
  10. package/dist/{asyncStorageTaskQueue-C0kQoY1x.d.cts → asyncStorageTaskQueue-trKcQM7q.d.cts} +2 -2
  11. package/dist/{chunk-UIFBMKI7.js → chunk-5TSUGRHP.js} +3 -3
  12. package/dist/{chunk-UIFBMKI7.js.map → chunk-5TSUGRHP.js.map} +1 -1
  13. package/dist/{chunk-LJLEFPWD.cjs → chunk-6EZY43WE.cjs} +14 -5
  14. package/dist/chunk-6EZY43WE.cjs.map +1 -0
  15. package/dist/{chunk-D744IES4.js → chunk-GF6NPAOJ.js} +14 -5
  16. package/dist/chunk-GF6NPAOJ.js.map +1 -0
  17. package/dist/{chunk-N56IDZON.cjs → chunk-GWISMFO5.cjs} +11 -11
  18. package/dist/{chunk-N56IDZON.cjs.map → chunk-GWISMFO5.cjs.map} +1 -1
  19. package/dist/{chunk-SYEGCMNV.js → chunk-I2O4Q2EL.js} +175 -78
  20. package/dist/chunk-I2O4Q2EL.js.map +1 -0
  21. package/dist/{chunk-P5FKMIGY.cjs → chunk-I4Z6KKUH.cjs} +251 -152
  22. package/dist/chunk-I4Z6KKUH.cjs.map +1 -0
  23. package/dist/{chunk-VGXTJ7HR.js → chunk-SWJBV4UB.js} +3 -3
  24. package/dist/{chunk-VGXTJ7HR.js.map → chunk-SWJBV4UB.js.map} +1 -1
  25. package/dist/{chunk-A5RLZCPO.cjs → chunk-TSG74BHI.cjs} +7 -7
  26. package/dist/{chunk-A5RLZCPO.cjs.map → chunk-TSG74BHI.cjs.map} +1 -1
  27. package/dist/contracts/handlers/index.d.cts +3 -3
  28. package/dist/contracts/handlers/index.d.ts +3 -3
  29. package/dist/{delegate-DHAgMIS9.d.cts → delegate-Bt5H1gbW.d.cts} +1 -1
  30. package/dist/{delegate-BjPbX-MR.d.ts → delegate-ClaZWxlA.d.ts} +1 -1
  31. package/dist/{index-BOQKDCmS.d.ts → index-ByYBDr1g.d.ts} +2 -2
  32. package/dist/{index-YkMAtSfw.d.cts → index-D6kIRfBy.d.cts} +2 -2
  33. package/dist/index.cjs +121 -113
  34. package/dist/index.d.cts +49 -10
  35. package/dist/index.d.ts +49 -10
  36. package/dist/index.js +2 -2
  37. package/dist/repositories/realm/index.cjs +11 -11
  38. package/dist/repositories/realm/index.d.cts +1 -1
  39. package/dist/repositories/realm/index.d.ts +1 -1
  40. package/dist/repositories/realm/index.js +2 -2
  41. package/dist/repositories/sqlite/index.cjs +11 -11
  42. package/dist/repositories/sqlite/index.d.cts +1 -1
  43. package/dist/repositories/sqlite/index.d.ts +1 -1
  44. package/dist/repositories/sqlite/index.js +2 -2
  45. package/dist/{taskRunner-Dfmt7ZPN.d.ts → taskRunner-Bwss4MUW.d.ts} +2 -2
  46. package/dist/{taskRunner-CVEgBO6d.d.cts → taskRunner-D7SuOTOa.d.cts} +2 -2
  47. package/dist/wallet/expo/background.cjs +12 -12
  48. package/dist/wallet/expo/background.d.cts +3 -3
  49. package/dist/wallet/expo/background.d.ts +3 -3
  50. package/dist/wallet/expo/background.js +4 -4
  51. package/dist/wallet/expo/index.cjs +11 -11
  52. package/dist/wallet/expo/index.d.cts +4 -4
  53. package/dist/wallet/expo/index.d.ts +4 -4
  54. package/dist/wallet/expo/index.js +3 -3
  55. package/dist/{wallet-_PTv-lMe.d.cts → wallet-V5C4Nlhz.d.cts} +2 -2
  56. package/dist/{wallet-C4Pide44.d.ts → wallet-l-2dKXVh.d.ts} +2 -2
  57. package/dist/worker/expo/index.cjs +7 -7
  58. package/dist/worker/expo/index.d.cts +4 -4
  59. package/dist/worker/expo/index.d.ts +4 -4
  60. package/dist/worker/expo/index.js +3 -3
  61. package/package.json +1 -1
  62. package/dist/chunk-D744IES4.js.map +0 -1
  63. package/dist/chunk-LJLEFPWD.cjs.map +0 -1
  64. package/dist/chunk-P5FKMIGY.cjs.map +0 -1
  65. package/dist/chunk-SYEGCMNV.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkLJLEFPWD_cjs = require('./chunk-LJLEFPWD.cjs');
3
+ var chunk6EZY43WE_cjs = require('./chunk-6EZY43WE.cjs');
4
4
  var chunkGUTKJMSF_cjs = require('./chunk-GUTKJMSF.cjs');
5
5
  var chunkCMPJR3HS_cjs = require('./chunk-CMPJR3HS.cjs');
6
6
  var utils_js = require('@scure/btc-signer/utils.js');
@@ -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 = chunkLJLEFPWD_cjs.getArkPsbtFields(tx.root, 0, chunkLJLEFPWD_cjs.CosignerPublicKey).map(
184
+ const cosigners = chunk6EZY43WE_cjs.getArkPsbtFields(tx.root, 0, chunk6EZY43WE_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 = chunkLJLEFPWD_cjs.getArkPsbtFields(g.root, 0, chunkLJLEFPWD_cjs.CosignerPublicKey).map((c) => c.key);
236
+ const cosigners = chunk6EZY43WE_cjs.getArkPsbtFields(g.root, 0, chunk6EZY43WE_cjs.CosignerPublicKey).map((c) => c.key);
237
237
  const { finalKey } = aggregateKeys(cosigners, true, {
238
238
  taprootTweak: this.scriptRoot
239
239
  });
@@ -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 chunkLJLEFPWD_cjs.baseFetch(url, {
983
+ const response = await chunk6EZY43WE_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: chunkLJLEFPWD_cjs.Intent.encodeMessage(intent.message),
990
+ message: chunk6EZY43WE_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 chunkLJLEFPWD_cjs.baseFetch(url);
1010
+ const response = await chunk6EZY43WE_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}`);
@@ -1042,14 +1042,14 @@ var EsploraProvider = class {
1042
1042
  pollingInterval;
1043
1043
  forcePolling;
1044
1044
  async getCoins(address) {
1045
- const response = await chunkLJLEFPWD_cjs.baseFetch(`${this.baseUrl}/address/${address}/utxo`);
1045
+ const response = await chunk6EZY43WE_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 chunkLJLEFPWD_cjs.baseFetch(`${this.baseUrl}/fee-estimates`);
1052
+ const response = await chunk6EZY43WE_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 chunkLJLEFPWD_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/outspends`);
1073
+ const response = await chunk6EZY43WE_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 chunkLJLEFPWD_cjs.baseFetch(`${this.baseUrl}/address/${address}/txs`);
1081
+ const response = await chunk6EZY43WE_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 chunkLJLEFPWD_cjs.baseFetch(`${this.baseUrl}/tx/${txid}`);
1089
+ const txresponse = await chunk6EZY43WE_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 chunkLJLEFPWD_cjs.baseFetch(`${this.baseUrl}/tx/${txid}/status`);
1097
+ const response = await chunk6EZY43WE_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 chunkLJLEFPWD_cjs.baseFetch(`${this.baseUrl}/blocks`);
1181
+ const tipBlocks = await chunk6EZY43WE_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 chunkLJLEFPWD_cjs.baseFetch(`${this.baseUrl}/txs/package`, {
1200
+ const response = await chunk6EZY43WE_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 chunkLJLEFPWD_cjs.baseFetch(`${this.baseUrl}/tx`, {
1214
+ const response = await chunk6EZY43WE_cjs.baseFetch(`${this.baseUrl}/tx`, {
1215
1215
  method: "POST",
1216
1216
  headers: {
1217
1217
  "Content-Type": "text/plain"
@@ -1231,7 +1231,9 @@ function isValidBlocksTip(tip) {
1231
1231
  });
1232
1232
  }
1233
1233
  var isExplorerTransaction = (tx) => {
1234
- return typeof tx.txid === "string" && Array.isArray(tx.vout) && tx.vout.every(
1234
+ return typeof tx.txid === "string" && (tx.vin === void 0 || Array.isArray(tx.vin) && tx.vin.every(
1235
+ (vin) => typeof vin.txid === "string" && typeof vin.vout === "number"
1236
+ )) && Array.isArray(tx.vout) && tx.vout.every(
1235
1237
  (vout) => typeof vout.scriptpubkey_address === "string" && typeof vout.value === "number"
1236
1238
  ) && typeof tx.status === "object" && typeof tx.status.confirmed === "boolean";
1237
1239
  };
@@ -1280,7 +1282,7 @@ function buildForfeitTx(inputs, forfeitPkScript, txLocktime) {
1280
1282
  );
1281
1283
  }
1282
1284
  function buildForfeitTxWithOutput(inputs, output, txLocktime) {
1283
- const tx = new chunkLJLEFPWD_cjs.Transaction({
1285
+ const tx = new chunk6EZY43WE_cjs.Transaction({
1284
1286
  version: 3,
1285
1287
  lockTime: txLocktime
1286
1288
  });
@@ -1356,7 +1358,7 @@ function validateVtxoTxGraph(graph, roundTransaction, sweepTapTreeRoot) {
1356
1358
  if (previousScriptKey.length !== 32) {
1357
1359
  throw new Error(`parent output ${childIndex} has invalid script`);
1358
1360
  }
1359
- const cosigners = chunkLJLEFPWD_cjs.getArkPsbtFields(child.root, 0, chunkLJLEFPWD_cjs.CosignerPublicKey);
1361
+ const cosigners = chunk6EZY43WE_cjs.getArkPsbtFields(child.root, 0, chunk6EZY43WE_cjs.CosignerPublicKey);
1360
1362
  if (cosigners.length === 0) {
1361
1363
  throw ErrMissingCosignersPublicKeys;
1362
1364
  }
@@ -1456,7 +1458,7 @@ var Extension = class _Extension {
1456
1458
  `expected magic prefix ${base.hex.encode(ARKADE_MAGIC)}, got ${base.hex.encode(payload.slice(0, Math.min(payload.length, ARKADE_MAGIC.length)))}`
1457
1459
  );
1458
1460
  }
1459
- const reader = new chunkLJLEFPWD_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
1461
+ const reader = new chunk6EZY43WE_cjs.BufferReader(payload.slice(ARKADE_MAGIC.length));
1460
1462
  const packets = [];
1461
1463
  while (reader.remaining() > 0) {
1462
1464
  const packetType = reader.readByte();
@@ -1530,7 +1532,7 @@ var Extension = class _Extension {
1530
1532
  */
1531
1533
  getAssetPacket() {
1532
1534
  for (const p of this.packets) {
1533
- if (p instanceof chunkLJLEFPWD_cjs.Packet) {
1535
+ if (p instanceof chunk6EZY43WE_cjs.Packet) {
1534
1536
  return p;
1535
1537
  }
1536
1538
  }
@@ -1538,8 +1540,8 @@ var Extension = class _Extension {
1538
1540
  }
1539
1541
  };
1540
1542
  function parsePacket(packetType, data) {
1541
- if (packetType === chunkLJLEFPWD_cjs.Packet.PACKET_TYPE) {
1542
- return chunkLJLEFPWD_cjs.Packet.fromBytes(data);
1543
+ if (packetType === chunk6EZY43WE_cjs.Packet.PACKET_TYPE) {
1544
+ return chunk6EZY43WE_cjs.Packet.fromBytes(data);
1543
1545
  }
1544
1546
  return new UnknownPacket(packetType, data);
1545
1547
  }
@@ -1730,7 +1732,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
1730
1732
  const existing = inputsByAssetId.get(asset.assetId);
1731
1733
  inputsByAssetId.set(asset.assetId, [
1732
1734
  ...existing ?? [],
1733
- chunkLJLEFPWD_cjs.AssetInput.create(inputIndex, asset.amount)
1735
+ chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount)
1734
1736
  ]);
1735
1737
  }
1736
1738
  }
@@ -1742,7 +1744,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
1742
1744
  const existing = outputsByAssetId.get(asset.assetId);
1743
1745
  outputsByAssetId.set(asset.assetId, [
1744
1746
  ...existing ?? [],
1745
- chunkLJLEFPWD_cjs.AssetOutput.create(outputIndex, asset.amount)
1747
+ chunk6EZY43WE_cjs.AssetOutput.create(outputIndex, asset.amount)
1746
1748
  ]);
1747
1749
  }
1748
1750
  }
@@ -1753,7 +1755,7 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
1753
1755
  const existing = outputsByAssetId.get(asset.assetId);
1754
1756
  outputsByAssetId.set(asset.assetId, [
1755
1757
  ...existing ?? [],
1756
- chunkLJLEFPWD_cjs.AssetOutput.create(outputIndex, asset.amount)
1758
+ chunk6EZY43WE_cjs.AssetOutput.create(outputIndex, asset.amount)
1757
1759
  ]);
1758
1760
  }
1759
1761
  }
@@ -1762,11 +1764,11 @@ function createAssetPacket(assetInputs, receivers, changeReceiver) {
1762
1764
  for (const assetIdStr of allAssetIds) {
1763
1765
  const inputs = inputsByAssetId.get(assetIdStr);
1764
1766
  const outputs = outputsByAssetId.get(assetIdStr);
1765
- const assetId = chunkLJLEFPWD_cjs.AssetId.fromString(assetIdStr);
1766
- const group = chunkLJLEFPWD_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
1767
+ const assetId = chunk6EZY43WE_cjs.AssetId.fromString(assetIdStr);
1768
+ const group = chunk6EZY43WE_cjs.AssetGroup.create(assetId, null, inputs ?? [], outputs ?? [], []);
1767
1769
  groups.push(group);
1768
1770
  }
1769
- return chunkLJLEFPWD_cjs.Packet.create(groups);
1771
+ return chunk6EZY43WE_cjs.Packet.create(groups);
1770
1772
  }
1771
1773
  function selectCoinsWithAsset(coins, assetId, requiredAmount) {
1772
1774
  const coinsWithAsset = coins.filter((coin) => coin.assets?.some((a) => a.assetId === assetId));
@@ -1883,7 +1885,7 @@ function buildVirtualTx(inputs, outputs) {
1883
1885
  }
1884
1886
  }
1885
1887
  }
1886
- const tx = new chunkLJLEFPWD_cjs.Transaction({
1888
+ const tx = new chunk6EZY43WE_cjs.Transaction({
1887
1889
  version: 3,
1888
1890
  lockTime: Number(lockTime)
1889
1891
  });
@@ -1898,7 +1900,7 @@ function buildVirtualTx(inputs, outputs) {
1898
1900
  },
1899
1901
  tapLeafScript: [input.tapLeafScript]
1900
1902
  });
1901
- chunkLJLEFPWD_cjs.setArkPsbtField(tx, i, chunkLJLEFPWD_cjs.VtxoTaprootTree, input.tapTree);
1903
+ chunk6EZY43WE_cjs.setArkPsbtField(tx, i, chunk6EZY43WE_cjs.VtxoTaprootTree, input.tapTree);
1902
1904
  }
1903
1905
  for (const output of outputs) {
1904
1906
  tx.addOutput(output);
@@ -2269,7 +2271,7 @@ var Estimator = class {
2269
2271
  * @param onchainOutputs - Array of onchain outputs to evaluate
2270
2272
  * @returns The total fee amount
2271
2273
  */
2272
- eval(offchainInputs, onchainInputs, offchainOutputs, onchainOutputs) {
2274
+ evaluate(offchainInputs, onchainInputs, offchainOutputs, onchainOutputs) {
2273
2275
  let fee = FeeAmount.ZERO;
2274
2276
  for (const input of offchainInputs) {
2275
2277
  fee = fee.add(this.evalOffchainInput(input));
@@ -3006,7 +3008,7 @@ var VtxoManager = class _VtxoManager {
3006
3008
  `Sweep not economical: output ${outputAmount} sats after ${fee} sats fee is below dust (${dustAmount} sats)`
3007
3009
  );
3008
3010
  }
3009
- const tx = new chunkLJLEFPWD_cjs.Transaction();
3011
+ const tx = new chunk6EZY43WE_cjs.Transaction();
3010
3012
  for (const utxo of expiredUtxos) {
3011
3013
  const utxoScript = chunkCMPJR3HS_cjs.VtxoScript.decode(utxo.tapTree);
3012
3014
  const utxoExitLeaf = utxoScript.leaves.find(
@@ -3644,7 +3646,7 @@ var VtxoManager = class _VtxoManager {
3644
3646
  * or doesn't carry the metadata.
3645
3647
  */
3646
3648
  extractSpentOutpoint(error) {
3647
- const ark = chunkLJLEFPWD_cjs.maybeArkError(error);
3649
+ const ark = chunk6EZY43WE_cjs.maybeArkError(error);
3648
3650
  if (!ark || ark.name !== "VTXO_ALREADY_SPENT") return void 0;
3649
3651
  const raw = ark.metadata?.vtxo_outpoint;
3650
3652
  if (typeof raw !== "string") return void 0;
@@ -4555,7 +4557,7 @@ var AssetManager = class extends ReadonlyAssetManager {
4555
4557
  const virtualCoins = await this.wallet.getVtxos({
4556
4558
  withRecoverable: false
4557
4559
  });
4558
- const controlAssetRef = params.controlAssetId ? chunkLJLEFPWD_cjs.AssetRef.fromId(chunkLJLEFPWD_cjs.AssetId.fromString(params.controlAssetId)) : null;
4560
+ const controlAssetRef = params.controlAssetId ? chunk6EZY43WE_cjs.AssetRef.fromId(chunk6EZY43WE_cjs.AssetId.fromString(params.controlAssetId)) : null;
4559
4561
  const coinSelection = selectVirtualCoins(virtualCoins, Number(this.wallet.dustAmount));
4560
4562
  let totalBtcSelected = 0n;
4561
4563
  const assetChanges = /* @__PURE__ */ new Map();
@@ -4568,8 +4570,8 @@ var AssetManager = class extends ReadonlyAssetManager {
4568
4570
  }
4569
4571
  }
4570
4572
  const groups = [];
4571
- const issuedAssetOutput = chunkLJLEFPWD_cjs.AssetOutput.create(0, params.amount);
4572
- const issuedAssetGroup = chunkLJLEFPWD_cjs.AssetGroup.create(
4573
+ const issuedAssetOutput = chunk6EZY43WE_cjs.AssetOutput.create(0, params.amount);
4574
+ const issuedAssetGroup = chunk6EZY43WE_cjs.AssetGroup.create(
4573
4575
  null,
4574
4576
  controlAssetRef,
4575
4577
  [],
@@ -4584,15 +4586,15 @@ var AssetManager = class extends ReadonlyAssetManager {
4584
4586
  for (const [inputIndex, assets] of assetInputs) {
4585
4587
  for (const asset of assets) {
4586
4588
  if (asset.assetId !== assetId) continue;
4587
- changeInputs.push(chunkLJLEFPWD_cjs.AssetInput.create(inputIndex, asset.amount));
4589
+ changeInputs.push(chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount));
4588
4590
  }
4589
4591
  }
4590
4592
  groups.push(
4591
- chunkLJLEFPWD_cjs.AssetGroup.create(
4592
- chunkLJLEFPWD_cjs.AssetId.fromString(assetId),
4593
+ chunk6EZY43WE_cjs.AssetGroup.create(
4594
+ chunk6EZY43WE_cjs.AssetId.fromString(assetId),
4593
4595
  null,
4594
4596
  changeInputs,
4595
- [chunkLJLEFPWD_cjs.AssetOutput.create(0, amount)],
4597
+ [chunk6EZY43WE_cjs.AssetOutput.create(0, amount)],
4596
4598
  []
4597
4599
  )
4598
4600
  );
@@ -4605,7 +4607,7 @@ var AssetManager = class extends ReadonlyAssetManager {
4605
4607
  script: outputAddress.pkScript,
4606
4608
  amount: BigInt(totalBtcSelected)
4607
4609
  },
4608
- Extension.create([chunkLJLEFPWD_cjs.Packet.create(groups)]).txOut()
4610
+ Extension.create([chunk6EZY43WE_cjs.Packet.create(groups)]).txOut()
4609
4611
  ];
4610
4612
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(
4611
4613
  coinSelection.inputs,
@@ -4613,7 +4615,7 @@ var AssetManager = class extends ReadonlyAssetManager {
4613
4615
  );
4614
4616
  return {
4615
4617
  arkTxId: arkTxid,
4616
- assetId: chunkLJLEFPWD_cjs.AssetId.create(arkTxid, 0).toString()
4618
+ assetId: chunk6EZY43WE_cjs.AssetId.create(arkTxid, 0).toString()
4617
4619
  };
4618
4620
  }
4619
4621
  /**
@@ -4685,16 +4687,16 @@ var AssetManager = class extends ReadonlyAssetManager {
4685
4687
  for (const [inputIndex, assets] of assetInputs) {
4686
4688
  for (const asset of assets) {
4687
4689
  if (asset.assetId !== params.assetId) continue;
4688
- reissueInputs.push(chunkLJLEFPWD_cjs.AssetInput.create(inputIndex, asset.amount));
4690
+ reissueInputs.push(chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount));
4689
4691
  }
4690
4692
  }
4691
4693
  const totalAssetAmount = assetToReissueAmount + params.amount;
4692
- const reissueAssetIdObj = chunkLJLEFPWD_cjs.AssetId.fromString(params.assetId);
4693
- const reissueAssetGroup = chunkLJLEFPWD_cjs.AssetGroup.create(
4694
+ const reissueAssetIdObj = chunk6EZY43WE_cjs.AssetId.fromString(params.assetId);
4695
+ const reissueAssetGroup = chunk6EZY43WE_cjs.AssetGroup.create(
4694
4696
  reissueAssetIdObj,
4695
4697
  null,
4696
4698
  reissueInputs,
4697
- [chunkLJLEFPWD_cjs.AssetOutput.create(0, totalAssetAmount)],
4699
+ [chunk6EZY43WE_cjs.AssetOutput.create(0, totalAssetAmount)],
4698
4700
  []
4699
4701
  );
4700
4702
  const groups = [reissueAssetGroup];
@@ -4703,15 +4705,15 @@ var AssetManager = class extends ReadonlyAssetManager {
4703
4705
  for (const [inputIndex, assets] of assetInputs) {
4704
4706
  for (const asset of assets) {
4705
4707
  if (asset.assetId !== assetId) continue;
4706
- changeInputs.push(chunkLJLEFPWD_cjs.AssetInput.create(inputIndex, asset.amount));
4708
+ changeInputs.push(chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount));
4707
4709
  }
4708
4710
  }
4709
4711
  groups.push(
4710
- chunkLJLEFPWD_cjs.AssetGroup.create(
4711
- chunkLJLEFPWD_cjs.AssetId.fromString(assetId),
4712
+ chunk6EZY43WE_cjs.AssetGroup.create(
4713
+ chunk6EZY43WE_cjs.AssetId.fromString(assetId),
4712
4714
  null,
4713
4715
  changeInputs,
4714
- [chunkLJLEFPWD_cjs.AssetOutput.create(0, amount)],
4716
+ [chunk6EZY43WE_cjs.AssetOutput.create(0, amount)],
4715
4717
  []
4716
4718
  )
4717
4719
  );
@@ -4723,7 +4725,7 @@ var AssetManager = class extends ReadonlyAssetManager {
4723
4725
  script: outputAddress.pkScript,
4724
4726
  amount: BigInt(totalBtcSelected)
4725
4727
  },
4726
- Extension.create([chunkLJLEFPWD_cjs.Packet.create(groups)]).txOut()
4728
+ Extension.create([chunk6EZY43WE_cjs.Packet.create(groups)]).txOut()
4727
4729
  ];
4728
4730
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
4729
4731
  return arkTxid;
@@ -4790,15 +4792,15 @@ var AssetManager = class extends ReadonlyAssetManager {
4790
4792
  for (const [inputIndex, assets] of assetInputs) {
4791
4793
  for (const asset of assets) {
4792
4794
  if (asset.assetId !== assetId) continue;
4793
- changeInputs.push(chunkLJLEFPWD_cjs.AssetInput.create(inputIndex, asset.amount));
4795
+ changeInputs.push(chunk6EZY43WE_cjs.AssetInput.create(inputIndex, asset.amount));
4794
4796
  }
4795
4797
  }
4796
4798
  groups.push(
4797
- chunkLJLEFPWD_cjs.AssetGroup.create(
4798
- chunkLJLEFPWD_cjs.AssetId.fromString(assetId),
4799
+ chunk6EZY43WE_cjs.AssetGroup.create(
4800
+ chunk6EZY43WE_cjs.AssetId.fromString(assetId),
4799
4801
  null,
4800
4802
  changeInputs,
4801
- amount > 0n ? [chunkLJLEFPWD_cjs.AssetOutput.create(0, amount)] : [],
4803
+ amount > 0n ? [chunk6EZY43WE_cjs.AssetOutput.create(0, amount)] : [],
4802
4804
  []
4803
4805
  )
4804
4806
  );
@@ -4810,7 +4812,7 @@ var AssetManager = class extends ReadonlyAssetManager {
4810
4812
  script: outputAddress.pkScript,
4811
4813
  amount: BigInt(totalBtcSelected)
4812
4814
  },
4813
- Extension.create([chunkLJLEFPWD_cjs.Packet.create(groups)]).txOut()
4815
+ Extension.create([chunk6EZY43WE_cjs.Packet.create(groups)]).txOut()
4814
4816
  ];
4815
4817
  const { arkTxid } = await this.wallet.buildAndSubmitOffchainTx(selectedCoins, outputs);
4816
4818
  return arkTxid;
@@ -4835,7 +4837,7 @@ function castMetadata(metadata) {
4835
4837
  } else {
4836
4838
  throw new Error("Invalid metadata value type");
4837
4839
  }
4838
- md.push(chunkLJLEFPWD_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
4840
+ md.push(chunk6EZY43WE_cjs.Metadata.create(textEncoder.encode(key), valueBytes));
4839
4841
  }
4840
4842
  return md;
4841
4843
  }
@@ -5120,7 +5122,7 @@ async function makeSignedDelegateIntent(identity, coins, outputs, onchainOutputs
5120
5122
  expire_at: 0,
5121
5123
  cosigners_public_keys: cosignerPubKeys
5122
5124
  };
5123
- const proof = chunkLJLEFPWD_cjs.Intent.create(message, coins, outputs);
5125
+ const proof = chunk6EZY43WE_cjs.Intent.create(message, coins, outputs);
5124
5126
  const signedProof = await identity.sign(proof);
5125
5127
  return {
5126
5128
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -6863,7 +6865,7 @@ var ContractWatcher = class {
6863
6865
  this.connectionState = "connected";
6864
6866
  this.reconnectAttempts = 0;
6865
6867
  this.listenLoop().catch((e) => {
6866
- if (chunkLJLEFPWD_cjs.isEventSourceError(e)) {
6868
+ if (chunk6EZY43WE_cjs.isEventSourceError(e)) {
6867
6869
  console.debug("ContractWatcher subscription disconnected; reconnecting");
6868
6870
  } else {
6869
6871
  console.error(e);
@@ -8819,7 +8821,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
8819
8821
  */
8820
8822
  static async setupWalletConfig(config, pubKey) {
8821
8823
  const arkadeServerUrl = getArkadeServerUrl(config);
8822
- const arkProvider = config.arkProvider || new chunkLJLEFPWD_cjs.RestArkProvider(arkadeServerUrl);
8824
+ const arkProvider = config.arkProvider || new chunk6EZY43WE_cjs.RestArkProvider(arkadeServerUrl);
8823
8825
  let indexerProvider = config.indexerProvider;
8824
8826
  if (!indexerProvider) {
8825
8827
  let indexerUrl = config.indexerUrl;
@@ -8836,7 +8838,7 @@ var ReadonlyWallet = class _ReadonlyWallet {
8836
8838
  indexerUrl = arkadeServerUrl;
8837
8839
  }
8838
8840
  }
8839
- indexerProvider = new chunkLJLEFPWD_cjs.RestIndexerProvider(indexerUrl);
8841
+ indexerProvider = new chunk6EZY43WE_cjs.RestIndexerProvider(indexerUrl);
8840
8842
  }
8841
8843
  const info = await arkProvider.getInfo();
8842
8844
  const network = chunkCMPJR3HS_cjs.getNetwork(info.network);
@@ -9102,6 +9104,12 @@ var ReadonlyWallet = class _ReadonlyWallet {
9102
9104
  const boardingAddress = tapscript.onchainAddress(this.network);
9103
9105
  const scriptHex = base.hex.encode(tapscript.pkScript);
9104
9106
  const txs = await this.onchainProvider.getTransactions(boardingAddress);
9107
+ const commitmentByOutpoint = /* @__PURE__ */ new Map();
9108
+ for (const tx of txs) {
9109
+ for (const input of tx.vin ?? []) {
9110
+ commitmentByOutpoint.set(`${input.txid}:${input.vout}`, tx.txid);
9111
+ }
9112
+ }
9105
9113
  for (const tx of txs) {
9106
9114
  for (let i = 0; i < tx.vout.length; i++) {
9107
9115
  const vout = tx.vout[i];
@@ -9112,8 +9120,10 @@ var ReadonlyWallet = class _ReadonlyWallet {
9112
9120
  outspendCache.set(tx.txid, spentStatuses);
9113
9121
  }
9114
9122
  const spentStatus = spentStatuses[i];
9115
- if (spentStatus?.spent) {
9116
- commitmentsToIgnore.add(spentStatus.txid);
9123
+ const commitmentTxid = spentStatus?.txid || commitmentByOutpoint.get(`${tx.txid}:${i}`);
9124
+ const spent = Boolean(spentStatus?.spent) || commitmentTxid !== void 0;
9125
+ if (spent && commitmentTxid) {
9126
+ commitmentsToIgnore.add(commitmentTxid);
9117
9127
  }
9118
9128
  utxos.push({
9119
9129
  txid: tx.txid,
@@ -9125,8 +9135,8 @@ var ReadonlyWallet = class _ReadonlyWallet {
9125
9135
  },
9126
9136
  isUnrolled: true,
9127
9137
  virtualStatus: {
9128
- state: spentStatus?.spent ? "spent" : "settled",
9129
- commitmentTxIds: spentStatus?.spent ? [spentStatus.txid] : void 0
9138
+ state: spent ? "spent" : "settled",
9139
+ commitmentTxIds: spent && commitmentTxid ? [commitmentTxid] : void 0
9130
9140
  },
9131
9141
  createdAt: tx.status.confirmed ? new Date(tx.status.block_time * 1e3) : /* @__PURE__ */ new Date(0),
9132
9142
  script: scriptHex
@@ -10744,7 +10754,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10744
10754
  try {
10745
10755
  return await this.arkProvider.registerIntent(intent);
10746
10756
  } catch (error) {
10747
- if (error instanceof chunkLJLEFPWD_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
10757
+ if (error instanceof chunk6EZY43WE_cjs.ArkError && error.code === 0 && error.message.includes("duplicated input")) {
10748
10758
  const deleteIntent = await this.makeDeleteIntentSignature(inputs);
10749
10759
  await this.arkProvider.deleteIntent(deleteIntent);
10750
10760
  return this.arkProvider.registerIntent(intent);
@@ -10760,7 +10770,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10760
10770
  expire_at: 0,
10761
10771
  cosigners_public_keys: cosignerPubKeys
10762
10772
  };
10763
- const proof = chunkLJLEFPWD_cjs.Intent.create(message, coins, outputs);
10773
+ const proof = chunk6EZY43WE_cjs.Intent.create(message, coins, outputs);
10764
10774
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
10765
10775
  return {
10766
10776
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -10772,7 +10782,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10772
10782
  type: "delete",
10773
10783
  expire_at: 0
10774
10784
  };
10775
- const proof = chunkLJLEFPWD_cjs.Intent.create(message, coins, []);
10785
+ const proof = chunk6EZY43WE_cjs.Intent.create(message, coins, []);
10776
10786
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
10777
10787
  return {
10778
10788
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -10784,7 +10794,7 @@ var Wallet2 = class _Wallet extends ReadonlyWallet {
10784
10794
  type: "get-pending-tx",
10785
10795
  expire_at: 0
10786
10796
  };
10787
- const proof = chunkLJLEFPWD_cjs.Intent.create(message, coins, []);
10797
+ const proof = chunk6EZY43WE_cjs.Intent.create(message, coins, []);
10788
10798
  const signedProof = await this._signerRouter.sign(proof, intentProofJobs(coins));
10789
10799
  return {
10790
10800
  proof: base.base64.encode(signedProof.toPSBT()),
@@ -11539,9 +11549,15 @@ async function waitForIncomingFunds(wallet) {
11539
11549
 
11540
11550
  // src/worker/errors.ts
11541
11551
  var MESSAGE_BUS_NOT_INITIALIZED = "MessageBus not initialized";
11552
+ var MESSAGE_BUS_INITIALIZING = `${MESSAGE_BUS_NOT_INITIALIZED}: initializing`;
11542
11553
  var MessageBusNotInitializedError = class extends Error {
11554
+ constructor(message = MESSAGE_BUS_NOT_INITIALIZED) {
11555
+ super(message);
11556
+ }
11557
+ };
11558
+ var MessageBusInitializingError = class extends MessageBusNotInitializedError {
11543
11559
  constructor() {
11544
- super(MESSAGE_BUS_NOT_INITIALIZED);
11560
+ super(MESSAGE_BUS_INITIALIZING);
11545
11561
  }
11546
11562
  };
11547
11563
  var ServiceWorkerTimeoutError = class extends Error {
@@ -11583,6 +11599,16 @@ var MessageBus = class {
11583
11599
  tickInProgress = false;
11584
11600
  debug = false;
11585
11601
  initialized = false;
11602
+ /**
11603
+ * FIFO chain that serializes `INITIALIZE_MESSAGE_BUS` handling. Each init
11604
+ * runs to completion in enqueue order.
11605
+ */
11606
+ initChain = Promise.resolve();
11607
+ /**
11608
+ * Number of inits accepted but not yet settled (queued or running). The
11609
+ * bus refuses ordinary wallet messages while this is > 0.
11610
+ */
11611
+ pendingInitCount = 0;
11586
11612
  buildServicesFn;
11587
11613
  boundOnMessage = this.onMessage.bind(this);
11588
11614
  /** Start the message bus and attach service-worker event listeners. */
@@ -11628,11 +11654,12 @@ var MessageBus = class {
11628
11654
  async runTick() {
11629
11655
  if (!this.running) return;
11630
11656
  if (this.tickInProgress) return;
11631
- this.tickInProgress = true;
11632
11657
  if (this.tickTimeout !== null) {
11633
11658
  self.clearTimeout(this.tickTimeout);
11634
11659
  this.tickTimeout = null;
11635
11660
  }
11661
+ if (this.pendingInitCount > 0) return;
11662
+ this.tickInProgress = true;
11636
11663
  try {
11637
11664
  const now = Date.now();
11638
11665
  for (const updater of this.handlers.values()) {
@@ -11666,7 +11693,34 @@ var MessageBus = class {
11666
11693
  this.scheduleNextTick();
11667
11694
  }
11668
11695
  }
11669
- async waitForInit(config) {
11696
+ /**
11697
+ * Serialize init requests on {@link initChain}.
11698
+ * Returns this init's own result.
11699
+ */
11700
+ waitForInit(config) {
11701
+ this.pendingInitCount += 1;
11702
+ const run = this.initChain.then(
11703
+ () => this.doInit(config),
11704
+ // A rejected init never blocks the next request.
11705
+ () => this.doInit(config)
11706
+ ).finally(() => {
11707
+ this.pendingInitCount -= 1;
11708
+ });
11709
+ this.initChain = run.catch(() => void 0);
11710
+ return run;
11711
+ }
11712
+ /**
11713
+ * The bus serves ordinary wallet messages only when it is initialized AND
11714
+ * no init is in flight.
11715
+ */
11716
+ acceptsWalletMessages() {
11717
+ return this.initialized && this.pendingInitCount === 0;
11718
+ }
11719
+ async doInit(config) {
11720
+ if (this.tickTimeout !== null) {
11721
+ self.clearTimeout(this.tickTimeout);
11722
+ this.tickTimeout = null;
11723
+ }
11670
11724
  if (this.initialized) {
11671
11725
  this.initialized = false;
11672
11726
  await Promise.all(
@@ -11679,17 +11733,26 @@ var MessageBus = class {
11679
11733
  ...config.messageTimeouts ?? {}
11680
11734
  };
11681
11735
  const services = await this.buildServicesFn(config);
11682
- for (const updater of this.handlers.values()) {
11683
- if (this.debug) console.log(`Starting updater: ${updater.messageTag}`);
11684
- await updater.start(services, {
11685
- walletRepository: this.walletRepository
11686
- });
11736
+ const started = [];
11737
+ try {
11738
+ for (const updater of this.handlers.values()) {
11739
+ if (this.debug) console.log(`Starting updater: ${updater.messageTag}`);
11740
+ await updater.start(services, {
11741
+ walletRepository: this.walletRepository
11742
+ });
11743
+ started.push(updater);
11744
+ }
11745
+ } catch (err) {
11746
+ await Promise.all(started.map((h) => h.stop().catch(() => {
11747
+ })));
11748
+ this.initialized = false;
11749
+ throw err;
11687
11750
  }
11688
11751
  this.scheduleNextTick();
11689
11752
  this.initialized = true;
11690
11753
  }
11691
11754
  async buildServices(config) {
11692
- const arkProvider = new chunkLJLEFPWD_cjs.RestArkProvider(config.arkServer.url);
11755
+ const arkProvider = new chunk6EZY43WE_cjs.RestArkProvider(config.arkServer.url);
11693
11756
  const storage = {
11694
11757
  walletRepository: this.walletRepository,
11695
11758
  contractRepository: this.contractRepository
@@ -11742,23 +11805,29 @@ var MessageBus = class {
11742
11805
  if (this.debug) {
11743
11806
  console.log("Init Command received");
11744
11807
  }
11745
- await this.waitForInit(event.data.config);
11746
- this.deliverResponse(event.source, { id, tag }, { id, tag });
11747
- if (this.debug) {
11748
- console.log("MessageBus initialized");
11808
+ try {
11809
+ await this.waitForInit(event.data.config);
11810
+ this.deliverResponse(event.source, { id, tag }, { id, tag });
11811
+ if (this.debug) {
11812
+ console.log("MessageBus initialized");
11813
+ }
11814
+ } catch (error) {
11815
+ if (this.debug) console.error("MessageBus init failed", error);
11816
+ this.deliverResponse(event.source, { id, tag, error: toError(error) }, { id, tag });
11749
11817
  }
11750
11818
  return;
11751
11819
  }
11752
- if (!this.initialized) {
11820
+ if (!this.acceptsWalletMessages()) {
11753
11821
  if (this.debug)
11754
- console.warn("Event received before initialization, dropping", event.data);
11822
+ console.warn("Event received while bus unavailable, dropping", event.data);
11755
11823
  const fallbackTag = tag ?? "unknown";
11824
+ const error = this.pendingInitCount > 0 ? new MessageBusInitializingError() : new MessageBusNotInitializedError();
11756
11825
  this.deliverResponse(
11757
11826
  event.source,
11758
11827
  {
11759
11828
  id,
11760
11829
  tag: fallbackTag,
11761
- error: new MessageBusNotInitializedError()
11830
+ error
11762
11831
  },
11763
11832
  { id, tag: fallbackTag }
11764
11833
  );
@@ -12840,7 +12909,7 @@ var WalletMessageHandler = class {
12840
12909
  // Wallet methods
12841
12910
  async handleInitWallet({ payload }) {
12842
12911
  const { arkServerUrl } = payload;
12843
- this.indexerProvider = new chunkLJLEFPWD_cjs.RestIndexerProvider(arkServerUrl);
12912
+ this.indexerProvider = new chunk6EZY43WE_cjs.RestIndexerProvider(arkServerUrl);
12844
12913
  await this.onWalletInitialized();
12845
12914
  }
12846
12915
  async handleGetBalance() {
@@ -13268,6 +13337,13 @@ var WalletMessageHandler = class {
13268
13337
  function isMessageBusNotInitializedError(error) {
13269
13338
  return error instanceof Error && error.message.includes(MESSAGE_BUS_NOT_INITIALIZED);
13270
13339
  }
13340
+ function isMessageBusInitializingError(error) {
13341
+ return error instanceof Error && error.message.includes(MESSAGE_BUS_INITIALIZING);
13342
+ }
13343
+ var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
13344
+ var INIT_WAIT_BACKOFF_CAP_MS = 2e3;
13345
+ var MAX_INIT_WAITS = 8;
13346
+ var initWaitBackoffMs = (attempt) => Math.min(100 * 2 ** attempt, INIT_WAIT_BACKOFF_CAP_MS);
13271
13347
  var DEFAULT_MESSAGE_TIMEOUTS = {
13272
13348
  // Fast reads — fail quickly
13273
13349
  GET_ADDRESS: 1e4,
@@ -13536,6 +13612,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
13536
13612
  wallet.initWalletPayload = initWalletPayload;
13537
13613
  wallet.messageBusTimeoutMs = options.messageBusTimeoutMs;
13538
13614
  wallet.messageTimeouts = messageTimeouts;
13615
+ await wallet.assertWorkerIdentityMatches();
13539
13616
  return wallet;
13540
13617
  }
13541
13618
  /**
@@ -13667,7 +13744,7 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
13667
13744
  }
13668
13745
  // send a message, retrying up to 2 times if the service worker was
13669
13746
  // killed and restarted by the OS (mobile browsers do this aggressively)
13670
- async sendMessageWithRetry(request) {
13747
+ async sendMessageWithRetry(request, withEvents) {
13671
13748
  if (this.initConfig) {
13672
13749
  try {
13673
13750
  await this.pingServiceWorker();
@@ -13677,32 +13754,23 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
13677
13754
  }
13678
13755
  const timeoutMs = this.getTimeoutForRequest(request);
13679
13756
  const maxRetries = 2;
13680
- for (let attempt = 0; ; attempt++) {
13757
+ for (let attempt = 0, initWaits = 0; ; attempt++) {
13681
13758
  try {
13759
+ if (withEvents) {
13760
+ return await this.sendMessageStreaming(
13761
+ request,
13762
+ withEvents.onEvent,
13763
+ withEvents.isComplete
13764
+ );
13765
+ }
13682
13766
  return await this.sendMessageDirect(request, timeoutMs);
13683
13767
  } catch (error) {
13684
- if (!isMessageBusNotInitializedError(error) || attempt >= maxRetries) {
13685
- throw error;
13768
+ if (isMessageBusInitializingError(error)) {
13769
+ if (initWaits >= MAX_INIT_WAITS) throw error;
13770
+ await sleep(initWaitBackoffMs(initWaits++));
13771
+ attempt--;
13772
+ continue;
13686
13773
  }
13687
- await this.reinitialize();
13688
- }
13689
- }
13690
- }
13691
- // Like sendMessage but for streaming responses — retries with
13692
- // reinitialize when the service worker has been killed/restarted.
13693
- async sendMessageWithEvents(request, onEvent, isComplete) {
13694
- if (this.initConfig) {
13695
- try {
13696
- await this.pingServiceWorker();
13697
- } catch {
13698
- await this.reinitialize();
13699
- }
13700
- }
13701
- const maxRetries = 2;
13702
- for (let attempt = 0; ; attempt++) {
13703
- try {
13704
- return await this.sendMessageStreaming(request, onEvent, isComplete);
13705
- } catch (error) {
13706
13774
  if (!isMessageBusNotInitializedError(error) || attempt >= maxRetries) {
13707
13775
  throw error;
13708
13776
  }
@@ -13775,11 +13843,41 @@ var ServiceWorkerReadonlyWallet = class _ServiceWorkerReadonlyWallet {
13775
13843
  payload
13776
13844
  };
13777
13845
  await this.sendMessageDirect(initMessage, this.getTimeoutForRequest(initMessage));
13846
+ await this.assertWorkerIdentityMatches();
13778
13847
  })().finally(() => {
13779
13848
  this.reinitPromise = null;
13780
13849
  });
13781
13850
  return this.reinitPromise;
13782
13851
  }
13852
+ /**
13853
+ * Verify the worker is bound to this wallet's identity before the SDK hands
13854
+ * back (or recovers) a usable wallet object.
13855
+ *
13856
+ * Compares the stable baseline identity key (`identity.xOnlyPublicKey()`) to the one reported
13857
+ * by the worker via GET_STATUS.
13858
+ */
13859
+ async assertWorkerIdentityMatches() {
13860
+ const expected = base.hex.encode(await this.identity.xOnlyPublicKey());
13861
+ const message = {
13862
+ id: getRandomId(),
13863
+ tag: this.messageTag,
13864
+ type: "GET_STATUS"
13865
+ };
13866
+ const response = await this.sendMessageDirect(
13867
+ message,
13868
+ this.getTimeoutForRequest(message)
13869
+ );
13870
+ const workerKey = response.payload.xOnlyPublicKey;
13871
+ if (!workerKey) {
13872
+ throw new Error("Service worker identity mismatch: worker did not report an identity");
13873
+ }
13874
+ const actual = base.hex.encode(workerKey);
13875
+ if (actual !== expected) {
13876
+ throw new Error(
13877
+ `Service worker identity mismatch: expected ${expected}, got ${actual}`
13878
+ );
13879
+ }
13880
+ }
13783
13881
  /** Clear cached wallet state from both the page and service worker storage. */
13784
13882
  async clear() {
13785
13883
  const message = {
@@ -14200,6 +14298,7 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
14200
14298
  wallet.initWalletPayload = initWalletPayload;
14201
14299
  wallet.messageBusTimeoutMs = options.messageBusTimeoutMs;
14202
14300
  wallet.messageTimeouts = messageTimeouts;
14301
+ await wallet.assertWorkerIdentityMatches();
14203
14302
  return wallet;
14204
14303
  }
14205
14304
  /**
@@ -14247,11 +14346,10 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
14247
14346
  payload: { params }
14248
14347
  };
14249
14348
  try {
14250
- const response = await this.sendMessageWithEvents(
14251
- message,
14252
- (resp) => callback?.(resp.payload),
14253
- (resp) => resp.type === "SETTLE_SUCCESS"
14254
- );
14349
+ const response = await this.sendMessageWithRetry(message, {
14350
+ onEvent: (resp) => callback?.(resp.payload),
14351
+ isComplete: (resp) => resp.type === "SETTLE_SUCCESS"
14352
+ });
14255
14353
  return response.payload.txid;
14256
14354
  } catch (error) {
14257
14355
  throw new Error(`Settlement failed: ${error}`);
@@ -14276,12 +14374,11 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
14276
14374
  payload: opts ?? {}
14277
14375
  };
14278
14376
  try {
14279
- await this.sendMessageWithEvents(
14280
- message,
14281
- () => {
14377
+ await this.sendMessageWithRetry(message, {
14378
+ onEvent: () => {
14282
14379
  },
14283
- (resp) => resp.type === "RESTORE_WALLET_SUCCESS"
14284
- );
14380
+ isComplete: (resp) => resp.type === "RESTORE_WALLET_SUCCESS"
14381
+ });
14285
14382
  } catch (error) {
14286
14383
  if (isSerializedAggregateError(error)) {
14287
14384
  throw deserializeAggregateError(error);
@@ -14369,11 +14466,10 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
14369
14466
  id: getRandomId()
14370
14467
  };
14371
14468
  try {
14372
- const response = await wallet.sendMessageWithEvents(
14373
- message,
14374
- (resp) => eventCallback?.(resp.payload),
14375
- (resp) => resp.type === "RECOVER_VTXOS_SUCCESS"
14376
- );
14469
+ const response = await wallet.sendMessageWithRetry(message, {
14470
+ onEvent: (resp) => eventCallback?.(resp.payload),
14471
+ isComplete: (resp) => resp.type === "RECOVER_VTXOS_SUCCESS"
14472
+ });
14377
14473
  return response.payload.txid;
14378
14474
  } catch (e) {
14379
14475
  throw new Error(`Failed to recover vtxos: ${e}`);
@@ -14420,11 +14516,10 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
14420
14516
  payload: options
14421
14517
  };
14422
14518
  try {
14423
- const response = await wallet.sendMessageWithEvents(
14424
- message,
14425
- (resp) => eventCallback?.(resp.payload),
14426
- (resp) => resp.type === "RENEW_VTXOS_SUCCESS"
14427
- );
14519
+ const response = await wallet.sendMessageWithRetry(message, {
14520
+ onEvent: (resp) => eventCallback?.(resp.payload),
14521
+ isComplete: (resp) => resp.type === "RENEW_VTXOS_SUCCESS"
14522
+ });
14428
14523
  return response.payload.txid;
14429
14524
  } catch (e) {
14430
14525
  throw new Error(`Failed to renew vtxos: ${e}`);
@@ -14463,13 +14558,12 @@ var ServiceWorkerWallet = class _ServiceWorkerWallet extends ServiceWorkerReadon
14463
14558
  id: getRandomId()
14464
14559
  };
14465
14560
  try {
14466
- const response = await wallet.sendMessageWithEvents(
14467
- message,
14468
- (resp) => options?.eventCallback?.(
14561
+ const response = await wallet.sendMessageWithRetry(message, {
14562
+ onEvent: (resp) => options?.eventCallback?.(
14469
14563
  resp.payload
14470
14564
  ),
14471
- (resp) => resp.type === "MIGRATE_DEPRECATED_SIGNER_VTXOS_SUCCESS"
14472
- );
14565
+ isComplete: (resp) => resp.type === "MIGRATE_DEPRECATED_SIGNER_VTXOS_SUCCESS"
14566
+ });
14473
14567
  return deserializeMigrationReport(
14474
14568
  response.payload.report
14475
14569
  );
@@ -14631,7 +14725,7 @@ var OnchainWallet = class _OnchainWallet {
14631
14725
  if (!inputs) {
14632
14726
  throw new Error("Fee estimation failed");
14633
14727
  }
14634
- let tx = new chunkLJLEFPWD_cjs.Transaction();
14728
+ let tx = new chunk6EZY43WE_cjs.Transaction();
14635
14729
  for (const input of inputs) {
14636
14730
  tx.addInput({
14637
14731
  txid: input.txid,
@@ -14662,7 +14756,7 @@ var OnchainWallet = class _OnchainWallet {
14662
14756
  */
14663
14757
  async bumpP2A(parent) {
14664
14758
  const parentVsize = parent.vsize;
14665
- let child = new chunkLJLEFPWD_cjs.Transaction({
14759
+ let child = new chunk6EZY43WE_cjs.Transaction({
14666
14760
  version: 3,
14667
14761
  allowLegacyWitnessUtxo: true
14668
14762
  });
@@ -15405,12 +15499,15 @@ function errorText(err) {
15405
15499
  }
15406
15500
  return "";
15407
15501
  }
15502
+ function normalizedErrorText(err) {
15503
+ return errorText(err).toLowerCase().replace(/\s+/g, "");
15504
+ }
15408
15505
  function isMissingHeightError(err) {
15409
- return errorText(err).toLowerCase().includes("missingheight");
15506
+ return normalizedErrorText(err).includes("missingheight");
15410
15507
  }
15411
15508
  function isTxNotInBlockError(err) {
15412
- const normalized = errorText(err).toLowerCase();
15413
- return normalized.includes("not yet in a block") || normalized.includes("not in a block") || normalized.includes("not in block") || normalized.includes("no confirmed transaction");
15509
+ const normalized = normalizedErrorText(err);
15510
+ return normalized.includes("notyetinablock") || normalized.includes("notinablock") || normalized.includes("notinblock") || normalized.includes("noconfirmedtransaction");
15414
15511
  }
15415
15512
  function childTxidFromHex(txHex) {
15416
15513
  const tx = btcSigner.Transaction.fromRaw(base.hex.decode(txHex), {
@@ -15425,7 +15522,7 @@ exports.BIP322 = void 0;
15425
15522
  async function sign2(message, identity, network) {
15426
15523
  const xOnlyPubKey = await identity.xOnlyPublicKey();
15427
15524
  const payment = btcSigner.p2tr(xOnlyPubKey, void 0, network);
15428
- const toSpend = chunkLJLEFPWD_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
15525
+ const toSpend = chunk6EZY43WE_cjs.craftToSpendTx(message, payment.script, TAG_BIP322);
15429
15526
  const toSign = craftBIP322ToSignP2TR(toSpend, payment.script, xOnlyPubKey);
15430
15527
  const signed = await identity.sign(toSign, [0]);
15431
15528
  signed.finalizeIdx(0);
@@ -15483,7 +15580,7 @@ function verifyP2TR(message, witnessItems, pkScript, pubkey) {
15483
15580
  if (sighashType !== btcSigner.SigHash.DEFAULT && sighashType !== btcSigner.SigHash.ALL) {
15484
15581
  return false;
15485
15582
  }
15486
- const toSpend = chunkLJLEFPWD_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
15583
+ const toSpend = chunk6EZY43WE_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
15487
15584
  const toSign = craftBIP322ToSignP2TR(toSpend, pkScript, pubkey);
15488
15585
  const sighash = toSign.preimageWitnessV1(0, [pkScript], sighashType, [0n]);
15489
15586
  const rawSig = sig.length === 65 ? sig.subarray(0, 64) : sig;
@@ -15504,7 +15601,7 @@ function verifyP2WPKH(message, witnessItems, pkScript, addressHash) {
15504
15601
  }
15505
15602
  const sighashType = sigWithHash[sigWithHash.length - 1];
15506
15603
  const derSig = sigWithHash.subarray(0, sigWithHash.length - 1);
15507
- const toSpend = chunkLJLEFPWD_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
15604
+ const toSpend = chunk6EZY43WE_cjs.craftToSpendTx(message, pkScript, TAG_BIP322);
15508
15605
  const toSign = craftBIP322ToSignSimple(toSpend, pkScript);
15509
15606
  const scriptCode = btcSigner.OutScript.encode({ type: "pkh", hash: addressHash });
15510
15607
  const sighash = toSign.preimageWitnessV0(0, scriptCode, sighashType, 0n);
@@ -15557,7 +15654,7 @@ function encodeCompactSize(n) {
15557
15654
  return buf;
15558
15655
  }
15559
15656
  function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
15560
- const tx = new chunkLJLEFPWD_cjs.Transaction({ version: 0 });
15657
+ const tx = new chunk6EZY43WE_cjs.Transaction({ version: 0 });
15561
15658
  tx.addInput({
15562
15659
  txid: toSpend.id,
15563
15660
  index: 0,
@@ -15571,12 +15668,12 @@ function craftBIP322ToSignP2TR(toSpend, pkScript, tapInternalKey) {
15571
15668
  });
15572
15669
  tx.addOutput({
15573
15670
  amount: 0n,
15574
- script: chunkLJLEFPWD_cjs.OP_RETURN_EMPTY_PKSCRIPT
15671
+ script: chunk6EZY43WE_cjs.OP_RETURN_EMPTY_PKSCRIPT
15575
15672
  });
15576
15673
  return tx;
15577
15674
  }
15578
15675
  function craftBIP322ToSignSimple(toSpend, pkScript) {
15579
- const tx = new chunkLJLEFPWD_cjs.Transaction({ version: 0 });
15676
+ const tx = new chunk6EZY43WE_cjs.Transaction({ version: 0 });
15580
15677
  tx.addInput({
15581
15678
  txid: toSpend.id,
15582
15679
  index: 0,
@@ -15588,7 +15685,7 @@ function craftBIP322ToSignSimple(toSpend, pkScript) {
15588
15685
  });
15589
15686
  tx.addOutput({
15590
15687
  amount: 0n,
15591
- script: chunkLJLEFPWD_cjs.OP_RETURN_EMPTY_PKSCRIPT
15688
+ script: chunk6EZY43WE_cjs.OP_RETURN_EMPTY_PKSCRIPT
15592
15689
  });
15593
15690
  return tx;
15594
15691
  }
@@ -15649,7 +15746,7 @@ exports.Unroll = void 0;
15649
15746
  if (virtualTxs.txs.length === 0) {
15650
15747
  throw new Error(`Tx ${nextTxToBroadcast.txid} not found`);
15651
15748
  }
15652
- const tx = chunkLJLEFPWD_cjs.Transaction.fromPSBT(base.base64.decode(virtualTxs.txs[0]));
15749
+ const tx = chunk6EZY43WE_cjs.Transaction.fromPSBT(base.base64.decode(virtualTxs.txs[0]));
15653
15750
  if (nextTxToBroadcast.type === "INDEXER_CHAINED_TX_TYPE_TREE" /* TREE */) {
15654
15751
  const input = tx.getInput(0);
15655
15752
  if (!input) {
@@ -15681,7 +15778,7 @@ exports.Unroll = void 0;
15681
15778
  let lastStep;
15682
15779
  do {
15683
15780
  if (lastStep !== void 0) {
15684
- await sleep(1e3);
15781
+ await sleep2(1e3);
15685
15782
  }
15686
15783
  const step = await this.next();
15687
15784
  await step.do();
@@ -15749,7 +15846,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
15749
15846
  btcSigner.TaprootControlBlock.encode(spendingLeaf[0]).length
15750
15847
  );
15751
15848
  }
15752
- const tx = new chunkLJLEFPWD_cjs.Transaction({ version: 2 });
15849
+ const tx = new chunk6EZY43WE_cjs.Transaction({ version: 2 });
15753
15850
  for (const input of inputs) {
15754
15851
  tx.addInput(input);
15755
15852
  }
@@ -15771,7 +15868,7 @@ async function prepareUnrollTransaction(wallet, vtxoTxIds, outputAddress) {
15771
15868
  signedTx.finalize();
15772
15869
  return signedTx;
15773
15870
  }
15774
- function sleep(ms) {
15871
+ function sleep2(ms) {
15775
15872
  return new Promise((resolve) => setTimeout(resolve, ms));
15776
15873
  }
15777
15874
  function doUnroll(onchainProvider, pkg) {
@@ -15893,9 +15990,11 @@ exports.InMemoryContractRepository = InMemoryContractRepository;
15893
15990
  exports.InMemoryWalletRepository = InMemoryWalletRepository;
15894
15991
  exports.IndexedDBContractRepository = IndexedDBContractRepository;
15895
15992
  exports.IndexedDBWalletRepository = IndexedDBWalletRepository;
15993
+ exports.MESSAGE_BUS_INITIALIZING = MESSAGE_BUS_INITIALIZING;
15896
15994
  exports.MESSAGE_BUS_NOT_INITIALIZED = MESSAGE_BUS_NOT_INITIALIZED;
15897
15995
  exports.MIGRATION_KEY = MIGRATION_KEY;
15898
15996
  exports.MessageBus = MessageBus;
15997
+ exports.MessageBusInitializingError = MessageBusInitializingError;
15899
15998
  exports.MessageBusNotInitializedError = MessageBusNotInitializedError;
15900
15999
  exports.MissingSigningDescriptorError = MissingSigningDescriptorError;
15901
16000
  exports.MnemonicIdentity = MnemonicIdentity;
@@ -15968,5 +16067,5 @@ exports.validateVtxoTxGraph = validateVtxoTxGraph;
15968
16067
  exports.verifyTapscriptSignatures = verifyTapscriptSignatures;
15969
16068
  exports.waitForIncomingFunds = waitForIncomingFunds;
15970
16069
  exports.warnAndFilterVtxosForScript = warnAndFilterVtxosForScript;
15971
- //# sourceMappingURL=chunk-P5FKMIGY.cjs.map
15972
- //# sourceMappingURL=chunk-P5FKMIGY.cjs.map
16070
+ //# sourceMappingURL=chunk-I4Z6KKUH.cjs.map
16071
+ //# sourceMappingURL=chunk-I4Z6KKUH.cjs.map