@buildonspark/issuer-sdk 0.0.13 → 0.0.14

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 (368) hide show
  1. package/dist/{interface → issuer-sdk/src/interface}/wallet-interface.d.ts +2 -0
  2. package/dist/issuer-sdk/src/interface/wallet-interface.js.map +1 -0
  3. package/dist/{issuer-sdk.d.ts → issuer-sdk/src/issuer-sdk.d.ts} +2 -0
  4. package/dist/{issuer-sdk.js → issuer-sdk/src/issuer-sdk.js} +9 -1
  5. package/dist/issuer-sdk/src/issuer-sdk.js.map +1 -0
  6. package/dist/issuer-sdk/src/proto/common.js.map +1 -0
  7. package/dist/issuer-sdk/src/proto/google/protobuf/descriptor.js.map +1 -0
  8. package/dist/issuer-sdk/src/proto/google/protobuf/duration.js.map +1 -0
  9. package/dist/issuer-sdk/src/proto/google/protobuf/empty.js.map +1 -0
  10. package/dist/issuer-sdk/src/proto/google/protobuf/timestamp.js.map +1 -0
  11. package/dist/issuer-sdk/src/proto/mock.js.map +1 -0
  12. package/dist/issuer-sdk/src/proto/spark.js.map +1 -0
  13. package/dist/issuer-sdk/src/proto/spark_authn.js.map +1 -0
  14. package/dist/issuer-sdk/src/proto/validate/validate.js.map +1 -0
  15. package/dist/issuer-sdk/src/services/freeze.js.map +1 -0
  16. package/dist/issuer-sdk/src/services/token-transactions.js.map +1 -0
  17. package/dist/{tests → issuer-sdk/src/tests}/integration/spark.test.js +72 -2
  18. package/dist/issuer-sdk/src/tests/integration/spark.test.js.map +1 -0
  19. package/dist/issuer-sdk/src/utils/constants.js.map +1 -0
  20. package/dist/issuer-sdk/src/utils/token-hashing.js.map +1 -0
  21. package/dist/spark-sdk/src/graphql/client.d.ts +24 -0
  22. package/dist/spark-sdk/src/graphql/client.js +176 -0
  23. package/dist/spark-sdk/src/graphql/client.js.map +1 -0
  24. package/dist/spark-sdk/src/graphql/mutations/CompleteCoopExit.d.ts +1 -0
  25. package/dist/spark-sdk/src/graphql/mutations/CompleteCoopExit.js +19 -0
  26. package/dist/spark-sdk/src/graphql/mutations/CompleteCoopExit.js.map +1 -0
  27. package/dist/spark-sdk/src/graphql/mutations/CompleteLeavesSwap.d.ts +1 -0
  28. package/dist/spark-sdk/src/graphql/mutations/CompleteLeavesSwap.js +17 -0
  29. package/dist/spark-sdk/src/graphql/mutations/CompleteLeavesSwap.js.map +1 -0
  30. package/dist/spark-sdk/src/graphql/mutations/RequestCoopExit.d.ts +1 -0
  31. package/dist/spark-sdk/src/graphql/mutations/RequestCoopExit.js +20 -0
  32. package/dist/spark-sdk/src/graphql/mutations/RequestCoopExit.js.map +1 -0
  33. package/dist/spark-sdk/src/graphql/mutations/RequestLightningReceive.d.ts +1 -0
  34. package/dist/spark-sdk/src/graphql/mutations/RequestLightningReceive.js +26 -0
  35. package/dist/spark-sdk/src/graphql/mutations/RequestLightningReceive.js.map +1 -0
  36. package/dist/spark-sdk/src/graphql/mutations/RequestLightningSend.d.ts +1 -0
  37. package/dist/spark-sdk/src/graphql/mutations/RequestLightningSend.js +18 -0
  38. package/dist/spark-sdk/src/graphql/mutations/RequestLightningSend.js.map +1 -0
  39. package/dist/spark-sdk/src/graphql/mutations/RequestSwapLeaves.d.ts +1 -0
  40. package/dist/spark-sdk/src/graphql/mutations/RequestSwapLeaves.js +24 -0
  41. package/dist/spark-sdk/src/graphql/mutations/RequestSwapLeaves.js.map +1 -0
  42. package/dist/spark-sdk/src/graphql/objects/BitcoinNetwork.d.ts +17 -0
  43. package/dist/spark-sdk/src/graphql/objects/BitcoinNetwork.js +20 -0
  44. package/dist/spark-sdk/src/graphql/objects/BitcoinNetwork.js.map +1 -0
  45. package/dist/spark-sdk/src/graphql/objects/CompleteCoopExitInput.d.ts +7 -0
  46. package/dist/spark-sdk/src/graphql/objects/CompleteCoopExitInput.js +14 -0
  47. package/dist/spark-sdk/src/graphql/objects/CompleteCoopExitInput.js.map +1 -0
  48. package/dist/spark-sdk/src/graphql/objects/CompleteCoopExitOutput.d.ts +7 -0
  49. package/dist/spark-sdk/src/graphql/objects/CompleteCoopExitOutput.js +19 -0
  50. package/dist/spark-sdk/src/graphql/objects/CompleteCoopExitOutput.js.map +1 -0
  51. package/dist/spark-sdk/src/graphql/objects/CompleteLeavesSwapInput.d.ts +8 -0
  52. package/dist/spark-sdk/src/graphql/objects/CompleteLeavesSwapInput.js +16 -0
  53. package/dist/spark-sdk/src/graphql/objects/CompleteLeavesSwapInput.js.map +1 -0
  54. package/dist/spark-sdk/src/graphql/objects/CompleteLeavesSwapOutput.d.ts +7 -0
  55. package/dist/spark-sdk/src/graphql/objects/CompleteLeavesSwapOutput.js +19 -0
  56. package/dist/spark-sdk/src/graphql/objects/CompleteLeavesSwapOutput.js.map +1 -0
  57. package/dist/spark-sdk/src/graphql/objects/CompleteSeedReleaseInput.d.ts +7 -0
  58. package/dist/spark-sdk/src/graphql/objects/CompleteSeedReleaseInput.js +14 -0
  59. package/dist/spark-sdk/src/graphql/objects/CompleteSeedReleaseInput.js.map +1 -0
  60. package/dist/spark-sdk/src/graphql/objects/CompleteSeedReleaseOutput.d.ts +7 -0
  61. package/dist/spark-sdk/src/graphql/objects/CompleteSeedReleaseOutput.js +17 -0
  62. package/dist/spark-sdk/src/graphql/objects/CompleteSeedReleaseOutput.js.map +1 -0
  63. package/dist/spark-sdk/src/graphql/objects/Connection.d.ts +16 -0
  64. package/dist/spark-sdk/src/graphql/objects/Connection.js +56 -0
  65. package/dist/spark-sdk/src/graphql/objects/Connection.js.map +1 -0
  66. package/dist/spark-sdk/src/graphql/objects/CoopExitFeeEstimateInput.d.ts +7 -0
  67. package/dist/spark-sdk/src/graphql/objects/CoopExitFeeEstimateInput.js +14 -0
  68. package/dist/spark-sdk/src/graphql/objects/CoopExitFeeEstimateInput.js.map +1 -0
  69. package/dist/spark-sdk/src/graphql/objects/CoopExitFeeEstimateOutput.d.ts +8 -0
  70. package/dist/spark-sdk/src/graphql/objects/CoopExitFeeEstimateOutput.js +26 -0
  71. package/dist/spark-sdk/src/graphql/objects/CoopExitFeeEstimateOutput.js.map +1 -0
  72. package/dist/spark-sdk/src/graphql/objects/CoopExitRequest.d.ts +32 -0
  73. package/dist/spark-sdk/src/graphql/objects/CoopExitRequest.js +64 -0
  74. package/dist/spark-sdk/src/graphql/objects/CoopExitRequest.js.map +1 -0
  75. package/dist/spark-sdk/src/graphql/objects/CurrencyAmount.d.ts +24 -0
  76. package/dist/spark-sdk/src/graphql/objects/CurrencyAmount.js +30 -0
  77. package/dist/spark-sdk/src/graphql/objects/CurrencyAmount.js.map +1 -0
  78. package/dist/spark-sdk/src/graphql/objects/CurrencyUnit.d.ts +27 -0
  79. package/dist/spark-sdk/src/graphql/objects/CurrencyUnit.js +30 -0
  80. package/dist/spark-sdk/src/graphql/objects/CurrencyUnit.js.map +1 -0
  81. package/dist/spark-sdk/src/graphql/objects/Entity.d.ts +16 -0
  82. package/dist/spark-sdk/src/graphql/objects/Entity.js +165 -0
  83. package/dist/spark-sdk/src/graphql/objects/Entity.js.map +1 -0
  84. package/dist/spark-sdk/src/graphql/objects/GetChallengeInput.d.ts +6 -0
  85. package/dist/spark-sdk/src/graphql/objects/GetChallengeInput.js +12 -0
  86. package/dist/spark-sdk/src/graphql/objects/GetChallengeInput.js.map +1 -0
  87. package/dist/spark-sdk/src/graphql/objects/GetChallengeOutput.d.ts +7 -0
  88. package/dist/spark-sdk/src/graphql/objects/GetChallengeOutput.js +17 -0
  89. package/dist/spark-sdk/src/graphql/objects/GetChallengeOutput.js.map +1 -0
  90. package/dist/spark-sdk/src/graphql/objects/Invoice.d.ts +15 -0
  91. package/dist/spark-sdk/src/graphql/objects/Invoice.js +45 -0
  92. package/dist/spark-sdk/src/graphql/objects/Invoice.js.map +1 -0
  93. package/dist/spark-sdk/src/graphql/objects/Leaf.d.ts +11 -0
  94. package/dist/spark-sdk/src/graphql/objects/Leaf.js +29 -0
  95. package/dist/spark-sdk/src/graphql/objects/Leaf.js.map +1 -0
  96. package/dist/spark-sdk/src/graphql/objects/LeavesSwapFeeEstimateInput.d.ts +6 -0
  97. package/dist/spark-sdk/src/graphql/objects/LeavesSwapFeeEstimateInput.js +12 -0
  98. package/dist/spark-sdk/src/graphql/objects/LeavesSwapFeeEstimateInput.js.map +1 -0
  99. package/dist/spark-sdk/src/graphql/objects/LeavesSwapFeeEstimateOutput.d.ts +8 -0
  100. package/dist/spark-sdk/src/graphql/objects/LeavesSwapFeeEstimateOutput.js +26 -0
  101. package/dist/spark-sdk/src/graphql/objects/LeavesSwapFeeEstimateOutput.js.map +1 -0
  102. package/dist/spark-sdk/src/graphql/objects/LeavesSwapRequest.d.ts +39 -0
  103. package/dist/spark-sdk/src/graphql/objects/LeavesSwapRequest.js +128 -0
  104. package/dist/spark-sdk/src/graphql/objects/LeavesSwapRequest.js.map +1 -0
  105. package/dist/spark-sdk/src/graphql/objects/LightningReceiveFeeEstimateInput.d.ts +8 -0
  106. package/dist/spark-sdk/src/graphql/objects/LightningReceiveFeeEstimateInput.js +15 -0
  107. package/dist/spark-sdk/src/graphql/objects/LightningReceiveFeeEstimateInput.js.map +1 -0
  108. package/dist/spark-sdk/src/graphql/objects/LightningReceiveFeeEstimateOutput.d.ts +8 -0
  109. package/dist/spark-sdk/src/graphql/objects/LightningReceiveFeeEstimateOutput.js +26 -0
  110. package/dist/spark-sdk/src/graphql/objects/LightningReceiveFeeEstimateOutput.js.map +1 -0
  111. package/dist/spark-sdk/src/graphql/objects/LightningReceiveRequest.d.ts +31 -0
  112. package/dist/spark-sdk/src/graphql/objects/LightningReceiveRequest.js +93 -0
  113. package/dist/spark-sdk/src/graphql/objects/LightningReceiveRequest.js.map +1 -0
  114. package/dist/spark-sdk/src/graphql/objects/LightningReceiveRequestStatus.d.ts +18 -0
  115. package/dist/spark-sdk/src/graphql/objects/LightningReceiveRequestStatus.js +21 -0
  116. package/dist/spark-sdk/src/graphql/objects/LightningReceiveRequestStatus.js.map +1 -0
  117. package/dist/spark-sdk/src/graphql/objects/LightningSendFeeEstimateInput.d.ts +6 -0
  118. package/dist/spark-sdk/src/graphql/objects/LightningSendFeeEstimateInput.js +12 -0
  119. package/dist/spark-sdk/src/graphql/objects/LightningSendFeeEstimateInput.js.map +1 -0
  120. package/dist/spark-sdk/src/graphql/objects/LightningSendFeeEstimateOutput.d.ts +8 -0
  121. package/dist/spark-sdk/src/graphql/objects/LightningSendFeeEstimateOutput.js +26 -0
  122. package/dist/spark-sdk/src/graphql/objects/LightningSendFeeEstimateOutput.js.map +1 -0
  123. package/dist/spark-sdk/src/graphql/objects/LightningSendRequest.d.ts +32 -0
  124. package/dist/spark-sdk/src/graphql/objects/LightningSendRequest.js +78 -0
  125. package/dist/spark-sdk/src/graphql/objects/LightningSendRequest.js.map +1 -0
  126. package/dist/spark-sdk/src/graphql/objects/LightningSendRequestStatus.d.ts +15 -0
  127. package/dist/spark-sdk/src/graphql/objects/LightningSendRequestStatus.js +18 -0
  128. package/dist/spark-sdk/src/graphql/objects/LightningSendRequestStatus.js.map +1 -0
  129. package/dist/spark-sdk/src/graphql/objects/NotifyReceiverTransferInput.d.ts +7 -0
  130. package/dist/spark-sdk/src/graphql/objects/NotifyReceiverTransferInput.js +14 -0
  131. package/dist/spark-sdk/src/graphql/objects/NotifyReceiverTransferInput.js.map +1 -0
  132. package/dist/spark-sdk/src/graphql/objects/PageInfo.d.ts +11 -0
  133. package/dist/spark-sdk/src/graphql/objects/PageInfo.js +26 -0
  134. package/dist/spark-sdk/src/graphql/objects/PageInfo.js.map +1 -0
  135. package/dist/spark-sdk/src/graphql/objects/Provider.d.ts +7 -0
  136. package/dist/spark-sdk/src/graphql/objects/Provider.js +14 -0
  137. package/dist/spark-sdk/src/graphql/objects/Provider.js.map +1 -0
  138. package/dist/spark-sdk/src/graphql/objects/RequestCoopExitInput.d.ts +7 -0
  139. package/dist/spark-sdk/src/graphql/objects/RequestCoopExitInput.js +14 -0
  140. package/dist/spark-sdk/src/graphql/objects/RequestCoopExitInput.js.map +1 -0
  141. package/dist/spark-sdk/src/graphql/objects/RequestCoopExitOutput.d.ts +7 -0
  142. package/dist/spark-sdk/src/graphql/objects/RequestCoopExitOutput.js +19 -0
  143. package/dist/spark-sdk/src/graphql/objects/RequestCoopExitOutput.js.map +1 -0
  144. package/dist/spark-sdk/src/graphql/objects/RequestLeavesSwapInput.d.ts +11 -0
  145. package/dist/spark-sdk/src/graphql/objects/RequestLeavesSwapInput.js +22 -0
  146. package/dist/spark-sdk/src/graphql/objects/RequestLeavesSwapInput.js.map +1 -0
  147. package/dist/spark-sdk/src/graphql/objects/RequestLeavesSwapOutput.d.ts +7 -0
  148. package/dist/spark-sdk/src/graphql/objects/RequestLeavesSwapOutput.js +19 -0
  149. package/dist/spark-sdk/src/graphql/objects/RequestLeavesSwapOutput.js.map +1 -0
  150. package/dist/spark-sdk/src/graphql/objects/RequestLightningReceiveInput.d.ts +16 -0
  151. package/dist/spark-sdk/src/graphql/objects/RequestLightningReceiveInput.js +21 -0
  152. package/dist/spark-sdk/src/graphql/objects/RequestLightningReceiveInput.js.map +1 -0
  153. package/dist/spark-sdk/src/graphql/objects/RequestLightningReceiveOutput.d.ts +7 -0
  154. package/dist/spark-sdk/src/graphql/objects/RequestLightningReceiveOutput.js +19 -0
  155. package/dist/spark-sdk/src/graphql/objects/RequestLightningReceiveOutput.js.map +1 -0
  156. package/dist/spark-sdk/src/graphql/objects/RequestLightningSendInput.d.ts +7 -0
  157. package/dist/spark-sdk/src/graphql/objects/RequestLightningSendInput.js +14 -0
  158. package/dist/spark-sdk/src/graphql/objects/RequestLightningSendInput.js.map +1 -0
  159. package/dist/spark-sdk/src/graphql/objects/RequestLightningSendOutput.d.ts +7 -0
  160. package/dist/spark-sdk/src/graphql/objects/RequestLightningSendOutput.js +19 -0
  161. package/dist/spark-sdk/src/graphql/objects/RequestLightningSendOutput.js.map +1 -0
  162. package/dist/spark-sdk/src/graphql/objects/SparkCoopExitRequestStatus.d.ts +11 -0
  163. package/dist/spark-sdk/src/graphql/objects/SparkCoopExitRequestStatus.js +14 -0
  164. package/dist/spark-sdk/src/graphql/objects/SparkCoopExitRequestStatus.js.map +1 -0
  165. package/dist/spark-sdk/src/graphql/objects/SparkLeavesSwapRequestStatus.d.ts +11 -0
  166. package/dist/spark-sdk/src/graphql/objects/SparkLeavesSwapRequestStatus.js +14 -0
  167. package/dist/spark-sdk/src/graphql/objects/SparkLeavesSwapRequestStatus.js.map +1 -0
  168. package/dist/spark-sdk/src/graphql/objects/SparkTransferToLeavesConnection.d.ts +19 -0
  169. package/dist/spark-sdk/src/graphql/objects/SparkTransferToLeavesConnection.js +46 -0
  170. package/dist/spark-sdk/src/graphql/objects/SparkTransferToLeavesConnection.js.map +1 -0
  171. package/dist/spark-sdk/src/graphql/objects/SparkWalletUser.d.ts +21 -0
  172. package/dist/spark-sdk/src/graphql/objects/SparkWalletUser.js +45 -0
  173. package/dist/spark-sdk/src/graphql/objects/SparkWalletUser.js.map +1 -0
  174. package/dist/spark-sdk/src/graphql/objects/StartSeedReleaseInput.d.ts +6 -0
  175. package/dist/spark-sdk/src/graphql/objects/StartSeedReleaseInput.js +12 -0
  176. package/dist/spark-sdk/src/graphql/objects/StartSeedReleaseInput.js.map +1 -0
  177. package/dist/spark-sdk/src/graphql/objects/SwapLeaf.d.ts +9 -0
  178. package/dist/spark-sdk/src/graphql/objects/SwapLeaf.js +23 -0
  179. package/dist/spark-sdk/src/graphql/objects/SwapLeaf.js.map +1 -0
  180. package/dist/spark-sdk/src/graphql/objects/Transfer.d.ts +24 -0
  181. package/dist/spark-sdk/src/graphql/objects/Transfer.js +82 -0
  182. package/dist/spark-sdk/src/graphql/objects/Transfer.js.map +1 -0
  183. package/dist/spark-sdk/src/graphql/objects/UserLeafInput.d.ts +8 -0
  184. package/dist/spark-sdk/src/graphql/objects/UserLeafInput.js +16 -0
  185. package/dist/spark-sdk/src/graphql/objects/UserLeafInput.js.map +1 -0
  186. package/dist/spark-sdk/src/graphql/objects/VerifyChallengeInput.d.ts +10 -0
  187. package/dist/spark-sdk/src/graphql/objects/VerifyChallengeInput.js +20 -0
  188. package/dist/spark-sdk/src/graphql/objects/VerifyChallengeInput.js.map +1 -0
  189. package/dist/spark-sdk/src/graphql/objects/VerifyChallengeOutput.d.ts +7 -0
  190. package/dist/spark-sdk/src/graphql/objects/VerifyChallengeOutput.js +17 -0
  191. package/dist/spark-sdk/src/graphql/objects/VerifyChallengeOutput.js.map +1 -0
  192. package/dist/spark-sdk/src/graphql/objects/WalletUserIdentityPublicKeyInput.d.ts +6 -0
  193. package/dist/spark-sdk/src/graphql/objects/WalletUserIdentityPublicKeyInput.js +12 -0
  194. package/dist/spark-sdk/src/graphql/objects/WalletUserIdentityPublicKeyInput.js.map +1 -0
  195. package/dist/spark-sdk/src/graphql/objects/WalletUserIdentityPublicKeyOutput.d.ts +7 -0
  196. package/dist/spark-sdk/src/graphql/objects/WalletUserIdentityPublicKeyOutput.js +17 -0
  197. package/dist/spark-sdk/src/graphql/objects/WalletUserIdentityPublicKeyOutput.js.map +1 -0
  198. package/dist/spark-sdk/src/graphql/objects/index.d.ts +52 -0
  199. package/dist/spark-sdk/src/graphql/objects/index.js +13 -0
  200. package/dist/spark-sdk/src/graphql/objects/index.js.map +1 -0
  201. package/dist/spark-sdk/src/graphql/queries/CoopExitFeeEstimate.d.ts +1 -0
  202. package/dist/spark-sdk/src/graphql/queries/CoopExitFeeEstimate.js +18 -0
  203. package/dist/spark-sdk/src/graphql/queries/CoopExitFeeEstimate.js.map +1 -0
  204. package/dist/spark-sdk/src/graphql/queries/LightningReceiveFeeEstimate.d.ts +1 -0
  205. package/dist/spark-sdk/src/graphql/queries/LightningReceiveFeeEstimate.js +18 -0
  206. package/dist/spark-sdk/src/graphql/queries/LightningReceiveFeeEstimate.js.map +1 -0
  207. package/dist/spark-sdk/src/graphql/queries/LightningSendFeeEstimate.d.ts +1 -0
  208. package/dist/spark-sdk/src/graphql/queries/LightningSendFeeEstimate.js +16 -0
  209. package/dist/spark-sdk/src/graphql/queries/LightningSendFeeEstimate.js.map +1 -0
  210. package/dist/spark-sdk/src/proto/common.d.ts +58 -0
  211. package/dist/spark-sdk/src/proto/common.js +350 -0
  212. package/dist/spark-sdk/src/proto/common.js.map +1 -0
  213. package/dist/spark-sdk/src/proto/google/protobuf/empty.d.ts +33 -0
  214. package/dist/spark-sdk/src/proto/google/protobuf/empty.js +46 -0
  215. package/dist/spark-sdk/src/proto/google/protobuf/empty.js.map +1 -0
  216. package/dist/spark-sdk/src/proto/google/protobuf/timestamp.d.ts +128 -0
  217. package/dist/spark-sdk/src/proto/google/protobuf/timestamp.js +90 -0
  218. package/dist/spark-sdk/src/proto/google/protobuf/timestamp.js.map +1 -0
  219. package/dist/spark-sdk/src/proto/mock.d.ts +48 -0
  220. package/dist/spark-sdk/src/proto/mock.js +103 -0
  221. package/dist/spark-sdk/src/proto/mock.js.map +1 -0
  222. package/dist/spark-sdk/src/proto/spark.d.ts +1101 -0
  223. package/dist/spark-sdk/src/proto/spark.js +9565 -0
  224. package/dist/spark-sdk/src/proto/spark.js.map +1 -0
  225. package/dist/spark-sdk/src/proto/spark_authn.d.ts +111 -0
  226. package/dist/spark-sdk/src/proto/spark_authn.js +517 -0
  227. package/dist/spark-sdk/src/proto/spark_authn.js.map +1 -0
  228. package/dist/spark-sdk/src/services/config.d.ts +16 -0
  229. package/dist/spark-sdk/src/services/config.js +51 -0
  230. package/dist/spark-sdk/src/services/config.js.map +1 -0
  231. package/dist/spark-sdk/src/services/connection.d.ts +22 -0
  232. package/dist/spark-sdk/src/services/connection.js +180 -0
  233. package/dist/spark-sdk/src/services/connection.js.map +1 -0
  234. package/dist/spark-sdk/src/services/coop-exit.d.ts +20 -0
  235. package/dist/spark-sdk/src/services/coop-exit.js +101 -0
  236. package/dist/spark-sdk/src/services/coop-exit.js.map +1 -0
  237. package/dist/spark-sdk/src/services/deposit.d.ts +21 -0
  238. package/dist/spark-sdk/src/services/deposit.js +214 -0
  239. package/dist/spark-sdk/src/services/deposit.js.map +1 -0
  240. package/dist/spark-sdk/src/services/lightning.d.ts +31 -0
  241. package/dist/spark-sdk/src/services/lightning.js +209 -0
  242. package/dist/spark-sdk/src/services/lightning.js.map +1 -0
  243. package/dist/spark-sdk/src/services/lrc20.d.ts +5 -0
  244. package/dist/spark-sdk/src/services/lrc20.js +27 -0
  245. package/dist/spark-sdk/src/services/lrc20.js.map +1 -0
  246. package/dist/spark-sdk/src/services/token-transactions.d.ts +16 -0
  247. package/dist/spark-sdk/src/services/token-transactions.js +299 -0
  248. package/dist/spark-sdk/src/services/token-transactions.js.map +1 -0
  249. package/dist/spark-sdk/src/services/transfer.d.ts +66 -0
  250. package/dist/spark-sdk/src/services/transfer.js +789 -0
  251. package/dist/spark-sdk/src/services/transfer.js.map +1 -0
  252. package/dist/spark-sdk/src/services/tree-creation.d.ts +29 -0
  253. package/dist/spark-sdk/src/services/tree-creation.js +399 -0
  254. package/dist/spark-sdk/src/services/tree-creation.js.map +1 -0
  255. package/dist/spark-sdk/src/services/wallet-config.d.ts +22 -0
  256. package/dist/spark-sdk/src/services/wallet-config.js +100 -0
  257. package/dist/spark-sdk/src/services/wallet-config.js.map +1 -0
  258. package/dist/spark-sdk/src/signer/signer.d.ts +106 -0
  259. package/dist/spark-sdk/src/signer/signer.js +272 -0
  260. package/dist/spark-sdk/src/signer/signer.js.map +1 -0
  261. package/dist/spark-sdk/src/spark-sdk.d.ts +353 -0
  262. package/dist/spark-sdk/src/spark-sdk.js +1110 -0
  263. package/dist/spark-sdk/src/spark-sdk.js.map +1 -0
  264. package/dist/spark-sdk/src/tests/utils/test-faucet.d.ts +23 -0
  265. package/dist/spark-sdk/src/tests/utils/test-faucet.js +172 -0
  266. package/dist/spark-sdk/src/tests/utils/test-faucet.js.map +1 -0
  267. package/dist/spark-sdk/src/types/grpc.d.ts +6 -0
  268. package/dist/spark-sdk/src/types/grpc.js +2 -0
  269. package/dist/spark-sdk/src/types/grpc.js.map +1 -0
  270. package/dist/spark-sdk/src/types/index.d.ts +3 -0
  271. package/dist/spark-sdk/src/types/index.js +4 -0
  272. package/dist/spark-sdk/src/types/index.js.map +1 -0
  273. package/dist/spark-sdk/src/utils/adaptor-signature.d.ts +7 -0
  274. package/dist/spark-sdk/src/utils/adaptor-signature.js +114 -0
  275. package/dist/spark-sdk/src/utils/adaptor-signature.js.map +1 -0
  276. package/dist/spark-sdk/src/utils/bitcoin.d.ts +12 -0
  277. package/dist/spark-sdk/src/utils/bitcoin.js +87 -0
  278. package/dist/spark-sdk/src/utils/bitcoin.js.map +1 -0
  279. package/dist/spark-sdk/src/utils/crypto.d.ts +1 -0
  280. package/dist/spark-sdk/src/utils/crypto.js +14 -0
  281. package/dist/spark-sdk/src/utils/crypto.js.map +1 -0
  282. package/dist/spark-sdk/src/utils/index.d.ts +12 -0
  283. package/dist/spark-sdk/src/utils/index.js +13 -0
  284. package/dist/spark-sdk/src/utils/index.js.map +1 -0
  285. package/dist/spark-sdk/src/utils/keys.d.ts +9 -0
  286. package/dist/spark-sdk/src/utils/keys.js +72 -0
  287. package/dist/spark-sdk/src/utils/keys.js.map +1 -0
  288. package/dist/spark-sdk/src/utils/mempool.d.ts +1 -0
  289. package/dist/spark-sdk/src/utils/mempool.js +29 -0
  290. package/dist/spark-sdk/src/utils/mempool.js.map +1 -0
  291. package/dist/spark-sdk/src/utils/network.d.ts +36 -0
  292. package/dist/spark-sdk/src/utils/network.js +65 -0
  293. package/dist/spark-sdk/src/utils/network.js.map +1 -0
  294. package/dist/spark-sdk/src/utils/proof.d.ts +1 -0
  295. package/dist/spark-sdk/src/utils/proof.js +12 -0
  296. package/dist/spark-sdk/src/utils/proof.js.map +1 -0
  297. package/dist/spark-sdk/src/utils/response-validation.d.ts +1 -0
  298. package/dist/spark-sdk/src/utils/response-validation.js +16 -0
  299. package/dist/spark-sdk/src/utils/response-validation.js.map +1 -0
  300. package/dist/spark-sdk/src/utils/secret-sharing.d.ts +26 -0
  301. package/dist/spark-sdk/src/utils/secret-sharing.js +174 -0
  302. package/dist/spark-sdk/src/utils/secret-sharing.js.map +1 -0
  303. package/dist/spark-sdk/src/utils/signing.d.ts +12 -0
  304. package/dist/spark-sdk/src/utils/signing.js +67 -0
  305. package/dist/spark-sdk/src/utils/signing.js.map +1 -0
  306. package/dist/spark-sdk/src/utils/token-hashing.d.ts +3 -0
  307. package/dist/spark-sdk/src/utils/token-hashing.js +116 -0
  308. package/dist/spark-sdk/src/utils/token-hashing.js.map +1 -0
  309. package/dist/spark-sdk/src/utils/token-keyshares.d.ts +5 -0
  310. package/dist/spark-sdk/src/utils/token-keyshares.js +17 -0
  311. package/dist/spark-sdk/src/utils/token-keyshares.js.map +1 -0
  312. package/dist/spark-sdk/src/utils/token-transactions.d.ts +5 -0
  313. package/dist/spark-sdk/src/utils/token-transactions.js +40 -0
  314. package/dist/spark-sdk/src/utils/token-transactions.js.map +1 -0
  315. package/dist/spark-sdk/src/utils/transaction.d.ts +6 -0
  316. package/dist/spark-sdk/src/utils/transaction.js +31 -0
  317. package/dist/spark-sdk/src/utils/transaction.js.map +1 -0
  318. package/dist/spark-sdk/src/utils/wasm-wrapper.d.ts +2 -0
  319. package/dist/spark-sdk/src/utils/wasm-wrapper.js +46 -0
  320. package/dist/spark-sdk/src/utils/wasm-wrapper.js.map +1 -0
  321. package/dist/spark-sdk/src/utils/wasm.d.ts +54 -0
  322. package/dist/spark-sdk/src/utils/wasm.js +26 -0
  323. package/dist/spark-sdk/src/utils/wasm.js.map +1 -0
  324. package/package.json +3 -3
  325. package/dist/interface/wallet-interface.js.map +0 -1
  326. package/dist/issuer-sdk.js.map +0 -1
  327. package/dist/proto/common.js.map +0 -1
  328. package/dist/proto/google/protobuf/descriptor.js.map +0 -1
  329. package/dist/proto/google/protobuf/duration.js.map +0 -1
  330. package/dist/proto/google/protobuf/empty.js.map +0 -1
  331. package/dist/proto/google/protobuf/timestamp.js.map +0 -1
  332. package/dist/proto/mock.js.map +0 -1
  333. package/dist/proto/spark.js.map +0 -1
  334. package/dist/proto/spark_authn.js.map +0 -1
  335. package/dist/proto/validate/validate.js.map +0 -1
  336. package/dist/services/freeze.js.map +0 -1
  337. package/dist/services/token-transactions.js.map +0 -1
  338. package/dist/tests/integration/spark.test.js.map +0 -1
  339. package/dist/utils/constants.js.map +0 -1
  340. package/dist/utils/token-hashing.js.map +0 -1
  341. /package/dist/{interface → issuer-sdk/src/interface}/wallet-interface.js +0 -0
  342. /package/dist/{proto → issuer-sdk/src/proto}/common.d.ts +0 -0
  343. /package/dist/{proto → issuer-sdk/src/proto}/common.js +0 -0
  344. /package/dist/{proto → issuer-sdk/src/proto}/google/protobuf/descriptor.d.ts +0 -0
  345. /package/dist/{proto → issuer-sdk/src/proto}/google/protobuf/descriptor.js +0 -0
  346. /package/dist/{proto → issuer-sdk/src/proto}/google/protobuf/duration.d.ts +0 -0
  347. /package/dist/{proto → issuer-sdk/src/proto}/google/protobuf/duration.js +0 -0
  348. /package/dist/{proto → issuer-sdk/src/proto}/google/protobuf/empty.d.ts +0 -0
  349. /package/dist/{proto → issuer-sdk/src/proto}/google/protobuf/empty.js +0 -0
  350. /package/dist/{proto → issuer-sdk/src/proto}/google/protobuf/timestamp.d.ts +0 -0
  351. /package/dist/{proto → issuer-sdk/src/proto}/google/protobuf/timestamp.js +0 -0
  352. /package/dist/{proto → issuer-sdk/src/proto}/mock.d.ts +0 -0
  353. /package/dist/{proto → issuer-sdk/src/proto}/mock.js +0 -0
  354. /package/dist/{proto → issuer-sdk/src/proto}/spark.d.ts +0 -0
  355. /package/dist/{proto → issuer-sdk/src/proto}/spark.js +0 -0
  356. /package/dist/{proto → issuer-sdk/src/proto}/spark_authn.d.ts +0 -0
  357. /package/dist/{proto → issuer-sdk/src/proto}/spark_authn.js +0 -0
  358. /package/dist/{proto → issuer-sdk/src/proto}/validate/validate.d.ts +0 -0
  359. /package/dist/{proto → issuer-sdk/src/proto}/validate/validate.js +0 -0
  360. /package/dist/{services → issuer-sdk/src/services}/freeze.d.ts +0 -0
  361. /package/dist/{services → issuer-sdk/src/services}/freeze.js +0 -0
  362. /package/dist/{services → issuer-sdk/src/services}/token-transactions.d.ts +0 -0
  363. /package/dist/{services → issuer-sdk/src/services}/token-transactions.js +0 -0
  364. /package/dist/{tests → issuer-sdk/src/tests}/integration/spark.test.d.ts +0 -0
  365. /package/dist/{utils → issuer-sdk/src/utils}/constants.d.ts +0 -0
  366. /package/dist/{utils → issuer-sdk/src/utils}/constants.js +0 -0
  367. /package/dist/{utils → issuer-sdk/src/utils}/token-hashing.d.ts +0 -0
  368. /package/dist/{utils → issuer-sdk/src/utils}/token-hashing.js +0 -0
@@ -0,0 +1,31 @@
1
+ import { InitiatePreimageSwapResponse, Transfer, UserSignedRefund } from "../proto/spark.js";
2
+ import { WalletConfigService } from "./config.js";
3
+ import { ConnectionManager } from "./connection.js";
4
+ import { LeafKeyTweak } from "./transfer.js";
5
+ export type CreateLightningInvoiceParams = {
6
+ invoiceCreator: (amountSats: number, paymentHash: Uint8Array, memo: string) => Promise<string | undefined>;
7
+ amountSats: number;
8
+ memo: string;
9
+ };
10
+ export type CreateLightningInvoiceWithPreimageParams = {
11
+ preimage: Uint8Array;
12
+ } & CreateLightningInvoiceParams;
13
+ export type SwapNodesForPreimageParams = {
14
+ leaves: LeafKeyTweak[];
15
+ receiverIdentityPubkey: Uint8Array;
16
+ paymentHash: Uint8Array;
17
+ invoiceString?: string;
18
+ isInboundPayment: boolean;
19
+ };
20
+ export declare class LightningService {
21
+ private readonly config;
22
+ private readonly connectionManager;
23
+ constructor(config: WalletConfigService, connectionManager: ConnectionManager);
24
+ createLightningInvoice({ invoiceCreator, amountSats, memo, }: CreateLightningInvoiceParams): Promise<string>;
25
+ createLightningInvoiceWithPreImage({ invoiceCreator, amountSats, memo, preimage, }: CreateLightningInvoiceWithPreimageParams): Promise<string>;
26
+ swapNodesForPreimage({ leaves, receiverIdentityPubkey, paymentHash, invoiceString, isInboundPayment, }: SwapNodesForPreimageParams): Promise<InitiatePreimageSwapResponse>;
27
+ queryUserSignedRefunds(paymentHash: Uint8Array): Promise<UserSignedRefund[]>;
28
+ validateUserSignedRefund(userSignedRefund: UserSignedRefund): bigint;
29
+ providePreimage(preimage: Uint8Array): Promise<Transfer>;
30
+ private signRefunds;
31
+ }
@@ -0,0 +1,209 @@
1
+ import { bytesToNumberBE, hexToBytes, 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 { getSigHashFromTx, getTxFromRawTxBytes, getTxId, } from "../utils/bitcoin.js";
7
+ import { getCrypto } from "../utils/crypto.js";
8
+ import { createRefundTx, getNextTransactionSequence, } 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.getThreshold(),
37
+ numShares: Object.keys(this.config.getSigningOperators()).length,
38
+ });
39
+ const errors = [];
40
+ const promises = Object.entries(this.config.getSigningOperators()).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.getThreshold(),
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
+ expiryTime: new Date(Date.now() + 2 * 60 * 1000),
116
+ },
117
+ receiverIdentityPublicKey: receiverIdentityPubkey,
118
+ feeSats: 0,
119
+ });
120
+ }
121
+ catch (error) {
122
+ throw new Error(`Error initiating preimage swap: ${error}`);
123
+ }
124
+ return response;
125
+ }
126
+ async queryUserSignedRefunds(paymentHash) {
127
+ const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
128
+ let response;
129
+ try {
130
+ response = await sparkClient.query_user_signed_refunds({
131
+ paymentHash,
132
+ });
133
+ }
134
+ catch (error) {
135
+ throw new Error(`Error querying user signed refunds: ${error}`);
136
+ }
137
+ return response.userSignedRefunds;
138
+ }
139
+ validateUserSignedRefund(userSignedRefund) {
140
+ const refundTx = getTxFromRawTxBytes(userSignedRefund.refundTx);
141
+ // TODO: Should we assert that the amount is always defined here?
142
+ return refundTx.getOutput(0).amount || 0n;
143
+ }
144
+ async providePreimage(preimage) {
145
+ const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
146
+ const paymentHash = sha256(preimage);
147
+ let response;
148
+ try {
149
+ response = await sparkClient.provide_preimage({
150
+ preimage,
151
+ paymentHash,
152
+ });
153
+ }
154
+ catch (error) {
155
+ throw new Error(`Error providing preimage: ${error}`);
156
+ }
157
+ if (!response.transfer) {
158
+ throw new Error("No transfer returned from coordinator");
159
+ }
160
+ return response.transfer;
161
+ }
162
+ async signRefunds(leaves, signingCommitments, receiverIdentityPubkey) {
163
+ const userSignedRefunds = [];
164
+ for (let i = 0; i < leaves.length; i++) {
165
+ const leaf = leaves[i];
166
+ if (!leaf?.leaf) {
167
+ throw new Error("Leaf not found in signRefunds");
168
+ }
169
+ const nodeTx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
170
+ const nodeOutPoint = {
171
+ txid: hexToBytes(getTxId(nodeTx)),
172
+ index: 0,
173
+ };
174
+ const currRefundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
175
+ const nextSequence = getNextTransactionSequence(currRefundTx.getInput(0).sequence);
176
+ const amountSats = currRefundTx.getOutput(0).amount;
177
+ if (amountSats === undefined) {
178
+ throw new Error("Amount not found in signRefunds");
179
+ }
180
+ const refundTx = createRefundTx(nextSequence, nodeOutPoint, amountSats, receiverIdentityPubkey, this.config.getNetwork());
181
+ const sighash = getSigHashFromTx(refundTx, 0, nodeTx.getOutput(0));
182
+ const signingCommitment = await this.config.signer.getRandomSigningCommitment();
183
+ const signingNonceCommitments = signingCommitments[i]?.signingNonceCommitments;
184
+ if (!signingNonceCommitments) {
185
+ throw new Error("Signing nonce commitments not found in signRefunds");
186
+ }
187
+ const signingResult = await this.config.signer.signFrost({
188
+ message: sighash,
189
+ publicKey: leaf.signingPubKey,
190
+ privateAsPubKey: leaf.signingPubKey,
191
+ selfCommitment: signingCommitment,
192
+ statechainCommitments: signingNonceCommitments,
193
+ adaptorPubKey: new Uint8Array(),
194
+ verifyingKey: leaf.leaf.verifyingPublicKey,
195
+ });
196
+ userSignedRefunds.push({
197
+ nodeId: leaf.leaf.id,
198
+ refundTx: refundTx.toBytes(),
199
+ userSignature: signingResult,
200
+ userSignatureCommitment: signingCommitment,
201
+ signingCommitments: {
202
+ signingCommitments: signingNonceCommitments,
203
+ },
204
+ });
205
+ }
206
+ return userSignedRefunds;
207
+ }
208
+ }
209
+ //# sourceMappingURL=lightning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightning.js","sourceRoot":"","sources":["../../../../../spark-sdk/src/services/lightning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { LRCWallet } from "@buildonspark/lrc20-sdk";
2
+ import { LeafWithPreviousTransactionData } from "../proto/spark.js";
3
+ export declare function broadcastL1Withdrawal(lrcWallet: LRCWallet, leavesToExit: LeafWithPreviousTransactionData[], receiverPublicKey: string, feeRateSatsPerVb?: number): Promise<{
4
+ txid: string;
5
+ }>;
@@ -0,0 +1,27 @@
1
+ import { Lrc20TransactionDto } from "@buildonspark/lrc20-sdk";
2
+ import { bytesToHex, bytesToNumberBE } from "@noble/curves/abstract/utils";
3
+ //TODO: dynamically set these for each leaf based on its metadata in the transaction that created it
4
+ const WITHDRAW_BOND_SATS = 10000;
5
+ const WITHDRAW_RELATIVE_BLOCK_LOCKTIME = 100;
6
+ export async function broadcastL1Withdrawal(lrcWallet, leavesToExit, receiverPublicKey, feeRateSatsPerVb = 2.0) {
7
+ await lrcWallet.syncWallet();
8
+ let payments = leavesToExit.map(({ leaf, previousTransactionHash, previousTransactionVout }) => {
9
+ return {
10
+ amount: bytesToNumberBE(leaf.tokenAmount),
11
+ tokenPubkey: bytesToHex(leaf.tokenPublicKey),
12
+ sats: WITHDRAW_BOND_SATS,
13
+ cltvOutputLocktime: WITHDRAW_RELATIVE_BLOCK_LOCKTIME,
14
+ revocationKey: bytesToHex(leaf.revocationPublicKey),
15
+ expiryKey: receiverPublicKey,
16
+ metadata: {
17
+ token_tx_hash: bytesToHex(previousTransactionHash),
18
+ exit_leaf_index: previousTransactionVout,
19
+ },
20
+ };
21
+ });
22
+ const tx = await lrcWallet.prepareSparkExit(payments, feeRateSatsPerVb);
23
+ let txDto = Lrc20TransactionDto.fromLrc20Transaction(tx);
24
+ let txid = await lrcWallet.broadcast(txDto); //.broadcastRawBtcTransaction(tx.bitcoin_tx.toHex());
25
+ return { txid };
26
+ }
27
+ //# sourceMappingURL=lrc20.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lrc20.js","sourceRoot":"","sources":["../../../../../spark-sdk/src/services/lrc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG3E,oGAAoG;AACpG,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAAoB,EACpB,YAA+C,EAC/C,iBAAyB,EACzB,mBAA2B,GAAG;IAE9B,MAAM,SAAS,CAAC,UAAU,EAAE,CAAC;IAE7B,IAAI,QAAQ,GAAG,YAAY,CAAC,GAAG,CAC7B,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,EAAE,EAAE;QAC7D,OAAO;YACL,MAAM,EAAE,eAAe,CAAC,IAAK,CAAC,WAAW,CAAC;YAC1C,WAAW,EAAE,UAAU,CAAC,IAAK,CAAC,cAAc,CAAC;YAC7C,IAAI,EAAE,kBAAkB;YACxB,kBAAkB,EAAE,gCAAgC;YACpD,aAAa,EAAE,UAAU,CAAC,IAAK,CAAC,mBAAoB,CAAC;YACrD,SAAS,EAAE,iBAAiB;YAC5B,QAAQ,EAAE;gBACR,aAAa,EAAE,UAAU,CAAC,uBAAuB,CAAC;gBAClD,eAAe,EAAE,uBAAuB;aACzC;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAExE,IAAI,KAAK,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAEzD,IAAI,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,qDAAqD;IAElG,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,16 @@
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[], receiverSparkAddress: Uint8Array, tokenPublicKey: Uint8Array, tokenAmount: bigint): Promise<TokenTransaction>;
9
+ collectOperatorIdentityPublicKeys(): Uint8Array[];
10
+ broadcastTokenTransaction(tokenTransaction: TokenTransaction, leafToSpendSigningPublicKeys?: Uint8Array[], leafToSpendRevocationPublicKeys?: Uint8Array[]): Promise<string>;
11
+ finalizeTokenTransaction(finalTokenTransaction: TokenTransaction, leafToSpendRevocationKeys: Uint8Array[], threshold: number): Promise<TokenTransaction>;
12
+ fetchOwnedTokenLeaves(ownerPublicKeys: Uint8Array[], tokenPublicKeys: Uint8Array[]): Promise<LeafWithPreviousTransactionData[]>;
13
+ syncTokenLeaves(tokenLeaves: Map<string, LeafWithPreviousTransactionData[]>): Promise<void>;
14
+ selectTokenLeaves(tokenLeaves: LeafWithPreviousTransactionData[], tokenAmount: bigint): LeafWithPreviousTransactionData[];
15
+ private signMessageWithKey;
16
+ }
@@ -0,0 +1,299 @@
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 } 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, receiverSparkAddress, 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: receiverSparkAddress,
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: receiverSparkAddress,
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.getSigningOperators())) {
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.getSigningOperators();
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
+ let ownerSignature;
142
+ if (this.config.shouldSignTokenTransactionsWithSchnorr()) {
143
+ ownerSignature =
144
+ await this.config.signer.signSchnorrWithIdentityKey(payloadHash);
145
+ }
146
+ else {
147
+ ownerSignature =
148
+ await this.config.signer.signMessageWithIdentityKey(payloadHash);
149
+ }
150
+ operatorSpecificSignatures.push({
151
+ ownerPublicKey: await this.config.signer.getIdentityPublicKey(),
152
+ ownerSignature: ownerSignature,
153
+ payload: payload,
154
+ });
155
+ }
156
+ }
157
+ // Submit sign_token_transaction to all SOs in parallel and track their indices
158
+ const soSignatures = await Promise.allSettled(Object.entries(signingOperators).map(async ([identifier, operator], index) => {
159
+ const internalSparkClient = await this.connectionManager.createSparkClient(operator.address);
160
+ const identityPublicKey = await this.config.signer.getIdentityPublicKey();
161
+ const response = await internalSparkClient.sign_token_transaction({
162
+ finalTokenTransaction,
163
+ operatorSpecificSignatures,
164
+ identityPublicKey,
165
+ }, {
166
+ retry: true,
167
+ retryMaxAttempts: 5,
168
+ });
169
+ return {
170
+ index,
171
+ identifier,
172
+ response,
173
+ };
174
+ }));
175
+ const threshold = startResponse.keyshareInfo.threshold;
176
+ const successfulSignatures = validateResponses(soSignatures);
177
+ if (tokenTransaction.tokenInput.$case === "transferInput") {
178
+ const leavesToSpend = tokenTransaction.tokenInput.transferInput.leavesToSpend;
179
+ let revocationKeys = [];
180
+ for (let leafIndex = 0; leafIndex < leavesToSpend.length; leafIndex++) {
181
+ // For each leaf, collect keyshares from all SOs that responded successfully
182
+ const leafKeyshares = successfulSignatures.map(({ identifier, response }) => ({
183
+ index: parseInt(identifier, 16),
184
+ keyshare: response.tokenTransactionRevocationKeyshares[leafIndex],
185
+ }));
186
+ if (leafKeyshares.length < threshold) {
187
+ throw new Error(`Insufficient keyshares for leaf ${leafIndex}: got ${leafKeyshares.length}, need ${threshold}`);
188
+ }
189
+ // Check for duplicate operator indices
190
+ const seenIndices = new Set();
191
+ for (const { index } of leafKeyshares) {
192
+ if (seenIndices.has(index)) {
193
+ throw new Error(`Duplicate operator index ${index} for leaf ${leafIndex}`);
194
+ }
195
+ seenIndices.add(index);
196
+ }
197
+ const recoveredPrivateKey = recoverPrivateKeyFromKeyshares(leafKeyshares, threshold);
198
+ const recoveredPublicKey = secp256k1.getPublicKey(recoveredPrivateKey, true);
199
+ if (!leafToSpendRevocationPublicKeys ||
200
+ !leafToSpendRevocationPublicKeys[leafIndex] ||
201
+ !recoveredPublicKey.every((byte, i) => byte === leafToSpendRevocationPublicKeys[leafIndex][i])) {
202
+ throw new Error(`Recovered public key does not match expected revocation public key for leaf ${leafIndex}`);
203
+ }
204
+ revocationKeys.push(recoveredPrivateKey);
205
+ }
206
+ // Finalize the token transaction with the keyshares
207
+ await this.finalizeTokenTransaction(finalTokenTransaction, revocationKeys, threshold);
208
+ }
209
+ return bytesToHex(hashTokenTransaction(startResponse.finalTokenTransaction));
210
+ }
211
+ async finalizeTokenTransaction(finalTokenTransaction, leafToSpendRevocationKeys, threshold) {
212
+ const signingOperators = this.config.getSigningOperators();
213
+ // Submit finalize_token_transaction to all SOs in parallel
214
+ const soResponses = await Promise.allSettled(Object.entries(signingOperators).map(async ([identifier, operator]) => {
215
+ const internalSparkClient = await this.connectionManager.createSparkClient(operator.address);
216
+ const identityPublicKey = await this.config.signer.getIdentityPublicKey();
217
+ const response = await internalSparkClient.finalize_token_transaction({
218
+ finalTokenTransaction,
219
+ leafToSpendRevocationKeys,
220
+ identityPublicKey,
221
+ }, {
222
+ retry: true,
223
+ retryMaxAttempts: 5,
224
+ });
225
+ return {
226
+ identifier,
227
+ response,
228
+ };
229
+ }));
230
+ validateResponses(soResponses);
231
+ return finalTokenTransaction;
232
+ }
233
+ async fetchOwnedTokenLeaves(ownerPublicKeys, tokenPublicKeys) {
234
+ const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
235
+ const result = await sparkClient.get_owned_token_leaves({
236
+ ownerPublicKeys,
237
+ tokenPublicKeys,
238
+ });
239
+ return result.leavesWithPreviousTransactionData;
240
+ }
241
+ async syncTokenLeaves(tokenLeaves) {
242
+ const unsortedTokenLeaves = await this.fetchOwnedTokenLeaves(await this.config.signer.getTrackedPublicKeys(), []);
243
+ unsortedTokenLeaves.forEach((leaf) => {
244
+ const tokenKey = bytesToHex(leaf.leaf.tokenPublicKey);
245
+ const index = leaf.previousTransactionVout;
246
+ tokenLeaves.set(tokenKey, [{ ...leaf, previousTransactionVout: index }]);
247
+ });
248
+ }
249
+ selectTokenLeaves(tokenLeaves, tokenAmount) {
250
+ if (calculateAvailableTokenAmount(tokenLeaves) < tokenAmount) {
251
+ throw new Error("Insufficient available token amount");
252
+ }
253
+ // First try to find an exact match
254
+ const exactMatch = tokenLeaves.find((item) => bytesToNumberBE(item.leaf.tokenAmount) === tokenAmount);
255
+ if (exactMatch) {
256
+ return [exactMatch];
257
+ }
258
+ // Sort by amount ascending for optimal selection.
259
+ // It's in user's interest to hold as little leaves as possible,
260
+ // so that in the event of a unilateral exit the fees are as low as possible
261
+ tokenLeaves.sort((a, b) => Number(bytesToNumberBE(a.leaf.tokenAmount) -
262
+ bytesToNumberBE(b.leaf.tokenAmount)));
263
+ let remainingAmount = tokenAmount;
264
+ const selectedLeaves = [];
265
+ // Select leaves using a greedy approach
266
+ for (const leafInfo of tokenLeaves) {
267
+ if (remainingAmount <= 0n)
268
+ break;
269
+ selectedLeaves.push(leafInfo);
270
+ remainingAmount -= bytesToNumberBE(leafInfo.leaf.tokenAmount);
271
+ }
272
+ if (remainingAmount > 0n) {
273
+ throw new Error("You do not have enough funds to complete the specified operation");
274
+ }
275
+ return selectedLeaves;
276
+ }
277
+ // Helper function for deciding if the signer public key is the identity public key
278
+ async signMessageWithKey(message, publicKey) {
279
+ const signWithSchnorr = this.config.shouldSignTokenTransactionsWithSchnorr();
280
+ if (bytesToHex(publicKey) ===
281
+ bytesToHex(await this.config.signer.getIdentityPublicKey())) {
282
+ if (signWithSchnorr) {
283
+ return await this.config.signer.signSchnorrWithIdentityKey(message);
284
+ }
285
+ else {
286
+ return await this.config.signer.signMessageWithIdentityKey(message);
287
+ }
288
+ }
289
+ else {
290
+ if (signWithSchnorr) {
291
+ return await this.config.signer.signSchnorr(message, publicKey);
292
+ }
293
+ else {
294
+ return await this.config.signer.signMessageWithPublicKey(message, publicKey);
295
+ }
296
+ }
297
+ }
298
+ }
299
+ //# sourceMappingURL=token-transactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-transactions.js","sourceRoot":"","sources":["../../../../../spark-sdk/src/services/token-transactions.ts"],"names":[],"mappings":"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"}