@buildonspark/spark-sdk 0.1.35 → 0.1.37

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 (110) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/{RequestLightningSendInput-BtR12ZlP.d.cts → RequestLightningSendInput-39_zGri6.d.cts} +1 -1
  3. package/dist/{RequestLightningSendInput-Dfx7JYWT.d.ts → RequestLightningSendInput-B4JdzclX.d.ts} +1 -1
  4. package/dist/address/index.cjs +7 -2
  5. package/dist/address/index.d.cts +2 -2
  6. package/dist/address/index.d.ts +2 -2
  7. package/dist/address/index.js +3 -3
  8. package/dist/{chunk-5IXRSN47.js → chunk-2CDJZQN4.js} +1 -1
  9. package/dist/{chunk-YQBZR7YC.js → chunk-A74XSEW3.js} +1 -1
  10. package/dist/{chunk-PZRENZXV.js → chunk-C5LTJBI7.js} +215 -6
  11. package/dist/{chunk-B2CHXWG6.js → chunk-FWQPAPXK.js} +2 -2
  12. package/dist/{chunk-EVTP3LXL.js → chunk-I4JI6TYN.js} +2 -2
  13. package/dist/{chunk-74S7NOHT.js → chunk-MVRQ5US7.js} +7 -2
  14. package/dist/{chunk-UDT7KKB6.js → chunk-NS4UZRQ7.js} +1 -1
  15. package/dist/{chunk-W7N2ABBH.js → chunk-RAPBVYJY.js} +7 -12
  16. package/dist/{chunk-7TM6XZIQ.js → chunk-RULOY5WX.js} +2 -2
  17. package/dist/{chunk-3FT662ZE.js → chunk-RZDD6X5A.js} +143 -68
  18. package/dist/{chunk-C4URKX6J.js → chunk-YWFZ5ECA.js} +1 -1
  19. package/dist/graphql/objects/index.cjs +7 -2
  20. package/dist/graphql/objects/index.d.cts +4 -4
  21. package/dist/graphql/objects/index.d.ts +4 -4
  22. package/dist/graphql/objects/index.js +1 -1
  23. package/dist/{index-BBzdQhqB.d.ts → index-CxAi2L8y.d.ts} +10 -8
  24. package/dist/{index-D-We3A27.d.cts → index-Dm17Ggfe.d.cts} +10 -8
  25. package/dist/index.cjs +365 -85
  26. package/dist/index.d.cts +6 -6
  27. package/dist/index.d.ts +6 -6
  28. package/dist/index.js +11 -11
  29. package/dist/index.node.cjs +365 -85
  30. package/dist/index.node.d.cts +7 -7
  31. package/dist/index.node.d.ts +7 -7
  32. package/dist/index.node.js +11 -11
  33. package/dist/native/chunk-C3WN3D4O.js +19 -0
  34. package/dist/native/index.cjs +365 -85
  35. package/dist/native/index.d.cts +16 -4
  36. package/dist/native/index.d.ts +16 -4
  37. package/dist/native/index.js +363 -88
  38. package/dist/native/{wasm-A6KGFTNV.js → wasm-PZWVEGEE.js} +1 -1
  39. package/dist/native/{xhr-transport-TERT4PBA.js → xhr-transport-WHMS3FGG.js} +1 -1
  40. package/dist/{network-Bc-W9qLR.d.ts → network-DobHpaV6.d.ts} +1 -1
  41. package/dist/{network-Dbxfi7Tp.d.cts → network-GFGEHkS4.d.cts} +1 -1
  42. package/dist/proto/lrc20.cjs +7 -2
  43. package/dist/proto/lrc20.d.cts +1 -1
  44. package/dist/proto/lrc20.d.ts +1 -1
  45. package/dist/proto/lrc20.js +3 -3
  46. package/dist/proto/spark.cjs +221 -7
  47. package/dist/proto/spark.d.cts +1 -1
  48. package/dist/proto/spark.d.ts +1 -1
  49. package/dist/proto/spark.js +6 -2
  50. package/dist/{sdk-types-BZhxaXMN.d.ts → sdk-types-BeI6DM_M.d.ts} +1 -1
  51. package/dist/{sdk-types-BPwagWYa.d.cts → sdk-types-BuVMn2rX.d.cts} +1 -1
  52. package/dist/services/config.cjs +17 -17
  53. package/dist/services/config.d.cts +4 -4
  54. package/dist/services/config.d.ts +4 -4
  55. package/dist/services/config.js +4 -4
  56. package/dist/services/connection.cjs +217 -7
  57. package/dist/services/connection.d.cts +4 -4
  58. package/dist/services/connection.d.ts +4 -4
  59. package/dist/services/connection.js +3 -3
  60. package/dist/services/index.cjs +227 -22
  61. package/dist/services/index.d.cts +4 -4
  62. package/dist/services/index.d.ts +4 -4
  63. package/dist/services/index.js +7 -7
  64. package/dist/services/lrc-connection.cjs +7 -2
  65. package/dist/services/lrc-connection.d.cts +4 -4
  66. package/dist/services/lrc-connection.d.ts +4 -4
  67. package/dist/services/lrc-connection.js +4 -4
  68. package/dist/services/token-transactions.cjs +7 -2
  69. package/dist/services/token-transactions.d.cts +4 -4
  70. package/dist/services/token-transactions.d.ts +4 -4
  71. package/dist/services/token-transactions.js +4 -4
  72. package/dist/services/wallet-config.cjs +7 -2
  73. package/dist/services/wallet-config.d.cts +4 -4
  74. package/dist/services/wallet-config.d.ts +4 -4
  75. package/dist/services/wallet-config.js +1 -1
  76. package/dist/signer/signer.cjs +11 -11
  77. package/dist/signer/signer.d.cts +2 -2
  78. package/dist/signer/signer.d.ts +2 -2
  79. package/dist/signer/signer.js +2 -2
  80. package/dist/{signer-DQfFgVNA.d.cts → signer-C1t40Wus.d.cts} +1 -1
  81. package/dist/{signer-Db_TjQFj.d.ts → signer-DFGw9RRp.d.ts} +1 -1
  82. package/dist/{spark-FHwyinrG.d.cts → spark-DXYE9gMM.d.cts} +29 -3
  83. package/dist/{spark-FHwyinrG.d.ts → spark-DXYE9gMM.d.ts} +29 -3
  84. package/dist/types/index.cjs +219 -7
  85. package/dist/types/index.d.cts +4 -4
  86. package/dist/types/index.d.ts +4 -4
  87. package/dist/types/index.js +3 -3
  88. package/dist/utils/index.cjs +7 -2
  89. package/dist/utils/index.d.cts +5 -5
  90. package/dist/utils/index.d.ts +5 -5
  91. package/dist/utils/index.js +3 -3
  92. package/dist/{wasm-W3WBILBX.js → wasm-7OWFHDMS.js} +1 -1
  93. package/dist/{xhr-transport-DSTXEBFS.js → xhr-transport-RH6LDRXS.js} +1 -1
  94. package/package.json +3 -4
  95. package/src/proto/common.ts +1 -1
  96. package/src/proto/google/protobuf/descriptor.ts +1 -1
  97. package/src/proto/google/protobuf/duration.ts +1 -1
  98. package/src/proto/google/protobuf/empty.ts +1 -1
  99. package/src/proto/google/protobuf/timestamp.ts +1 -1
  100. package/src/proto/mock.ts +2 -2
  101. package/src/proto/spark.ts +271 -8
  102. package/src/proto/spark_authn.ts +2 -2
  103. package/src/proto/validate/validate.ts +1 -1
  104. package/src/services/transfer.ts +1 -0
  105. package/src/signer/signer.ts +6 -11
  106. package/src/spark-wallet/spark-wallet.ts +177 -73
  107. package/src/tests/integration/deposit.test.ts +5 -0
  108. package/src/tests/integration/ssp/static_deposit.test.ts +4 -0
  109. package/src/tests/spark-wallet/queryNodes.test.ts +89 -0
  110. package/dist/native/chunk-OVEXKBAZ.js +0 -14
@@ -40,8 +40,13 @@ var init_buffer = __esm({
40
40
  if (typeof globalThis.Buffer === "undefined") {
41
41
  globalThis.Buffer = import_buffer.Buffer;
42
42
  }
43
- if (typeof global === "undefined") {
44
- window.global = window.globalThis;
43
+ if (typeof window !== "undefined") {
44
+ if (typeof window.global === "undefined") {
45
+ window.global = window;
46
+ }
47
+ if (typeof window.globalThis === "undefined") {
48
+ window.globalThis = window;
49
+ }
45
50
  }
46
51
  }
47
52
  });
@@ -1501,7 +1506,6 @@ var NativeSparkFrost = class {
1501
1506
  init_buffer();
1502
1507
  var import_utils4 = require("@noble/curves/abstract/utils");
1503
1508
  var import_secp256k15 = require("@noble/curves/secp256k1");
1504
- var import_sha2 = require("@noble/hashes/sha2");
1505
1509
  var import_bip32 = require("@scure/bip32");
1506
1510
  var import_bip39 = require("@scure/bip39");
1507
1511
  var import_english = require("@scure/bip39/wordlists/english");
@@ -1824,7 +1828,7 @@ function getSigningCommitmentFromNonce(nonce) {
1824
1828
  var import_lrc20_sdk = require("@buildonspark/lrc20-sdk");
1825
1829
  var import_lrc20_sdk2 = require("@buildonspark/lrc20-sdk");
1826
1830
  var import_secp256k16 = require("@bitcoinerlab/secp256k1");
1827
- var bitcoin = __toESM(require("bitcoinjs-lib"), 1);
1831
+ var import_sha2 = require("@noble/hashes/sha2");
1828
1832
  var import_lrc20_sdk3 = require("@buildonspark/lrc20-sdk");
1829
1833
  var sparkFrostModule = void 0;
1830
1834
  var getSparkFrostModule = async () => {
@@ -2291,15 +2295,11 @@ var DefaultSparkSigner = class {
2291
2295
  }
2292
2296
  if (receipt) {
2293
2297
  const receiptPrivateKey = this.getReceiptPrivateKey(receipt);
2294
- const tweakedKeyPair = import_lrc20_sdk3.ECPair.fromPrivateKey(
2295
- import_buffer.Buffer.from(receiptPrivateKey)
2296
- );
2298
+ const tweakedKeyPair = (0, import_lrc20_sdk3.fromPrivateKey)(import_buffer.Buffer.from(receiptPrivateKey));
2297
2299
  psbt.signInput(input, tweakedKeyPair, sighashTypes);
2298
2300
  return psbt;
2299
2301
  }
2300
- const keypair = import_lrc20_sdk3.ECPair.fromPrivateKey(
2301
- import_buffer.Buffer.from(this.identityKey.privateKey)
2302
- );
2302
+ const keypair = (0, import_lrc20_sdk3.fromPrivateKey)(import_buffer.Buffer.from(this.identityKey.privateKey));
2303
2303
  psbt.signInput(input, keypair, sighashTypes);
2304
2304
  return psbt;
2305
2305
  }
@@ -2311,7 +2311,7 @@ var DefaultSparkSigner = class {
2311
2311
  innerKey = import_buffer.Buffer.concat([import_lrc20_sdk.PARITY, innerKey.slice(1)]);
2312
2312
  privateKey = import_buffer.Buffer.from((0, import_secp256k16.privateNegate)(privateKey));
2313
2313
  }
2314
- const pxhPubkey = bitcoin.crypto.sha256(import_buffer.Buffer.concat([pxh, innerKey]));
2314
+ const pxhPubkey = (0, import_sha2.sha256)(import_buffer.Buffer.concat([pxh, innerKey]));
2315
2315
  const receiptProof = (0, import_secp256k16.privateAdd)(privateKey, pxhPubkey);
2316
2316
  return import_buffer.Buffer.from(receiptProof);
2317
2317
  }
@@ -10455,6 +10455,203 @@ var FinalizeTransferRequest = {
10455
10455
  return message;
10456
10456
  }
10457
10457
  };
10458
+ function createBaseFinalizeTransferWithTransferPackageRequest() {
10459
+ return {
10460
+ transferId: "",
10461
+ ownerIdentityPublicKey: new Uint8Array(0),
10462
+ transferPackage: void 0,
10463
+ refundSignatures: {}
10464
+ };
10465
+ }
10466
+ var FinalizeTransferWithTransferPackageRequest = {
10467
+ encode(message, writer = new import_wire4.BinaryWriter()) {
10468
+ if (message.transferId !== "") {
10469
+ writer.uint32(10).string(message.transferId);
10470
+ }
10471
+ if (message.ownerIdentityPublicKey.length !== 0) {
10472
+ writer.uint32(18).bytes(message.ownerIdentityPublicKey);
10473
+ }
10474
+ if (message.transferPackage !== void 0) {
10475
+ TransferPackage.encode(message.transferPackage, writer.uint32(26).fork()).join();
10476
+ }
10477
+ Object.entries(message.refundSignatures).forEach(([key, value]) => {
10478
+ FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry.encode(
10479
+ { key, value },
10480
+ writer.uint32(34).fork()
10481
+ ).join();
10482
+ });
10483
+ return writer;
10484
+ },
10485
+ decode(input, length) {
10486
+ const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
10487
+ let end = length === void 0 ? reader.len : reader.pos + length;
10488
+ const message = createBaseFinalizeTransferWithTransferPackageRequest();
10489
+ while (reader.pos < end) {
10490
+ const tag = reader.uint32();
10491
+ switch (tag >>> 3) {
10492
+ case 1: {
10493
+ if (tag !== 10) {
10494
+ break;
10495
+ }
10496
+ message.transferId = reader.string();
10497
+ continue;
10498
+ }
10499
+ case 2: {
10500
+ if (tag !== 18) {
10501
+ break;
10502
+ }
10503
+ message.ownerIdentityPublicKey = reader.bytes();
10504
+ continue;
10505
+ }
10506
+ case 3: {
10507
+ if (tag !== 26) {
10508
+ break;
10509
+ }
10510
+ message.transferPackage = TransferPackage.decode(reader, reader.uint32());
10511
+ continue;
10512
+ }
10513
+ case 4: {
10514
+ if (tag !== 34) {
10515
+ break;
10516
+ }
10517
+ const entry4 = FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry.decode(
10518
+ reader,
10519
+ reader.uint32()
10520
+ );
10521
+ if (entry4.value !== void 0) {
10522
+ message.refundSignatures[entry4.key] = entry4.value;
10523
+ }
10524
+ continue;
10525
+ }
10526
+ }
10527
+ if ((tag & 7) === 4 || tag === 0) {
10528
+ break;
10529
+ }
10530
+ reader.skip(tag & 7);
10531
+ }
10532
+ return message;
10533
+ },
10534
+ fromJSON(object) {
10535
+ return {
10536
+ transferId: isSet3(object.transferId) ? globalThis.String(object.transferId) : "",
10537
+ ownerIdentityPublicKey: isSet3(object.ownerIdentityPublicKey) ? bytesFromBase642(object.ownerIdentityPublicKey) : new Uint8Array(0),
10538
+ transferPackage: isSet3(object.transferPackage) ? TransferPackage.fromJSON(object.transferPackage) : void 0,
10539
+ refundSignatures: isObject8(object.refundSignatures) ? Object.entries(object.refundSignatures).reduce((acc, [key, value]) => {
10540
+ acc[key] = bytesFromBase642(value);
10541
+ return acc;
10542
+ }, {}) : {}
10543
+ };
10544
+ },
10545
+ toJSON(message) {
10546
+ const obj = {};
10547
+ if (message.transferId !== "") {
10548
+ obj.transferId = message.transferId;
10549
+ }
10550
+ if (message.ownerIdentityPublicKey.length !== 0) {
10551
+ obj.ownerIdentityPublicKey = base64FromBytes2(message.ownerIdentityPublicKey);
10552
+ }
10553
+ if (message.transferPackage !== void 0) {
10554
+ obj.transferPackage = TransferPackage.toJSON(message.transferPackage);
10555
+ }
10556
+ if (message.refundSignatures) {
10557
+ const entries = Object.entries(message.refundSignatures);
10558
+ if (entries.length > 0) {
10559
+ obj.refundSignatures = {};
10560
+ entries.forEach(([k, v]) => {
10561
+ obj.refundSignatures[k] = base64FromBytes2(v);
10562
+ });
10563
+ }
10564
+ }
10565
+ return obj;
10566
+ },
10567
+ create(base) {
10568
+ return FinalizeTransferWithTransferPackageRequest.fromPartial(base ?? {});
10569
+ },
10570
+ fromPartial(object) {
10571
+ const message = createBaseFinalizeTransferWithTransferPackageRequest();
10572
+ message.transferId = object.transferId ?? "";
10573
+ message.ownerIdentityPublicKey = object.ownerIdentityPublicKey ?? new Uint8Array(0);
10574
+ message.transferPackage = object.transferPackage !== void 0 && object.transferPackage !== null ? TransferPackage.fromPartial(object.transferPackage) : void 0;
10575
+ message.refundSignatures = Object.entries(object.refundSignatures ?? {}).reduce(
10576
+ (acc, [key, value]) => {
10577
+ if (value !== void 0) {
10578
+ acc[key] = value;
10579
+ }
10580
+ return acc;
10581
+ },
10582
+ {}
10583
+ );
10584
+ return message;
10585
+ }
10586
+ };
10587
+ function createBaseFinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry() {
10588
+ return { key: "", value: new Uint8Array(0) };
10589
+ }
10590
+ var FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry = {
10591
+ encode(message, writer = new import_wire4.BinaryWriter()) {
10592
+ if (message.key !== "") {
10593
+ writer.uint32(10).string(message.key);
10594
+ }
10595
+ if (message.value.length !== 0) {
10596
+ writer.uint32(18).bytes(message.value);
10597
+ }
10598
+ return writer;
10599
+ },
10600
+ decode(input, length) {
10601
+ const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
10602
+ let end = length === void 0 ? reader.len : reader.pos + length;
10603
+ const message = createBaseFinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry();
10604
+ while (reader.pos < end) {
10605
+ const tag = reader.uint32();
10606
+ switch (tag >>> 3) {
10607
+ case 1: {
10608
+ if (tag !== 10) {
10609
+ break;
10610
+ }
10611
+ message.key = reader.string();
10612
+ continue;
10613
+ }
10614
+ case 2: {
10615
+ if (tag !== 18) {
10616
+ break;
10617
+ }
10618
+ message.value = reader.bytes();
10619
+ continue;
10620
+ }
10621
+ }
10622
+ if ((tag & 7) === 4 || tag === 0) {
10623
+ break;
10624
+ }
10625
+ reader.skip(tag & 7);
10626
+ }
10627
+ return message;
10628
+ },
10629
+ fromJSON(object) {
10630
+ return {
10631
+ key: isSet3(object.key) ? globalThis.String(object.key) : "",
10632
+ value: isSet3(object.value) ? bytesFromBase642(object.value) : new Uint8Array(0)
10633
+ };
10634
+ },
10635
+ toJSON(message) {
10636
+ const obj = {};
10637
+ if (message.key !== "") {
10638
+ obj.key = message.key;
10639
+ }
10640
+ if (message.value.length !== 0) {
10641
+ obj.value = base64FromBytes2(message.value);
10642
+ }
10643
+ return obj;
10644
+ },
10645
+ create(base) {
10646
+ return FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry.fromPartial(base ?? {});
10647
+ },
10648
+ fromPartial(object) {
10649
+ const message = createBaseFinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry();
10650
+ message.key = object.key ?? "";
10651
+ message.value = object.value ?? new Uint8Array(0);
10652
+ return message;
10653
+ }
10654
+ };
10458
10655
  function createBaseFinalizeTransferResponse() {
10459
10656
  return { transfer: void 0 };
10460
10657
  }
@@ -15737,7 +15934,7 @@ var InitiateUtxoSwapRequest = {
15737
15934
  writer.uint32(50).bytes(message.userSignature);
15738
15935
  }
15739
15936
  if (message.transfer !== void 0) {
15740
- StartUserSignedTransferRequest.encode(message.transfer, writer.uint32(58).fork()).join();
15937
+ StartTransferRequest.encode(message.transfer, writer.uint32(58).fork()).join();
15741
15938
  }
15742
15939
  if (message.spendTxSigningJob !== void 0) {
15743
15940
  SigningJob.encode(message.spendTxSigningJob, writer.uint32(66).fork()).join();
@@ -15797,7 +15994,7 @@ var InitiateUtxoSwapRequest = {
15797
15994
  if (tag !== 58) {
15798
15995
  break;
15799
15996
  }
15800
- message.transfer = StartUserSignedTransferRequest.decode(reader, reader.uint32());
15997
+ message.transfer = StartTransferRequest.decode(reader, reader.uint32());
15801
15998
  continue;
15802
15999
  }
15803
16000
  case 8: {
@@ -15822,7 +16019,7 @@ var InitiateUtxoSwapRequest = {
15822
16019
  amount: isSet3(object.creditAmountSats) ? { $case: "creditAmountSats", creditAmountSats: globalThis.Number(object.creditAmountSats) } : isSet3(object.maxFeeSats) ? { $case: "maxFeeSats", maxFeeSats: globalThis.Number(object.maxFeeSats) } : void 0,
15823
16020
  sspSignature: isSet3(object.sspSignature) ? bytesFromBase642(object.sspSignature) : new Uint8Array(0),
15824
16021
  userSignature: isSet3(object.userSignature) ? bytesFromBase642(object.userSignature) : new Uint8Array(0),
15825
- transfer: isSet3(object.transfer) ? StartUserSignedTransferRequest.fromJSON(object.transfer) : void 0,
16022
+ transfer: isSet3(object.transfer) ? StartTransferRequest.fromJSON(object.transfer) : void 0,
15826
16023
  spendTxSigningJob: isSet3(object.spendTxSigningJob) ? SigningJob.fromJSON(object.spendTxSigningJob) : void 0
15827
16024
  };
15828
16025
  },
@@ -15846,7 +16043,7 @@ var InitiateUtxoSwapRequest = {
15846
16043
  obj.userSignature = base64FromBytes2(message.userSignature);
15847
16044
  }
15848
16045
  if (message.transfer !== void 0) {
15849
- obj.transfer = StartUserSignedTransferRequest.toJSON(message.transfer);
16046
+ obj.transfer = StartTransferRequest.toJSON(message.transfer);
15850
16047
  }
15851
16048
  if (message.spendTxSigningJob !== void 0) {
15852
16049
  obj.spendTxSigningJob = SigningJob.toJSON(message.spendTxSigningJob);
@@ -15876,7 +16073,7 @@ var InitiateUtxoSwapRequest = {
15876
16073
  }
15877
16074
  message.sspSignature = object.sspSignature ?? new Uint8Array(0);
15878
16075
  message.userSignature = object.userSignature ?? new Uint8Array(0);
15879
- message.transfer = object.transfer !== void 0 && object.transfer !== null ? StartUserSignedTransferRequest.fromPartial(object.transfer) : void 0;
16076
+ message.transfer = object.transfer !== void 0 && object.transfer !== null ? StartTransferRequest.fromPartial(object.transfer) : void 0;
15880
16077
  message.spendTxSigningJob = object.spendTxSigningJob !== void 0 && object.spendTxSigningJob !== null ? SigningJob.fromPartial(object.spendTxSigningJob) : void 0;
15881
16078
  return message;
15882
16079
  }
@@ -16851,6 +17048,14 @@ var SparkServiceDefinition = {
16851
17048
  responseStream: false,
16852
17049
  options: {}
16853
17050
  },
17051
+ finalize_transfer_with_transfer_package: {
17052
+ name: "finalize_transfer_with_transfer_package",
17053
+ requestType: FinalizeTransferWithTransferPackageRequest,
17054
+ requestStream: false,
17055
+ responseType: FinalizeTransferResponse,
17056
+ responseStream: false,
17057
+ options: {}
17058
+ },
16854
17059
  cancel_transfer: {
16855
17060
  name: "cancel_transfer",
16856
17061
  requestType: CancelTransferRequest,
@@ -17222,7 +17427,7 @@ init_buffer();
17222
17427
  init_buffer();
17223
17428
  var import_lrc20_sdk4 = require("@buildonspark/lrc20-sdk");
17224
17429
  var btc = __toESM(require("@scure/btc-signer"), 1);
17225
- var bitcoin2 = __toESM(require("bitcoinjs-lib"), 1);
17430
+ var bitcoin = __toESM(require("bitcoinjs-lib"), 1);
17226
17431
  var Network2 = /* @__PURE__ */ ((Network5) => {
17227
17432
  Network5[Network5["MAINNET"] = 0] = "MAINNET";
17228
17433
  Network5[Network5["TESTNET"] = 1] = "TESTNET";
@@ -17247,11 +17452,11 @@ var NetworkConfig = {
17247
17452
  };
17248
17453
  var getNetwork = (network) => NetworkConfig[network];
17249
17454
  var LRC_WALLET_NETWORK = Object.freeze({
17250
- [0 /* MAINNET */]: bitcoin2.networks.bitcoin,
17251
- [1 /* TESTNET */]: bitcoin2.networks.testnet,
17252
- [2 /* SIGNET */]: bitcoin2.networks.testnet,
17253
- [3 /* REGTEST */]: bitcoin2.networks.regtest,
17254
- [4 /* LOCAL */]: bitcoin2.networks.regtest
17455
+ [0 /* MAINNET */]: bitcoin.networks.bitcoin,
17456
+ [1 /* TESTNET */]: bitcoin.networks.testnet,
17457
+ [2 /* SIGNET */]: bitcoin.networks.testnet,
17458
+ [3 /* REGTEST */]: bitcoin.networks.regtest,
17459
+ [4 /* LOCAL */]: bitcoin.networks.regtest
17255
17460
  });
17256
17461
  var LRC_WALLET_NETWORK_TYPE = Object.freeze({
17257
17462
  [0 /* MAINNET */]: import_lrc20_sdk4.NetworkType.MAINNET,
@@ -17262,7 +17467,7 @@ var LRC_WALLET_NETWORK_TYPE = Object.freeze({
17262
17467
  });
17263
17468
  function getNetworkFromAddress(address2) {
17264
17469
  try {
17265
- const decoded = bitcoin2.address.fromBech32(address2);
17470
+ const decoded = bitcoin.address.fromBech32(address2);
17266
17471
  if (decoded.prefix === "bc") {
17267
17472
  return "MAINNET" /* MAINNET */;
17268
17473
  } else if (decoded.prefix === "bcrt") {
@@ -19309,7 +19514,8 @@ var TransferService = class extends BaseTransferService {
19309
19514
  types: [
19310
19515
  2 /* TRANSFER */,
19311
19516
  0 /* PREIMAGE_SWAP */,
19312
- 1 /* COOPERATIVE_EXIT */
19517
+ 1 /* COOPERATIVE_EXIT */,
19518
+ 3 /* UTXO_SWAP */
19313
19519
  ],
19314
19520
  network: NetworkToProto[this.config.getNetwork()]
19315
19521
  });
@@ -20637,7 +20843,7 @@ function verifySignature(words, prefix) {
20637
20843
  }
20638
20844
 
20639
20845
  // src/services/lightning.ts
20640
- var crypto3 = getCrypto();
20846
+ var crypto2 = getCrypto();
20641
20847
  var LightningService = class {
20642
20848
  config;
20643
20849
  connectionManager;
@@ -20654,7 +20860,7 @@ var LightningService = class {
20654
20860
  receiverIdentityPubkey,
20655
20861
  descriptionHash
20656
20862
  }) {
20657
- const randBytes = crypto3.getRandomValues(new Uint8Array(32));
20863
+ const randBytes = crypto2.getRandomValues(new Uint8Array(32));
20658
20864
  const preimage = (0, import_utils11.numberToBytesBE)(
20659
20865
  (0, import_utils11.bytesToNumberBE)(randBytes) % import_secp256k111.secp256k1.CURVE.n,
20660
20866
  32
@@ -26370,7 +26576,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26370
26576
  if (event?.$case === "transfer" && event.transfer.transfer && event.transfer.transfer.type !== 40 /* COUNTER_SWAP */) {
26371
26577
  const { senderIdentityPublicKey, receiverIdentityPublicKey } = event.transfer.transfer;
26372
26578
  if (event.transfer.transfer && !(0, import_utils21.equalBytes)(senderIdentityPublicKey, receiverIdentityPublicKey)) {
26373
- await this.claimTransfer(event.transfer.transfer, true);
26579
+ await this.claimTransfer({
26580
+ transfer: event.transfer.transfer,
26581
+ emit: true,
26582
+ optimize: true
26583
+ });
26374
26584
  }
26375
26585
  } else if (event?.$case === "deposit" && event.deposit.deposit) {
26376
26586
  const deposit = event.deposit.deposit;
@@ -26496,10 +26706,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26496
26706
  }
26497
26707
  }
26498
26708
  async getLeaves(isBalanceCheck = false) {
26499
- const sparkClient = await this.connectionManager.createSparkClient(
26500
- this.config.getCoordinatorAddress()
26501
- );
26502
- const leaves = await sparkClient.query_nodes({
26709
+ const leaves = await this.queryNodes({
26503
26710
  source: {
26504
26711
  $case: "ownerIdentityPubkey",
26505
26712
  ownerIdentityPubkey: await this.config.signer.getIdentityPublicKey()
@@ -26513,17 +26720,17 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26513
26720
  this.config.getSigningOperators()
26514
26721
  )) {
26515
26722
  if (id !== this.config.getCoordinatorIdentifier()) {
26516
- const client = await this.connectionManager.createSparkClient(
26723
+ const operatorLeaves = await this.queryNodes(
26724
+ {
26725
+ source: {
26726
+ $case: "ownerIdentityPubkey",
26727
+ ownerIdentityPubkey: await this.config.signer.getIdentityPublicKey()
26728
+ },
26729
+ includeParents: false,
26730
+ network: NetworkToProto[this.config.getNetwork()]
26731
+ },
26517
26732
  operator.address
26518
26733
  );
26519
- const operatorLeaves = await client.query_nodes({
26520
- source: {
26521
- $case: "ownerIdentityPubkey",
26522
- ownerIdentityPubkey: await this.config.signer.getIdentityPublicKey()
26523
- },
26524
- includeParents: false,
26525
- network: NetworkToProto[this.config.getNetwork()]
26526
- });
26527
26734
  for (const [nodeId, leaf] of Object.entries(leaves.nodes)) {
26528
26735
  const operatorLeaf = operatorLeaves.nodes[nodeId];
26529
26736
  if (!operatorLeaf) {
@@ -26652,10 +26859,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26652
26859
  }
26653
26860
  async syncWallet() {
26654
26861
  await this.syncTokenOutputs();
26655
- this.leaves = await this.getLeaves();
26656
- await this.config.signer.restoreSigningKeysFromLeafs(this.leaves);
26657
- await this.checkRefreshTimelockNodes();
26658
- await this.checkExtendTimeLockNodes();
26862
+ let leaves = await this.getLeaves();
26863
+ await this.config.signer.restoreSigningKeysFromLeafs(leaves);
26864
+ leaves = await this.checkRefreshTimelockNodes(leaves);
26865
+ leaves = await this.checkExtendTimeLockNodes(leaves);
26866
+ this.leaves = leaves;
26659
26867
  this.optimizeLeaves().catch((e) => {
26660
26868
  console.error("Failed to optimize leaves", e);
26661
26869
  });
@@ -26799,11 +27007,6 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26799
27007
  expected: "smaller or equal to " + Number.MAX_SAFE_INTEGER
26800
27008
  });
26801
27009
  }
26802
- try {
26803
- await this.claimTransfers();
26804
- } catch (e) {
26805
- console.warn("Unabled to claim transfers.");
26806
- }
26807
27010
  let leavesToSwap;
26808
27011
  if (targetAmount && leaves && leaves.length > 0) {
26809
27012
  if (targetAmount < leaves.reduce((acc, leaf) => acc + leaf.value, 0)) {
@@ -26902,10 +27105,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26902
27105
  if (!request) {
26903
27106
  throw new Error("Failed to request leaves swap. No response returned.");
26904
27107
  }
26905
- const sparkClient = await this.connectionManager.createSparkClient(
26906
- this.config.getCoordinatorAddress()
26907
- );
26908
- const nodes = await sparkClient.query_nodes({
27108
+ const nodes = await this.queryNodes({
26909
27109
  source: {
26910
27110
  $case: "nodeIds",
26911
27111
  nodeIds: {
@@ -27076,7 +27276,20 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27076
27276
  * @returns {Promise<string>} A Bitcoin address for depositing funds
27077
27277
  */
27078
27278
  async getStaticDepositAddress() {
27079
- return await this.generateDepositAddress(true);
27279
+ try {
27280
+ return await this.generateDepositAddress(true);
27281
+ } catch (error) {
27282
+ if (error.message?.includes("static deposit address already exists")) {
27283
+ const existingAddresses = await this.queryStaticDepositAddresses();
27284
+ if (existingAddresses.length > 0 && existingAddresses[0]) {
27285
+ return existingAddresses[0];
27286
+ } else {
27287
+ throw error;
27288
+ }
27289
+ } else {
27290
+ throw error;
27291
+ }
27292
+ }
27080
27293
  }
27081
27294
  /**
27082
27295
  * Generates a deposit address for receiving funds.
@@ -27659,7 +27872,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27659
27872
  const pendingTransfer = await this.transferService.queryTransfer(
27660
27873
  transfer.id
27661
27874
  );
27662
- const resultNodes = !pendingTransfer ? [] : await this.claimTransfer(pendingTransfer);
27875
+ const resultNodes = !pendingTransfer ? [] : await this.claimTransfer({ transfer: pendingTransfer });
27663
27876
  const leavesToRemove = new Set(leaves.map((leaf) => leaf.id));
27664
27877
  this.leaves = [
27665
27878
  ...this.leaves.filter((leaf) => !leavesToRemove.has(leaf.id)),
@@ -27709,7 +27922,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27709
27922
  );
27710
27923
  return await this.withLeaves(async () => {
27711
27924
  let leavesToSend = await this.selectLeaves(amountSats);
27712
- await this.checkRefreshTimelockNodes(leavesToSend);
27925
+ leavesToSend = await this.checkRefreshTimelockNodes(leavesToSend);
27713
27926
  leavesToSend = await this.checkExtendTimeLockNodes(leavesToSend);
27714
27927
  const leafKeyTweaks = await Promise.all(
27715
27928
  leavesToSend.map(async (leaf) => ({
@@ -27730,7 +27943,10 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27730
27943
  const transactionId = transfer.id;
27731
27944
  const pendingTransfer = await this.transferService.queryTransfer(transactionId);
27732
27945
  if (pendingTransfer) {
27733
- await this.claimTransfer(pendingTransfer);
27946
+ await this.claimTransfer({
27947
+ transfer: pendingTransfer,
27948
+ optimize: true
27949
+ });
27734
27950
  }
27735
27951
  }
27736
27952
  return mapTransferToWalletTransfer(
@@ -27740,11 +27956,10 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27740
27956
  });
27741
27957
  }
27742
27958
  async checkExtendTimeLockNodes(nodes) {
27743
- const nodesToCheck = nodes ?? this.leaves;
27744
27959
  const nodesToExtend = [];
27745
27960
  const nodeIds = [];
27746
- let resultNodes = [...nodesToCheck];
27747
- for (const node of nodesToCheck) {
27961
+ const validNodes = [];
27962
+ for (const node of nodes) {
27748
27963
  const nodeTx = getTxFromRawTxBytes(node.nodeTx);
27749
27964
  const { needRefresh } = getNextTransactionSequence(
27750
27965
  nodeTx.getInput(0).sequence
@@ -27752,9 +27967,14 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27752
27967
  if (needRefresh) {
27753
27968
  nodesToExtend.push(node);
27754
27969
  nodeIds.push(node.id);
27970
+ } else {
27971
+ validNodes.push(node);
27755
27972
  }
27756
27973
  }
27757
- resultNodes = resultNodes.filter((node) => !nodesToExtend.includes(node));
27974
+ if (nodesToExtend.length === 0) {
27975
+ return validNodes;
27976
+ }
27977
+ const nodesToAdd = [];
27758
27978
  for (const node of nodesToExtend) {
27759
27979
  const signingPubKey = await this.config.signer.generatePublicKey(
27760
27980
  (0, import_sha213.sha256)(node.id)
@@ -27765,9 +27985,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27765
27985
  );
27766
27986
  this.leaves = this.leaves.filter((leaf) => leaf.id !== node.id);
27767
27987
  const newNodes = await this.transferLeavesToSelf(nodes2, signingPubKey);
27768
- resultNodes.push(...newNodes);
27988
+ nodesToAdd.push(...newNodes);
27769
27989
  }
27770
- return resultNodes;
27990
+ this.updateLeaves(nodeIds, nodesToAdd);
27991
+ validNodes.push(...nodesToAdd);
27992
+ return validNodes;
27771
27993
  }
27772
27994
  /**
27773
27995
  * Internal method to refresh timelock nodes.
@@ -27779,7 +28001,8 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27779
28001
  async checkRefreshTimelockNodes(nodes) {
27780
28002
  const nodesToRefresh = [];
27781
28003
  const nodeIds = [];
27782
- for (const node of nodes ?? this.leaves) {
28004
+ const validNodes = [];
28005
+ for (const node of nodes) {
27783
28006
  const refundTx = getTxFromRawTxBytes(node.refundTx);
27784
28007
  const { needRefresh } = getNextTransactionSequence(
27785
28008
  refundTx.getInput(0).sequence,
@@ -27788,15 +28011,14 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27788
28011
  if (needRefresh) {
27789
28012
  nodesToRefresh.push(node);
27790
28013
  nodeIds.push(node.id);
28014
+ } else {
28015
+ validNodes.push(node);
27791
28016
  }
27792
28017
  }
27793
28018
  if (nodesToRefresh.length === 0) {
27794
- return;
28019
+ return validNodes;
27795
28020
  }
27796
- const sparkClient = await this.connectionManager.createSparkClient(
27797
- this.config.getCoordinatorAddress()
27798
- );
27799
- const nodesResp = await sparkClient.query_nodes({
28021
+ const nodesResp = await this.queryNodes({
27800
28022
  source: {
27801
28023
  $case: "nodeIds",
27802
28024
  nodeIds: {
@@ -27810,6 +28032,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27810
28032
  for (const node of Object.values(nodesResp.nodes)) {
27811
28033
  nodesMap.set(node.id, node);
27812
28034
  }
28035
+ const nodesToAdd = [];
27813
28036
  for (const node of nodesToRefresh) {
27814
28037
  if (!node.parentNodeId) {
27815
28038
  throw new Error(`node ${node.id} has no parent`);
@@ -27830,9 +28053,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27830
28053
  if (!newNode) {
27831
28054
  throw new Error("Failed to refresh timelock node");
27832
28055
  }
27833
- this.leaves = this.leaves.filter((leaf) => leaf.id !== node.id);
27834
- this.leaves.push(newNode);
28056
+ nodesToAdd.push(newNode);
27835
28057
  }
28058
+ this.updateLeaves(nodeIds, nodesToAdd);
28059
+ validNodes.push(...nodesToAdd);
28060
+ return validNodes;
27836
28061
  }
27837
28062
  /**
27838
28063
  * Claims a specific transfer.
@@ -27840,11 +28065,16 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27840
28065
  * @param {Transfer} transfer - The transfer to claim
27841
28066
  * @returns {Promise<Object>} The claim result
27842
28067
  */
27843
- async claimTransfer(transfer, emit = false, retryCount = 0) {
28068
+ async claimTransfer({
28069
+ transfer,
28070
+ emit,
28071
+ retryCount,
28072
+ optimize
28073
+ }) {
27844
28074
  const MAX_RETRIES = 5;
27845
28075
  const BASE_DELAY_MS = 1e3;
27846
28076
  const MAX_DELAY_MS = 1e4;
27847
- if (retryCount > 0) {
28077
+ if (retryCount && retryCount > 0) {
27848
28078
  const delayMs = Math.min(
27849
28079
  BASE_DELAY_MS * Math.pow(2, retryCount - 1),
27850
28080
  MAX_DELAY_MS
@@ -27860,7 +28090,10 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27860
28090
  const leafPubKey = leafPubKeyMap.get(leaf.leaf.id);
27861
28091
  if (leafPubKey) {
27862
28092
  leavesToClaim.push({
27863
- leaf: leaf.leaf,
28093
+ leaf: {
28094
+ ...leaf.leaf,
28095
+ refundTx: leaf.intermediateRefundTx
28096
+ },
27864
28097
  signingPubKey: leafPubKey,
27865
28098
  newSigningPubKey: await this.config.signer.generatePublicKey(
27866
28099
  (0, import_sha213.sha256)(leaf.leaf.id)
@@ -27873,7 +28106,6 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27873
28106
  transfer,
27874
28107
  leavesToClaim
27875
28108
  );
27876
- this.leaves.push(...response.nodes);
27877
28109
  if (emit) {
27878
28110
  this.emit(
27879
28111
  "transfer:claimed",
@@ -27883,14 +28115,25 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27883
28115
  }
27884
28116
  return response.nodes;
27885
28117
  });
27886
- await this.checkRefreshTimelockNodes(result);
28118
+ result = await this.checkRefreshTimelockNodes(result);
27887
28119
  result = await this.checkExtendTimeLockNodes(result);
28120
+ const existingIds = new Set(this.leaves.map((leaf) => leaf.id));
28121
+ const uniqueResults = result.filter((node) => !existingIds.has(node.id));
28122
+ this.leaves.push(...uniqueResults);
28123
+ if (optimize && transfer.type !== 40 /* COUNTER_SWAP */) {
28124
+ await this.optimizeLeaves();
28125
+ }
27888
28126
  return result;
27889
28127
  } catch (error) {
27890
- if (retryCount < MAX_RETRIES) {
27891
- this.claimTransfer(transfer, emit, retryCount + 1);
28128
+ if (retryCount && retryCount < MAX_RETRIES) {
28129
+ this.claimTransfer({
28130
+ transfer,
28131
+ emit,
28132
+ retryCount: retryCount + 1,
28133
+ optimize
28134
+ });
27892
28135
  return [];
27893
- } else if (retryCount > 0) {
28136
+ } else if (retryCount) {
27894
28137
  console.warn(
27895
28138
  "Failed to claim transfer. Please try reinitializing your wallet in a few minutes. Transfer ID: " + transfer.id,
27896
28139
  error
@@ -27925,7 +28168,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27925
28168
  continue;
27926
28169
  }
27927
28170
  promises.push(
27928
- this.claimTransfer(transfer, emit).then(() => transfer.id).catch((error) => {
28171
+ this.claimTransfer({ transfer, emit, optimize: true }).then(() => transfer.id).catch((error) => {
27929
28172
  console.warn(`Failed to claim transfer ${transfer.id}:`, error);
27930
28173
  return null;
27931
28174
  })
@@ -27960,11 +28203,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27960
28203
  *
27961
28204
  * @param {Object} params - Parameters for the lightning invoice
27962
28205
  * @param {number} params.amountSats - Amount in satoshis
27963
- * @param {string} params.memo - Description for the invoice
28206
+ * @param {string} [params.memo] - Description for the invoice. Should not be provided if the descriptionHash is provided.
27964
28207
  * @param {number} [params.expirySeconds] - Optional expiry time in seconds
27965
28208
  * @param {boolean} [params.includeSparkAddress] - Optional boolean signalling whether or not to include the spark address in the invoice
27966
28209
  * @param {string} [params.receiverIdentityPubkey] - Optional public key of the wallet receiving the lightning invoice. If not present, the receiver will be the creator of this request.
27967
- * @param {string} [params.descriptionHash] - Optional h tag of the invoice. This is the hash of a longer description to include in the lightning invoice. It is used in LNURL and UMA as the hash of the metadata.
28210
+ * @param {string} [params.descriptionHash] - Optional h tag of the invoice. This is the hash of a longer description to include in the lightning invoice. It is used in LNURL and UMA as the hash of the metadata. This field is mutually exclusive with the memo field. Only one or the other should be provided.
27968
28211
  * @returns {Promise<LightningReceiveRequest>} BOLT11 encoded invoice
27969
28212
  */
27970
28213
  async createLightningInvoice({
@@ -28011,6 +28254,16 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28011
28254
  expected: "Memo size within limits"
28012
28255
  });
28013
28256
  }
28257
+ if (memo && descriptionHash) {
28258
+ throw new ValidationError(
28259
+ "Memo and descriptionHash cannot be provided together. Please provide only one.",
28260
+ {
28261
+ field: "memo",
28262
+ value: memo,
28263
+ expected: "Memo or descriptionHash"
28264
+ }
28265
+ );
28266
+ }
28014
28267
  const requestLightningInvoice = async (amountSats2, paymentHash, memo2, receiverIdentityPubkey2, descriptionHash2) => {
28015
28268
  const network = this.config.getNetwork();
28016
28269
  let bitcoinNetwork = BitcoinNetwork_default.REGTEST;
@@ -28146,7 +28399,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28146
28399
  });
28147
28400
  }
28148
28401
  let leaves = await this.selectLeaves(totalAmount);
28149
- await this.checkRefreshTimelockNodes(leaves);
28402
+ leaves = await this.checkRefreshTimelockNodes(leaves);
28150
28403
  leaves = await this.checkExtendTimeLockNodes(leaves);
28151
28404
  const leavesToSend = await Promise.all(
28152
28405
  leaves.map(async (leaf) => ({
@@ -28327,7 +28580,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28327
28580
  );
28328
28581
  }
28329
28582
  }
28330
- await this.checkRefreshTimelockNodes(leavesToSend);
28583
+ leavesToSend = await this.checkRefreshTimelockNodes(leavesToSend);
28331
28584
  leavesToSend = await this.checkExtendTimeLockNodes(leavesToSend);
28332
28585
  const leafKeyTweaks = await Promise.all(
28333
28586
  leavesToSend.map(async (leaf) => ({
@@ -28397,7 +28650,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28397
28650
  });
28398
28651
  }
28399
28652
  let leaves = await this.selectLeaves(amountSats);
28400
- await this.checkRefreshTimelockNodes(leaves);
28653
+ leaves = await this.checkRefreshTimelockNodes(leaves);
28401
28654
  leaves = await this.checkExtendTimeLockNodes(leaves);
28402
28655
  const feeEstimate = await sspClient.getCoopExitFeeEstimate({
28403
28656
  leafExternalIds: leaves.map((leaf) => leaf.id),
@@ -28631,6 +28884,33 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28631
28884
  }
28632
28885
  }, 1e4);
28633
28886
  }
28887
+ async updateLeaves(leavesToRemove, leavesToAdd) {
28888
+ const leavesToRemoveSet = new Set(leavesToRemove);
28889
+ this.leaves = this.leaves.filter((leaf) => !leavesToRemoveSet.has(leaf.id));
28890
+ this.leaves.push(...leavesToAdd);
28891
+ }
28892
+ async queryNodes(baseRequest, sparkClientAddress, pageSize = 100) {
28893
+ const address2 = sparkClientAddress ?? this.config.getCoordinatorAddress();
28894
+ const aggregatedNodes = {};
28895
+ let offset = 0;
28896
+ while (true) {
28897
+ const sparkClient = await this.connectionManager.createSparkClient(address2);
28898
+ const response = await sparkClient.query_nodes({
28899
+ ...baseRequest,
28900
+ limit: pageSize,
28901
+ offset
28902
+ });
28903
+ Object.assign(aggregatedNodes, response.nodes ?? {});
28904
+ const received = Object.keys(response.nodes ?? {}).length;
28905
+ if (received < pageSize) {
28906
+ return {
28907
+ nodes: aggregatedNodes,
28908
+ offset: response.offset
28909
+ };
28910
+ }
28911
+ offset += pageSize;
28912
+ }
28913
+ }
28634
28914
  };
28635
28915
 
28636
28916
  // src/utils/mempool.ts