@buildonspark/spark-sdk 0.1.44 → 0.1.46

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 (143) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/{RequestLightningSendInput-BxbCtwpV.d.cts → RequestLightningSendInput-2cSh_In4.d.cts} +1 -1
  3. package/dist/{RequestLightningSendInput-RGel43ks.d.ts → RequestLightningSendInput-CN6BNg_g.d.ts} +1 -1
  4. package/dist/address/index.cjs +2 -2
  5. package/dist/address/index.d.cts +2 -2
  6. package/dist/address/index.d.ts +2 -2
  7. package/dist/address/index.js +2 -2
  8. package/dist/{chunk-EKFD62HN.js → chunk-4EMV7HHW.js} +2 -1
  9. package/dist/{chunk-4Q2ZDYYU.js → chunk-BGGEVUJK.js} +1157 -208
  10. package/dist/{chunk-CIZNCBKE.js → chunk-C2S227QR.js} +648 -45
  11. package/dist/{chunk-WPTRVD2V.js → chunk-DXR2PXJU.js} +15 -15
  12. package/dist/{chunk-NBCNYDWJ.js → chunk-HHNQ3ZHC.js} +2 -2
  13. package/dist/{chunk-DAXGVPVM.js → chunk-HSCLBJEL.js} +2 -2
  14. package/dist/{chunk-6AFUC5M2.js → chunk-HWJWKEIU.js} +8 -2
  15. package/dist/{chunk-A2ZLMH6I.js → chunk-JB64OQES.js} +259 -327
  16. package/dist/{chunk-KEKGSH7B.js → chunk-KMUMFYFX.js} +3 -3
  17. package/dist/chunk-LHRD2WT6.js +2374 -0
  18. package/dist/{chunk-HTMXTJRK.js → chunk-N5VZVCGJ.js} +4 -4
  19. package/dist/{chunk-SQKXGAIR.js → chunk-NTFKFRQ2.js} +1 -1
  20. package/dist/{chunk-K4BJARWM.js → chunk-OBFKIEMP.js} +1 -1
  21. package/dist/{chunk-UBT6EDVJ.js → chunk-OFCJFZ4I.js} +1 -1
  22. package/dist/{chunk-XX4RRWOX.js → chunk-UXDODSDT.js} +8 -10
  23. package/dist/graphql/objects/index.d.cts +5 -4
  24. package/dist/graphql/objects/index.d.ts +5 -4
  25. package/dist/index-CKL5DodV.d.cts +214 -0
  26. package/dist/index-COm59SPw.d.ts +214 -0
  27. package/dist/index.cjs +4026 -1315
  28. package/dist/index.d.cts +764 -19
  29. package/dist/index.d.ts +764 -19
  30. package/dist/index.js +23 -27
  31. package/dist/index.node.cjs +4026 -1319
  32. package/dist/index.node.d.cts +10 -8
  33. package/dist/index.node.d.ts +10 -8
  34. package/dist/index.node.js +23 -31
  35. package/dist/native/index.cjs +4027 -1316
  36. package/dist/native/index.d.cts +281 -85
  37. package/dist/native/index.d.ts +281 -85
  38. package/dist/native/index.js +4018 -1307
  39. package/dist/{network-CfxLnaot.d.cts → network-Css46DAz.d.cts} +1 -1
  40. package/dist/{network-CroCOQ0B.d.ts → network-hynb7iTZ.d.ts} +1 -1
  41. package/dist/proto/lrc20.cjs +222 -19
  42. package/dist/proto/lrc20.d.cts +1 -1
  43. package/dist/proto/lrc20.d.ts +1 -1
  44. package/dist/proto/lrc20.js +2 -2
  45. package/dist/proto/spark.cjs +1154 -205
  46. package/dist/proto/spark.d.cts +1 -1
  47. package/dist/proto/spark.d.ts +1 -1
  48. package/dist/proto/spark.js +3 -1
  49. package/dist/proto/spark_token.cjs +1377 -58
  50. package/dist/proto/spark_token.d.cts +153 -15
  51. package/dist/proto/spark_token.d.ts +153 -15
  52. package/dist/proto/spark_token.js +40 -4
  53. package/dist/{sdk-types-CTbTdDbE.d.ts → sdk-types-CKBsylfW.d.ts} +1 -1
  54. package/dist/{sdk-types-BeCBoozO.d.cts → sdk-types-Ct8xmN7l.d.cts} +1 -1
  55. package/dist/services/config.cjs +2 -2
  56. package/dist/services/config.d.cts +5 -4
  57. package/dist/services/config.d.ts +5 -4
  58. package/dist/services/config.js +6 -6
  59. package/dist/services/connection.cjs +2438 -262
  60. package/dist/services/connection.d.cts +5 -4
  61. package/dist/services/connection.d.ts +5 -4
  62. package/dist/services/connection.js +4 -4
  63. package/dist/services/index.cjs +5937 -3154
  64. package/dist/services/index.d.cts +7 -6
  65. package/dist/services/index.d.ts +7 -6
  66. package/dist/services/index.js +17 -15
  67. package/dist/services/lrc-connection.cjs +223 -20
  68. package/dist/services/lrc-connection.d.cts +5 -4
  69. package/dist/services/lrc-connection.d.ts +5 -4
  70. package/dist/services/lrc-connection.js +4 -4
  71. package/dist/services/token-transactions.cjs +840 -236
  72. package/dist/services/token-transactions.d.cts +25 -7
  73. package/dist/services/token-transactions.d.ts +25 -7
  74. package/dist/services/token-transactions.js +5 -4
  75. package/dist/services/wallet-config.cjs +3 -1
  76. package/dist/services/wallet-config.d.cts +7 -5
  77. package/dist/services/wallet-config.d.ts +7 -5
  78. package/dist/services/wallet-config.js +3 -1
  79. package/dist/signer/signer.cjs +1 -1
  80. package/dist/signer/signer.d.cts +3 -2
  81. package/dist/signer/signer.d.ts +3 -2
  82. package/dist/signer/signer.js +2 -2
  83. package/dist/{signer-D7vfYik9.d.ts → signer-BP6F__oR.d.cts} +2 -6
  84. package/dist/{signer-DaY8c60s.d.cts → signer-BVZJXcq7.d.ts} +2 -6
  85. package/dist/{spark-C4ZrsgjC.d.cts → spark-DbzGfse6.d.cts} +93 -15
  86. package/dist/{spark-C4ZrsgjC.d.ts → spark-DbzGfse6.d.ts} +93 -15
  87. package/dist/spark_bindings/native/index.cjs +183 -0
  88. package/dist/spark_bindings/native/index.d.cts +14 -0
  89. package/dist/spark_bindings/native/index.d.ts +14 -0
  90. package/dist/spark_bindings/native/index.js +141 -0
  91. package/dist/spark_bindings/wasm/index.cjs +1093 -0
  92. package/dist/spark_bindings/wasm/index.d.cts +47 -0
  93. package/dist/spark_bindings/wasm/index.d.ts +47 -0
  94. package/dist/{chunk-K4C4W5FC.js → spark_bindings/wasm/index.js} +7 -6
  95. package/dist/types/index.cjs +1156 -208
  96. package/dist/types/index.d.cts +5 -4
  97. package/dist/types/index.d.ts +5 -4
  98. package/dist/types/index.js +2 -2
  99. package/dist/types-C-Rp0Oo7.d.cts +46 -0
  100. package/dist/types-C-Rp0Oo7.d.ts +46 -0
  101. package/dist/utils/index.cjs +65 -13
  102. package/dist/utils/index.d.cts +14 -134
  103. package/dist/utils/index.d.ts +14 -134
  104. package/dist/utils/index.js +13 -13
  105. package/package.json +22 -2
  106. package/src/index.node.ts +0 -1
  107. package/src/index.ts +0 -1
  108. package/src/native/index.ts +1 -2
  109. package/src/proto/common.ts +5 -5
  110. package/src/proto/google/protobuf/descriptor.ts +34 -34
  111. package/src/proto/google/protobuf/duration.ts +2 -2
  112. package/src/proto/google/protobuf/empty.ts +2 -2
  113. package/src/proto/google/protobuf/timestamp.ts +2 -2
  114. package/src/proto/mock.ts +4 -4
  115. package/src/proto/spark.ts +1452 -185
  116. package/src/proto/spark_authn.ts +7 -7
  117. package/src/proto/spark_token.ts +1668 -105
  118. package/src/proto/validate/validate.ts +24 -24
  119. package/src/services/bolt11-spark.ts +62 -187
  120. package/src/services/coop-exit.ts +3 -0
  121. package/src/services/lrc20.ts +1 -1
  122. package/src/services/token-transactions.ts +197 -9
  123. package/src/services/transfer.ts +22 -0
  124. package/src/services/tree-creation.ts +13 -0
  125. package/src/services/wallet-config.ts +2 -2
  126. package/src/spark-wallet/spark-wallet.node.ts +0 -4
  127. package/src/spark-wallet/spark-wallet.ts +76 -108
  128. package/src/spark-wallet/types.ts +39 -3
  129. package/src/tests/bolt11-spark.test.ts +7 -15
  130. package/src/tests/integration/ssp/coop-exit.test.ts +7 -7
  131. package/src/tests/integration/swap.test.ts +453 -433
  132. package/src/tests/integration/transfer.test.ts +261 -248
  133. package/src/tests/token-identifier.test.ts +54 -0
  134. package/src/tests/tokens.test.ts +218 -23
  135. package/src/utils/token-hashing.ts +320 -44
  136. package/src/utils/token-identifier.ts +88 -0
  137. package/src/utils/token-transaction-validation.ts +350 -5
  138. package/src/utils/token-transactions.ts +12 -8
  139. package/src/utils/transaction.ts +0 -6
  140. package/dist/chunk-B3AMIGJG.js +0 -1073
  141. package/dist/index-CZmDdSts.d.cts +0 -829
  142. package/dist/index-ClIRO_3y.d.ts +0 -829
  143. package/dist/wasm-7OWFHDMS.js +0 -21
@@ -20,453 +20,473 @@ import { createNewTree } from "../test-util.js";
20
20
  import { SparkWalletTesting } from "../utils/spark-testing-wallet.js";
21
21
  import { BitcoinFaucet } from "../utils/test-faucet.js";
22
22
 
23
+ const testLocalOnly = process.env.GITHUB_ACTIONS ? it.skip : it;
24
+
23
25
  describe("swap", () => {
24
- it("test swap", async () => {
25
- const faucet = BitcoinFaucet.getInstance();
26
- // Initiate sender
27
- const { wallet: senderWallet } = await SparkWalletTesting.initialize({
28
- options: {
29
- network: "LOCAL",
30
- },
31
- });
32
- const senderPubkey = await senderWallet.getIdentityPublicKey();
33
-
34
- const senderConfig = new WalletConfigService(
35
- {
36
- network: "LOCAL",
37
- },
38
- senderWallet.getSigner(),
39
- );
40
- const senderConnectionManager = new ConnectionManager(senderConfig);
41
- const senderSigningService = new SigningService(senderConfig);
42
- const senderTransferService = new TransferService(
43
- senderConfig,
44
- senderConnectionManager,
45
- senderSigningService,
46
- );
47
-
48
- // Initiate receiver
49
- const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
50
- options: {
51
- network: "LOCAL",
52
- },
53
- });
54
- const receiverPubkey = await receiverWallet.getIdentityPublicKey();
55
-
56
- const receiverConfig = new WalletConfigService(
57
- {
58
- network: "LOCAL",
59
- },
60
- receiverWallet.getSigner(),
61
- );
62
- const receiverConnectionManager = new ConnectionManager(receiverConfig);
63
- const receiverSigningService = new SigningService(receiverConfig);
64
- const receiverTransferService = new TransferService(
65
- receiverConfig,
66
- receiverConnectionManager,
67
- receiverSigningService,
68
- );
69
-
70
- const senderLeafPubKey = await senderWallet.getSigner().generatePublicKey();
71
- const senderRootNode = await createNewTree(
72
- senderWallet,
73
- senderLeafPubKey,
74
- faucet,
75
- );
76
-
77
- const receiverLeafPubKey = await receiverWallet
78
- .getSigner()
79
- .generatePublicKey();
80
- const receiverRootNode = await createNewTree(
81
- receiverWallet,
82
- receiverLeafPubKey,
83
- faucet,
84
- );
85
-
86
- // Sender initiates transfer
87
- const senderNewLeafPubKey = await senderWallet
88
- .getSigner()
89
- .generatePublicKey(sha256("1"));
90
- const senderTransferNode: LeafKeyTweak = {
91
- leaf: senderRootNode,
92
- signingPubKey: senderLeafPubKey,
93
- newSigningPubKey: senderNewLeafPubKey,
94
- };
95
- const senderLeavesToTransfer = [senderTransferNode];
96
-
97
- // Get signature for refunds (normal flow)
98
- const {
99
- transfer: senderTransfer,
100
- signatureMap: senderRefundSignatureMap,
101
- leafDataMap: senderLeafDataMap,
102
- } = await senderTransferService.startSwapSignRefund(
103
- senderLeavesToTransfer,
104
- hexToBytes(receiverPubkey),
105
- new Date(Date.now() + 10 * 60 * 1000),
106
- );
107
-
108
- expect(senderRefundSignatureMap.size).toBe(1);
109
- const senderSignature = senderRefundSignatureMap.get(senderRootNode.id);
110
- expect(senderSignature).toBeDefined();
111
- expect(senderLeafDataMap.size).toBe(1);
112
-
113
- const { adaptorPrivateKey, adaptorSignature } =
114
- generateAdaptorFromSignature(senderSignature!);
115
- const adaptorPubKey = secp256k1.getPublicKey(adaptorPrivateKey);
116
-
117
- const receiverNewLeafPubKey = await receiverWallet
118
- .getSigner()
119
- .generatePublicKey(sha256("1"));
120
-
121
- const receiverTransferNode: LeafKeyTweak = {
122
- leaf: receiverRootNode,
123
- signingPubKey: receiverLeafPubKey,
124
- newSigningPubKey: receiverNewLeafPubKey,
125
- };
126
- const receiverLeavesToTransfer = [receiverTransferNode];
127
-
128
- const {
129
- transfer: receiverTransfer,
130
- signatureMap: receiverRefundSignatureMap,
131
- leafDataMap: receiverLeafDataMap,
132
- signingResults: operatorSigningResults,
133
- } = await receiverTransferService.counterSwapSignRefund(
134
- receiverLeavesToTransfer,
135
- hexToBytes(senderPubkey),
136
- new Date(Date.now() + 10 * 60 * 1000),
137
- adaptorPubKey,
138
- );
139
-
140
- const newReceiverRefundSignatureMap = new Map<string, Uint8Array>();
141
- for (const [nodeId, signature] of receiverRefundSignatureMap.entries()) {
142
- const leafData = receiverLeafDataMap.get(nodeId);
143
- if (!leafData?.refundTx) {
144
- throw new ValidationError("Refund transaction not found", {
145
- field: "refundTx",
146
- value: leafData,
147
- });
148
- }
149
- const sighash = getSigHashFromTx(
150
- leafData.refundTx,
151
- 0,
152
- leafData.tx.getOutput(leafData.vout),
26
+ testLocalOnly(
27
+ "test swap",
28
+ async () => {
29
+ const faucet = BitcoinFaucet.getInstance();
30
+ // Initiate sender
31
+ const { wallet: senderWallet } = await SparkWalletTesting.initialize({
32
+ options: {
33
+ network: "LOCAL",
34
+ },
35
+ });
36
+ const senderPubkey = await senderWallet.getIdentityPublicKey();
37
+
38
+ const senderConfig = new WalletConfigService(
39
+ {
40
+ network: "LOCAL",
41
+ },
42
+ senderWallet.getSigner(),
43
+ );
44
+ const senderConnectionManager = new ConnectionManager(senderConfig);
45
+ const senderSigningService = new SigningService(senderConfig);
46
+ const senderTransferService = new TransferService(
47
+ senderConfig,
48
+ senderConnectionManager,
49
+ senderSigningService,
50
+ );
51
+
52
+ // Initiate receiver
53
+ const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
54
+ options: {
55
+ network: "LOCAL",
56
+ },
57
+ });
58
+ const receiverPubkey = await receiverWallet.getIdentityPublicKey();
59
+
60
+ const receiverConfig = new WalletConfigService(
61
+ {
62
+ network: "LOCAL",
63
+ },
64
+ receiverWallet.getSigner(),
65
+ );
66
+ const receiverConnectionManager = new ConnectionManager(receiverConfig);
67
+ const receiverSigningService = new SigningService(receiverConfig);
68
+ const receiverTransferService = new TransferService(
69
+ receiverConfig,
70
+ receiverConnectionManager,
71
+ receiverSigningService,
72
+ );
73
+
74
+ const senderLeafPubKey = await senderWallet
75
+ .getSigner()
76
+ .generatePublicKey();
77
+ const senderRootNode = await createNewTree(
78
+ senderWallet,
79
+ senderLeafPubKey,
80
+ faucet,
81
+ );
82
+
83
+ const receiverLeafPubKey = await receiverWallet
84
+ .getSigner()
85
+ .generatePublicKey();
86
+ const receiverRootNode = await createNewTree(
87
+ receiverWallet,
88
+ receiverLeafPubKey,
89
+ faucet,
153
90
  );
154
- let verifyingPubkey: Uint8Array | undefined;
155
- for (const signingResult of operatorSigningResults) {
156
- if (signingResult.leafId === nodeId) {
157
- verifyingPubkey = signingResult.verifyingKey;
91
+
92
+ // Sender initiates transfer
93
+ const senderNewLeafPubKey = await senderWallet
94
+ .getSigner()
95
+ .generatePublicKey(sha256("1"));
96
+ const senderTransferNode: LeafKeyTweak = {
97
+ leaf: senderRootNode,
98
+ signingPubKey: senderLeafPubKey,
99
+ newSigningPubKey: senderNewLeafPubKey,
100
+ };
101
+ const senderLeavesToTransfer = [senderTransferNode];
102
+
103
+ // Get signature for refunds (normal flow)
104
+ const {
105
+ transfer: senderTransfer,
106
+ signatureMap: senderRefundSignatureMap,
107
+ leafDataMap: senderLeafDataMap,
108
+ } = await senderTransferService.startSwapSignRefund(
109
+ senderLeavesToTransfer,
110
+ hexToBytes(receiverPubkey),
111
+ new Date(Date.now() + 10 * 60 * 1000),
112
+ );
113
+
114
+ expect(senderRefundSignatureMap.size).toBe(1);
115
+ const senderSignature = senderRefundSignatureMap.get(senderRootNode.id);
116
+ expect(senderSignature).toBeDefined();
117
+ expect(senderLeafDataMap.size).toBe(1);
118
+
119
+ const { adaptorPrivateKey, adaptorSignature } =
120
+ generateAdaptorFromSignature(senderSignature!);
121
+ const adaptorPubKey = secp256k1.getPublicKey(adaptorPrivateKey);
122
+
123
+ const receiverNewLeafPubKey = await receiverWallet
124
+ .getSigner()
125
+ .generatePublicKey(sha256("1"));
126
+
127
+ const receiverTransferNode: LeafKeyTweak = {
128
+ leaf: receiverRootNode,
129
+ signingPubKey: receiverLeafPubKey,
130
+ newSigningPubKey: receiverNewLeafPubKey,
131
+ };
132
+ const receiverLeavesToTransfer = [receiverTransferNode];
133
+
134
+ const {
135
+ transfer: receiverTransfer,
136
+ signatureMap: receiverRefundSignatureMap,
137
+ leafDataMap: receiverLeafDataMap,
138
+ signingResults: operatorSigningResults,
139
+ } = await receiverTransferService.counterSwapSignRefund(
140
+ receiverLeavesToTransfer,
141
+ hexToBytes(senderPubkey),
142
+ new Date(Date.now() + 10 * 60 * 1000),
143
+ adaptorPubKey,
144
+ );
145
+
146
+ const newReceiverRefundSignatureMap = new Map<string, Uint8Array>();
147
+ for (const [nodeId, signature] of receiverRefundSignatureMap.entries()) {
148
+ const leafData = receiverLeafDataMap.get(nodeId);
149
+ if (!leafData?.refundTx) {
150
+ throw new ValidationError("Refund transaction not found", {
151
+ field: "refundTx",
152
+ value: leafData,
153
+ });
154
+ }
155
+ const sighash = getSigHashFromTx(
156
+ leafData.refundTx,
157
+ 0,
158
+ leafData.tx.getOutput(leafData.vout),
159
+ );
160
+ let verifyingPubkey: Uint8Array | undefined;
161
+ for (const signingResult of operatorSigningResults) {
162
+ if (signingResult.leafId === nodeId) {
163
+ verifyingPubkey = signingResult.verifyingKey;
164
+ }
158
165
  }
166
+ expect(verifyingPubkey).toBeDefined();
167
+ const taprootKey = computeTaprootKeyNoScript(
168
+ verifyingPubkey!.slice(1, 33),
169
+ );
170
+ const adaptorSig = applyAdaptorToSignature(
171
+ taprootKey.slice(1, 33),
172
+ sighash,
173
+ signature,
174
+ adaptorPrivateKey,
175
+ );
176
+ newReceiverRefundSignatureMap.set(nodeId, adaptorSig);
159
177
  }
160
- expect(verifyingPubkey).toBeDefined();
161
- const taprootKey = computeTaprootKeyNoScript(
162
- verifyingPubkey!.slice(1, 33),
178
+ const senderTransferTweakKey =
179
+ await senderTransferService.sendTransferTweakKey(
180
+ senderTransfer,
181
+ senderLeavesToTransfer,
182
+ senderRefundSignatureMap,
183
+ );
184
+
185
+ const pendingTransfer =
186
+ await receiverTransferService.queryPendingTransfers();
187
+ expect(pendingTransfer.transfers.length).toBe(1);
188
+ const receiverPendingTransfer = pendingTransfer.transfers[0];
189
+ expect(receiverPendingTransfer!.id).toBe(senderTransferTweakKey.id);
190
+
191
+ const leafPrivKeyMap =
192
+ await receiverTransferService.verifyPendingTransfer(
193
+ receiverPendingTransfer!,
194
+ );
195
+
196
+ expect(leafPrivKeyMap.size).toBe(1);
197
+ expect(leafPrivKeyMap.get(senderRootNode.id)).toBeDefined();
198
+ const bytesEqual = equalBytes(
199
+ leafPrivKeyMap.get(senderRootNode.id)!,
200
+ senderNewLeafPubKey,
201
+ );
202
+ expect(bytesEqual).toBe(true);
203
+ expect(receiverPendingTransfer!.leaves[0]!.leaf).toBeDefined();
204
+ const finalLeafPubKey = await receiverWallet
205
+ .getSigner()
206
+ .generatePublicKey(sha256("2"));
207
+ const claimingNode: LeafKeyTweak = {
208
+ leaf: receiverPendingTransfer!.leaves[0]!.leaf!,
209
+ signingPubKey: senderNewLeafPubKey,
210
+ newSigningPubKey: finalLeafPubKey,
211
+ };
212
+ const leavesToClaim = [claimingNode];
213
+ await receiverTransferService.claimTransfer(
214
+ receiverPendingTransfer!,
215
+ leavesToClaim,
163
216
  );
164
- const adaptorSig = applyAdaptorToSignature(
165
- taprootKey.slice(1, 33),
166
- sighash,
167
- signature,
168
- adaptorPrivateKey,
217
+ await receiverTransferService.sendTransferTweakKey(
218
+ receiverTransfer,
219
+ receiverLeavesToTransfer,
220
+ newReceiverRefundSignatureMap,
221
+ );
222
+
223
+ const sPendingTransfer =
224
+ await senderTransferService.queryPendingTransfers();
225
+ expect(sPendingTransfer.transfers.length).toBe(1);
226
+ const senderPendingTransfer = sPendingTransfer.transfers[0];
227
+ expect(senderPendingTransfer!.id).toBe(receiverTransfer.id);
228
+
229
+ const senderLeafPrivKeyMap =
230
+ await senderTransferService.verifyPendingTransfer(
231
+ senderPendingTransfer!,
232
+ );
233
+ expect(senderLeafPrivKeyMap.size).toBe(1);
234
+ expect(senderLeafPrivKeyMap.get(receiverRootNode.id)).toBeDefined();
235
+ const bytesEqual_1 = equalBytes(
236
+ senderLeafPrivKeyMap.get(receiverRootNode.id)!,
237
+ receiverNewLeafPubKey,
169
238
  );
170
- newReceiverRefundSignatureMap.set(nodeId, adaptorSig);
171
- }
172
- const senderTransferTweakKey =
173
- await senderTransferService.sendTransferTweakKey(
174
- senderTransfer,
239
+ expect(bytesEqual_1).toBe(true);
240
+ expect(senderPendingTransfer!.leaves[0]!.leaf).toBeDefined();
241
+
242
+ const finalLeafPubKey_1 = await senderWallet
243
+ .getSigner()
244
+ .generatePublicKey(sha256("3"));
245
+ const claimingNode_1: LeafKeyTweak = {
246
+ leaf: senderPendingTransfer!.leaves[0]!.leaf!,
247
+ signingPubKey: receiverNewLeafPubKey,
248
+ newSigningPubKey: finalLeafPubKey_1,
249
+ };
250
+ const leavesToClaim_1 = [claimingNode_1];
251
+ await senderTransferService.claimTransfer(
252
+ senderPendingTransfer!,
253
+ leavesToClaim_1,
254
+ );
255
+ },
256
+ 30000,
257
+ );
258
+
259
+ testLocalOnly(
260
+ "test swap v2",
261
+ async () => {
262
+ const faucet = BitcoinFaucet.getInstance();
263
+ // Initiate sender
264
+ const { wallet: senderWallet } = await SparkWalletTesting.initialize({
265
+ options: {
266
+ network: "LOCAL",
267
+ },
268
+ });
269
+ const senderPubkey = await senderWallet.getIdentityPublicKey();
270
+
271
+ const senderConfig = new WalletConfigService(
272
+ {
273
+ network: "LOCAL",
274
+ },
275
+ senderWallet.getSigner(),
276
+ );
277
+ const senderConnectionManager = new ConnectionManager(senderConfig);
278
+ const senderSigningService = new SigningService(senderConfig);
279
+ const senderTransferService = new TransferService(
280
+ senderConfig,
281
+ senderConnectionManager,
282
+ senderSigningService,
283
+ );
284
+
285
+ // Initiate receiver
286
+ const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
287
+ options: {
288
+ network: "LOCAL",
289
+ },
290
+ });
291
+ const receiverPubkey = await receiverWallet.getIdentityPublicKey();
292
+
293
+ const receiverConfig = new WalletConfigService(
294
+ {
295
+ network: "LOCAL",
296
+ },
297
+ receiverWallet.getSigner(),
298
+ );
299
+ const receiverConnectionManager = new ConnectionManager(receiverConfig);
300
+ const receiverSigningService = new SigningService(receiverConfig);
301
+ const receiverTransferService = new TransferService(
302
+ receiverConfig,
303
+ receiverConnectionManager,
304
+ receiverSigningService,
305
+ );
306
+
307
+ const senderLeafPubKey = await senderWallet
308
+ .getSigner()
309
+ .generatePublicKey();
310
+ const senderRootNode = await createNewTree(
311
+ senderWallet,
312
+ senderLeafPubKey,
313
+ faucet,
314
+ );
315
+
316
+ const receiverLeafPubKey = await receiverWallet
317
+ .getSigner()
318
+ .generatePublicKey();
319
+ const receiverRootNode = await createNewTree(
320
+ receiverWallet,
321
+ receiverLeafPubKey,
322
+ faucet,
323
+ );
324
+
325
+ // Sender initiates transfer
326
+ const senderNewLeafPubKey = await senderWallet
327
+ .getSigner()
328
+ .generatePublicKey(sha256("1"));
329
+ const senderTransferNode: LeafKeyTweak = {
330
+ leaf: senderRootNode,
331
+ signingPubKey: senderLeafPubKey,
332
+ newSigningPubKey: senderNewLeafPubKey,
333
+ };
334
+ const senderLeavesToTransfer = [senderTransferNode];
335
+
336
+ // Get signature for refunds (normal flow)
337
+ const {
338
+ transfer: senderTransfer,
339
+ signatureMap: senderRefundSignatureMap,
340
+ leafDataMap: senderLeafDataMap,
341
+ } = await senderTransferService.startSwapSignRefund(
175
342
  senderLeavesToTransfer,
176
- senderRefundSignatureMap,
343
+ hexToBytes(receiverPubkey),
344
+ new Date(Date.now() + 10 * 60 * 1000),
177
345
  );
178
346
 
179
- const pendingTransfer =
180
- await receiverTransferService.queryPendingTransfers();
181
- expect(pendingTransfer.transfers.length).toBe(1);
182
- const receiverPendingTransfer = pendingTransfer.transfers[0];
183
- expect(receiverPendingTransfer!.id).toBe(senderTransferTweakKey.id);
184
-
185
- const leafPrivKeyMap = await receiverTransferService.verifyPendingTransfer(
186
- receiverPendingTransfer!,
187
- );
188
-
189
- expect(leafPrivKeyMap.size).toBe(1);
190
- expect(leafPrivKeyMap.get(senderRootNode.id)).toBeDefined();
191
- const bytesEqual = equalBytes(
192
- leafPrivKeyMap.get(senderRootNode.id)!,
193
- senderNewLeafPubKey,
194
- );
195
- expect(bytesEqual).toBe(true);
196
- expect(receiverPendingTransfer!.leaves[0]!.leaf).toBeDefined();
197
- const finalLeafPubKey = await receiverWallet
198
- .getSigner()
199
- .generatePublicKey(sha256("2"));
200
- const claimingNode: LeafKeyTweak = {
201
- leaf: receiverPendingTransfer!.leaves[0]!.leaf!,
202
- signingPubKey: senderNewLeafPubKey,
203
- newSigningPubKey: finalLeafPubKey,
204
- };
205
- const leavesToClaim = [claimingNode];
206
- await receiverTransferService.claimTransfer(
207
- receiverPendingTransfer!,
208
- leavesToClaim,
209
- );
210
- await receiverTransferService.sendTransferTweakKey(
211
- receiverTransfer,
212
- receiverLeavesToTransfer,
213
- newReceiverRefundSignatureMap,
214
- );
215
-
216
- const sPendingTransfer =
217
- await senderTransferService.queryPendingTransfers();
218
- expect(sPendingTransfer.transfers.length).toBe(1);
219
- const senderPendingTransfer = sPendingTransfer.transfers[0];
220
- expect(senderPendingTransfer!.id).toBe(receiverTransfer.id);
221
-
222
- const senderLeafPrivKeyMap =
223
- await senderTransferService.verifyPendingTransfer(senderPendingTransfer!);
224
- expect(senderLeafPrivKeyMap.size).toBe(1);
225
- expect(senderLeafPrivKeyMap.get(receiverRootNode.id)).toBeDefined();
226
- const bytesEqual_1 = equalBytes(
227
- senderLeafPrivKeyMap.get(receiverRootNode.id)!,
228
- receiverNewLeafPubKey,
229
- );
230
- expect(bytesEqual_1).toBe(true);
231
- expect(senderPendingTransfer!.leaves[0]!.leaf).toBeDefined();
232
-
233
- const finalLeafPubKey_1 = await senderWallet
234
- .getSigner()
235
- .generatePublicKey(sha256("3"));
236
- const claimingNode_1: LeafKeyTweak = {
237
- leaf: senderPendingTransfer!.leaves[0]!.leaf!,
238
- signingPubKey: receiverNewLeafPubKey,
239
- newSigningPubKey: finalLeafPubKey_1,
240
- };
241
- const leavesToClaim_1 = [claimingNode_1];
242
- await senderTransferService.claimTransfer(
243
- senderPendingTransfer!,
244
- leavesToClaim_1,
245
- );
246
- }, 30000);
247
-
248
- it("test swap v2", async () => {
249
- const faucet = BitcoinFaucet.getInstance();
250
- // Initiate sender
251
- const { wallet: senderWallet } = await SparkWalletTesting.initialize({
252
- options: {
253
- network: "LOCAL",
254
- },
255
- });
256
- const senderPubkey = await senderWallet.getIdentityPublicKey();
257
-
258
- const senderConfig = new WalletConfigService(
259
- {
260
- network: "LOCAL",
261
- },
262
- senderWallet.getSigner(),
263
- );
264
- const senderConnectionManager = new ConnectionManager(senderConfig);
265
- const senderSigningService = new SigningService(senderConfig);
266
- const senderTransferService = new TransferService(
267
- senderConfig,
268
- senderConnectionManager,
269
- senderSigningService,
270
- );
271
-
272
- // Initiate receiver
273
- const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
274
- options: {
275
- network: "LOCAL",
276
- },
277
- });
278
- const receiverPubkey = await receiverWallet.getIdentityPublicKey();
279
-
280
- const receiverConfig = new WalletConfigService(
281
- {
282
- network: "LOCAL",
283
- },
284
- receiverWallet.getSigner(),
285
- );
286
- const receiverConnectionManager = new ConnectionManager(receiverConfig);
287
- const receiverSigningService = new SigningService(receiverConfig);
288
- const receiverTransferService = new TransferService(
289
- receiverConfig,
290
- receiverConnectionManager,
291
- receiverSigningService,
292
- );
293
-
294
- const senderLeafPubKey = await senderWallet.getSigner().generatePublicKey();
295
- const senderRootNode = await createNewTree(
296
- senderWallet,
297
- senderLeafPubKey,
298
- faucet,
299
- );
300
-
301
- const receiverLeafPubKey = await receiverWallet
302
- .getSigner()
303
- .generatePublicKey();
304
- const receiverRootNode = await createNewTree(
305
- receiverWallet,
306
- receiverLeafPubKey,
307
- faucet,
308
- );
309
-
310
- // Sender initiates transfer
311
- const senderNewLeafPubKey = await senderWallet
312
- .getSigner()
313
- .generatePublicKey(sha256("1"));
314
- const senderTransferNode: LeafKeyTweak = {
315
- leaf: senderRootNode,
316
- signingPubKey: senderLeafPubKey,
317
- newSigningPubKey: senderNewLeafPubKey,
318
- };
319
- const senderLeavesToTransfer = [senderTransferNode];
320
-
321
- // Get signature for refunds (normal flow)
322
- const {
323
- transfer: senderTransfer,
324
- signatureMap: senderRefundSignatureMap,
325
- leafDataMap: senderLeafDataMap,
326
- } = await senderTransferService.startSwapSignRefund(
327
- senderLeavesToTransfer,
328
- hexToBytes(receiverPubkey),
329
- new Date(Date.now() + 10 * 60 * 1000),
330
- );
331
-
332
- expect(senderRefundSignatureMap.size).toBe(1);
333
- const senderSignature = senderRefundSignatureMap.get(senderRootNode.id);
334
- expect(senderSignature).toBeDefined();
335
- expect(senderLeafDataMap.size).toBe(1);
336
-
337
- const { adaptorPrivateKey } = generateAdaptorFromSignature(
338
- senderSignature!,
339
- );
340
- const adaptorPubKey = secp256k1.getPublicKey(adaptorPrivateKey);
341
-
342
- const receiverNewLeafPubKey = await receiverWallet
343
- .getSigner()
344
- .generatePublicKey(sha256("1"));
345
-
346
- const receiverTransferNode: LeafKeyTweak = {
347
- leaf: receiverRootNode,
348
- signingPubKey: receiverLeafPubKey,
349
- newSigningPubKey: receiverNewLeafPubKey,
350
- };
351
- const receiverLeavesToTransfer = [receiverTransferNode];
352
-
353
- const {
354
- transfer: receiverTransfer,
355
- signatureMap: receiverRefundSignatureMap,
356
- leafDataMap: receiverLeafDataMap,
357
- signingResults: operatorSigningResults,
358
- } = await receiverTransferService.counterSwapSignRefund(
359
- receiverLeavesToTransfer,
360
- hexToBytes(senderPubkey),
361
- new Date(Date.now() + 10 * 60 * 1000),
362
- adaptorPubKey,
363
- );
364
-
365
- const newReceiverRefundSignatureMap = new Map<string, Uint8Array>();
366
- for (const [nodeId, signature] of receiverRefundSignatureMap.entries()) {
367
- const leafData = receiverLeafDataMap.get(nodeId);
368
- if (!leafData?.refundTx) {
369
- throw new ValidationError("Refund transaction not found", {
370
- field: "refundTx",
371
- value: leafData,
372
- });
373
- }
374
- const sighash = getSigHashFromTx(
375
- leafData.refundTx,
376
- 0,
377
- leafData.tx.getOutput(leafData.vout),
347
+ expect(senderRefundSignatureMap.size).toBe(1);
348
+ const senderSignature = senderRefundSignatureMap.get(senderRootNode.id);
349
+ expect(senderSignature).toBeDefined();
350
+ expect(senderLeafDataMap.size).toBe(1);
351
+
352
+ const { adaptorPrivateKey } = generateAdaptorFromSignature(
353
+ senderSignature!,
378
354
  );
379
- let verifyingPubkey: Uint8Array | undefined;
380
- for (const signingResult of operatorSigningResults) {
381
- if (signingResult.leafId === nodeId) {
382
- verifyingPubkey = signingResult.verifyingKey;
355
+ const adaptorPubKey = secp256k1.getPublicKey(adaptorPrivateKey);
356
+
357
+ const receiverNewLeafPubKey = await receiverWallet
358
+ .getSigner()
359
+ .generatePublicKey(sha256("1"));
360
+
361
+ const receiverTransferNode: LeafKeyTweak = {
362
+ leaf: receiverRootNode,
363
+ signingPubKey: receiverLeafPubKey,
364
+ newSigningPubKey: receiverNewLeafPubKey,
365
+ };
366
+ const receiverLeavesToTransfer = [receiverTransferNode];
367
+
368
+ const {
369
+ transfer: receiverTransfer,
370
+ signatureMap: receiverRefundSignatureMap,
371
+ leafDataMap: receiverLeafDataMap,
372
+ signingResults: operatorSigningResults,
373
+ } = await receiverTransferService.counterSwapSignRefund(
374
+ receiverLeavesToTransfer,
375
+ hexToBytes(senderPubkey),
376
+ new Date(Date.now() + 10 * 60 * 1000),
377
+ adaptorPubKey,
378
+ );
379
+
380
+ const newReceiverRefundSignatureMap = new Map<string, Uint8Array>();
381
+ for (const [nodeId, signature] of receiverRefundSignatureMap.entries()) {
382
+ const leafData = receiverLeafDataMap.get(nodeId);
383
+ if (!leafData?.refundTx) {
384
+ throw new ValidationError("Refund transaction not found", {
385
+ field: "refundTx",
386
+ value: leafData,
387
+ });
383
388
  }
389
+ const sighash = getSigHashFromTx(
390
+ leafData.refundTx,
391
+ 0,
392
+ leafData.tx.getOutput(leafData.vout),
393
+ );
394
+ let verifyingPubkey: Uint8Array | undefined;
395
+ for (const signingResult of operatorSigningResults) {
396
+ if (signingResult.leafId === nodeId) {
397
+ verifyingPubkey = signingResult.verifyingKey;
398
+ }
399
+ }
400
+ expect(verifyingPubkey).toBeDefined();
401
+ const taprootKey = computeTaprootKeyNoScript(
402
+ verifyingPubkey!.slice(1, 33),
403
+ );
404
+ const adaptorSig = applyAdaptorToSignature(
405
+ taprootKey.slice(1, 33),
406
+ sighash,
407
+ signature,
408
+ adaptorPrivateKey,
409
+ );
410
+ newReceiverRefundSignatureMap.set(nodeId, adaptorSig);
384
411
  }
385
- expect(verifyingPubkey).toBeDefined();
386
- const taprootKey = computeTaprootKeyNoScript(
387
- verifyingPubkey!.slice(1, 33),
412
+ const senderTransferTweakKey =
413
+ await senderTransferService.deliverTransferPackage(
414
+ senderTransfer,
415
+ senderLeavesToTransfer,
416
+ senderRefundSignatureMap,
417
+ );
418
+
419
+ const pendingTransfer =
420
+ await receiverTransferService.queryPendingTransfers();
421
+ expect(pendingTransfer.transfers.length).toBe(1);
422
+ const receiverPendingTransfer = pendingTransfer.transfers[0];
423
+ expect(receiverPendingTransfer!.id).toBe(senderTransferTweakKey.id);
424
+
425
+ const leafPrivKeyMap =
426
+ await receiverTransferService.verifyPendingTransfer(
427
+ receiverPendingTransfer!,
428
+ );
429
+
430
+ expect(leafPrivKeyMap.size).toBe(1);
431
+ expect(leafPrivKeyMap.get(senderRootNode.id)).toBeDefined();
432
+ const bytesEqual = equalBytes(
433
+ leafPrivKeyMap.get(senderRootNode.id)!,
434
+ senderNewLeafPubKey,
388
435
  );
389
- const adaptorSig = applyAdaptorToSignature(
390
- taprootKey.slice(1, 33),
391
- sighash,
392
- signature,
393
- adaptorPrivateKey,
436
+ expect(bytesEqual).toBe(true);
437
+ expect(receiverPendingTransfer!.leaves[0]!.leaf).toBeDefined();
438
+ const finalLeafPubKey = await receiverWallet
439
+ .getSigner()
440
+ .generatePublicKey(sha256("2"));
441
+ const claimingNode: LeafKeyTweak = {
442
+ leaf: receiverPendingTransfer!.leaves[0]!.leaf!,
443
+ signingPubKey: senderNewLeafPubKey,
444
+ newSigningPubKey: finalLeafPubKey,
445
+ };
446
+ const leavesToClaim = [claimingNode];
447
+ await receiverTransferService.claimTransfer(
448
+ receiverPendingTransfer!,
449
+ leavesToClaim,
394
450
  );
395
- newReceiverRefundSignatureMap.set(nodeId, adaptorSig);
396
- }
397
- const senderTransferTweakKey =
398
- await senderTransferService.deliverTransferPackage(
399
- senderTransfer,
400
- senderLeavesToTransfer,
401
- senderRefundSignatureMap,
451
+ await receiverTransferService.deliverTransferPackage(
452
+ receiverTransfer,
453
+ receiverLeavesToTransfer,
454
+ newReceiverRefundSignatureMap,
402
455
  );
403
456
 
404
- const pendingTransfer =
405
- await receiverTransferService.queryPendingTransfers();
406
- expect(pendingTransfer.transfers.length).toBe(1);
407
- const receiverPendingTransfer = pendingTransfer.transfers[0];
408
- expect(receiverPendingTransfer!.id).toBe(senderTransferTweakKey.id);
409
-
410
- const leafPrivKeyMap = await receiverTransferService.verifyPendingTransfer(
411
- receiverPendingTransfer!,
412
- );
413
-
414
- expect(leafPrivKeyMap.size).toBe(1);
415
- expect(leafPrivKeyMap.get(senderRootNode.id)).toBeDefined();
416
- const bytesEqual = equalBytes(
417
- leafPrivKeyMap.get(senderRootNode.id)!,
418
- senderNewLeafPubKey,
419
- );
420
- expect(bytesEqual).toBe(true);
421
- expect(receiverPendingTransfer!.leaves[0]!.leaf).toBeDefined();
422
- const finalLeafPubKey = await receiverWallet
423
- .getSigner()
424
- .generatePublicKey(sha256("2"));
425
- const claimingNode: LeafKeyTweak = {
426
- leaf: receiverPendingTransfer!.leaves[0]!.leaf!,
427
- signingPubKey: senderNewLeafPubKey,
428
- newSigningPubKey: finalLeafPubKey,
429
- };
430
- const leavesToClaim = [claimingNode];
431
- await receiverTransferService.claimTransfer(
432
- receiverPendingTransfer!,
433
- leavesToClaim,
434
- );
435
- await receiverTransferService.deliverTransferPackage(
436
- receiverTransfer,
437
- receiverLeavesToTransfer,
438
- newReceiverRefundSignatureMap,
439
- );
440
-
441
- const sPendingTransfer =
442
- await senderTransferService.queryPendingTransfers();
443
- expect(sPendingTransfer.transfers.length).toBe(1);
444
- const senderPendingTransfer = sPendingTransfer.transfers[0];
445
- expect(senderPendingTransfer!.id).toBe(receiverTransfer.id);
446
-
447
- const senderLeafPrivKeyMap =
448
- await senderTransferService.verifyPendingTransfer(senderPendingTransfer!);
449
- expect(senderLeafPrivKeyMap.size).toBe(1);
450
- expect(senderLeafPrivKeyMap.get(receiverRootNode.id)).toBeDefined();
451
- const bytesEqual_1 = equalBytes(
452
- senderLeafPrivKeyMap.get(receiverRootNode.id)!,
453
- receiverNewLeafPubKey,
454
- );
455
- expect(bytesEqual_1).toBe(true);
456
- expect(senderPendingTransfer!.leaves[0]!.leaf).toBeDefined();
457
-
458
- const finalLeafPubKey_1 = await senderWallet
459
- .getSigner()
460
- .generatePublicKey(sha256("3"));
461
- const claimingNode_1: LeafKeyTweak = {
462
- leaf: senderPendingTransfer!.leaves[0]!.leaf!,
463
- signingPubKey: receiverNewLeafPubKey,
464
- newSigningPubKey: finalLeafPubKey_1,
465
- };
466
- const leavesToClaim_1 = [claimingNode_1];
467
- await senderTransferService.claimTransfer(
468
- senderPendingTransfer!,
469
- leavesToClaim_1,
470
- );
471
- }, 30000);
457
+ const sPendingTransfer =
458
+ await senderTransferService.queryPendingTransfers();
459
+ expect(sPendingTransfer.transfers.length).toBe(1);
460
+ const senderPendingTransfer = sPendingTransfer.transfers[0];
461
+ expect(senderPendingTransfer!.id).toBe(receiverTransfer.id);
462
+
463
+ const senderLeafPrivKeyMap =
464
+ await senderTransferService.verifyPendingTransfer(
465
+ senderPendingTransfer!,
466
+ );
467
+ expect(senderLeafPrivKeyMap.size).toBe(1);
468
+ expect(senderLeafPrivKeyMap.get(receiverRootNode.id)).toBeDefined();
469
+ const bytesEqual_1 = equalBytes(
470
+ senderLeafPrivKeyMap.get(receiverRootNode.id)!,
471
+ receiverNewLeafPubKey,
472
+ );
473
+ expect(bytesEqual_1).toBe(true);
474
+ expect(senderPendingTransfer!.leaves[0]!.leaf).toBeDefined();
475
+
476
+ const finalLeafPubKey_1 = await senderWallet
477
+ .getSigner()
478
+ .generatePublicKey(sha256("3"));
479
+ const claimingNode_1: LeafKeyTweak = {
480
+ leaf: senderPendingTransfer!.leaves[0]!.leaf!,
481
+ signingPubKey: receiverNewLeafPubKey,
482
+ newSigningPubKey: finalLeafPubKey_1,
483
+ };
484
+ const leavesToClaim_1 = [claimingNode_1];
485
+ await senderTransferService.claimTransfer(
486
+ senderPendingTransfer!,
487
+ leavesToClaim_1,
488
+ );
489
+ },
490
+ 30000,
491
+ );
472
492
  });