@buildonspark/spark-sdk 0.0.0

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 (314) hide show
  1. package/dist/graphql/client.d.ts +24 -0
  2. package/dist/graphql/client.js +177 -0
  3. package/dist/graphql/client.js.map +1 -0
  4. package/dist/graphql/mutations/CompleteCoopExit.d.ts +1 -0
  5. package/dist/graphql/mutations/CompleteCoopExit.js +19 -0
  6. package/dist/graphql/mutations/CompleteCoopExit.js.map +1 -0
  7. package/dist/graphql/mutations/CompleteLeavesSwap.d.ts +1 -0
  8. package/dist/graphql/mutations/CompleteLeavesSwap.js +17 -0
  9. package/dist/graphql/mutations/CompleteLeavesSwap.js.map +1 -0
  10. package/dist/graphql/mutations/RequestCoopExit.d.ts +1 -0
  11. package/dist/graphql/mutations/RequestCoopExit.js +20 -0
  12. package/dist/graphql/mutations/RequestCoopExit.js.map +1 -0
  13. package/dist/graphql/mutations/RequestLightningReceive.d.ts +1 -0
  14. package/dist/graphql/mutations/RequestLightningReceive.js +26 -0
  15. package/dist/graphql/mutations/RequestLightningReceive.js.map +1 -0
  16. package/dist/graphql/mutations/RequestLightningSend.d.ts +1 -0
  17. package/dist/graphql/mutations/RequestLightningSend.js +18 -0
  18. package/dist/graphql/mutations/RequestLightningSend.js.map +1 -0
  19. package/dist/graphql/mutations/RequestSwapLeaves.d.ts +1 -0
  20. package/dist/graphql/mutations/RequestSwapLeaves.js +26 -0
  21. package/dist/graphql/mutations/RequestSwapLeaves.js.map +1 -0
  22. package/dist/graphql/objects/BitcoinNetwork.d.ts +17 -0
  23. package/dist/graphql/objects/BitcoinNetwork.js +20 -0
  24. package/dist/graphql/objects/BitcoinNetwork.js.map +1 -0
  25. package/dist/graphql/objects/CompleteCoopExitInput.d.ts +7 -0
  26. package/dist/graphql/objects/CompleteCoopExitInput.js +14 -0
  27. package/dist/graphql/objects/CompleteCoopExitInput.js.map +1 -0
  28. package/dist/graphql/objects/CompleteCoopExitOutput.d.ts +7 -0
  29. package/dist/graphql/objects/CompleteCoopExitOutput.js +19 -0
  30. package/dist/graphql/objects/CompleteCoopExitOutput.js.map +1 -0
  31. package/dist/graphql/objects/CompleteLeavesSwapInput.d.ts +8 -0
  32. package/dist/graphql/objects/CompleteLeavesSwapInput.js +16 -0
  33. package/dist/graphql/objects/CompleteLeavesSwapInput.js.map +1 -0
  34. package/dist/graphql/objects/CompleteLeavesSwapOutput.d.ts +7 -0
  35. package/dist/graphql/objects/CompleteLeavesSwapOutput.js +19 -0
  36. package/dist/graphql/objects/CompleteLeavesSwapOutput.js.map +1 -0
  37. package/dist/graphql/objects/Connection.d.ts +16 -0
  38. package/dist/graphql/objects/Connection.js +56 -0
  39. package/dist/graphql/objects/Connection.js.map +1 -0
  40. package/dist/graphql/objects/CoopExitFeeEstimateInput.d.ts +7 -0
  41. package/dist/graphql/objects/CoopExitFeeEstimateInput.js +14 -0
  42. package/dist/graphql/objects/CoopExitFeeEstimateInput.js.map +1 -0
  43. package/dist/graphql/objects/CoopExitFeeEstimateOutput.d.ts +8 -0
  44. package/dist/graphql/objects/CoopExitFeeEstimateOutput.js +26 -0
  45. package/dist/graphql/objects/CoopExitFeeEstimateOutput.js.map +1 -0
  46. package/dist/graphql/objects/CoopExitRequest.d.ts +32 -0
  47. package/dist/graphql/objects/CoopExitRequest.js +64 -0
  48. package/dist/graphql/objects/CoopExitRequest.js.map +1 -0
  49. package/dist/graphql/objects/CurrencyAmount.d.ts +24 -0
  50. package/dist/graphql/objects/CurrencyAmount.js +30 -0
  51. package/dist/graphql/objects/CurrencyAmount.js.map +1 -0
  52. package/dist/graphql/objects/CurrencyUnit.d.ts +27 -0
  53. package/dist/graphql/objects/CurrencyUnit.js +30 -0
  54. package/dist/graphql/objects/CurrencyUnit.js.map +1 -0
  55. package/dist/graphql/objects/Entity.d.ts +16 -0
  56. package/dist/graphql/objects/Entity.js +141 -0
  57. package/dist/graphql/objects/Entity.js.map +1 -0
  58. package/dist/graphql/objects/Invoice.d.ts +15 -0
  59. package/dist/graphql/objects/Invoice.js +45 -0
  60. package/dist/graphql/objects/Invoice.js.map +1 -0
  61. package/dist/graphql/objects/Leaf.d.ts +11 -0
  62. package/dist/graphql/objects/Leaf.js +29 -0
  63. package/dist/graphql/objects/Leaf.js.map +1 -0
  64. package/dist/graphql/objects/LeavesSwapFeeEstimateInput.d.ts +6 -0
  65. package/dist/graphql/objects/LeavesSwapFeeEstimateInput.js +12 -0
  66. package/dist/graphql/objects/LeavesSwapFeeEstimateInput.js.map +1 -0
  67. package/dist/graphql/objects/LeavesSwapFeeEstimateOutput.d.ts +8 -0
  68. package/dist/graphql/objects/LeavesSwapFeeEstimateOutput.js +26 -0
  69. package/dist/graphql/objects/LeavesSwapFeeEstimateOutput.js.map +1 -0
  70. package/dist/graphql/objects/LeavesSwapRequest.d.ts +32 -0
  71. package/dist/graphql/objects/LeavesSwapRequest.js +87 -0
  72. package/dist/graphql/objects/LeavesSwapRequest.js.map +1 -0
  73. package/dist/graphql/objects/LightningReceiveFeeEstimateInput.d.ts +8 -0
  74. package/dist/graphql/objects/LightningReceiveFeeEstimateInput.js +15 -0
  75. package/dist/graphql/objects/LightningReceiveFeeEstimateInput.js.map +1 -0
  76. package/dist/graphql/objects/LightningReceiveFeeEstimateOutput.d.ts +8 -0
  77. package/dist/graphql/objects/LightningReceiveFeeEstimateOutput.js +26 -0
  78. package/dist/graphql/objects/LightningReceiveFeeEstimateOutput.js.map +1 -0
  79. package/dist/graphql/objects/LightningReceiveRequest.d.ts +31 -0
  80. package/dist/graphql/objects/LightningReceiveRequest.js +93 -0
  81. package/dist/graphql/objects/LightningReceiveRequest.js.map +1 -0
  82. package/dist/graphql/objects/LightningReceiveRequestStatus.d.ts +16 -0
  83. package/dist/graphql/objects/LightningReceiveRequestStatus.js +19 -0
  84. package/dist/graphql/objects/LightningReceiveRequestStatus.js.map +1 -0
  85. package/dist/graphql/objects/LightningSendFeeEstimateInput.d.ts +6 -0
  86. package/dist/graphql/objects/LightningSendFeeEstimateInput.js +12 -0
  87. package/dist/graphql/objects/LightningSendFeeEstimateInput.js.map +1 -0
  88. package/dist/graphql/objects/LightningSendFeeEstimateOutput.d.ts +8 -0
  89. package/dist/graphql/objects/LightningSendFeeEstimateOutput.js +26 -0
  90. package/dist/graphql/objects/LightningSendFeeEstimateOutput.js.map +1 -0
  91. package/dist/graphql/objects/LightningSendRequest.d.ts +32 -0
  92. package/dist/graphql/objects/LightningSendRequest.js +78 -0
  93. package/dist/graphql/objects/LightningSendRequest.js.map +1 -0
  94. package/dist/graphql/objects/LightningSendRequestStatus.d.ts +15 -0
  95. package/dist/graphql/objects/LightningSendRequestStatus.js +18 -0
  96. package/dist/graphql/objects/LightningSendRequestStatus.js.map +1 -0
  97. package/dist/graphql/objects/PageInfo.d.ts +11 -0
  98. package/dist/graphql/objects/PageInfo.js +26 -0
  99. package/dist/graphql/objects/PageInfo.js.map +1 -0
  100. package/dist/graphql/objects/RequestCoopExitInput.d.ts +7 -0
  101. package/dist/graphql/objects/RequestCoopExitInput.js +14 -0
  102. package/dist/graphql/objects/RequestCoopExitInput.js.map +1 -0
  103. package/dist/graphql/objects/RequestCoopExitOutput.d.ts +7 -0
  104. package/dist/graphql/objects/RequestCoopExitOutput.js +19 -0
  105. package/dist/graphql/objects/RequestCoopExitOutput.js.map +1 -0
  106. package/dist/graphql/objects/RequestLeavesSwapInput.d.ts +13 -0
  107. package/dist/graphql/objects/RequestLeavesSwapInput.js +25 -0
  108. package/dist/graphql/objects/RequestLeavesSwapInput.js.map +1 -0
  109. package/dist/graphql/objects/RequestLeavesSwapOutput.d.ts +7 -0
  110. package/dist/graphql/objects/RequestLeavesSwapOutput.js +19 -0
  111. package/dist/graphql/objects/RequestLeavesSwapOutput.js.map +1 -0
  112. package/dist/graphql/objects/RequestLightningReceiveInput.d.ts +16 -0
  113. package/dist/graphql/objects/RequestLightningReceiveInput.js +21 -0
  114. package/dist/graphql/objects/RequestLightningReceiveInput.js.map +1 -0
  115. package/dist/graphql/objects/RequestLightningReceiveOutput.d.ts +7 -0
  116. package/dist/graphql/objects/RequestLightningReceiveOutput.js +19 -0
  117. package/dist/graphql/objects/RequestLightningReceiveOutput.js.map +1 -0
  118. package/dist/graphql/objects/RequestLightningSendInput.d.ts +7 -0
  119. package/dist/graphql/objects/RequestLightningSendInput.js +14 -0
  120. package/dist/graphql/objects/RequestLightningSendInput.js.map +1 -0
  121. package/dist/graphql/objects/RequestLightningSendOutput.d.ts +7 -0
  122. package/dist/graphql/objects/RequestLightningSendOutput.js +19 -0
  123. package/dist/graphql/objects/RequestLightningSendOutput.js.map +1 -0
  124. package/dist/graphql/objects/SparkCoopExitRequestStatus.d.ts +11 -0
  125. package/dist/graphql/objects/SparkCoopExitRequestStatus.js +14 -0
  126. package/dist/graphql/objects/SparkCoopExitRequestStatus.js.map +1 -0
  127. package/dist/graphql/objects/SparkLeavesSwapRequestStatus.d.ts +11 -0
  128. package/dist/graphql/objects/SparkLeavesSwapRequestStatus.js +14 -0
  129. package/dist/graphql/objects/SparkLeavesSwapRequestStatus.js.map +1 -0
  130. package/dist/graphql/objects/SparkTransferToLeavesConnection.d.ts +19 -0
  131. package/dist/graphql/objects/SparkTransferToLeavesConnection.js +45 -0
  132. package/dist/graphql/objects/SparkTransferToLeavesConnection.js.map +1 -0
  133. package/dist/graphql/objects/SwapLeaf.d.ts +9 -0
  134. package/dist/graphql/objects/SwapLeaf.js +23 -0
  135. package/dist/graphql/objects/SwapLeaf.js.map +1 -0
  136. package/dist/graphql/objects/Transfer.d.ts +24 -0
  137. package/dist/graphql/objects/Transfer.js +82 -0
  138. package/dist/graphql/objects/Transfer.js.map +1 -0
  139. package/dist/graphql/objects/UserLeafInput.d.ts +8 -0
  140. package/dist/graphql/objects/UserLeafInput.js +16 -0
  141. package/dist/graphql/objects/UserLeafInput.js.map +1 -0
  142. package/dist/graphql/objects/WalletUser.d.ts +21 -0
  143. package/dist/graphql/objects/WalletUser.js +48 -0
  144. package/dist/graphql/objects/WalletUser.js.map +1 -0
  145. package/dist/graphql/objects/index.d.ts +41 -0
  146. package/dist/graphql/objects/index.js +13 -0
  147. package/dist/graphql/objects/index.js.map +1 -0
  148. package/dist/graphql/queries/CoopExitFeeEstimate.d.ts +1 -0
  149. package/dist/graphql/queries/CoopExitFeeEstimate.js +18 -0
  150. package/dist/graphql/queries/CoopExitFeeEstimate.js.map +1 -0
  151. package/dist/graphql/queries/CurrentUser.d.ts +1 -0
  152. package/dist/graphql/queries/CurrentUser.js +10 -0
  153. package/dist/graphql/queries/CurrentUser.js.map +1 -0
  154. package/dist/graphql/queries/LightningReceiveFeeEstimate.d.ts +1 -0
  155. package/dist/graphql/queries/LightningReceiveFeeEstimate.js +18 -0
  156. package/dist/graphql/queries/LightningReceiveFeeEstimate.js.map +1 -0
  157. package/dist/graphql/queries/LightningSendFeeEstimate.d.ts +1 -0
  158. package/dist/graphql/queries/LightningSendFeeEstimate.js +16 -0
  159. package/dist/graphql/queries/LightningSendFeeEstimate.js.map +1 -0
  160. package/dist/proto/common.d.ts +58 -0
  161. package/dist/proto/common.js +350 -0
  162. package/dist/proto/common.js.map +1 -0
  163. package/dist/proto/google/protobuf/descriptor.d.ts +1228 -0
  164. package/dist/proto/google/protobuf/descriptor.js +5070 -0
  165. package/dist/proto/google/protobuf/descriptor.js.map +1 -0
  166. package/dist/proto/google/protobuf/duration.d.ts +99 -0
  167. package/dist/proto/google/protobuf/duration.js +90 -0
  168. package/dist/proto/google/protobuf/duration.js.map +1 -0
  169. package/dist/proto/google/protobuf/empty.d.ts +33 -0
  170. package/dist/proto/google/protobuf/empty.js +46 -0
  171. package/dist/proto/google/protobuf/empty.js.map +1 -0
  172. package/dist/proto/google/protobuf/timestamp.d.ts +128 -0
  173. package/dist/proto/google/protobuf/timestamp.js +90 -0
  174. package/dist/proto/google/protobuf/timestamp.js.map +1 -0
  175. package/dist/proto/mock.d.ts +48 -0
  176. package/dist/proto/mock.js +103 -0
  177. package/dist/proto/mock.js.map +1 -0
  178. package/dist/proto/spark.d.ts +1101 -0
  179. package/dist/proto/spark.js +9565 -0
  180. package/dist/proto/spark.js.map +1 -0
  181. package/dist/proto/spark_authn.d.ts +111 -0
  182. package/dist/proto/spark_authn.js +517 -0
  183. package/dist/proto/spark_authn.js.map +1 -0
  184. package/dist/proto/validate/validate.d.ts +1087 -0
  185. package/dist/proto/validate/validate.js +4437 -0
  186. package/dist/proto/validate/validate.js.map +1 -0
  187. package/dist/services/config.d.ts +24 -0
  188. package/dist/services/config.js +29 -0
  189. package/dist/services/config.js.map +1 -0
  190. package/dist/services/connection.d.ts +21 -0
  191. package/dist/services/connection.js +154 -0
  192. package/dist/services/connection.js.map +1 -0
  193. package/dist/services/coop-exit.d.ts +20 -0
  194. package/dist/services/coop-exit.js +102 -0
  195. package/dist/services/coop-exit.js.map +1 -0
  196. package/dist/services/deposit.d.ts +21 -0
  197. package/dist/services/deposit.js +214 -0
  198. package/dist/services/deposit.js.map +1 -0
  199. package/dist/services/lightning.d.ts +31 -0
  200. package/dist/services/lightning.js +196 -0
  201. package/dist/services/lightning.js.map +1 -0
  202. package/dist/services/token-transactions.d.ts +17 -0
  203. package/dist/services/token-transactions.js +297 -0
  204. package/dist/services/token-transactions.js.map +1 -0
  205. package/dist/services/transfer.d.ts +63 -0
  206. package/dist/services/transfer.js +499 -0
  207. package/dist/services/transfer.js.map +1 -0
  208. package/dist/services/tree-creation.d.ts +30 -0
  209. package/dist/services/tree-creation.js +404 -0
  210. package/dist/services/tree-creation.js.map +1 -0
  211. package/dist/signer/signer.d.ts +97 -0
  212. package/dist/signer/signer.js +239 -0
  213. package/dist/signer/signer.js.map +1 -0
  214. package/dist/spark-sdk.d.ts +87 -0
  215. package/dist/spark-sdk.js +675 -0
  216. package/dist/spark-sdk.js.map +1 -0
  217. package/dist/tests/adaptor-signature.test.d.ts +1 -0
  218. package/dist/tests/adaptor-signature.test.js +34 -0
  219. package/dist/tests/adaptor-signature.test.js.map +1 -0
  220. package/dist/tests/bitcoin.test.d.ts +1 -0
  221. package/dist/tests/bitcoin.test.js +77 -0
  222. package/dist/tests/bitcoin.test.js.map +1 -0
  223. package/dist/tests/coop-exit.test.d.ts +1 -0
  224. package/dist/tests/coop-exit.test.js +140 -0
  225. package/dist/tests/coop-exit.test.js.map +1 -0
  226. package/dist/tests/deposit.test.d.ts +1 -0
  227. package/dist/tests/deposit.test.js +57 -0
  228. package/dist/tests/deposit.test.js.map +1 -0
  229. package/dist/tests/keys.test.d.ts +1 -0
  230. package/dist/tests/keys.test.js +53 -0
  231. package/dist/tests/keys.test.js.map +1 -0
  232. package/dist/tests/lightning.test.d.ts +1 -0
  233. package/dist/tests/lightning.test.js +175 -0
  234. package/dist/tests/lightning.test.js.map +1 -0
  235. package/dist/tests/secret-sharing.test.d.ts +1 -0
  236. package/dist/tests/secret-sharing.test.js +41 -0
  237. package/dist/tests/secret-sharing.test.js.map +1 -0
  238. package/dist/tests/swap.test.d.ts +1 -0
  239. package/dist/tests/swap.test.js +131 -0
  240. package/dist/tests/swap.test.js.map +1 -0
  241. package/dist/tests/test-util.d.ts +24 -0
  242. package/dist/tests/test-util.js +137 -0
  243. package/dist/tests/test-util.js.map +1 -0
  244. package/dist/tests/tokens.test.d.ts +1 -0
  245. package/dist/tests/tokens.test.js +42 -0
  246. package/dist/tests/tokens.test.js.map +1 -0
  247. package/dist/tests/transfer.test.d.ts +1 -0
  248. package/dist/tests/transfer.test.js +175 -0
  249. package/dist/tests/transfer.test.js.map +1 -0
  250. package/dist/tests/tree-creation.test.d.ts +1 -0
  251. package/dist/tests/tree-creation.test.js +32 -0
  252. package/dist/tests/tree-creation.test.js.map +1 -0
  253. package/dist/tests/utils/spark-testing-wallet.d.ts +14 -0
  254. package/dist/tests/utils/spark-testing-wallet.js +13 -0
  255. package/dist/tests/utils/spark-testing-wallet.js.map +1 -0
  256. package/dist/tests/utils/test-faucet.d.ts +22 -0
  257. package/dist/tests/utils/test-faucet.js +148 -0
  258. package/dist/tests/utils/test-faucet.js.map +1 -0
  259. package/dist/types/index.d.ts +3 -0
  260. package/dist/types/index.js +4 -0
  261. package/dist/types/index.js.map +1 -0
  262. package/dist/utils/adaptor-signature.d.ts +7 -0
  263. package/dist/utils/adaptor-signature.js +114 -0
  264. package/dist/utils/adaptor-signature.js.map +1 -0
  265. package/dist/utils/bitcoin.d.ts +12 -0
  266. package/dist/utils/bitcoin.js +87 -0
  267. package/dist/utils/bitcoin.js.map +1 -0
  268. package/dist/utils/crypto.d.ts +1 -0
  269. package/dist/utils/crypto.js +14 -0
  270. package/dist/utils/crypto.js.map +1 -0
  271. package/dist/utils/index.d.ts +14 -0
  272. package/dist/utils/index.js +15 -0
  273. package/dist/utils/index.js.map +1 -0
  274. package/dist/utils/keys.d.ts +7 -0
  275. package/dist/utils/keys.js +68 -0
  276. package/dist/utils/keys.js.map +1 -0
  277. package/dist/utils/network.d.ts +11 -0
  278. package/dist/utils/network.js +26 -0
  279. package/dist/utils/network.js.map +1 -0
  280. package/dist/utils/proof.d.ts +1 -0
  281. package/dist/utils/proof.js +12 -0
  282. package/dist/utils/proof.js.map +1 -0
  283. package/dist/utils/response-validation.d.ts +1 -0
  284. package/dist/utils/response-validation.js +16 -0
  285. package/dist/utils/response-validation.js.map +1 -0
  286. package/dist/utils/secret-sharing.d.ts +26 -0
  287. package/dist/utils/secret-sharing.js +175 -0
  288. package/dist/utils/secret-sharing.js.map +1 -0
  289. package/dist/utils/signing.d.ts +12 -0
  290. package/dist/utils/signing.js +67 -0
  291. package/dist/utils/signing.js.map +1 -0
  292. package/dist/utils/token-hashing.d.ts +3 -0
  293. package/dist/utils/token-hashing.js +117 -0
  294. package/dist/utils/token-hashing.js.map +1 -0
  295. package/dist/utils/token-keyshares.d.ts +5 -0
  296. package/dist/utils/token-keyshares.js +17 -0
  297. package/dist/utils/token-keyshares.js.map +1 -0
  298. package/dist/utils/token-transactions.d.ts +5 -0
  299. package/dist/utils/token-transactions.js +40 -0
  300. package/dist/utils/token-transactions.js.map +1 -0
  301. package/dist/utils/transaction.d.ts +8 -0
  302. package/dist/utils/transaction.js +33 -0
  303. package/dist/utils/transaction.js.map +1 -0
  304. package/dist/utils/wasm-wrapper.d.ts +2 -0
  305. package/dist/utils/wasm-wrapper.js +36 -0
  306. package/dist/utils/wasm-wrapper.js.map +1 -0
  307. package/dist/utils/wasm.d.ts +54 -0
  308. package/dist/utils/wasm.js +26 -0
  309. package/dist/utils/wasm.js.map +1 -0
  310. package/dist/wasm/spark_bindings.d.ts +229 -0
  311. package/dist/wasm/spark_bindings.js +1097 -0
  312. package/dist/wasm/spark_bindings.js.map +1 -0
  313. package/dist/wasm/spark_bindings_bg.wasm +0 -0
  314. package/package.json +140 -0
@@ -0,0 +1,196 @@
1
+ import { bytesToNumberBE, numberToBytesBE } from "@noble/curves/abstract/utils";
2
+ import { secp256k1 } from "@noble/curves/secp256k1";
3
+ import { sha256 } from "@scure/btc-signer/utils";
4
+ import { decode } from "light-bolt11-decoder";
5
+ import { InitiatePreimageSwapRequest_Reason, } from "../proto/spark.js";
6
+ import { getTxFromRawTxBytes } from "../utils/bitcoin.js";
7
+ import { getCrypto } from "../utils/crypto.js";
8
+ import { createRefundTx } from "../utils/transaction.js";
9
+ const crypto = getCrypto();
10
+ export class LightningService {
11
+ config;
12
+ connectionManager;
13
+ constructor(config, connectionManager) {
14
+ this.config = config;
15
+ this.connectionManager = connectionManager;
16
+ }
17
+ async createLightningInvoice({ invoiceCreator, amountSats, memo, }) {
18
+ const randBytes = crypto.getRandomValues(new Uint8Array(32));
19
+ const preimage = numberToBytesBE(bytesToNumberBE(randBytes) % secp256k1.CURVE.n, 32);
20
+ return await this.createLightningInvoiceWithPreImage({
21
+ invoiceCreator,
22
+ amountSats,
23
+ memo,
24
+ preimage,
25
+ });
26
+ }
27
+ async createLightningInvoiceWithPreImage({ invoiceCreator, amountSats, memo, preimage, }) {
28
+ const paymentHash = sha256(preimage);
29
+ const invoice = await invoiceCreator(amountSats, paymentHash, memo);
30
+ if (!invoice) {
31
+ throw new Error("Error creating lightning invoice");
32
+ }
33
+ const shares = await this.config.signer.splitSecretWithProofs({
34
+ secret: preimage,
35
+ curveOrder: secp256k1.CURVE.n,
36
+ threshold: this.config.getConfig().threshold,
37
+ numShares: Object.keys(this.config.getConfig().signingOperators).length,
38
+ });
39
+ const errors = [];
40
+ const promises = Object.entries(this.config.getConfig().signingOperators).map(async ([_, operator]) => {
41
+ const share = shares[operator.id];
42
+ if (!share) {
43
+ throw new Error("Share not found");
44
+ }
45
+ const sparkClient = await this.connectionManager.createSparkClient(operator.address);
46
+ try {
47
+ await sparkClient.store_preimage_share({
48
+ paymentHash,
49
+ preimageShare: {
50
+ secretShare: numberToBytesBE(share.share, 32),
51
+ proofs: share.proofs,
52
+ },
53
+ threshold: this.config.getConfig().threshold,
54
+ invoiceString: invoice,
55
+ userIdentityPublicKey: await this.config.signer.getIdentityPublicKey(),
56
+ });
57
+ }
58
+ catch (e) {
59
+ errors.push(e);
60
+ }
61
+ });
62
+ await Promise.all(promises);
63
+ if (errors.length > 0) {
64
+ throw new Error(`Error creating lightning invoice: ${errors[0]}`);
65
+ }
66
+ return invoice;
67
+ }
68
+ async swapNodesForPreimage({ leaves, receiverIdentityPubkey, paymentHash, invoiceString, isInboundPayment, }) {
69
+ const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
70
+ let signingCommitments;
71
+ try {
72
+ signingCommitments = await sparkClient.get_signing_commitments({
73
+ nodeIds: leaves.map((leaf) => leaf.leaf.id),
74
+ });
75
+ }
76
+ catch (error) {
77
+ throw new Error(`Error getting signing commitments: ${error}`);
78
+ }
79
+ const userSignedRefunds = await this.signRefunds(leaves, signingCommitments.signingCommitments, receiverIdentityPubkey);
80
+ const transferId = crypto.randomUUID();
81
+ let bolt11String = "";
82
+ let amountSats = 0;
83
+ if (invoiceString) {
84
+ const decodedInvoice = decode(invoiceString);
85
+ let amountMsats = 0;
86
+ try {
87
+ amountMsats = Number(decodedInvoice.sections.find((section) => section.name === "amount")
88
+ ?.value);
89
+ }
90
+ catch (error) {
91
+ console.error("Error decoding invoice", error);
92
+ }
93
+ amountSats = amountMsats / 1000;
94
+ bolt11String = invoiceString;
95
+ }
96
+ const reason = isInboundPayment
97
+ ? InitiatePreimageSwapRequest_Reason.REASON_RECEIVE
98
+ : InitiatePreimageSwapRequest_Reason.REASON_SEND;
99
+ let response;
100
+ try {
101
+ response = await sparkClient.initiate_preimage_swap({
102
+ paymentHash,
103
+ userSignedRefunds,
104
+ reason,
105
+ invoiceAmount: {
106
+ invoiceAmountProof: {
107
+ bolt11Invoice: bolt11String,
108
+ },
109
+ valueSats: amountSats,
110
+ },
111
+ transfer: {
112
+ transferId,
113
+ ownerIdentityPublicKey: await this.config.signer.getIdentityPublicKey(),
114
+ receiverIdentityPublicKey: receiverIdentityPubkey,
115
+ },
116
+ receiverIdentityPublicKey: receiverIdentityPubkey,
117
+ feeSats: 0,
118
+ });
119
+ }
120
+ catch (error) {
121
+ throw new Error(`Error initiating preimage swap: ${error}`);
122
+ }
123
+ return response;
124
+ }
125
+ async queryUserSignedRefunds(paymentHash) {
126
+ const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
127
+ let response;
128
+ try {
129
+ response = await sparkClient.query_user_signed_refunds({
130
+ paymentHash,
131
+ });
132
+ }
133
+ catch (error) {
134
+ throw new Error(`Error querying user signed refunds: ${error}`);
135
+ }
136
+ return response.userSignedRefunds;
137
+ }
138
+ validateUserSignedRefund(userSignedRefund) {
139
+ const refundTx = getTxFromRawTxBytes(userSignedRefund.refundTx);
140
+ // TODO: Should we assert that the amount is always defined here?
141
+ return refundTx.getOutput(0).amount || 0n;
142
+ }
143
+ async providePreimage(preimage) {
144
+ const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
145
+ const paymentHash = sha256(preimage);
146
+ let response;
147
+ try {
148
+ response = await sparkClient.provide_preimage({
149
+ preimage,
150
+ paymentHash,
151
+ });
152
+ }
153
+ catch (error) {
154
+ throw new Error(`Error providing preimage: ${error}`);
155
+ }
156
+ if (!response.transfer) {
157
+ throw new Error("No transfer returned from coordinator");
158
+ }
159
+ return response.transfer;
160
+ }
161
+ async signRefunds(leaves, signingCommitments, receiverIdentityPubkey) {
162
+ const userSignedRefunds = [];
163
+ for (let i = 0; i < leaves.length; i++) {
164
+ const leaf = leaves[i];
165
+ if (!leaf?.leaf) {
166
+ throw new Error("Leaf not found in signRefunds");
167
+ }
168
+ const { refundTx, sighash } = createRefundTx(leaf.leaf, receiverIdentityPubkey, this.config.getNetwork());
169
+ const signingCommitment = await this.config.signer.getRandomSigningCommitment();
170
+ const signingNonceCommitments = signingCommitments[i]?.signingNonceCommitments;
171
+ if (!signingNonceCommitments) {
172
+ throw new Error("Signing nonce commitments not found in signRefunds");
173
+ }
174
+ const signingResult = await this.config.signer.signFrost({
175
+ message: sighash,
176
+ publicKey: leaf.signingPubKey,
177
+ privateAsPubKey: leaf.signingPubKey,
178
+ selfCommitment: signingCommitment,
179
+ statechainCommitments: signingNonceCommitments,
180
+ adaptorPubKey: new Uint8Array(),
181
+ verifyingKey: leaf.leaf.verifyingPublicKey,
182
+ });
183
+ userSignedRefunds.push({
184
+ nodeId: leaf.leaf.id,
185
+ refundTx: refundTx.toBytes(),
186
+ userSignature: signingResult,
187
+ userSignatureCommitment: signingCommitment,
188
+ signingCommitments: {
189
+ signingCommitments: signingNonceCommitments,
190
+ },
191
+ });
192
+ }
193
+ return userSignedRefunds;
194
+ }
195
+ }
196
+ //# sourceMappingURL=lightning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightning.js","sourceRoot":"","sources":["../../src/services/lightning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { LeafWithPreviousTransactionData, TokenTransaction } from "../proto/spark.js";
2
+ import { WalletConfigService } from "./config.js";
3
+ import { ConnectionManager } from "./connection.js";
4
+ export declare class TokenTransactionService {
5
+ protected readonly config: WalletConfigService;
6
+ protected readonly connectionManager: ConnectionManager;
7
+ constructor(config: WalletConfigService, connectionManager: ConnectionManager);
8
+ constructTransferTokenTransaction(selectedLeaves: LeafWithPreviousTransactionData[], recipientPublicKey: Uint8Array, tokenPublicKey: Uint8Array, tokenAmount: bigint): Promise<TokenTransaction>;
9
+ collectOperatorIdentityPublicKeys(): Uint8Array[];
10
+ broadcastTokenTransaction(tokenTransaction: TokenTransaction, leafToSpendSigningPublicKeys?: Uint8Array[], leafToSpendRevocationPublicKeys?: Uint8Array[]): Promise<TokenTransaction>;
11
+ finalizeTokenTransaction(finalTokenTransaction: TokenTransaction, leafToSpendRevocationKeys: Uint8Array[], threshold: number): Promise<TokenTransaction>;
12
+ constructConsolidateTokenTransaction(selectedLeaves: LeafWithPreviousTransactionData[], tokenPublicKey: Uint8Array): Promise<TokenTransaction>;
13
+ fetchOwnedTokenLeaves(ownerPublicKeys: Uint8Array[], tokenPublicKeys: Uint8Array[]): Promise<LeafWithPreviousTransactionData[]>;
14
+ syncTokenLeaves(tokenLeaves: Map<string, LeafWithPreviousTransactionData[]>): Promise<void>;
15
+ selectTokenLeaves(tokenLeaves: LeafWithPreviousTransactionData[], tokenAmount: bigint): LeafWithPreviousTransactionData[];
16
+ private signMessageWithKey;
17
+ }
@@ -0,0 +1,297 @@
1
+ import { bytesToHex, bytesToNumberBE, numberToBytesBE, } from "@noble/curves/abstract/utils";
2
+ import { secp256k1 } from "@noble/curves/secp256k1";
3
+ import { validateResponses } from "../utils/response-validation.js";
4
+ import { hashOperatorSpecificTokenTransactionSignablePayload, hashTokenTransaction, } from "../utils/token-hashing.js";
5
+ import { recoverPrivateKeyFromKeyshares, } from "../utils/token-keyshares.js";
6
+ import { calculateAvailableTokenAmount, getTokenLeavesSum, } from "../utils/token-transactions.js";
7
+ export class TokenTransactionService {
8
+ config;
9
+ connectionManager;
10
+ constructor(config, connectionManager) {
11
+ this.config = config;
12
+ this.connectionManager = connectionManager;
13
+ }
14
+ async constructTransferTokenTransaction(selectedLeaves, recipientPublicKey, tokenPublicKey, tokenAmount) {
15
+ let availableTokenAmount = calculateAvailableTokenAmount(selectedLeaves);
16
+ if (availableTokenAmount === tokenAmount) {
17
+ return {
18
+ tokenInput: {
19
+ $case: "transferInput",
20
+ transferInput: {
21
+ leavesToSpend: selectedLeaves.map((leaf) => ({
22
+ prevTokenTransactionHash: leaf.previousTransactionHash,
23
+ prevTokenTransactionLeafVout: leaf.previousTransactionVout,
24
+ })),
25
+ },
26
+ },
27
+ outputLeaves: [
28
+ {
29
+ ownerPublicKey: recipientPublicKey,
30
+ tokenPublicKey: tokenPublicKey,
31
+ tokenAmount: numberToBytesBE(tokenAmount, 16),
32
+ },
33
+ ],
34
+ sparkOperatorIdentityPublicKeys: this.collectOperatorIdentityPublicKeys(),
35
+ };
36
+ }
37
+ else {
38
+ const tokenAmountDifference = availableTokenAmount - tokenAmount;
39
+ return {
40
+ tokenInput: {
41
+ $case: "transferInput",
42
+ transferInput: {
43
+ leavesToSpend: selectedLeaves.map((leaf) => ({
44
+ prevTokenTransactionHash: leaf.previousTransactionHash,
45
+ prevTokenTransactionLeafVout: leaf.previousTransactionVout,
46
+ })),
47
+ },
48
+ },
49
+ outputLeaves: [
50
+ {
51
+ ownerPublicKey: recipientPublicKey,
52
+ tokenPublicKey: tokenPublicKey,
53
+ tokenAmount: numberToBytesBE(tokenAmount, 16),
54
+ },
55
+ {
56
+ ownerPublicKey: await this.config.signer.getIdentityPublicKey(),
57
+ tokenPublicKey: tokenPublicKey,
58
+ tokenAmount: numberToBytesBE(tokenAmountDifference, 16),
59
+ },
60
+ ],
61
+ sparkOperatorIdentityPublicKeys: this.collectOperatorIdentityPublicKeys(),
62
+ };
63
+ }
64
+ }
65
+ collectOperatorIdentityPublicKeys() {
66
+ const operatorKeys = [];
67
+ for (const [_, operator] of Object.entries(this.config.getConfig().signingOperators)) {
68
+ operatorKeys.push(operator.identityPublicKey);
69
+ }
70
+ return operatorKeys;
71
+ }
72
+ async broadcastTokenTransaction(tokenTransaction, leafToSpendSigningPublicKeys, leafToSpendRevocationPublicKeys) {
73
+ const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
74
+ const signingOperators = this.config.getConfig().signingOperators;
75
+ const partialTokenTransactionHash = hashTokenTransaction(tokenTransaction, true);
76
+ const ownerSignatures = [];
77
+ if (tokenTransaction.tokenInput.$case === "mintInput") {
78
+ const issuerPublicKey = tokenTransaction.tokenInput.mintInput.issuerPublicKey;
79
+ if (!issuerPublicKey) {
80
+ throw new Error("issuer public key cannot be nil");
81
+ }
82
+ const ownerSignature = await this.signMessageWithKey(partialTokenTransactionHash, issuerPublicKey);
83
+ ownerSignatures.push(ownerSignature);
84
+ }
85
+ else if (tokenTransaction.tokenInput.$case === "transferInput") {
86
+ const transferInput = tokenTransaction.tokenInput.transferInput;
87
+ if (!leafToSpendSigningPublicKeys || !leafToSpendRevocationPublicKeys) {
88
+ throw new Error("leafToSpendSigningPublicKeys and leafToSpendRevocationPublicKeys are required");
89
+ }
90
+ for (let i = 0; i < transferInput.leavesToSpend.length; i++) {
91
+ const key = leafToSpendSigningPublicKeys[i];
92
+ if (!key) {
93
+ throw new Error("key not found");
94
+ }
95
+ const ownerSignature = await this.signMessageWithKey(partialTokenTransactionHash, key);
96
+ ownerSignatures.push(ownerSignature);
97
+ }
98
+ }
99
+ // Start the token transaction
100
+ const startResponse = await sparkClient.start_token_transaction({
101
+ identityPublicKey: await this.config.signer.getIdentityPublicKey(),
102
+ partialTokenTransaction: tokenTransaction,
103
+ tokenTransactionSignatures: {
104
+ ownerSignatures: ownerSignatures,
105
+ },
106
+ });
107
+ // Validate keyshare configuration
108
+ if (startResponse.keyshareInfo?.ownerIdentifiers.length !==
109
+ Object.keys(signingOperators).length) {
110
+ throw new Error(`Keyshare operator count (${startResponse.keyshareInfo?.ownerIdentifiers.length}) does not match signing operator count (${Object.keys(signingOperators).length})`);
111
+ }
112
+ for (const identifier of startResponse.keyshareInfo?.ownerIdentifiers ||
113
+ []) {
114
+ if (!signingOperators[identifier]) {
115
+ throw new Error(`Keyshare operator ${identifier} not found in signing operator list`);
116
+ }
117
+ }
118
+ const finalTokenTransaction = startResponse.finalTokenTransaction;
119
+ const finalTokenTransactionHash = hashTokenTransaction(finalTokenTransaction, false);
120
+ const payload = {
121
+ finalTokenTransactionHash: finalTokenTransactionHash,
122
+ operatorIdentityPublicKey: await this.config.signer.getIdentityPublicKey(),
123
+ };
124
+ const payloadHash = await hashOperatorSpecificTokenTransactionSignablePayload(payload);
125
+ const operatorSpecificSignatures = [];
126
+ if (tokenTransaction.tokenInput.$case === "mintInput") {
127
+ const issuerPublicKey = tokenTransaction.tokenInput.mintInput.issuerPublicKey;
128
+ if (!issuerPublicKey) {
129
+ throw new Error("issuer public key cannot be nil");
130
+ }
131
+ const ownerSignature = await this.signMessageWithKey(payloadHash, issuerPublicKey);
132
+ operatorSpecificSignatures.push({
133
+ ownerPublicKey: issuerPublicKey,
134
+ ownerSignature: ownerSignature,
135
+ payload: payload,
136
+ });
137
+ }
138
+ if (tokenTransaction.tokenInput.$case === "transferInput") {
139
+ const transferInput = tokenTransaction.tokenInput.transferInput;
140
+ for (let i = 0; i < transferInput.leavesToSpend.length; i++) {
141
+ const ownerSignature = await this.config.signer.signMessageWithIdentityKey(payloadHash);
142
+ operatorSpecificSignatures.push({
143
+ ownerPublicKey: await this.config.signer.getIdentityPublicKey(),
144
+ ownerSignature: ownerSignature,
145
+ payload: payload,
146
+ });
147
+ }
148
+ }
149
+ // Submit sign_token_transaction to all SOs in parallel and track their indices
150
+ const soSignatures = await Promise.allSettled(Object.entries(signingOperators).map(async ([identifier, operator], index) => {
151
+ const internalSparkClient = await this.connectionManager.createSparkClient(operator.address);
152
+ const identityPublicKey = await this.config.signer.getIdentityPublicKey();
153
+ const response = await internalSparkClient.sign_token_transaction({
154
+ finalTokenTransaction,
155
+ operatorSpecificSignatures,
156
+ identityPublicKey,
157
+ });
158
+ return {
159
+ index,
160
+ identifier,
161
+ response,
162
+ };
163
+ }));
164
+ const threshold = startResponse.keyshareInfo.threshold;
165
+ const successfulSignatures = validateResponses(soSignatures);
166
+ if (tokenTransaction.tokenInput.$case === "transferInput") {
167
+ const leavesToSpend = tokenTransaction.tokenInput.transferInput.leavesToSpend;
168
+ let revocationKeys = [];
169
+ for (let leafIndex = 0; leafIndex < leavesToSpend.length; leafIndex++) {
170
+ // For each leaf, collect keyshares from all SOs that responded successfully
171
+ const leafKeyshares = successfulSignatures.map(({ identifier, response }) => ({
172
+ index: parseInt(identifier, 16),
173
+ keyshare: response.tokenTransactionRevocationKeyshares[leafIndex],
174
+ }));
175
+ if (leafKeyshares.length < threshold) {
176
+ throw new Error(`Insufficient keyshares for leaf ${leafIndex}: got ${leafKeyshares.length}, need ${threshold}`);
177
+ }
178
+ // Check for duplicate operator indices
179
+ const seenIndices = new Set();
180
+ for (const { index } of leafKeyshares) {
181
+ if (seenIndices.has(index)) {
182
+ throw new Error(`Duplicate operator index ${index} for leaf ${leafIndex}`);
183
+ }
184
+ seenIndices.add(index);
185
+ }
186
+ const recoveredPrivateKey = recoverPrivateKeyFromKeyshares(leafKeyshares, threshold);
187
+ const recoveredPublicKey = secp256k1.getPublicKey(recoveredPrivateKey, true);
188
+ if (!leafToSpendRevocationPublicKeys ||
189
+ !leafToSpendRevocationPublicKeys[leafIndex] ||
190
+ !recoveredPublicKey.every((byte, i) => byte === leafToSpendRevocationPublicKeys[leafIndex][i])) {
191
+ throw new Error(`Recovered public key does not match expected revocation public key for leaf ${leafIndex}`);
192
+ }
193
+ revocationKeys.push(recoveredPrivateKey);
194
+ }
195
+ // Finalize the token transaction with the keyshares
196
+ await this.finalizeTokenTransaction(finalTokenTransaction, revocationKeys, threshold);
197
+ }
198
+ return startResponse.finalTokenTransaction;
199
+ }
200
+ async finalizeTokenTransaction(finalTokenTransaction, leafToSpendRevocationKeys, threshold) {
201
+ const signingOperators = this.config.getConfig().signingOperators;
202
+ // Submit finalize_token_transaction to all SOs in parallel
203
+ const soResponses = await Promise.allSettled(Object.entries(signingOperators).map(async ([identifier, operator]) => {
204
+ const internalSparkClient = await this.connectionManager.createSparkClient(operator.address);
205
+ const identityPublicKey = await this.config.signer.getIdentityPublicKey();
206
+ const response = await internalSparkClient.finalize_token_transaction({
207
+ finalTokenTransaction,
208
+ leafToSpendRevocationKeys,
209
+ identityPublicKey,
210
+ });
211
+ return {
212
+ identifier,
213
+ response,
214
+ };
215
+ }));
216
+ validateResponses(soResponses);
217
+ return finalTokenTransaction;
218
+ }
219
+ async constructConsolidateTokenTransaction(selectedLeaves, tokenPublicKey) {
220
+ const tokenAmountSum = getTokenLeavesSum(selectedLeaves);
221
+ const transferTokenTransaction = {
222
+ tokenInput: {
223
+ $case: "transferInput",
224
+ transferInput: {
225
+ leavesToSpend: selectedLeaves.map((leaf) => ({
226
+ prevTokenTransactionHash: leaf.previousTransactionHash,
227
+ prevTokenTransactionLeafVout: leaf.previousTransactionVout,
228
+ })),
229
+ },
230
+ },
231
+ outputLeaves: [
232
+ {
233
+ ownerPublicKey: await this.config.signer.getIdentityPublicKey(),
234
+ tokenPublicKey: tokenPublicKey,
235
+ tokenAmount: numberToBytesBE(tokenAmountSum, 16),
236
+ },
237
+ ],
238
+ sparkOperatorIdentityPublicKeys: this.collectOperatorIdentityPublicKeys(),
239
+ };
240
+ return transferTokenTransaction;
241
+ }
242
+ async fetchOwnedTokenLeaves(ownerPublicKeys, tokenPublicKeys) {
243
+ const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
244
+ const result = await sparkClient.get_owned_token_leaves({
245
+ ownerPublicKeys,
246
+ tokenPublicKeys,
247
+ });
248
+ return result.leavesWithPreviousTransactionData;
249
+ }
250
+ async syncTokenLeaves(tokenLeaves) {
251
+ const unsortedTokenLeaves = await this.fetchOwnedTokenLeaves(await this.config.signer.getTrackedPublicKeys(), []);
252
+ unsortedTokenLeaves.forEach((leaf) => {
253
+ const tokenKey = bytesToHex(leaf.leaf.tokenPublicKey);
254
+ const index = leaf.previousTransactionVout;
255
+ tokenLeaves.set(tokenKey, [{ ...leaf, previousTransactionVout: index }]);
256
+ });
257
+ }
258
+ selectTokenLeaves(tokenLeaves, tokenAmount) {
259
+ if (calculateAvailableTokenAmount(tokenLeaves) < tokenAmount) {
260
+ throw new Error("Insufficient available token amount");
261
+ }
262
+ // First try to find an exact match
263
+ const exactMatch = tokenLeaves.find((item) => bytesToNumberBE(item.leaf.tokenAmount) === tokenAmount);
264
+ if (exactMatch) {
265
+ return [exactMatch];
266
+ }
267
+ // Sort by amount ascending for optimal selection.
268
+ // It's in user's interest to hold as little leaves as possible,
269
+ // so that in the event of a unilateral exit the fees are as low as possible
270
+ tokenLeaves.sort((a, b) => Number(bytesToNumberBE(a.leaf.tokenAmount) -
271
+ bytesToNumberBE(b.leaf.tokenAmount)));
272
+ let remainingAmount = tokenAmount;
273
+ const selectedLeaves = [];
274
+ // Select leaves using a greedy approach
275
+ for (const leafInfo of tokenLeaves) {
276
+ if (remainingAmount <= 0n)
277
+ break;
278
+ selectedLeaves.push(leafInfo);
279
+ remainingAmount -= bytesToNumberBE(leafInfo.leaf.tokenAmount);
280
+ }
281
+ if (remainingAmount > 0n) {
282
+ throw new Error("You do not have enough funds to complete the specified operation");
283
+ }
284
+ return selectedLeaves;
285
+ }
286
+ // Helper function for deciding if the signer public key is the identity public key
287
+ async signMessageWithKey(message, publicKey) {
288
+ if (bytesToHex(publicKey) ===
289
+ bytesToHex(await this.config.signer.getIdentityPublicKey())) {
290
+ return await this.config.signer.signMessageWithIdentityKey(message);
291
+ }
292
+ else {
293
+ return await this.config.signer.signMessageWithPublicKey(message, publicKey);
294
+ }
295
+ }
296
+ }
297
+ //# sourceMappingURL=token-transactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-transactions.js","sourceRoot":"","sources":["../../src/services/token-transactions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { Transaction } from "@scure/btc-signer";
2
+ import { LeafRefundTxSigningResult, NodeSignatures, QueryPendingTransfersResponse, Transfer, TreeNode } from "../proto/spark.js";
3
+ import { SigningCommitment } from "../signer/signer.js";
4
+ import { VerifiableSecretShare } from "../utils/secret-sharing.js";
5
+ import { WalletConfigService } from "./config.js";
6
+ import { ConnectionManager } from "./connection.js";
7
+ export type LeafKeyTweak = {
8
+ leaf: TreeNode;
9
+ signingPubKey: Uint8Array;
10
+ newSigningPubKey: Uint8Array;
11
+ };
12
+ export type ClaimLeafData = {
13
+ signingPubKey: Uint8Array;
14
+ tx?: Transaction;
15
+ refundTx?: Transaction;
16
+ signingNonceCommitment: SigningCommitment;
17
+ vout?: number;
18
+ };
19
+ export type LeafRefundSigningData = {
20
+ signingPubKey: Uint8Array;
21
+ receivingPubkey: Uint8Array;
22
+ tx: Transaction;
23
+ refundTx?: Transaction;
24
+ signingNonceCommitment: SigningCommitment;
25
+ vout: number;
26
+ };
27
+ export declare class BaseTransferService {
28
+ protected readonly config: WalletConfigService;
29
+ protected readonly connectionManager: ConnectionManager;
30
+ constructor(config: WalletConfigService, connectionManager: ConnectionManager);
31
+ sendTransferTweakKey(transfer: Transfer, leaves: LeafKeyTweak[], refundSignatureMap: Map<string, Uint8Array>): Promise<Transfer>;
32
+ signRefunds(leafDataMap: Map<string, ClaimLeafData>, operatorSigningResults: LeafRefundTxSigningResult[], adaptorPubKey?: Uint8Array): Promise<NodeSignatures[]>;
33
+ private prepareSendTransferKeyTweaks;
34
+ private prepareSingleSendTransferKeyTweak;
35
+ protected findShare(shares: VerifiableSecretShare[], operatorID: number): VerifiableSecretShare | undefined;
36
+ private compareTransfers;
37
+ }
38
+ export declare class TransferService extends BaseTransferService {
39
+ constructor(config: WalletConfigService, connectionManager: ConnectionManager);
40
+ sendTransfer(leaves: LeafKeyTweak[], receiverIdentityPubkey: Uint8Array, expiryTime: Date): Promise<Transfer>;
41
+ claimTransfer(transfer: Transfer, leaves: LeafKeyTweak[]): Promise<import("../proto/spark.js").FinalizeNodeSignaturesResponse>;
42
+ queryPendingTransfers(): Promise<QueryPendingTransfersResponse>;
43
+ verifyPendingTransfer(transfer: Transfer): Promise<Map<string, Uint8Array>>;
44
+ sendSwapSignRefund(leaves: LeafKeyTweak[], receiverIdentityPubkey: Uint8Array, expiryTime: Date, adaptorPubKey?: Uint8Array): Promise<{
45
+ transfer: Transfer;
46
+ signatureMap: Map<string, Uint8Array>;
47
+ leafDataMap: Map<string, LeafRefundSigningData>;
48
+ signingResults: LeafRefundTxSigningResult[];
49
+ }>;
50
+ sendTransferSignRefund(leaves: LeafKeyTweak[], receiverIdentityPubkey: Uint8Array, expiryTime: Date): Promise<{
51
+ transfer: Transfer;
52
+ signatureMap: Map<string, Uint8Array>;
53
+ leafDataMap: Map<string, LeafRefundSigningData>;
54
+ }>;
55
+ private prepareRefundSoSigningJobs;
56
+ claimTransferTweakKeys(transfer: Transfer, leaves: LeafKeyTweak[]): Promise<void>;
57
+ private prepareClaimLeavesKeyTweaks;
58
+ private prepareClaimLeafKeyTweaks;
59
+ claimTransferSignRefunds(transfer: Transfer, leafKeys: LeafKeyTweak[]): Promise<NodeSignatures[]>;
60
+ private finalizeTransfer;
61
+ cancelSendTransfer(transfer: Transfer): Promise<Transfer | undefined>;
62
+ queryPendingTransfersBySender(): Promise<QueryPendingTransfersResponse>;
63
+ }