@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
@@ -1,7 +1,7 @@
1
1
  require("react-native-get-random-values");
2
2
  import {
3
3
  Buffer
4
- } from "./chunk-OVEXKBAZ.js";
4
+ } from "./chunk-C3WN3D4O.js";
5
5
 
6
6
  // src/signer/signer.react-native.ts
7
7
  import { bytesToHex as bytesToHex3, hexToBytes as hexToBytes2 } from "@noble/hashes/utils";
@@ -209,7 +209,6 @@ import {
209
209
  hexToBytes
210
210
  } from "@noble/curves/abstract/utils";
211
211
  import { schnorr as schnorr2, secp256k1 as secp256k15 } from "@noble/curves/secp256k1";
212
- import { sha256 } from "@noble/hashes/sha2";
213
212
  import { HDKey } from "@scure/bip32";
214
213
  import { generateMnemonic, mnemonicToSeed } from "@scure/bip39";
215
214
  import { wordlist } from "@scure/bip39/wordlists/english";
@@ -526,15 +525,15 @@ function getSigningCommitmentFromNonce(nonce) {
526
525
  import { PARITY } from "@buildonspark/lrc20-sdk";
527
526
  import { Receipt } from "@buildonspark/lrc20-sdk";
528
527
  import { privateNegate, privateAdd } from "@bitcoinerlab/secp256k1";
529
- import * as bitcoin from "bitcoinjs-lib";
530
- import { ECPair } from "@buildonspark/lrc20-sdk";
528
+ import { sha256 } from "@noble/hashes/sha2";
529
+ import { fromPrivateKey } from "@buildonspark/lrc20-sdk";
531
530
  var sparkFrostModule = void 0;
532
531
  var getSparkFrostModule = async () => {
533
532
  if (isReactNative) {
534
533
  return void 0;
535
534
  }
536
535
  if (!sparkFrostModule) {
537
- sparkFrostModule = await import("./wasm-A6KGFTNV.js");
536
+ sparkFrostModule = await import("./wasm-PZWVEGEE.js");
538
537
  }
539
538
  return sparkFrostModule;
540
539
  };
@@ -993,15 +992,11 @@ var DefaultSparkSigner = class {
993
992
  }
994
993
  if (receipt) {
995
994
  const receiptPrivateKey = this.getReceiptPrivateKey(receipt);
996
- const tweakedKeyPair = ECPair.fromPrivateKey(
997
- Buffer.from(receiptPrivateKey)
998
- );
995
+ const tweakedKeyPair = fromPrivateKey(Buffer.from(receiptPrivateKey));
999
996
  psbt.signInput(input, tweakedKeyPair, sighashTypes);
1000
997
  return psbt;
1001
998
  }
1002
- const keypair = ECPair.fromPrivateKey(
1003
- Buffer.from(this.identityKey.privateKey)
1004
- );
999
+ const keypair = fromPrivateKey(Buffer.from(this.identityKey.privateKey));
1005
1000
  psbt.signInput(input, keypair, sighashTypes);
1006
1001
  return psbt;
1007
1002
  }
@@ -1013,7 +1008,7 @@ var DefaultSparkSigner = class {
1013
1008
  innerKey = Buffer.concat([PARITY, innerKey.slice(1)]);
1014
1009
  privateKey = Buffer.from(privateNegate(privateKey));
1015
1010
  }
1016
- const pxhPubkey = bitcoin.crypto.sha256(Buffer.concat([pxh, innerKey]));
1011
+ const pxhPubkey = sha256(Buffer.concat([pxh, innerKey]));
1017
1012
  const receiptProof = privateAdd(privateKey, pxhPubkey);
1018
1013
  return Buffer.from(receiptProof);
1019
1014
  }
@@ -9075,6 +9070,203 @@ var FinalizeTransferRequest = {
9075
9070
  return message;
9076
9071
  }
9077
9072
  };
9073
+ function createBaseFinalizeTransferWithTransferPackageRequest() {
9074
+ return {
9075
+ transferId: "",
9076
+ ownerIdentityPublicKey: new Uint8Array(0),
9077
+ transferPackage: void 0,
9078
+ refundSignatures: {}
9079
+ };
9080
+ }
9081
+ var FinalizeTransferWithTransferPackageRequest = {
9082
+ encode(message, writer = new BinaryWriter4()) {
9083
+ if (message.transferId !== "") {
9084
+ writer.uint32(10).string(message.transferId);
9085
+ }
9086
+ if (message.ownerIdentityPublicKey.length !== 0) {
9087
+ writer.uint32(18).bytes(message.ownerIdentityPublicKey);
9088
+ }
9089
+ if (message.transferPackage !== void 0) {
9090
+ TransferPackage.encode(message.transferPackage, writer.uint32(26).fork()).join();
9091
+ }
9092
+ Object.entries(message.refundSignatures).forEach(([key, value]) => {
9093
+ FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry.encode(
9094
+ { key, value },
9095
+ writer.uint32(34).fork()
9096
+ ).join();
9097
+ });
9098
+ return writer;
9099
+ },
9100
+ decode(input, length) {
9101
+ const reader = input instanceof BinaryReader4 ? input : new BinaryReader4(input);
9102
+ let end = length === void 0 ? reader.len : reader.pos + length;
9103
+ const message = createBaseFinalizeTransferWithTransferPackageRequest();
9104
+ while (reader.pos < end) {
9105
+ const tag = reader.uint32();
9106
+ switch (tag >>> 3) {
9107
+ case 1: {
9108
+ if (tag !== 10) {
9109
+ break;
9110
+ }
9111
+ message.transferId = reader.string();
9112
+ continue;
9113
+ }
9114
+ case 2: {
9115
+ if (tag !== 18) {
9116
+ break;
9117
+ }
9118
+ message.ownerIdentityPublicKey = reader.bytes();
9119
+ continue;
9120
+ }
9121
+ case 3: {
9122
+ if (tag !== 26) {
9123
+ break;
9124
+ }
9125
+ message.transferPackage = TransferPackage.decode(reader, reader.uint32());
9126
+ continue;
9127
+ }
9128
+ case 4: {
9129
+ if (tag !== 34) {
9130
+ break;
9131
+ }
9132
+ const entry4 = FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry.decode(
9133
+ reader,
9134
+ reader.uint32()
9135
+ );
9136
+ if (entry4.value !== void 0) {
9137
+ message.refundSignatures[entry4.key] = entry4.value;
9138
+ }
9139
+ continue;
9140
+ }
9141
+ }
9142
+ if ((tag & 7) === 4 || tag === 0) {
9143
+ break;
9144
+ }
9145
+ reader.skip(tag & 7);
9146
+ }
9147
+ return message;
9148
+ },
9149
+ fromJSON(object) {
9150
+ return {
9151
+ transferId: isSet3(object.transferId) ? globalThis.String(object.transferId) : "",
9152
+ ownerIdentityPublicKey: isSet3(object.ownerIdentityPublicKey) ? bytesFromBase642(object.ownerIdentityPublicKey) : new Uint8Array(0),
9153
+ transferPackage: isSet3(object.transferPackage) ? TransferPackage.fromJSON(object.transferPackage) : void 0,
9154
+ refundSignatures: isObject8(object.refundSignatures) ? Object.entries(object.refundSignatures).reduce((acc, [key, value]) => {
9155
+ acc[key] = bytesFromBase642(value);
9156
+ return acc;
9157
+ }, {}) : {}
9158
+ };
9159
+ },
9160
+ toJSON(message) {
9161
+ const obj = {};
9162
+ if (message.transferId !== "") {
9163
+ obj.transferId = message.transferId;
9164
+ }
9165
+ if (message.ownerIdentityPublicKey.length !== 0) {
9166
+ obj.ownerIdentityPublicKey = base64FromBytes2(message.ownerIdentityPublicKey);
9167
+ }
9168
+ if (message.transferPackage !== void 0) {
9169
+ obj.transferPackage = TransferPackage.toJSON(message.transferPackage);
9170
+ }
9171
+ if (message.refundSignatures) {
9172
+ const entries = Object.entries(message.refundSignatures);
9173
+ if (entries.length > 0) {
9174
+ obj.refundSignatures = {};
9175
+ entries.forEach(([k, v]) => {
9176
+ obj.refundSignatures[k] = base64FromBytes2(v);
9177
+ });
9178
+ }
9179
+ }
9180
+ return obj;
9181
+ },
9182
+ create(base) {
9183
+ return FinalizeTransferWithTransferPackageRequest.fromPartial(base ?? {});
9184
+ },
9185
+ fromPartial(object) {
9186
+ const message = createBaseFinalizeTransferWithTransferPackageRequest();
9187
+ message.transferId = object.transferId ?? "";
9188
+ message.ownerIdentityPublicKey = object.ownerIdentityPublicKey ?? new Uint8Array(0);
9189
+ message.transferPackage = object.transferPackage !== void 0 && object.transferPackage !== null ? TransferPackage.fromPartial(object.transferPackage) : void 0;
9190
+ message.refundSignatures = Object.entries(object.refundSignatures ?? {}).reduce(
9191
+ (acc, [key, value]) => {
9192
+ if (value !== void 0) {
9193
+ acc[key] = value;
9194
+ }
9195
+ return acc;
9196
+ },
9197
+ {}
9198
+ );
9199
+ return message;
9200
+ }
9201
+ };
9202
+ function createBaseFinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry() {
9203
+ return { key: "", value: new Uint8Array(0) };
9204
+ }
9205
+ var FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry = {
9206
+ encode(message, writer = new BinaryWriter4()) {
9207
+ if (message.key !== "") {
9208
+ writer.uint32(10).string(message.key);
9209
+ }
9210
+ if (message.value.length !== 0) {
9211
+ writer.uint32(18).bytes(message.value);
9212
+ }
9213
+ return writer;
9214
+ },
9215
+ decode(input, length) {
9216
+ const reader = input instanceof BinaryReader4 ? input : new BinaryReader4(input);
9217
+ let end = length === void 0 ? reader.len : reader.pos + length;
9218
+ const message = createBaseFinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry();
9219
+ while (reader.pos < end) {
9220
+ const tag = reader.uint32();
9221
+ switch (tag >>> 3) {
9222
+ case 1: {
9223
+ if (tag !== 10) {
9224
+ break;
9225
+ }
9226
+ message.key = reader.string();
9227
+ continue;
9228
+ }
9229
+ case 2: {
9230
+ if (tag !== 18) {
9231
+ break;
9232
+ }
9233
+ message.value = reader.bytes();
9234
+ continue;
9235
+ }
9236
+ }
9237
+ if ((tag & 7) === 4 || tag === 0) {
9238
+ break;
9239
+ }
9240
+ reader.skip(tag & 7);
9241
+ }
9242
+ return message;
9243
+ },
9244
+ fromJSON(object) {
9245
+ return {
9246
+ key: isSet3(object.key) ? globalThis.String(object.key) : "",
9247
+ value: isSet3(object.value) ? bytesFromBase642(object.value) : new Uint8Array(0)
9248
+ };
9249
+ },
9250
+ toJSON(message) {
9251
+ const obj = {};
9252
+ if (message.key !== "") {
9253
+ obj.key = message.key;
9254
+ }
9255
+ if (message.value.length !== 0) {
9256
+ obj.value = base64FromBytes2(message.value);
9257
+ }
9258
+ return obj;
9259
+ },
9260
+ create(base) {
9261
+ return FinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry.fromPartial(base ?? {});
9262
+ },
9263
+ fromPartial(object) {
9264
+ const message = createBaseFinalizeTransferWithTransferPackageRequest_RefundSignaturesEntry();
9265
+ message.key = object.key ?? "";
9266
+ message.value = object.value ?? new Uint8Array(0);
9267
+ return message;
9268
+ }
9269
+ };
9078
9270
  function createBaseFinalizeTransferResponse() {
9079
9271
  return { transfer: void 0 };
9080
9272
  }
@@ -14357,7 +14549,7 @@ var InitiateUtxoSwapRequest = {
14357
14549
  writer.uint32(50).bytes(message.userSignature);
14358
14550
  }
14359
14551
  if (message.transfer !== void 0) {
14360
- StartUserSignedTransferRequest.encode(message.transfer, writer.uint32(58).fork()).join();
14552
+ StartTransferRequest.encode(message.transfer, writer.uint32(58).fork()).join();
14361
14553
  }
14362
14554
  if (message.spendTxSigningJob !== void 0) {
14363
14555
  SigningJob.encode(message.spendTxSigningJob, writer.uint32(66).fork()).join();
@@ -14417,7 +14609,7 @@ var InitiateUtxoSwapRequest = {
14417
14609
  if (tag !== 58) {
14418
14610
  break;
14419
14611
  }
14420
- message.transfer = StartUserSignedTransferRequest.decode(reader, reader.uint32());
14612
+ message.transfer = StartTransferRequest.decode(reader, reader.uint32());
14421
14613
  continue;
14422
14614
  }
14423
14615
  case 8: {
@@ -14442,7 +14634,7 @@ var InitiateUtxoSwapRequest = {
14442
14634
  amount: isSet3(object.creditAmountSats) ? { $case: "creditAmountSats", creditAmountSats: globalThis.Number(object.creditAmountSats) } : isSet3(object.maxFeeSats) ? { $case: "maxFeeSats", maxFeeSats: globalThis.Number(object.maxFeeSats) } : void 0,
14443
14635
  sspSignature: isSet3(object.sspSignature) ? bytesFromBase642(object.sspSignature) : new Uint8Array(0),
14444
14636
  userSignature: isSet3(object.userSignature) ? bytesFromBase642(object.userSignature) : new Uint8Array(0),
14445
- transfer: isSet3(object.transfer) ? StartUserSignedTransferRequest.fromJSON(object.transfer) : void 0,
14637
+ transfer: isSet3(object.transfer) ? StartTransferRequest.fromJSON(object.transfer) : void 0,
14446
14638
  spendTxSigningJob: isSet3(object.spendTxSigningJob) ? SigningJob.fromJSON(object.spendTxSigningJob) : void 0
14447
14639
  };
14448
14640
  },
@@ -14466,7 +14658,7 @@ var InitiateUtxoSwapRequest = {
14466
14658
  obj.userSignature = base64FromBytes2(message.userSignature);
14467
14659
  }
14468
14660
  if (message.transfer !== void 0) {
14469
- obj.transfer = StartUserSignedTransferRequest.toJSON(message.transfer);
14661
+ obj.transfer = StartTransferRequest.toJSON(message.transfer);
14470
14662
  }
14471
14663
  if (message.spendTxSigningJob !== void 0) {
14472
14664
  obj.spendTxSigningJob = SigningJob.toJSON(message.spendTxSigningJob);
@@ -14496,7 +14688,7 @@ var InitiateUtxoSwapRequest = {
14496
14688
  }
14497
14689
  message.sspSignature = object.sspSignature ?? new Uint8Array(0);
14498
14690
  message.userSignature = object.userSignature ?? new Uint8Array(0);
14499
- message.transfer = object.transfer !== void 0 && object.transfer !== null ? StartUserSignedTransferRequest.fromPartial(object.transfer) : void 0;
14691
+ message.transfer = object.transfer !== void 0 && object.transfer !== null ? StartTransferRequest.fromPartial(object.transfer) : void 0;
14500
14692
  message.spendTxSigningJob = object.spendTxSigningJob !== void 0 && object.spendTxSigningJob !== null ? SigningJob.fromPartial(object.spendTxSigningJob) : void 0;
14501
14693
  return message;
14502
14694
  }
@@ -15471,6 +15663,14 @@ var SparkServiceDefinition = {
15471
15663
  responseStream: false,
15472
15664
  options: {}
15473
15665
  },
15666
+ finalize_transfer_with_transfer_package: {
15667
+ name: "finalize_transfer_with_transfer_package",
15668
+ requestType: FinalizeTransferWithTransferPackageRequest,
15669
+ requestStream: false,
15670
+ responseType: FinalizeTransferResponse,
15671
+ responseStream: false,
15672
+ options: {}
15673
+ },
15474
15674
  cancel_transfer: {
15475
15675
  name: "cancel_transfer",
15476
15676
  requestType: CancelTransferRequest,
@@ -15838,7 +16038,7 @@ function isSet3(value) {
15838
16038
  // src/utils/network.ts
15839
16039
  import { NetworkType as Lrc20NetworkType } from "@buildonspark/lrc20-sdk";
15840
16040
  import * as btc from "@scure/btc-signer";
15841
- import * as bitcoin2 from "bitcoinjs-lib";
16041
+ import * as bitcoin from "bitcoinjs-lib";
15842
16042
  var Network2 = /* @__PURE__ */ ((Network5) => {
15843
16043
  Network5[Network5["MAINNET"] = 0] = "MAINNET";
15844
16044
  Network5[Network5["TESTNET"] = 1] = "TESTNET";
@@ -15863,11 +16063,11 @@ var NetworkConfig = {
15863
16063
  };
15864
16064
  var getNetwork = (network) => NetworkConfig[network];
15865
16065
  var LRC_WALLET_NETWORK = Object.freeze({
15866
- [0 /* MAINNET */]: bitcoin2.networks.bitcoin,
15867
- [1 /* TESTNET */]: bitcoin2.networks.testnet,
15868
- [2 /* SIGNET */]: bitcoin2.networks.testnet,
15869
- [3 /* REGTEST */]: bitcoin2.networks.regtest,
15870
- [4 /* LOCAL */]: bitcoin2.networks.regtest
16066
+ [0 /* MAINNET */]: bitcoin.networks.bitcoin,
16067
+ [1 /* TESTNET */]: bitcoin.networks.testnet,
16068
+ [2 /* SIGNET */]: bitcoin.networks.testnet,
16069
+ [3 /* REGTEST */]: bitcoin.networks.regtest,
16070
+ [4 /* LOCAL */]: bitcoin.networks.regtest
15871
16071
  });
15872
16072
  var LRC_WALLET_NETWORK_TYPE = Object.freeze({
15873
16073
  [0 /* MAINNET */]: Lrc20NetworkType.MAINNET,
@@ -15878,7 +16078,7 @@ var LRC_WALLET_NETWORK_TYPE = Object.freeze({
15878
16078
  });
15879
16079
  function getNetworkFromAddress(address2) {
15880
16080
  try {
15881
- const decoded = bitcoin2.address.fromBech32(address2);
16081
+ const decoded = bitcoin.address.fromBech32(address2);
15882
16082
  if (decoded.prefix === "bc") {
15883
16083
  return "MAINNET" /* MAINNET */;
15884
16084
  } else if (decoded.prefix === "bcrt") {
@@ -17085,7 +17285,7 @@ var ConnectionManager = class {
17085
17285
  } else {
17086
17286
  const grpcModule = await import("nice-grpc-web");
17087
17287
  const { createChannel, FetchTransport } = "default" in grpcModule ? grpcModule.default : grpcModule;
17088
- const { XHRTransport } = await import("./xhr-transport-TERT4PBA.js");
17288
+ const { XHRTransport } = await import("./xhr-transport-WHMS3FGG.js");
17089
17289
  return createChannel(
17090
17290
  address2,
17091
17291
  isReactNative ? XHRTransport() : FetchTransport()
@@ -17922,7 +18122,8 @@ var TransferService = class extends BaseTransferService {
17922
18122
  types: [
17923
18123
  2 /* TRANSFER */,
17924
18124
  0 /* PREIMAGE_SWAP */,
17925
- 1 /* COOPERATIVE_EXIT */
18125
+ 1 /* COOPERATIVE_EXIT */,
18126
+ 3 /* UTXO_SWAP */
17926
18127
  ],
17927
18128
  network: NetworkToProto[this.config.getNetwork()]
17928
18129
  });
@@ -19250,7 +19451,7 @@ function verifySignature(words, prefix) {
19250
19451
  }
19251
19452
 
19252
19453
  // src/services/lightning.ts
19253
- var crypto3 = getCrypto();
19454
+ var crypto2 = getCrypto();
19254
19455
  var LightningService = class {
19255
19456
  config;
19256
19457
  connectionManager;
@@ -19267,7 +19468,7 @@ var LightningService = class {
19267
19468
  receiverIdentityPubkey,
19268
19469
  descriptionHash
19269
19470
  }) {
19270
- const randBytes = crypto3.getRandomValues(new Uint8Array(32));
19471
+ const randBytes = crypto2.getRandomValues(new Uint8Array(32));
19271
19472
  const preimage = numberToBytesBE4(
19272
19473
  bytesToNumberBE4(randBytes) % secp256k110.CURVE.n,
19273
19474
  32
@@ -22598,7 +22799,7 @@ var Lrc20ConnectionManager = class {
22598
22799
  } else {
22599
22800
  const grpcModule = await import("nice-grpc-web");
22600
22801
  const { createChannel, FetchTransport } = "default" in grpcModule ? grpcModule.default : grpcModule;
22601
- const { XHRTransport } = await import("./xhr-transport-TERT4PBA.js");
22802
+ const { XHRTransport } = await import("./xhr-transport-WHMS3FGG.js");
22602
22803
  return createChannel(
22603
22804
  address2,
22604
22805
  isReactNative ? XHRTransport() : FetchTransport()
@@ -24970,7 +25171,11 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
24970
25171
  if (event?.$case === "transfer" && event.transfer.transfer && event.transfer.transfer.type !== 40 /* COUNTER_SWAP */) {
24971
25172
  const { senderIdentityPublicKey, receiverIdentityPublicKey } = event.transfer.transfer;
24972
25173
  if (event.transfer.transfer && !equalBytes4(senderIdentityPublicKey, receiverIdentityPublicKey)) {
24973
- await this.claimTransfer(event.transfer.transfer, true);
25174
+ await this.claimTransfer({
25175
+ transfer: event.transfer.transfer,
25176
+ emit: true,
25177
+ optimize: true
25178
+ });
24974
25179
  }
24975
25180
  } else if (event?.$case === "deposit" && event.deposit.deposit) {
24976
25181
  const deposit = event.deposit.deposit;
@@ -25096,10 +25301,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
25096
25301
  }
25097
25302
  }
25098
25303
  async getLeaves(isBalanceCheck = false) {
25099
- const sparkClient = await this.connectionManager.createSparkClient(
25100
- this.config.getCoordinatorAddress()
25101
- );
25102
- const leaves = await sparkClient.query_nodes({
25304
+ const leaves = await this.queryNodes({
25103
25305
  source: {
25104
25306
  $case: "ownerIdentityPubkey",
25105
25307
  ownerIdentityPubkey: await this.config.signer.getIdentityPublicKey()
@@ -25113,17 +25315,17 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
25113
25315
  this.config.getSigningOperators()
25114
25316
  )) {
25115
25317
  if (id !== this.config.getCoordinatorIdentifier()) {
25116
- const client = await this.connectionManager.createSparkClient(
25318
+ const operatorLeaves = await this.queryNodes(
25319
+ {
25320
+ source: {
25321
+ $case: "ownerIdentityPubkey",
25322
+ ownerIdentityPubkey: await this.config.signer.getIdentityPublicKey()
25323
+ },
25324
+ includeParents: false,
25325
+ network: NetworkToProto[this.config.getNetwork()]
25326
+ },
25117
25327
  operator.address
25118
25328
  );
25119
- const operatorLeaves = await client.query_nodes({
25120
- source: {
25121
- $case: "ownerIdentityPubkey",
25122
- ownerIdentityPubkey: await this.config.signer.getIdentityPublicKey()
25123
- },
25124
- includeParents: false,
25125
- network: NetworkToProto[this.config.getNetwork()]
25126
- });
25127
25329
  for (const [nodeId, leaf] of Object.entries(leaves.nodes)) {
25128
25330
  const operatorLeaf = operatorLeaves.nodes[nodeId];
25129
25331
  if (!operatorLeaf) {
@@ -25252,10 +25454,11 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
25252
25454
  }
25253
25455
  async syncWallet() {
25254
25456
  await this.syncTokenOutputs();
25255
- this.leaves = await this.getLeaves();
25256
- await this.config.signer.restoreSigningKeysFromLeafs(this.leaves);
25257
- await this.checkRefreshTimelockNodes();
25258
- await this.checkExtendTimeLockNodes();
25457
+ let leaves = await this.getLeaves();
25458
+ await this.config.signer.restoreSigningKeysFromLeafs(leaves);
25459
+ leaves = await this.checkRefreshTimelockNodes(leaves);
25460
+ leaves = await this.checkExtendTimeLockNodes(leaves);
25461
+ this.leaves = leaves;
25259
25462
  this.optimizeLeaves().catch((e) => {
25260
25463
  console.error("Failed to optimize leaves", e);
25261
25464
  });
@@ -25399,11 +25602,6 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
25399
25602
  expected: "smaller or equal to " + Number.MAX_SAFE_INTEGER
25400
25603
  });
25401
25604
  }
25402
- try {
25403
- await this.claimTransfers();
25404
- } catch (e) {
25405
- console.warn("Unabled to claim transfers.");
25406
- }
25407
25605
  let leavesToSwap;
25408
25606
  if (targetAmount && leaves && leaves.length > 0) {
25409
25607
  if (targetAmount < leaves.reduce((acc, leaf) => acc + leaf.value, 0)) {
@@ -25502,10 +25700,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
25502
25700
  if (!request) {
25503
25701
  throw new Error("Failed to request leaves swap. No response returned.");
25504
25702
  }
25505
- const sparkClient = await this.connectionManager.createSparkClient(
25506
- this.config.getCoordinatorAddress()
25507
- );
25508
- const nodes = await sparkClient.query_nodes({
25703
+ const nodes = await this.queryNodes({
25509
25704
  source: {
25510
25705
  $case: "nodeIds",
25511
25706
  nodeIds: {
@@ -25676,7 +25871,20 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
25676
25871
  * @returns {Promise<string>} A Bitcoin address for depositing funds
25677
25872
  */
25678
25873
  async getStaticDepositAddress() {
25679
- return await this.generateDepositAddress(true);
25874
+ try {
25875
+ return await this.generateDepositAddress(true);
25876
+ } catch (error) {
25877
+ if (error.message?.includes("static deposit address already exists")) {
25878
+ const existingAddresses = await this.queryStaticDepositAddresses();
25879
+ if (existingAddresses.length > 0 && existingAddresses[0]) {
25880
+ return existingAddresses[0];
25881
+ } else {
25882
+ throw error;
25883
+ }
25884
+ } else {
25885
+ throw error;
25886
+ }
25887
+ }
25680
25888
  }
25681
25889
  /**
25682
25890
  * Generates a deposit address for receiving funds.
@@ -26259,7 +26467,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26259
26467
  const pendingTransfer = await this.transferService.queryTransfer(
26260
26468
  transfer.id
26261
26469
  );
26262
- const resultNodes = !pendingTransfer ? [] : await this.claimTransfer(pendingTransfer);
26470
+ const resultNodes = !pendingTransfer ? [] : await this.claimTransfer({ transfer: pendingTransfer });
26263
26471
  const leavesToRemove = new Set(leaves.map((leaf) => leaf.id));
26264
26472
  this.leaves = [
26265
26473
  ...this.leaves.filter((leaf) => !leavesToRemove.has(leaf.id)),
@@ -26309,7 +26517,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26309
26517
  );
26310
26518
  return await this.withLeaves(async () => {
26311
26519
  let leavesToSend = await this.selectLeaves(amountSats);
26312
- await this.checkRefreshTimelockNodes(leavesToSend);
26520
+ leavesToSend = await this.checkRefreshTimelockNodes(leavesToSend);
26313
26521
  leavesToSend = await this.checkExtendTimeLockNodes(leavesToSend);
26314
26522
  const leafKeyTweaks = await Promise.all(
26315
26523
  leavesToSend.map(async (leaf) => ({
@@ -26330,7 +26538,10 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26330
26538
  const transactionId = transfer.id;
26331
26539
  const pendingTransfer = await this.transferService.queryTransfer(transactionId);
26332
26540
  if (pendingTransfer) {
26333
- await this.claimTransfer(pendingTransfer);
26541
+ await this.claimTransfer({
26542
+ transfer: pendingTransfer,
26543
+ optimize: true
26544
+ });
26334
26545
  }
26335
26546
  }
26336
26547
  return mapTransferToWalletTransfer(
@@ -26340,11 +26551,10 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26340
26551
  });
26341
26552
  }
26342
26553
  async checkExtendTimeLockNodes(nodes) {
26343
- const nodesToCheck = nodes ?? this.leaves;
26344
26554
  const nodesToExtend = [];
26345
26555
  const nodeIds = [];
26346
- let resultNodes = [...nodesToCheck];
26347
- for (const node of nodesToCheck) {
26556
+ const validNodes = [];
26557
+ for (const node of nodes) {
26348
26558
  const nodeTx = getTxFromRawTxBytes(node.nodeTx);
26349
26559
  const { needRefresh } = getNextTransactionSequence(
26350
26560
  nodeTx.getInput(0).sequence
@@ -26352,9 +26562,14 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26352
26562
  if (needRefresh) {
26353
26563
  nodesToExtend.push(node);
26354
26564
  nodeIds.push(node.id);
26565
+ } else {
26566
+ validNodes.push(node);
26355
26567
  }
26356
26568
  }
26357
- resultNodes = resultNodes.filter((node) => !nodesToExtend.includes(node));
26569
+ if (nodesToExtend.length === 0) {
26570
+ return validNodes;
26571
+ }
26572
+ const nodesToAdd = [];
26358
26573
  for (const node of nodesToExtend) {
26359
26574
  const signingPubKey = await this.config.signer.generatePublicKey(
26360
26575
  sha25613(node.id)
@@ -26365,9 +26580,11 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26365
26580
  );
26366
26581
  this.leaves = this.leaves.filter((leaf) => leaf.id !== node.id);
26367
26582
  const newNodes = await this.transferLeavesToSelf(nodes2, signingPubKey);
26368
- resultNodes.push(...newNodes);
26583
+ nodesToAdd.push(...newNodes);
26369
26584
  }
26370
- return resultNodes;
26585
+ this.updateLeaves(nodeIds, nodesToAdd);
26586
+ validNodes.push(...nodesToAdd);
26587
+ return validNodes;
26371
26588
  }
26372
26589
  /**
26373
26590
  * Internal method to refresh timelock nodes.
@@ -26379,7 +26596,8 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26379
26596
  async checkRefreshTimelockNodes(nodes) {
26380
26597
  const nodesToRefresh = [];
26381
26598
  const nodeIds = [];
26382
- for (const node of nodes ?? this.leaves) {
26599
+ const validNodes = [];
26600
+ for (const node of nodes) {
26383
26601
  const refundTx = getTxFromRawTxBytes(node.refundTx);
26384
26602
  const { needRefresh } = getNextTransactionSequence(
26385
26603
  refundTx.getInput(0).sequence,
@@ -26388,15 +26606,14 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26388
26606
  if (needRefresh) {
26389
26607
  nodesToRefresh.push(node);
26390
26608
  nodeIds.push(node.id);
26609
+ } else {
26610
+ validNodes.push(node);
26391
26611
  }
26392
26612
  }
26393
26613
  if (nodesToRefresh.length === 0) {
26394
- return;
26614
+ return validNodes;
26395
26615
  }
26396
- const sparkClient = await this.connectionManager.createSparkClient(
26397
- this.config.getCoordinatorAddress()
26398
- );
26399
- const nodesResp = await sparkClient.query_nodes({
26616
+ const nodesResp = await this.queryNodes({
26400
26617
  source: {
26401
26618
  $case: "nodeIds",
26402
26619
  nodeIds: {
@@ -26410,6 +26627,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26410
26627
  for (const node of Object.values(nodesResp.nodes)) {
26411
26628
  nodesMap.set(node.id, node);
26412
26629
  }
26630
+ const nodesToAdd = [];
26413
26631
  for (const node of nodesToRefresh) {
26414
26632
  if (!node.parentNodeId) {
26415
26633
  throw new Error(`node ${node.id} has no parent`);
@@ -26430,9 +26648,11 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26430
26648
  if (!newNode) {
26431
26649
  throw new Error("Failed to refresh timelock node");
26432
26650
  }
26433
- this.leaves = this.leaves.filter((leaf) => leaf.id !== node.id);
26434
- this.leaves.push(newNode);
26651
+ nodesToAdd.push(newNode);
26435
26652
  }
26653
+ this.updateLeaves(nodeIds, nodesToAdd);
26654
+ validNodes.push(...nodesToAdd);
26655
+ return validNodes;
26436
26656
  }
26437
26657
  /**
26438
26658
  * Claims a specific transfer.
@@ -26440,11 +26660,16 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26440
26660
  * @param {Transfer} transfer - The transfer to claim
26441
26661
  * @returns {Promise<Object>} The claim result
26442
26662
  */
26443
- async claimTransfer(transfer, emit = false, retryCount = 0) {
26663
+ async claimTransfer({
26664
+ transfer,
26665
+ emit,
26666
+ retryCount,
26667
+ optimize
26668
+ }) {
26444
26669
  const MAX_RETRIES = 5;
26445
26670
  const BASE_DELAY_MS = 1e3;
26446
26671
  const MAX_DELAY_MS = 1e4;
26447
- if (retryCount > 0) {
26672
+ if (retryCount && retryCount > 0) {
26448
26673
  const delayMs = Math.min(
26449
26674
  BASE_DELAY_MS * Math.pow(2, retryCount - 1),
26450
26675
  MAX_DELAY_MS
@@ -26460,7 +26685,10 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26460
26685
  const leafPubKey = leafPubKeyMap.get(leaf.leaf.id);
26461
26686
  if (leafPubKey) {
26462
26687
  leavesToClaim.push({
26463
- leaf: leaf.leaf,
26688
+ leaf: {
26689
+ ...leaf.leaf,
26690
+ refundTx: leaf.intermediateRefundTx
26691
+ },
26464
26692
  signingPubKey: leafPubKey,
26465
26693
  newSigningPubKey: await this.config.signer.generatePublicKey(
26466
26694
  sha25613(leaf.leaf.id)
@@ -26473,7 +26701,6 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26473
26701
  transfer,
26474
26702
  leavesToClaim
26475
26703
  );
26476
- this.leaves.push(...response.nodes);
26477
26704
  if (emit) {
26478
26705
  this.emit(
26479
26706
  "transfer:claimed",
@@ -26483,14 +26710,25 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26483
26710
  }
26484
26711
  return response.nodes;
26485
26712
  });
26486
- await this.checkRefreshTimelockNodes(result);
26713
+ result = await this.checkRefreshTimelockNodes(result);
26487
26714
  result = await this.checkExtendTimeLockNodes(result);
26715
+ const existingIds = new Set(this.leaves.map((leaf) => leaf.id));
26716
+ const uniqueResults = result.filter((node) => !existingIds.has(node.id));
26717
+ this.leaves.push(...uniqueResults);
26718
+ if (optimize && transfer.type !== 40 /* COUNTER_SWAP */) {
26719
+ await this.optimizeLeaves();
26720
+ }
26488
26721
  return result;
26489
26722
  } catch (error) {
26490
- if (retryCount < MAX_RETRIES) {
26491
- this.claimTransfer(transfer, emit, retryCount + 1);
26723
+ if (retryCount && retryCount < MAX_RETRIES) {
26724
+ this.claimTransfer({
26725
+ transfer,
26726
+ emit,
26727
+ retryCount: retryCount + 1,
26728
+ optimize
26729
+ });
26492
26730
  return [];
26493
- } else if (retryCount > 0) {
26731
+ } else if (retryCount) {
26494
26732
  console.warn(
26495
26733
  "Failed to claim transfer. Please try reinitializing your wallet in a few minutes. Transfer ID: " + transfer.id,
26496
26734
  error
@@ -26525,7 +26763,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26525
26763
  continue;
26526
26764
  }
26527
26765
  promises.push(
26528
- this.claimTransfer(transfer, emit).then(() => transfer.id).catch((error) => {
26766
+ this.claimTransfer({ transfer, emit, optimize: true }).then(() => transfer.id).catch((error) => {
26529
26767
  console.warn(`Failed to claim transfer ${transfer.id}:`, error);
26530
26768
  return null;
26531
26769
  })
@@ -26560,11 +26798,11 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26560
26798
  *
26561
26799
  * @param {Object} params - Parameters for the lightning invoice
26562
26800
  * @param {number} params.amountSats - Amount in satoshis
26563
- * @param {string} params.memo - Description for the invoice
26801
+ * @param {string} [params.memo] - Description for the invoice. Should not be provided if the descriptionHash is provided.
26564
26802
  * @param {number} [params.expirySeconds] - Optional expiry time in seconds
26565
26803
  * @param {boolean} [params.includeSparkAddress] - Optional boolean signalling whether or not to include the spark address in the invoice
26566
26804
  * @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.
26567
- * @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.
26805
+ * @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.
26568
26806
  * @returns {Promise<LightningReceiveRequest>} BOLT11 encoded invoice
26569
26807
  */
26570
26808
  async createLightningInvoice({
@@ -26611,6 +26849,16 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26611
26849
  expected: "Memo size within limits"
26612
26850
  });
26613
26851
  }
26852
+ if (memo && descriptionHash) {
26853
+ throw new ValidationError(
26854
+ "Memo and descriptionHash cannot be provided together. Please provide only one.",
26855
+ {
26856
+ field: "memo",
26857
+ value: memo,
26858
+ expected: "Memo or descriptionHash"
26859
+ }
26860
+ );
26861
+ }
26614
26862
  const requestLightningInvoice = async (amountSats2, paymentHash, memo2, receiverIdentityPubkey2, descriptionHash2) => {
26615
26863
  const network = this.config.getNetwork();
26616
26864
  let bitcoinNetwork = BitcoinNetwork_default.REGTEST;
@@ -26746,7 +26994,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26746
26994
  });
26747
26995
  }
26748
26996
  let leaves = await this.selectLeaves(totalAmount);
26749
- await this.checkRefreshTimelockNodes(leaves);
26997
+ leaves = await this.checkRefreshTimelockNodes(leaves);
26750
26998
  leaves = await this.checkExtendTimeLockNodes(leaves);
26751
26999
  const leavesToSend = await Promise.all(
26752
27000
  leaves.map(async (leaf) => ({
@@ -26927,7 +27175,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26927
27175
  );
26928
27176
  }
26929
27177
  }
26930
- await this.checkRefreshTimelockNodes(leavesToSend);
27178
+ leavesToSend = await this.checkRefreshTimelockNodes(leavesToSend);
26931
27179
  leavesToSend = await this.checkExtendTimeLockNodes(leavesToSend);
26932
27180
  const leafKeyTweaks = await Promise.all(
26933
27181
  leavesToSend.map(async (leaf) => ({
@@ -26997,7 +27245,7 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
26997
27245
  });
26998
27246
  }
26999
27247
  let leaves = await this.selectLeaves(amountSats);
27000
- await this.checkRefreshTimelockNodes(leaves);
27248
+ leaves = await this.checkRefreshTimelockNodes(leaves);
27001
27249
  leaves = await this.checkExtendTimeLockNodes(leaves);
27002
27250
  const feeEstimate = await sspClient.getCoopExitFeeEstimate({
27003
27251
  leafExternalIds: leaves.map((leaf) => leaf.id),
@@ -27231,6 +27479,33 @@ var SparkWallet = class _SparkWallet extends EventEmitter {
27231
27479
  }
27232
27480
  }, 1e4);
27233
27481
  }
27482
+ async updateLeaves(leavesToRemove, leavesToAdd) {
27483
+ const leavesToRemoveSet = new Set(leavesToRemove);
27484
+ this.leaves = this.leaves.filter((leaf) => !leavesToRemoveSet.has(leaf.id));
27485
+ this.leaves.push(...leavesToAdd);
27486
+ }
27487
+ async queryNodes(baseRequest, sparkClientAddress, pageSize = 100) {
27488
+ const address2 = sparkClientAddress ?? this.config.getCoordinatorAddress();
27489
+ const aggregatedNodes = {};
27490
+ let offset = 0;
27491
+ while (true) {
27492
+ const sparkClient = await this.connectionManager.createSparkClient(address2);
27493
+ const response = await sparkClient.query_nodes({
27494
+ ...baseRequest,
27495
+ limit: pageSize,
27496
+ offset
27497
+ });
27498
+ Object.assign(aggregatedNodes, response.nodes ?? {});
27499
+ const received = Object.keys(response.nodes ?? {}).length;
27500
+ if (received < pageSize) {
27501
+ return {
27502
+ nodes: aggregatedNodes,
27503
+ offset: response.offset
27504
+ };
27505
+ }
27506
+ offset += pageSize;
27507
+ }
27508
+ }
27234
27509
  };
27235
27510
 
27236
27511
  // src/utils/mempool.ts