@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
package/dist/index.cjs CHANGED
@@ -39,8 +39,13 @@ var init_buffer = __esm({
39
39
  if (typeof globalThis.Buffer === "undefined") {
40
40
  globalThis.Buffer = import_buffer.Buffer;
41
41
  }
42
- if (typeof global === "undefined") {
43
- window.global = window.globalThis;
42
+ if (typeof window !== "undefined") {
43
+ if (typeof window.global === "undefined") {
44
+ window.global = window;
45
+ }
46
+ if (typeof window.globalThis === "undefined") {
47
+ window.globalThis = window;
48
+ }
44
49
  }
45
50
  }
46
51
  });
@@ -9510,6 +9515,203 @@ var FinalizeTransferRequest = {
9510
9515
  return message;
9511
9516
  }
9512
9517
  };
9518
+ function createBaseFinalizeTransferWithTransferPackageRequest() {
9519
+ return {
9520
+ transferId: "",
9521
+ ownerIdentityPublicKey: new Uint8Array(0),
9522
+ transferPackage: void 0,
9523
+ refundSignatures: {}
9524
+ };
9525
+ }
9526
+ var FinalizeTransferWithTransferPackageRequest = {
9527
+ encode(message, writer = new import_wire4.BinaryWriter()) {
9528
+ if (message.transferId !== "") {
9529
+ writer.uint32(10).string(message.transferId);
9530
+ }
9531
+ if (message.ownerIdentityPublicKey.length !== 0) {
9532
+ writer.uint32(18).bytes(message.ownerIdentityPublicKey);
9533
+ }
9534
+ if (message.transferPackage !== void 0) {
9535
+ TransferPackage.encode(message.transferPackage, writer.uint32(26).fork()).join();
9536
+ }
9537
+ Object.entries(message.refundSignatures).forEach(([key, value]) => {
9538
+ FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry.encode(
9539
+ { key, value },
9540
+ writer.uint32(34).fork()
9541
+ ).join();
9542
+ });
9543
+ return writer;
9544
+ },
9545
+ decode(input, length) {
9546
+ const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
9547
+ let end = length === void 0 ? reader.len : reader.pos + length;
9548
+ const message = createBaseFinalizeTransferWithTransferPackageRequest();
9549
+ while (reader.pos < end) {
9550
+ const tag = reader.uint32();
9551
+ switch (tag >>> 3) {
9552
+ case 1: {
9553
+ if (tag !== 10) {
9554
+ break;
9555
+ }
9556
+ message.transferId = reader.string();
9557
+ continue;
9558
+ }
9559
+ case 2: {
9560
+ if (tag !== 18) {
9561
+ break;
9562
+ }
9563
+ message.ownerIdentityPublicKey = reader.bytes();
9564
+ continue;
9565
+ }
9566
+ case 3: {
9567
+ if (tag !== 26) {
9568
+ break;
9569
+ }
9570
+ message.transferPackage = TransferPackage.decode(reader, reader.uint32());
9571
+ continue;
9572
+ }
9573
+ case 4: {
9574
+ if (tag !== 34) {
9575
+ break;
9576
+ }
9577
+ const entry4 = FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry.decode(
9578
+ reader,
9579
+ reader.uint32()
9580
+ );
9581
+ if (entry4.value !== void 0) {
9582
+ message.refundSignatures[entry4.key] = entry4.value;
9583
+ }
9584
+ continue;
9585
+ }
9586
+ }
9587
+ if ((tag & 7) === 4 || tag === 0) {
9588
+ break;
9589
+ }
9590
+ reader.skip(tag & 7);
9591
+ }
9592
+ return message;
9593
+ },
9594
+ fromJSON(object) {
9595
+ return {
9596
+ transferId: isSet3(object.transferId) ? globalThis.String(object.transferId) : "",
9597
+ ownerIdentityPublicKey: isSet3(object.ownerIdentityPublicKey) ? bytesFromBase642(object.ownerIdentityPublicKey) : new Uint8Array(0),
9598
+ transferPackage: isSet3(object.transferPackage) ? TransferPackage.fromJSON(object.transferPackage) : void 0,
9599
+ refundSignatures: isObject8(object.refundSignatures) ? Object.entries(object.refundSignatures).reduce((acc, [key, value]) => {
9600
+ acc[key] = bytesFromBase642(value);
9601
+ return acc;
9602
+ }, {}) : {}
9603
+ };
9604
+ },
9605
+ toJSON(message) {
9606
+ const obj = {};
9607
+ if (message.transferId !== "") {
9608
+ obj.transferId = message.transferId;
9609
+ }
9610
+ if (message.ownerIdentityPublicKey.length !== 0) {
9611
+ obj.ownerIdentityPublicKey = base64FromBytes2(message.ownerIdentityPublicKey);
9612
+ }
9613
+ if (message.transferPackage !== void 0) {
9614
+ obj.transferPackage = TransferPackage.toJSON(message.transferPackage);
9615
+ }
9616
+ if (message.refundSignatures) {
9617
+ const entries = Object.entries(message.refundSignatures);
9618
+ if (entries.length > 0) {
9619
+ obj.refundSignatures = {};
9620
+ entries.forEach(([k, v]) => {
9621
+ obj.refundSignatures[k] = base64FromBytes2(v);
9622
+ });
9623
+ }
9624
+ }
9625
+ return obj;
9626
+ },
9627
+ create(base) {
9628
+ return FinalizeTransferWithTransferPackageRequest.fromPartial(base ?? {});
9629
+ },
9630
+ fromPartial(object) {
9631
+ const message = createBaseFinalizeTransferWithTransferPackageRequest();
9632
+ message.transferId = object.transferId ?? "";
9633
+ message.ownerIdentityPublicKey = object.ownerIdentityPublicKey ?? new Uint8Array(0);
9634
+ message.transferPackage = object.transferPackage !== void 0 && object.transferPackage !== null ? TransferPackage.fromPartial(object.transferPackage) : void 0;
9635
+ message.refundSignatures = Object.entries(object.refundSignatures ?? {}).reduce(
9636
+ (acc, [key, value]) => {
9637
+ if (value !== void 0) {
9638
+ acc[key] = value;
9639
+ }
9640
+ return acc;
9641
+ },
9642
+ {}
9643
+ );
9644
+ return message;
9645
+ }
9646
+ };
9647
+ function createBaseFinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry() {
9648
+ return { key: "", value: new Uint8Array(0) };
9649
+ }
9650
+ var FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry = {
9651
+ encode(message, writer = new import_wire4.BinaryWriter()) {
9652
+ if (message.key !== "") {
9653
+ writer.uint32(10).string(message.key);
9654
+ }
9655
+ if (message.value.length !== 0) {
9656
+ writer.uint32(18).bytes(message.value);
9657
+ }
9658
+ return writer;
9659
+ },
9660
+ decode(input, length) {
9661
+ const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
9662
+ let end = length === void 0 ? reader.len : reader.pos + length;
9663
+ const message = createBaseFinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry();
9664
+ while (reader.pos < end) {
9665
+ const tag = reader.uint32();
9666
+ switch (tag >>> 3) {
9667
+ case 1: {
9668
+ if (tag !== 10) {
9669
+ break;
9670
+ }
9671
+ message.key = reader.string();
9672
+ continue;
9673
+ }
9674
+ case 2: {
9675
+ if (tag !== 18) {
9676
+ break;
9677
+ }
9678
+ message.value = reader.bytes();
9679
+ continue;
9680
+ }
9681
+ }
9682
+ if ((tag & 7) === 4 || tag === 0) {
9683
+ break;
9684
+ }
9685
+ reader.skip(tag & 7);
9686
+ }
9687
+ return message;
9688
+ },
9689
+ fromJSON(object) {
9690
+ return {
9691
+ key: isSet3(object.key) ? globalThis.String(object.key) : "",
9692
+ value: isSet3(object.value) ? bytesFromBase642(object.value) : new Uint8Array(0)
9693
+ };
9694
+ },
9695
+ toJSON(message) {
9696
+ const obj = {};
9697
+ if (message.key !== "") {
9698
+ obj.key = message.key;
9699
+ }
9700
+ if (message.value.length !== 0) {
9701
+ obj.value = base64FromBytes2(message.value);
9702
+ }
9703
+ return obj;
9704
+ },
9705
+ create(base) {
9706
+ return FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry.fromPartial(base ?? {});
9707
+ },
9708
+ fromPartial(object) {
9709
+ const message = createBaseFinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry();
9710
+ message.key = object.key ?? "";
9711
+ message.value = object.value ?? new Uint8Array(0);
9712
+ return message;
9713
+ }
9714
+ };
9513
9715
  function createBaseFinalizeTransferResponse() {
9514
9716
  return { transfer: void 0 };
9515
9717
  }
@@ -14792,7 +14994,7 @@ var InitiateUtxoSwapRequest = {
14792
14994
  writer.uint32(50).bytes(message.userSignature);
14793
14995
  }
14794
14996
  if (message.transfer !== void 0) {
14795
- StartUserSignedTransferRequest.encode(message.transfer, writer.uint32(58).fork()).join();
14997
+ StartTransferRequest.encode(message.transfer, writer.uint32(58).fork()).join();
14796
14998
  }
14797
14999
  if (message.spendTxSigningJob !== void 0) {
14798
15000
  SigningJob.encode(message.spendTxSigningJob, writer.uint32(66).fork()).join();
@@ -14852,7 +15054,7 @@ var InitiateUtxoSwapRequest = {
14852
15054
  if (tag !== 58) {
14853
15055
  break;
14854
15056
  }
14855
- message.transfer = StartUserSignedTransferRequest.decode(reader, reader.uint32());
15057
+ message.transfer = StartTransferRequest.decode(reader, reader.uint32());
14856
15058
  continue;
14857
15059
  }
14858
15060
  case 8: {
@@ -14877,7 +15079,7 @@ var InitiateUtxoSwapRequest = {
14877
15079
  amount: isSet3(object.creditAmountSats) ? { $case: "creditAmountSats", creditAmountSats: globalThis.Number(object.creditAmountSats) } : isSet3(object.maxFeeSats) ? { $case: "maxFeeSats", maxFeeSats: globalThis.Number(object.maxFeeSats) } : void 0,
14878
15080
  sspSignature: isSet3(object.sspSignature) ? bytesFromBase642(object.sspSignature) : new Uint8Array(0),
14879
15081
  userSignature: isSet3(object.userSignature) ? bytesFromBase642(object.userSignature) : new Uint8Array(0),
14880
- transfer: isSet3(object.transfer) ? StartUserSignedTransferRequest.fromJSON(object.transfer) : void 0,
15082
+ transfer: isSet3(object.transfer) ? StartTransferRequest.fromJSON(object.transfer) : void 0,
14881
15083
  spendTxSigningJob: isSet3(object.spendTxSigningJob) ? SigningJob.fromJSON(object.spendTxSigningJob) : void 0
14882
15084
  };
14883
15085
  },
@@ -14901,7 +15103,7 @@ var InitiateUtxoSwapRequest = {
14901
15103
  obj.userSignature = base64FromBytes2(message.userSignature);
14902
15104
  }
14903
15105
  if (message.transfer !== void 0) {
14904
- obj.transfer = StartUserSignedTransferRequest.toJSON(message.transfer);
15106
+ obj.transfer = StartTransferRequest.toJSON(message.transfer);
14905
15107
  }
14906
15108
  if (message.spendTxSigningJob !== void 0) {
14907
15109
  obj.spendTxSigningJob = SigningJob.toJSON(message.spendTxSigningJob);
@@ -14931,7 +15133,7 @@ var InitiateUtxoSwapRequest = {
14931
15133
  }
14932
15134
  message.sspSignature = object.sspSignature ?? new Uint8Array(0);
14933
15135
  message.userSignature = object.userSignature ?? new Uint8Array(0);
14934
- message.transfer = object.transfer !== void 0 && object.transfer !== null ? StartUserSignedTransferRequest.fromPartial(object.transfer) : void 0;
15136
+ message.transfer = object.transfer !== void 0 && object.transfer !== null ? StartTransferRequest.fromPartial(object.transfer) : void 0;
14935
15137
  message.spendTxSigningJob = object.spendTxSigningJob !== void 0 && object.spendTxSigningJob !== null ? SigningJob.fromPartial(object.spendTxSigningJob) : void 0;
14936
15138
  return message;
14937
15139
  }
@@ -15906,6 +16108,14 @@ var SparkServiceDefinition = {
15906
16108
  responseStream: false,
15907
16109
  options: {}
15908
16110
  },
16111
+ finalize_transfer_with_transfer_package: {
16112
+ name: "finalize_transfer_with_transfer_package",
16113
+ requestType: FinalizeTransferWithTransferPackageRequest,
16114
+ requestStream: false,
16115
+ responseType: FinalizeTransferResponse,
16116
+ responseStream: false,
16117
+ options: {}
16118
+ },
15909
16119
  cancel_transfer: {
15910
16120
  name: "cancel_transfer",
15911
16121
  requestType: CancelTransferRequest,
@@ -16277,7 +16487,6 @@ init_buffer();
16277
16487
  init_buffer();
16278
16488
  var import_utils4 = require("@noble/curves/abstract/utils");
16279
16489
  var import_secp256k15 = require("@noble/curves/secp256k1");
16280
- var import_sha22 = require("@noble/hashes/sha2");
16281
16490
  var import_bip32 = require("@scure/bip32");
16282
16491
  var import_bip39 = require("@scure/bip39");
16283
16492
  var import_english = require("@scure/bip39/wordlists/english");
@@ -16811,7 +17020,7 @@ function decodeBytesToSigningCommitment(bytes2) {
16811
17020
  var import_lrc20_sdk = require("@buildonspark/lrc20-sdk");
16812
17021
  var import_lrc20_sdk2 = require("@buildonspark/lrc20-sdk");
16813
17022
  var import_secp256k16 = require("@bitcoinerlab/secp256k1");
16814
- var bitcoin = __toESM(require("bitcoinjs-lib"), 1);
17023
+ var import_sha22 = require("@noble/hashes/sha2");
16815
17024
  var import_lrc20_sdk3 = require("@buildonspark/lrc20-sdk");
16816
17025
  var sparkFrostModule = void 0;
16817
17026
  var getSparkFrostModule = async () => {
@@ -17278,15 +17487,11 @@ var DefaultSparkSigner = class {
17278
17487
  }
17279
17488
  if (receipt) {
17280
17489
  const receiptPrivateKey = this.getReceiptPrivateKey(receipt);
17281
- const tweakedKeyPair = import_lrc20_sdk3.ECPair.fromPrivateKey(
17282
- import_buffer.Buffer.from(receiptPrivateKey)
17283
- );
17490
+ const tweakedKeyPair = (0, import_lrc20_sdk3.fromPrivateKey)(import_buffer.Buffer.from(receiptPrivateKey));
17284
17491
  psbt.signInput(input, tweakedKeyPair, sighashTypes);
17285
17492
  return psbt;
17286
17493
  }
17287
- const keypair = import_lrc20_sdk3.ECPair.fromPrivateKey(
17288
- import_buffer.Buffer.from(this.identityKey.privateKey)
17289
- );
17494
+ const keypair = (0, import_lrc20_sdk3.fromPrivateKey)(import_buffer.Buffer.from(this.identityKey.privateKey));
17290
17495
  psbt.signInput(input, keypair, sighashTypes);
17291
17496
  return psbt;
17292
17497
  }
@@ -17298,7 +17503,7 @@ var DefaultSparkSigner = class {
17298
17503
  innerKey = import_buffer.Buffer.concat([import_lrc20_sdk.PARITY, innerKey.slice(1)]);
17299
17504
  privateKey = import_buffer.Buffer.from((0, import_secp256k16.privateNegate)(privateKey));
17300
17505
  }
17301
- const pxhPubkey = bitcoin.crypto.sha256(import_buffer.Buffer.concat([pxh, innerKey]));
17506
+ const pxhPubkey = (0, import_sha22.sha256)(import_buffer.Buffer.concat([pxh, innerKey]));
17302
17507
  const receiptProof = (0, import_secp256k16.privateAdd)(privateKey, pxhPubkey);
17303
17508
  return import_buffer.Buffer.from(receiptProof);
17304
17509
  }
@@ -17308,7 +17513,7 @@ var DefaultSparkSigner = class {
17308
17513
  init_buffer();
17309
17514
  var import_lrc20_sdk4 = require("@buildonspark/lrc20-sdk");
17310
17515
  var btc = __toESM(require("@scure/btc-signer"), 1);
17311
- var bitcoin2 = __toESM(require("bitcoinjs-lib"), 1);
17516
+ var bitcoin = __toESM(require("bitcoinjs-lib"), 1);
17312
17517
  var Network2 = /* @__PURE__ */ ((Network5) => {
17313
17518
  Network5[Network5["MAINNET"] = 0] = "MAINNET";
17314
17519
  Network5[Network5["TESTNET"] = 1] = "TESTNET";
@@ -17333,11 +17538,11 @@ var NetworkConfig = {
17333
17538
  };
17334
17539
  var getNetwork = (network) => NetworkConfig[network];
17335
17540
  var LRC_WALLET_NETWORK = Object.freeze({
17336
- [0 /* MAINNET */]: bitcoin2.networks.bitcoin,
17337
- [1 /* TESTNET */]: bitcoin2.networks.testnet,
17338
- [2 /* SIGNET */]: bitcoin2.networks.testnet,
17339
- [3 /* REGTEST */]: bitcoin2.networks.regtest,
17340
- [4 /* LOCAL */]: bitcoin2.networks.regtest
17541
+ [0 /* MAINNET */]: bitcoin.networks.bitcoin,
17542
+ [1 /* TESTNET */]: bitcoin.networks.testnet,
17543
+ [2 /* SIGNET */]: bitcoin.networks.testnet,
17544
+ [3 /* REGTEST */]: bitcoin.networks.regtest,
17545
+ [4 /* LOCAL */]: bitcoin.networks.regtest
17341
17546
  });
17342
17547
  var LRC_WALLET_NETWORK_TYPE = Object.freeze({
17343
17548
  [0 /* MAINNET */]: import_lrc20_sdk4.NetworkType.MAINNET,
@@ -17348,7 +17553,7 @@ var LRC_WALLET_NETWORK_TYPE = Object.freeze({
17348
17553
  });
17349
17554
  function getNetworkFromAddress(address2) {
17350
17555
  try {
17351
- const decoded = bitcoin2.address.fromBech32(address2);
17556
+ const decoded = bitcoin.address.fromBech32(address2);
17352
17557
  if (decoded.prefix === "bc") {
17353
17558
  return "MAINNET" /* MAINNET */;
17354
17559
  } else if (decoded.prefix === "bcrt") {
@@ -19409,7 +19614,8 @@ var TransferService = class extends BaseTransferService {
19409
19614
  types: [
19410
19615
  2 /* TRANSFER */,
19411
19616
  0 /* PREIMAGE_SWAP */,
19412
- 1 /* COOPERATIVE_EXIT */
19617
+ 1 /* COOPERATIVE_EXIT */,
19618
+ 3 /* UTXO_SWAP */
19413
19619
  ],
19414
19620
  network: NetworkToProto[this.config.getNetwork()]
19415
19621
  });
@@ -20737,7 +20943,7 @@ function verifySignature(words, prefix) {
20737
20943
  }
20738
20944
 
20739
20945
  // src/services/lightning.ts
20740
- var crypto3 = getCrypto();
20946
+ var crypto2 = getCrypto();
20741
20947
  var LightningService = class {
20742
20948
  config;
20743
20949
  connectionManager;
@@ -20754,7 +20960,7 @@ var LightningService = class {
20754
20960
  receiverIdentityPubkey,
20755
20961
  descriptionHash
20756
20962
  }) {
20757
- const randBytes = crypto3.getRandomValues(new Uint8Array(32));
20963
+ const randBytes = crypto2.getRandomValues(new Uint8Array(32));
20758
20964
  const preimage = (0, import_utils10.numberToBytesBE)(
20759
20965
  (0, import_utils10.bytesToNumberBE)(randBytes) % import_secp256k111.secp256k1.CURVE.n,
20760
20966
  32
@@ -26480,7 +26686,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26480
26686
  if (event?.$case === "transfer" && event.transfer.transfer && event.transfer.transfer.type !== 40 /* COUNTER_SWAP */) {
26481
26687
  const { senderIdentityPublicKey, receiverIdentityPublicKey } = event.transfer.transfer;
26482
26688
  if (event.transfer.transfer && !(0, import_utils20.equalBytes)(senderIdentityPublicKey, receiverIdentityPublicKey)) {
26483
- await this.claimTransfer(event.transfer.transfer, true);
26689
+ await this.claimTransfer({
26690
+ transfer: event.transfer.transfer,
26691
+ emit: true,
26692
+ optimize: true
26693
+ });
26484
26694
  }
26485
26695
  } else if (event?.$case === "deposit" && event.deposit.deposit) {
26486
26696
  const deposit = event.deposit.deposit;
@@ -26606,10 +26816,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26606
26816
  }
26607
26817
  }
26608
26818
  async getLeaves(isBalanceCheck = false) {
26609
- const sparkClient = await this.connectionManager.createSparkClient(
26610
- this.config.getCoordinatorAddress()
26611
- );
26612
- const leaves = await sparkClient.query_nodes({
26819
+ const leaves = await this.queryNodes({
26613
26820
  source: {
26614
26821
  $case: "ownerIdentityPubkey",
26615
26822
  ownerIdentityPubkey: await this.config.signer.getIdentityPublicKey()
@@ -26623,17 +26830,17 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26623
26830
  this.config.getSigningOperators()
26624
26831
  )) {
26625
26832
  if (id !== this.config.getCoordinatorIdentifier()) {
26626
- const client = await this.connectionManager.createSparkClient(
26833
+ const operatorLeaves = await this.queryNodes(
26834
+ {
26835
+ source: {
26836
+ $case: "ownerIdentityPubkey",
26837
+ ownerIdentityPubkey: await this.config.signer.getIdentityPublicKey()
26838
+ },
26839
+ includeParents: false,
26840
+ network: NetworkToProto[this.config.getNetwork()]
26841
+ },
26627
26842
  operator.address
26628
26843
  );
26629
- const operatorLeaves = await client.query_nodes({
26630
- source: {
26631
- $case: "ownerIdentityPubkey",
26632
- ownerIdentityPubkey: await this.config.signer.getIdentityPublicKey()
26633
- },
26634
- includeParents: false,
26635
- network: NetworkToProto[this.config.getNetwork()]
26636
- });
26637
26844
  for (const [nodeId, leaf] of Object.entries(leaves.nodes)) {
26638
26845
  const operatorLeaf = operatorLeaves.nodes[nodeId];
26639
26846
  if (!operatorLeaf) {
@@ -26762,10 +26969,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26762
26969
  }
26763
26970
  async syncWallet() {
26764
26971
  await this.syncTokenOutputs();
26765
- this.leaves = await this.getLeaves();
26766
- await this.config.signer.restoreSigningKeysFromLeafs(this.leaves);
26767
- await this.checkRefreshTimelockNodes();
26768
- await this.checkExtendTimeLockNodes();
26972
+ let leaves = await this.getLeaves();
26973
+ await this.config.signer.restoreSigningKeysFromLeafs(leaves);
26974
+ leaves = await this.checkRefreshTimelockNodes(leaves);
26975
+ leaves = await this.checkExtendTimeLockNodes(leaves);
26976
+ this.leaves = leaves;
26769
26977
  this.optimizeLeaves().catch((e) => {
26770
26978
  console.error("Failed to optimize leaves", e);
26771
26979
  });
@@ -26909,11 +27117,6 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
26909
27117
  expected: "smaller or equal to " + Number.MAX_SAFE_INTEGER
26910
27118
  });
26911
27119
  }
26912
- try {
26913
- await this.claimTransfers();
26914
- } catch (e) {
26915
- console.warn("Unabled to claim transfers.");
26916
- }
26917
27120
  let leavesToSwap;
26918
27121
  if (targetAmount && leaves && leaves.length > 0) {
26919
27122
  if (targetAmount < leaves.reduce((acc, leaf) => acc + leaf.value, 0)) {
@@ -27012,10 +27215,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27012
27215
  if (!request) {
27013
27216
  throw new Error("Failed to request leaves swap. No response returned.");
27014
27217
  }
27015
- const sparkClient = await this.connectionManager.createSparkClient(
27016
- this.config.getCoordinatorAddress()
27017
- );
27018
- const nodes = await sparkClient.query_nodes({
27218
+ const nodes = await this.queryNodes({
27019
27219
  source: {
27020
27220
  $case: "nodeIds",
27021
27221
  nodeIds: {
@@ -27186,7 +27386,20 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27186
27386
  * @returns {Promise<string>} A Bitcoin address for depositing funds
27187
27387
  */
27188
27388
  async getStaticDepositAddress() {
27189
- return await this.generateDepositAddress(true);
27389
+ try {
27390
+ return await this.generateDepositAddress(true);
27391
+ } catch (error) {
27392
+ if (error.message?.includes("static deposit address already exists")) {
27393
+ const existingAddresses = await this.queryStaticDepositAddresses();
27394
+ if (existingAddresses.length > 0 && existingAddresses[0]) {
27395
+ return existingAddresses[0];
27396
+ } else {
27397
+ throw error;
27398
+ }
27399
+ } else {
27400
+ throw error;
27401
+ }
27402
+ }
27190
27403
  }
27191
27404
  /**
27192
27405
  * Generates a deposit address for receiving funds.
@@ -27769,7 +27982,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27769
27982
  const pendingTransfer = await this.transferService.queryTransfer(
27770
27983
  transfer.id
27771
27984
  );
27772
- const resultNodes = !pendingTransfer ? [] : await this.claimTransfer(pendingTransfer);
27985
+ const resultNodes = !pendingTransfer ? [] : await this.claimTransfer({ transfer: pendingTransfer });
27773
27986
  const leavesToRemove = new Set(leaves.map((leaf) => leaf.id));
27774
27987
  this.leaves = [
27775
27988
  ...this.leaves.filter((leaf) => !leavesToRemove.has(leaf.id)),
@@ -27819,7 +28032,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27819
28032
  );
27820
28033
  return await this.withLeaves(async () => {
27821
28034
  let leavesToSend = await this.selectLeaves(amountSats);
27822
- await this.checkRefreshTimelockNodes(leavesToSend);
28035
+ leavesToSend = await this.checkRefreshTimelockNodes(leavesToSend);
27823
28036
  leavesToSend = await this.checkExtendTimeLockNodes(leavesToSend);
27824
28037
  const leafKeyTweaks = await Promise.all(
27825
28038
  leavesToSend.map(async (leaf) => ({
@@ -27840,7 +28053,10 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27840
28053
  const transactionId = transfer.id;
27841
28054
  const pendingTransfer = await this.transferService.queryTransfer(transactionId);
27842
28055
  if (pendingTransfer) {
27843
- await this.claimTransfer(pendingTransfer);
28056
+ await this.claimTransfer({
28057
+ transfer: pendingTransfer,
28058
+ optimize: true
28059
+ });
27844
28060
  }
27845
28061
  }
27846
28062
  return mapTransferToWalletTransfer(
@@ -27850,11 +28066,10 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27850
28066
  });
27851
28067
  }
27852
28068
  async checkExtendTimeLockNodes(nodes) {
27853
- const nodesToCheck = nodes ?? this.leaves;
27854
28069
  const nodesToExtend = [];
27855
28070
  const nodeIds = [];
27856
- let resultNodes = [...nodesToCheck];
27857
- for (const node of nodesToCheck) {
28071
+ const validNodes = [];
28072
+ for (const node of nodes) {
27858
28073
  const nodeTx = getTxFromRawTxBytes(node.nodeTx);
27859
28074
  const { needRefresh } = getNextTransactionSequence(
27860
28075
  nodeTx.getInput(0).sequence
@@ -27862,9 +28077,14 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27862
28077
  if (needRefresh) {
27863
28078
  nodesToExtend.push(node);
27864
28079
  nodeIds.push(node.id);
28080
+ } else {
28081
+ validNodes.push(node);
27865
28082
  }
27866
28083
  }
27867
- resultNodes = resultNodes.filter((node) => !nodesToExtend.includes(node));
28084
+ if (nodesToExtend.length === 0) {
28085
+ return validNodes;
28086
+ }
28087
+ const nodesToAdd = [];
27868
28088
  for (const node of nodesToExtend) {
27869
28089
  const signingPubKey = await this.config.signer.generatePublicKey(
27870
28090
  (0, import_sha213.sha256)(node.id)
@@ -27875,9 +28095,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27875
28095
  );
27876
28096
  this.leaves = this.leaves.filter((leaf) => leaf.id !== node.id);
27877
28097
  const newNodes = await this.transferLeavesToSelf(nodes2, signingPubKey);
27878
- resultNodes.push(...newNodes);
28098
+ nodesToAdd.push(...newNodes);
27879
28099
  }
27880
- return resultNodes;
28100
+ this.updateLeaves(nodeIds, nodesToAdd);
28101
+ validNodes.push(...nodesToAdd);
28102
+ return validNodes;
27881
28103
  }
27882
28104
  /**
27883
28105
  * Internal method to refresh timelock nodes.
@@ -27889,7 +28111,8 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27889
28111
  async checkRefreshTimelockNodes(nodes) {
27890
28112
  const nodesToRefresh = [];
27891
28113
  const nodeIds = [];
27892
- for (const node of nodes ?? this.leaves) {
28114
+ const validNodes = [];
28115
+ for (const node of nodes) {
27893
28116
  const refundTx = getTxFromRawTxBytes(node.refundTx);
27894
28117
  const { needRefresh } = getNextTransactionSequence(
27895
28118
  refundTx.getInput(0).sequence,
@@ -27898,15 +28121,14 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27898
28121
  if (needRefresh) {
27899
28122
  nodesToRefresh.push(node);
27900
28123
  nodeIds.push(node.id);
28124
+ } else {
28125
+ validNodes.push(node);
27901
28126
  }
27902
28127
  }
27903
28128
  if (nodesToRefresh.length === 0) {
27904
- return;
28129
+ return validNodes;
27905
28130
  }
27906
- const sparkClient = await this.connectionManager.createSparkClient(
27907
- this.config.getCoordinatorAddress()
27908
- );
27909
- const nodesResp = await sparkClient.query_nodes({
28131
+ const nodesResp = await this.queryNodes({
27910
28132
  source: {
27911
28133
  $case: "nodeIds",
27912
28134
  nodeIds: {
@@ -27920,6 +28142,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27920
28142
  for (const node of Object.values(nodesResp.nodes)) {
27921
28143
  nodesMap.set(node.id, node);
27922
28144
  }
28145
+ const nodesToAdd = [];
27923
28146
  for (const node of nodesToRefresh) {
27924
28147
  if (!node.parentNodeId) {
27925
28148
  throw new Error(`node ${node.id} has no parent`);
@@ -27940,9 +28163,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27940
28163
  if (!newNode) {
27941
28164
  throw new Error("Failed to refresh timelock node");
27942
28165
  }
27943
- this.leaves = this.leaves.filter((leaf) => leaf.id !== node.id);
27944
- this.leaves.push(newNode);
28166
+ nodesToAdd.push(newNode);
27945
28167
  }
28168
+ this.updateLeaves(nodeIds, nodesToAdd);
28169
+ validNodes.push(...nodesToAdd);
28170
+ return validNodes;
27946
28171
  }
27947
28172
  /**
27948
28173
  * Claims a specific transfer.
@@ -27950,11 +28175,16 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27950
28175
  * @param {Transfer} transfer - The transfer to claim
27951
28176
  * @returns {Promise<Object>} The claim result
27952
28177
  */
27953
- async claimTransfer(transfer, emit = false, retryCount = 0) {
28178
+ async claimTransfer({
28179
+ transfer,
28180
+ emit,
28181
+ retryCount,
28182
+ optimize
28183
+ }) {
27954
28184
  const MAX_RETRIES = 5;
27955
28185
  const BASE_DELAY_MS = 1e3;
27956
28186
  const MAX_DELAY_MS = 1e4;
27957
- if (retryCount > 0) {
28187
+ if (retryCount && retryCount > 0) {
27958
28188
  const delayMs = Math.min(
27959
28189
  BASE_DELAY_MS * Math.pow(2, retryCount - 1),
27960
28190
  MAX_DELAY_MS
@@ -27970,7 +28200,10 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27970
28200
  const leafPubKey = leafPubKeyMap.get(leaf.leaf.id);
27971
28201
  if (leafPubKey) {
27972
28202
  leavesToClaim.push({
27973
- leaf: leaf.leaf,
28203
+ leaf: {
28204
+ ...leaf.leaf,
28205
+ refundTx: leaf.intermediateRefundTx
28206
+ },
27974
28207
  signingPubKey: leafPubKey,
27975
28208
  newSigningPubKey: await this.config.signer.generatePublicKey(
27976
28209
  (0, import_sha213.sha256)(leaf.leaf.id)
@@ -27983,7 +28216,6 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27983
28216
  transfer,
27984
28217
  leavesToClaim
27985
28218
  );
27986
- this.leaves.push(...response.nodes);
27987
28219
  if (emit) {
27988
28220
  this.emit(
27989
28221
  "transfer:claimed",
@@ -27993,14 +28225,25 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
27993
28225
  }
27994
28226
  return response.nodes;
27995
28227
  });
27996
- await this.checkRefreshTimelockNodes(result);
28228
+ result = await this.checkRefreshTimelockNodes(result);
27997
28229
  result = await this.checkExtendTimeLockNodes(result);
28230
+ const existingIds = new Set(this.leaves.map((leaf) => leaf.id));
28231
+ const uniqueResults = result.filter((node) => !existingIds.has(node.id));
28232
+ this.leaves.push(...uniqueResults);
28233
+ if (optimize && transfer.type !== 40 /* COUNTER_SWAP */) {
28234
+ await this.optimizeLeaves();
28235
+ }
27998
28236
  return result;
27999
28237
  } catch (error) {
28000
- if (retryCount < MAX_RETRIES) {
28001
- this.claimTransfer(transfer, emit, retryCount + 1);
28238
+ if (retryCount && retryCount < MAX_RETRIES) {
28239
+ this.claimTransfer({
28240
+ transfer,
28241
+ emit,
28242
+ retryCount: retryCount + 1,
28243
+ optimize
28244
+ });
28002
28245
  return [];
28003
- } else if (retryCount > 0) {
28246
+ } else if (retryCount) {
28004
28247
  console.warn(
28005
28248
  "Failed to claim transfer. Please try reinitializing your wallet in a few minutes. Transfer ID: " + transfer.id,
28006
28249
  error
@@ -28035,7 +28278,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28035
28278
  continue;
28036
28279
  }
28037
28280
  promises.push(
28038
- this.claimTransfer(transfer, emit).then(() => transfer.id).catch((error) => {
28281
+ this.claimTransfer({ transfer, emit, optimize: true }).then(() => transfer.id).catch((error) => {
28039
28282
  console.warn(`Failed to claim transfer ${transfer.id}:`, error);
28040
28283
  return null;
28041
28284
  })
@@ -28070,11 +28313,11 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28070
28313
  *
28071
28314
  * @param {Object} params - Parameters for the lightning invoice
28072
28315
  * @param {number} params.amountSats - Amount in satoshis
28073
- * @param {string} params.memo - Description for the invoice
28316
+ * @param {string} [params.memo] - Description for the invoice. Should not be provided if the descriptionHash is provided.
28074
28317
  * @param {number} [params.expirySeconds] - Optional expiry time in seconds
28075
28318
  * @param {boolean} [params.includeSparkAddress] - Optional boolean signalling whether or not to include the spark address in the invoice
28076
28319
  * @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.
28077
- * @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.
28320
+ * @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.
28078
28321
  * @returns {Promise<LightningReceiveRequest>} BOLT11 encoded invoice
28079
28322
  */
28080
28323
  async createLightningInvoice({
@@ -28121,6 +28364,16 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28121
28364
  expected: "Memo size within limits"
28122
28365
  });
28123
28366
  }
28367
+ if (memo && descriptionHash) {
28368
+ throw new ValidationError(
28369
+ "Memo and descriptionHash cannot be provided together. Please provide only one.",
28370
+ {
28371
+ field: "memo",
28372
+ value: memo,
28373
+ expected: "Memo or descriptionHash"
28374
+ }
28375
+ );
28376
+ }
28124
28377
  const requestLightningInvoice = async (amountSats2, paymentHash, memo2, receiverIdentityPubkey2, descriptionHash2) => {
28125
28378
  const network = this.config.getNetwork();
28126
28379
  let bitcoinNetwork = BitcoinNetwork_default.REGTEST;
@@ -28256,7 +28509,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28256
28509
  });
28257
28510
  }
28258
28511
  let leaves = await this.selectLeaves(totalAmount);
28259
- await this.checkRefreshTimelockNodes(leaves);
28512
+ leaves = await this.checkRefreshTimelockNodes(leaves);
28260
28513
  leaves = await this.checkExtendTimeLockNodes(leaves);
28261
28514
  const leavesToSend = await Promise.all(
28262
28515
  leaves.map(async (leaf) => ({
@@ -28437,7 +28690,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28437
28690
  );
28438
28691
  }
28439
28692
  }
28440
- await this.checkRefreshTimelockNodes(leavesToSend);
28693
+ leavesToSend = await this.checkRefreshTimelockNodes(leavesToSend);
28441
28694
  leavesToSend = await this.checkExtendTimeLockNodes(leavesToSend);
28442
28695
  const leafKeyTweaks = await Promise.all(
28443
28696
  leavesToSend.map(async (leaf) => ({
@@ -28507,7 +28760,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28507
28760
  });
28508
28761
  }
28509
28762
  let leaves = await this.selectLeaves(amountSats);
28510
- await this.checkRefreshTimelockNodes(leaves);
28763
+ leaves = await this.checkRefreshTimelockNodes(leaves);
28511
28764
  leaves = await this.checkExtendTimeLockNodes(leaves);
28512
28765
  const feeEstimate = await sspClient.getCoopExitFeeEstimate({
28513
28766
  leafExternalIds: leaves.map((leaf) => leaf.id),
@@ -28741,6 +28994,33 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
28741
28994
  }
28742
28995
  }, 1e4);
28743
28996
  }
28997
+ async updateLeaves(leavesToRemove, leavesToAdd) {
28998
+ const leavesToRemoveSet = new Set(leavesToRemove);
28999
+ this.leaves = this.leaves.filter((leaf) => !leavesToRemoveSet.has(leaf.id));
29000
+ this.leaves.push(...leavesToAdd);
29001
+ }
29002
+ async queryNodes(baseRequest, sparkClientAddress, pageSize = 100) {
29003
+ const address2 = sparkClientAddress ?? this.config.getCoordinatorAddress();
29004
+ const aggregatedNodes = {};
29005
+ let offset = 0;
29006
+ while (true) {
29007
+ const sparkClient = await this.connectionManager.createSparkClient(address2);
29008
+ const response = await sparkClient.query_nodes({
29009
+ ...baseRequest,
29010
+ limit: pageSize,
29011
+ offset
29012
+ });
29013
+ Object.assign(aggregatedNodes, response.nodes ?? {});
29014
+ const received = Object.keys(response.nodes ?? {}).length;
29015
+ if (received < pageSize) {
29016
+ return {
29017
+ nodes: aggregatedNodes,
29018
+ offset: response.offset
29019
+ };
29020
+ }
29021
+ offset += pageSize;
29022
+ }
29023
+ }
28744
29024
  };
28745
29025
 
28746
29026
  // src/index.ts