@buildonspark/spark-sdk 0.1.46 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/{chunk-BGGEVUJK.js → chunk-2ENZX6LT.js} +241 -7
  3. package/dist/{chunk-LHRD2WT6.js → chunk-4JD4HIAN.js} +23 -3
  4. package/dist/{chunk-I54FARY2.js → chunk-CDLETEDT.js} +11 -3
  5. package/dist/{chunk-OBFKIEMP.js → chunk-TM6CHQXC.js} +1 -1
  6. package/dist/chunk-UDK3EBE5.js +13514 -0
  7. package/dist/chunk-XYTKKLCV.js +7 -0
  8. package/dist/{RequestLightningSendInput-2cSh_In4.d.cts → client-DKbwpcnl.d.ts} +434 -212
  9. package/dist/{RequestLightningSendInput-CN6BNg_g.d.ts → client-Drs5Lapg.d.cts} +434 -212
  10. package/dist/{services/config.cjs → debug.cjs} +31007 -1003
  11. package/dist/debug.d.cts +126 -0
  12. package/dist/debug.d.ts +126 -0
  13. package/dist/debug.js +21 -0
  14. package/dist/graphql/objects/index.d.cts +4 -11
  15. package/dist/graphql/objects/index.d.ts +4 -11
  16. package/dist/graphql/objects/index.js +2 -4
  17. package/dist/index.cjs +18219 -20818
  18. package/dist/index.d.cts +15 -768
  19. package/dist/index.d.ts +15 -768
  20. package/dist/index.js +82 -76
  21. package/dist/index.node.cjs +23831 -26538
  22. package/dist/index.node.d.cts +191 -33
  23. package/dist/index.node.d.ts +191 -33
  24. package/dist/index.node.js +87 -181
  25. package/dist/native/index.cjs +17835 -20519
  26. package/dist/native/index.d.cts +1466 -1546
  27. package/dist/native/index.d.ts +1466 -1546
  28. package/dist/native/index.js +22605 -25286
  29. package/dist/proto/lrc20.d.cts +2 -2
  30. package/dist/proto/lrc20.d.ts +2 -2
  31. package/dist/proto/lrc20.js +3098 -46
  32. package/dist/proto/spark.cjs +241 -7
  33. package/dist/proto/spark.d.cts +1 -1
  34. package/dist/proto/spark.d.ts +1 -1
  35. package/dist/proto/spark.js +5 -1
  36. package/dist/proto/spark_token.cjs +22 -2
  37. package/dist/proto/spark_token.d.cts +8 -1
  38. package/dist/proto/spark_token.d.ts +8 -1
  39. package/dist/proto/spark_token.js +2 -2
  40. package/dist/{sdk-types-CKBsylfW.d.ts → sdk-types-DCIVdKUT.d.ts} +1 -1
  41. package/dist/{sdk-types-Ct8xmN7l.d.cts → sdk-types-DJ2ve9YY.d.cts} +1 -1
  42. package/dist/{spark-DbzGfse6.d.ts → spark-BUOx3U7Q.d.cts} +103 -5
  43. package/dist/{spark-DbzGfse6.d.cts → spark-BUOx3U7Q.d.ts} +103 -5
  44. package/dist/spark-wallet-CF8Oxjqs.d.ts +935 -0
  45. package/dist/spark-wallet-DOLSa3oF.d.cts +935 -0
  46. package/dist/spark_bindings/native/index.d.cts +1 -1
  47. package/dist/spark_bindings/native/index.d.ts +1 -1
  48. package/dist/spark_bindings/wasm/index.d.cts +1 -1
  49. package/dist/spark_bindings/wasm/index.d.ts +1 -1
  50. package/dist/{services/index.cjs → tests/test-utils.cjs} +9788 -10263
  51. package/dist/tests/test-utils.d.cts +79 -0
  52. package/dist/tests/test-utils.d.ts +79 -0
  53. package/dist/tests/test-utils.js +93 -0
  54. package/dist/types/index.cjs +239 -7
  55. package/dist/types/index.d.cts +5 -9
  56. package/dist/types/index.d.ts +5 -9
  57. package/dist/types/index.js +4 -6
  58. package/dist/{types-C-Rp0Oo7.d.ts → types-BADxR3bm.d.cts} +1 -1
  59. package/dist/{types-C-Rp0Oo7.d.cts → types-BADxR3bm.d.ts} +1 -1
  60. package/dist/{index-COm59SPw.d.ts → xchain-address-C2xMs9nz.d.cts} +6 -94
  61. package/dist/{index-CKL5DodV.d.cts → xchain-address-Ckto9oEz.d.ts} +6 -94
  62. package/package.json +9 -33
  63. package/src/debug.ts +13 -0
  64. package/src/graphql/client.ts +59 -20
  65. package/src/index.node.ts +28 -2
  66. package/src/index.ts +31 -1
  67. package/src/native/index.ts +16 -2
  68. package/src/proto/mock.ts +76 -0
  69. package/src/proto/spark.ts +354 -6
  70. package/src/proto/spark_token.ts +34 -2
  71. package/src/services/config.ts +4 -6
  72. package/src/services/connection.ts +131 -64
  73. package/src/services/coop-exit.ts +6 -3
  74. package/src/services/deposit.ts +9 -8
  75. package/src/services/lightning.ts +4 -3
  76. package/src/services/signing.ts +10 -6
  77. package/src/services/token-transactions.ts +100 -85
  78. package/src/services/transfer.ts +88 -60
  79. package/src/services/tree-creation.ts +17 -9
  80. package/src/services/wallet-config.ts +17 -9
  81. package/src/signer/signer.react-native.ts +5 -10
  82. package/src/signer/signer.ts +269 -339
  83. package/src/signer/types.ts +63 -0
  84. package/src/spark-wallet/spark-wallet.ts +226 -149
  85. package/src/spark-wallet/types.ts +22 -8
  86. package/src/tests/integration/adaptor-signature.test.ts +8 -9
  87. package/src/tests/integration/coop-exit.test.ts +214 -202
  88. package/src/tests/integration/lightning.test.ts +128 -103
  89. package/src/tests/integration/swap.test.ts +116 -84
  90. package/src/tests/integration/transfer.test.ts +291 -214
  91. package/src/tests/integration/tree-creation.test.ts +0 -5
  92. package/src/tests/integration/wallet.test.ts +1 -0
  93. package/src/tests/isHermeticTest.ts +3 -24
  94. package/src/tests/{test-util.ts → test-utils.ts} +13 -11
  95. package/src/tests/token-identifier.test.ts +6 -6
  96. package/src/tests/wrapWithOtelSpan.test.ts +1 -1
  97. package/src/{address → utils}/address.ts +1 -1
  98. package/src/utils/crypto.ts +19 -9
  99. package/src/utils/index.ts +2 -0
  100. package/src/utils/network.ts +17 -0
  101. package/src/utils/secret-sharing.ts +1 -2
  102. package/src/utils/signing.ts +1 -1
  103. package/src/utils/token-identifier.ts +27 -21
  104. package/src/utils/token-transaction-validation.ts +34 -0
  105. package/src/utils/token-transactions.ts +12 -8
  106. package/src/utils/unilateral-exit.ts +32 -0
  107. package/src/utils/xchain-address.ts +1 -1
  108. package/dist/BitcoinNetwork-TnABML0T.d.cts +0 -18
  109. package/dist/BitcoinNetwork-TnABML0T.d.ts +0 -18
  110. package/dist/LightningSendFeeEstimateInput-BgOhEAI-.d.cts +0 -10
  111. package/dist/LightningSendFeeEstimateInput-BgOhEAI-.d.ts +0 -10
  112. package/dist/address/index.cjs +0 -458
  113. package/dist/address/index.d.cts +0 -32
  114. package/dist/address/index.d.ts +0 -32
  115. package/dist/address/index.js +0 -17
  116. package/dist/chunk-4EMV7HHW.js +0 -277
  117. package/dist/chunk-C2S227QR.js +0 -2336
  118. package/dist/chunk-DXR2PXJU.js +0 -1122
  119. package/dist/chunk-GSI4OLXZ.js +0 -117
  120. package/dist/chunk-HHNQ3ZHC.js +0 -170
  121. package/dist/chunk-HMLOC6TE.js +0 -14
  122. package/dist/chunk-HSCLBJEL.js +0 -113
  123. package/dist/chunk-HWJWKEIU.js +0 -75
  124. package/dist/chunk-JB64OQES.js +0 -7095
  125. package/dist/chunk-KMUMFYFX.js +0 -137
  126. package/dist/chunk-N5VZVCGJ.js +0 -622
  127. package/dist/chunk-NSJF5F5O.js +0 -325
  128. package/dist/chunk-NTFKFRQ2.js +0 -3146
  129. package/dist/chunk-OFCJFZ4I.js +0 -24
  130. package/dist/chunk-QNNSEJ4P.js +0 -232
  131. package/dist/chunk-UXDODSDT.js +0 -838
  132. package/dist/chunk-VTUGIIWI.js +0 -0
  133. package/dist/chunk-Z5HIAYFT.js +0 -84
  134. package/dist/network-Css46DAz.d.cts +0 -46
  135. package/dist/network-hynb7iTZ.d.ts +0 -46
  136. package/dist/services/config.d.cts +0 -42
  137. package/dist/services/config.d.ts +0 -42
  138. package/dist/services/config.js +0 -17
  139. package/dist/services/connection.cjs +0 -17691
  140. package/dist/services/connection.d.cts +0 -95
  141. package/dist/services/connection.d.ts +0 -95
  142. package/dist/services/connection.js +0 -11
  143. package/dist/services/index.d.cts +0 -21
  144. package/dist/services/index.d.ts +0 -21
  145. package/dist/services/index.js +0 -58
  146. package/dist/services/lrc-connection.cjs +0 -4713
  147. package/dist/services/lrc-connection.d.cts +0 -34
  148. package/dist/services/lrc-connection.d.ts +0 -34
  149. package/dist/services/lrc-connection.js +0 -11
  150. package/dist/services/token-transactions.cjs +0 -2877
  151. package/dist/services/token-transactions.d.cts +0 -75
  152. package/dist/services/token-transactions.d.ts +0 -75
  153. package/dist/services/token-transactions.js +0 -15
  154. package/dist/services/wallet-config.cjs +0 -340
  155. package/dist/services/wallet-config.d.cts +0 -56
  156. package/dist/services/wallet-config.d.ts +0 -56
  157. package/dist/services/wallet-config.js +0 -33
  158. package/dist/signer/signer.cjs +0 -2004
  159. package/dist/signer/signer.d.cts +0 -10
  160. package/dist/signer/signer.d.ts +0 -10
  161. package/dist/signer/signer.js +0 -24
  162. package/dist/signer-BP6F__oR.d.cts +0 -187
  163. package/dist/signer-BVZJXcq7.d.ts +0 -187
  164. package/dist/utils/index.cjs +0 -2947
  165. package/dist/utils/index.d.cts +0 -18
  166. package/dist/utils/index.d.ts +0 -18
  167. package/dist/utils/index.js +0 -157
  168. package/ios/spark_frost.kt +0 -1900
  169. package/src/address/index.ts +0 -1
  170. package/src/services/lrc-connection.ts +0 -215
  171. /package/dist/{chunk-L3EHBOUX.js → chunk-BYXBJQAS.js} +0 -0
@@ -4,9 +4,11 @@ import {
4
4
  equalBytes,
5
5
  hexToBytes,
6
6
  } from "@noble/curves/abstract/utils";
7
- import { sha256 } from "@noble/hashes/sha2";
8
7
  import { generateMnemonic } from "@scure/bip39";
9
8
  import { wordlist } from "@scure/bip39/wordlists/english";
9
+ import { uuidv7 } from "uuidv7";
10
+ import { RPCError } from "../../errors/types.js";
11
+ import { KeyDerivation, KeyDerivationType } from "../../index.js";
10
12
  import { TransferStatus } from "../../proto/spark.js";
11
13
  import { WalletConfigService } from "../../services/config.js";
12
14
  import { ConnectionManager } from "../../services/connection.js";
@@ -16,123 +18,128 @@ import { TransferService } from "../../services/transfer.js";
16
18
  import {
17
19
  ConfigOptions,
18
20
  getLocalSigningOperators,
19
- LOCAL_WALLET_CONFIG,
21
+ WalletConfig,
20
22
  } from "../../services/wallet-config.js";
21
- import { createNewTree } from "../../tests/test-util.js";
22
23
  import { NetworkType } from "../../utils/network.js";
24
+ import { createNewTree } from "../test-utils.js";
23
25
  import { SparkWalletTesting } from "../utils/spark-testing-wallet.js";
24
26
  import { BitcoinFaucet } from "../utils/test-faucet.js";
25
- import { RPCError } from "../../errors/types.js";
26
27
 
27
28
  const testLocalOnly = process.env.GITHUB_ACTIONS ? it.skip : it;
28
29
 
29
30
  describe("Transfer", () => {
30
31
  jest.setTimeout(15_000);
31
- testLocalOnly(
32
- "test transfer",
33
- async () => {
34
- const faucet = BitcoinFaucet.getInstance();
35
-
36
- const options: ConfigOptions = {
37
- network: "LOCAL",
38
- };
39
-
40
- const { wallet: senderWallet } = await SparkWalletTesting.initialize({
41
- options,
42
- });
32
+ it("test transfer", async () => {
33
+ const faucet = BitcoinFaucet.getInstance();
43
34
 
44
- const senderConfigService = new WalletConfigService(
45
- options,
46
- senderWallet.getSigner(),
47
- );
48
- const senderConnectionManager = new ConnectionManager(
49
- senderConfigService,
50
- );
51
- const signingService = new SigningService(senderConfigService);
52
- const senderTransferService = new TransferService(
53
- senderConfigService,
54
- senderConnectionManager,
55
- signingService,
56
- );
35
+ const options: ConfigOptions = {
36
+ network: "LOCAL",
37
+ };
57
38
 
58
- const leafPubKey = await senderWallet.getSigner().generatePublicKey();
59
- const rootNode = await createNewTree(
60
- senderWallet,
61
- leafPubKey,
62
- faucet,
63
- 1000n,
64
- );
39
+ const { wallet: senderWallet } = await SparkWalletTesting.initialize({
40
+ options,
41
+ });
65
42
 
66
- const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
43
+ const senderConfigService = new WalletConfigService(
44
+ options,
45
+ senderWallet.getSigner(),
46
+ );
47
+ const senderConnectionManager = new ConnectionManager(senderConfigService);
48
+ const signingService = new SigningService(senderConfigService);
49
+ const senderTransferService = new TransferService(
50
+ senderConfigService,
51
+ senderConnectionManager,
52
+ signingService,
53
+ );
67
54
 
68
- const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
69
- options,
70
- });
71
- const receiverPubkey = await receiverWallet.getIdentityPublicKey();
55
+ const leafId = uuidv7();
56
+ const rootNode = await createNewTree(senderWallet, leafId, faucet, 1000n);
72
57
 
73
- const receiverConfigService = new WalletConfigService(
74
- options,
75
- receiverWallet.getSigner(),
76
- );
77
- const receiverConnectionManager = new ConnectionManager(
78
- receiverConfigService,
79
- );
80
- const receiverSigningService = new SigningService(receiverConfigService);
58
+ const newLeafDerivationPath: KeyDerivation = {
59
+ type: KeyDerivationType.LEAF,
60
+ path: uuidv7(),
61
+ };
81
62
 
82
- const receiverTransferService = new TransferService(
83
- receiverConfigService,
84
- receiverConnectionManager,
85
- receiverSigningService,
86
- );
63
+ const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
64
+ options,
65
+ });
66
+ const receiverPubkey = await receiverWallet.getIdentityPublicKey();
87
67
 
88
- const transferNode = {
89
- leaf: rootNode,
90
- signingPubKey: leafPubKey,
91
- newSigningPubKey: newLeafPubKey,
92
- };
68
+ const receiverConfigService = new WalletConfigService(
69
+ options,
70
+ receiverWallet.getSigner(),
71
+ );
72
+ const receiverConnectionManager = new ConnectionManager(
73
+ receiverConfigService,
74
+ );
75
+ const receiverSigningService = new SigningService(receiverConfigService);
93
76
 
94
- const senderTransfer = await senderTransferService.sendTransfer(
95
- [transferNode],
96
- hexToBytes(receiverPubkey),
97
- );
77
+ const receiverTransferService = new TransferService(
78
+ receiverConfigService,
79
+ receiverConnectionManager,
80
+ receiverSigningService,
81
+ );
98
82
 
99
- const pendingTransfer = await receiverWallet.queryPendingTransfers();
83
+ const transferNode: LeafKeyTweak = {
84
+ leaf: rootNode,
85
+ keyDerivation: {
86
+ type: KeyDerivationType.LEAF,
87
+ path: leafId,
88
+ },
89
+ newKeyDerivation: newLeafDerivationPath,
90
+ };
100
91
 
101
- expect(pendingTransfer.transfers.length).toBe(1);
92
+ const senderTransfer = await senderTransferService.sendTransfer(
93
+ [transferNode],
94
+ hexToBytes(receiverPubkey),
95
+ );
102
96
 
103
- const receiverTransfer = pendingTransfer.transfers[0];
97
+ const pendingTransfer = await receiverWallet.queryPendingTransfers();
104
98
 
105
- expect(receiverTransfer!.id).toBe(senderTransfer.id);
99
+ expect(pendingTransfer.transfers.length).toBe(1);
106
100
 
107
- const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(
108
- receiverTransfer!,
109
- );
101
+ const receiverTransfer = pendingTransfer.transfers[0];
110
102
 
111
- expect(leafPrivKeyMap.size).toBe(1);
103
+ expect(receiverTransfer!.id).toBe(senderTransfer.id);
112
104
 
113
- const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
114
- expect(leafPrivKeyMapBytes).toBeDefined();
115
- expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
105
+ const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(
106
+ receiverTransfer!,
107
+ );
116
108
 
117
- const finalLeafPubKey = await receiverWallet
118
- .getSigner()
119
- .generatePublicKey(sha256(rootNode.id));
109
+ expect(leafPrivKeyMap.size).toBe(1);
120
110
 
121
- const claimingNode = {
122
- leaf: rootNode,
123
- signingPubKey: newLeafPubKey,
124
- newSigningPubKey: finalLeafPubKey,
125
- };
111
+ const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
112
+ expect(leafPrivKeyMapBytes).toBeDefined();
113
+ expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(
114
+ bytesToHex(
115
+ await senderWallet
116
+ .getSigner()
117
+ .getPublicKeyFromDerivation(newLeafDerivationPath),
118
+ ),
119
+ );
120
+
121
+ const claimingNodes: LeafKeyTweak[] = receiverTransfer!.leaves.map(
122
+ (leaf) => ({
123
+ leaf: leaf.leaf!,
124
+ keyDerivation: {
125
+ type: KeyDerivationType.ECIES,
126
+ path: leaf.secretCipher,
127
+ },
128
+ newKeyDerivation: {
129
+ type: KeyDerivationType.LEAF,
130
+ path: leaf.leaf!.id,
131
+ },
132
+ }),
133
+ );
126
134
 
127
- await receiverTransferService.claimTransfer(receiverTransfer!, [
128
- claimingNode,
129
- ]);
135
+ await receiverTransferService.claimTransfer(
136
+ receiverTransfer!,
137
+ claimingNodes,
138
+ );
130
139
 
131
- const balance = await receiverWallet.getBalance();
132
- expect(balance.balance).toBe(1000n);
133
- },
134
- 30000,
135
- );
140
+ const balance = await receiverWallet.getBalance();
141
+ expect(balance.balance).toBe(1000n);
142
+ }, 30000);
136
143
 
137
144
  testLocalOnly("test transfer with separate", async () => {
138
145
  const faucet = BitcoinFaucet.getInstance();
@@ -177,21 +184,26 @@ describe("Transfer", () => {
177
184
  receiverSigningService,
178
185
  );
179
186
 
180
- const leafPubKey = await senderWallet.getSigner().generatePublicKey();
181
-
187
+ const leafId = uuidv7();
182
188
  const rootNode = await createNewTree(
183
189
  senderWallet,
184
- leafPubKey,
190
+ leafId,
185
191
  faucet,
186
192
  100_000n,
187
193
  );
188
194
 
189
- const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
195
+ const newLeafDerivationPath: KeyDerivation = {
196
+ type: KeyDerivationType.LEAF,
197
+ path: uuidv7(),
198
+ };
190
199
 
191
200
  const transferNode: LeafKeyTweak = {
192
201
  leaf: rootNode,
193
- signingPubKey: leafPubKey,
194
- newSigningPubKey: newLeafPubKey,
202
+ keyDerivation: {
203
+ type: KeyDerivationType.LEAF,
204
+ path: leafId,
205
+ },
206
+ newKeyDerivation: newLeafDerivationPath,
195
207
  };
196
208
 
197
209
  const leavesToTransfer = [transferNode];
@@ -218,17 +230,28 @@ describe("Transfer", () => {
218
230
 
219
231
  const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
220
232
  expect(leafPrivKeyMapBytes).toBeDefined();
221
- expect(equalBytes(leafPrivKeyMapBytes!, newLeafPubKey)).toBe(true);
222
-
223
- const finalLeafPubKey = await receiverWallet
224
- .getSigner()
225
- .generatePublicKey(sha256(rootNode.id));
226
-
227
- const claimingNode: LeafKeyTweak = {
228
- leaf: receiverTransfer!.leaves[0]!.leaf!,
229
- signingPubKey: newLeafPubKey,
230
- newSigningPubKey: finalLeafPubKey,
231
- };
233
+ expect(
234
+ equalBytes(
235
+ leafPrivKeyMapBytes!,
236
+ await senderWallet
237
+ .getSigner()
238
+ .getPublicKeyFromDerivation(newLeafDerivationPath),
239
+ ),
240
+ ).toBe(true);
241
+
242
+ const claimingNodes: LeafKeyTweak[] = receiverTransfer!.leaves.map(
243
+ (leaf) => ({
244
+ leaf: leaf.leaf!,
245
+ keyDerivation: {
246
+ type: KeyDerivationType.ECIES,
247
+ path: leaf.secretCipher,
248
+ },
249
+ newKeyDerivation: {
250
+ type: KeyDerivationType.LEAF,
251
+ path: leaf.leaf!.id,
252
+ },
253
+ }),
254
+ );
232
255
 
233
256
  const transferService = new TransferService(
234
257
  receiverConfigService,
@@ -236,9 +259,10 @@ describe("Transfer", () => {
236
259
  new SigningService(receiverConfigService),
237
260
  );
238
261
 
239
- await transferService.claimTransferTweakKeys(receiverTransfer!, [
240
- claimingNode,
241
- ]);
262
+ await transferService.claimTransferTweakKeys(
263
+ receiverTransfer!,
264
+ claimingNodes,
265
+ );
242
266
 
243
267
  const newPendingTransfer = await receiverWallet.queryPendingTransfers();
244
268
 
@@ -255,18 +279,25 @@ describe("Transfer", () => {
255
279
 
256
280
  const newLeafPubKeyMapBytes = newLeafPubKeyMap.get(rootNode.id);
257
281
  expect(newLeafPubKeyMapBytes).toBeDefined();
258
- expect(bytesToHex(newLeafPubKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
282
+ expect(bytesToHex(newLeafPubKeyMapBytes!)).toBe(
283
+ bytesToHex(
284
+ await senderWallet
285
+ .getSigner()
286
+ .getPublicKeyFromDerivation(newLeafDerivationPath),
287
+ ),
288
+ );
259
289
 
260
- await transferService.claimTransferSignRefunds(newReceiverTransfer!, [
261
- claimingNode,
262
- ]);
290
+ await transferService.claimTransferSignRefunds(
291
+ newReceiverTransfer!,
292
+ claimingNodes,
293
+ );
263
294
 
264
295
  const newNewPendingTransfer = await receiverWallet.queryPendingTransfers();
265
296
  expect(newNewPendingTransfer.transfers.length).toBe(1);
266
297
 
267
298
  await receiverTransferService.claimTransfer(
268
299
  newNewPendingTransfer.transfers[0]!,
269
- [claimingNode],
300
+ claimingNodes,
270
301
  );
271
302
  });
272
303
 
@@ -301,20 +332,26 @@ describe("Transfer", () => {
301
332
  receiverSigningService,
302
333
  );
303
334
 
304
- const leafPubKey = await senderWallet.getSigner().generatePublicKey();
335
+ const leafId = uuidv7();
305
336
  const rootNode = await createNewTree(
306
337
  senderWallet,
307
- leafPubKey,
338
+ leafId,
308
339
  faucet,
309
340
  100_000n,
310
341
  );
311
342
 
312
- const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
343
+ const newLeafDerivationPath: KeyDerivation = {
344
+ type: KeyDerivationType.LEAF,
345
+ path: uuidv7(),
346
+ };
313
347
 
314
348
  const transferNode: LeafKeyTweak = {
315
349
  leaf: rootNode,
316
- signingPubKey: leafPubKey,
317
- newSigningPubKey: newLeafPubKey,
350
+ keyDerivation: {
351
+ type: KeyDerivationType.LEAF,
352
+ path: leafId,
353
+ },
354
+ newKeyDerivation: newLeafDerivationPath,
318
355
  };
319
356
 
320
357
  const senderConfigService = new WalletConfigService(
@@ -360,21 +397,33 @@ describe("Transfer", () => {
360
397
 
361
398
  const leafPubKeyMapBytes = leafPubKeyMap.get(rootNode.id);
362
399
  expect(leafPubKeyMapBytes).toBeDefined();
363
- expect(equalBytes(leafPubKeyMapBytes!, newLeafPubKey)).toBe(true);
364
-
365
- const finalLeafPubKey = await receiverWallet
366
- .getSigner()
367
- .generatePublicKey(sha256(rootNode.id));
368
-
369
- const claimingNode: LeafKeyTweak = {
370
- leaf: receiverTransfer!.leaves[0]!.leaf!,
371
- signingPubKey: newLeafPubKey,
372
- newSigningPubKey: finalLeafPubKey,
373
- };
400
+ expect(
401
+ equalBytes(
402
+ leafPubKeyMapBytes!,
403
+ await senderWallet
404
+ .getSigner()
405
+ .getPublicKeyFromDerivation(newLeafDerivationPath),
406
+ ),
407
+ ).toBe(true);
408
+
409
+ const claimingNodes: LeafKeyTweak[] = receiverTransfer!.leaves.map(
410
+ (leaf) => ({
411
+ leaf: receiverTransfer!.leaves[0]!.leaf!,
412
+ keyDerivation: {
413
+ type: KeyDerivationType.ECIES,
414
+ path: leaf.secretCipher,
415
+ },
416
+ newKeyDerivation: {
417
+ type: KeyDerivationType.LEAF,
418
+ path: leaf.leaf!.id,
419
+ },
420
+ }),
421
+ );
374
422
 
375
- await receiverTransferService.claimTransfer(receiverTransfer!, [
376
- claimingNode,
377
- ]);
423
+ await receiverTransferService.claimTransfer(
424
+ receiverTransfer!,
425
+ claimingNodes,
426
+ );
378
427
  });
379
428
 
380
429
  testLocalOnly(
@@ -404,15 +453,13 @@ describe("Transfer", () => {
404
453
  senderSigningService,
405
454
  );
406
455
 
407
- const leafPubKey = await senderWallet.getSigner().generatePublicKey();
408
- const rootNode = await createNewTree(
409
- senderWallet,
410
- leafPubKey,
411
- faucet,
412
- 1000n,
413
- );
456
+ const leafId = uuidv7();
457
+ const rootNode = await createNewTree(senderWallet, leafId, faucet, 1000n);
414
458
 
415
- const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
459
+ const newLeafDerivationPath: KeyDerivation = {
460
+ type: KeyDerivationType.LEAF,
461
+ path: uuidv7(),
462
+ };
416
463
 
417
464
  const soToRemove =
418
465
  "0000000000000000000000000000000000000000000000000000000000000005";
@@ -423,7 +470,7 @@ describe("Transfer", () => {
423
470
  ),
424
471
  );
425
472
  const missingOperatorOptions = {
426
- ...LOCAL_WALLET_CONFIG,
473
+ ...WalletConfig.LOCAL,
427
474
  signingOperators,
428
475
  };
429
476
  const mnemonic = generateMnemonic(wordlist);
@@ -448,10 +495,13 @@ describe("Transfer", () => {
448
495
  receiverSigningService,
449
496
  );
450
497
 
451
- const transferNode = {
498
+ const transferNode: LeafKeyTweak = {
452
499
  leaf: rootNode,
453
- signingPubKey: leafPubKey,
454
- newSigningPubKey: newLeafPubKey,
500
+ keyDerivation: {
501
+ type: KeyDerivationType.LEAF,
502
+ path: leafId,
503
+ },
504
+ newKeyDerivation: newLeafDerivationPath,
455
505
  };
456
506
 
457
507
  const senderTransfer = await senderTransferService.sendTransfer(
@@ -475,25 +525,36 @@ describe("Transfer", () => {
475
525
 
476
526
  const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
477
527
  expect(leafPrivKeyMapBytes).toBeDefined();
478
- expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
479
-
480
- const finalLeafPubKey = await receiverWallet
481
- .getSigner()
482
- .generatePublicKey(sha256(rootNode.id));
528
+ expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(
529
+ bytesToHex(
530
+ await senderWallet
531
+ .getSigner()
532
+ .getPublicKeyFromDerivation(newLeafDerivationPath),
533
+ ),
534
+ );
483
535
 
484
- const claimingNode = {
485
- leaf: rootNode,
486
- signingPubKey: newLeafPubKey,
487
- newSigningPubKey: finalLeafPubKey,
488
- };
536
+ const claimingNodes: LeafKeyTweak[] = receiverTransfer!.leaves.map(
537
+ (leaf) => ({
538
+ leaf: rootNode,
539
+ keyDerivation: {
540
+ type: KeyDerivationType.ECIES,
541
+ path: receiverTransfer!.leaves[0]!.secretCipher,
542
+ },
543
+ newKeyDerivation: {
544
+ type: KeyDerivationType.LEAF,
545
+ path: leaf.leaf!.id,
546
+ },
547
+ }),
548
+ );
489
549
 
490
550
  // Tweak the key with only 4 out of the 5 operators
491
- await receiverTransferService.claimTransferTweakKeys(receiverTransfer!, [
492
- claimingNode,
493
- ]);
551
+ await receiverTransferService.claimTransferTweakKeys(
552
+ receiverTransfer!,
553
+ claimingNodes,
554
+ );
494
555
 
495
556
  const receiverOptions = {
496
- ...LOCAL_WALLET_CONFIG,
557
+ ...WalletConfig.LOCAL,
497
558
  };
498
559
 
499
560
  const { wallet: receiverWalletWithAllOperators } =
@@ -521,7 +582,7 @@ describe("Transfer", () => {
521
582
  const { wallet: receiverWalletWithMissingOperatorAsCoordinator } =
522
583
  await SparkWalletTesting.initialize({
523
584
  options: {
524
- ...LOCAL_WALLET_CONFIG,
585
+ ...WalletConfig.LOCAL,
525
586
  coodinatorIdentifier: soToRemove,
526
587
  },
527
588
  mnemonicOrSeed: mnemonic,
@@ -561,20 +622,20 @@ describe("Transfer", () => {
561
622
  leafPrivKeyMapWithAllOperators.get(rootNode.id);
562
623
  expect(leafPrivKeyMapBytesWithAllOperators).toBeDefined();
563
624
  expect(bytesToHex(leafPrivKeyMapBytesWithAllOperators!)).toBe(
564
- bytesToHex(newLeafPubKey),
625
+ bytesToHex(
626
+ await senderWallet
627
+ .getSigner()
628
+ .getPublicKeyFromDerivation(newLeafDerivationPath),
629
+ ),
565
630
  );
566
631
 
567
- await receiverWalletWithAllOperators
568
- .getSigner()
569
- .restoreSigningKeysFromLeafs([claimingNode.leaf]);
570
-
571
632
  await receiverWalletWithAllOperators.verifyPendingTransfer(
572
633
  receiverTransfer!,
573
634
  );
574
635
 
575
636
  await receiverTransferServiceWithAllOperators.claimTransfer(
576
637
  receiverTransfer!,
577
- [claimingNode],
638
+ claimingNodes,
578
639
  );
579
640
  },
580
641
  );
@@ -765,15 +826,13 @@ describe("transfer v2", () => {
765
826
  signingService,
766
827
  );
767
828
 
768
- const leafPubKey = await senderWallet.getSigner().generatePublicKey();
769
- const rootNode = await createNewTree(
770
- senderWallet,
771
- leafPubKey,
772
- faucet,
773
- 1000n,
774
- );
829
+ const leafId = uuidv7();
830
+ const rootNode = await createNewTree(senderWallet, leafId, faucet, 1000n);
775
831
 
776
- const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
832
+ const newLeafDerivationPath: KeyDerivation = {
833
+ type: KeyDerivationType.LEAF,
834
+ path: uuidv7(),
835
+ };
777
836
 
778
837
  const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
779
838
  options,
@@ -795,10 +854,13 @@ describe("transfer v2", () => {
795
854
  receiverSigningService,
796
855
  );
797
856
 
798
- const transferNode = {
857
+ const transferNode: LeafKeyTweak = {
799
858
  leaf: rootNode,
800
- signingPubKey: leafPubKey,
801
- newSigningPubKey: newLeafPubKey,
859
+ keyDerivation: {
860
+ type: KeyDerivationType.LEAF,
861
+ path: leafId,
862
+ },
863
+ newKeyDerivation: newLeafDerivationPath,
802
864
  };
803
865
 
804
866
  const senderTransfer =
@@ -826,21 +888,32 @@ describe("transfer v2", () => {
826
888
 
827
889
  const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
828
890
  expect(leafPrivKeyMapBytes).toBeDefined();
829
- expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
830
-
831
- const finalLeafPubKey = await receiverWallet
832
- .getSigner()
833
- .generatePublicKey(sha256(rootNode.id));
834
-
835
- const claimingNode = {
836
- leaf: rootNode,
837
- signingPubKey: newLeafPubKey,
838
- newSigningPubKey: finalLeafPubKey,
839
- };
891
+ expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(
892
+ bytesToHex(
893
+ await senderWallet
894
+ .getSigner()
895
+ .getPublicKeyFromDerivation(newLeafDerivationPath),
896
+ ),
897
+ );
898
+
899
+ const claimingNodes: LeafKeyTweak[] = receiverTransfer!.leaves.map(
900
+ (leaf) => ({
901
+ leaf: leaf.leaf!,
902
+ keyDerivation: {
903
+ type: KeyDerivationType.ECIES,
904
+ path: leaf.secretCipher,
905
+ },
906
+ newKeyDerivation: {
907
+ type: KeyDerivationType.LEAF,
908
+ path: leaf.leaf!.id,
909
+ },
910
+ }),
911
+ );
840
912
 
841
- await receiverTransferService.claimTransfer(receiverTransfer!, [
842
- claimingNode,
843
- ]);
913
+ await receiverTransferService.claimTransfer(
914
+ receiverTransfer!,
915
+ claimingNodes,
916
+ );
844
917
 
845
918
  const balance = await receiverWallet.getBalance();
846
919
  expect(balance.balance).toBe(1000n);
@@ -865,19 +938,20 @@ describe("transfer v2", () => {
865
938
  senderConnectionManager,
866
939
  senderSigningService,
867
940
  );
868
- const leafPubKey = await senderWallet.getSigner().generatePublicKey();
869
- const rootNode = await createNewTree(
870
- senderWallet,
871
- leafPubKey,
872
- faucet,
873
- 1000n,
874
- );
875
- const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
941
+ const leafId = uuidv7();
942
+ const rootNode = await createNewTree(senderWallet, leafId, faucet, 1000n);
943
+ const newLeafDerivationPath: KeyDerivation = {
944
+ type: KeyDerivationType.LEAF,
945
+ path: uuidv7(),
946
+ };
876
947
  const receiverPubkey = await senderWallet.getIdentityPublicKey();
877
- const transferNode = {
948
+ const transferNode: LeafKeyTweak = {
878
949
  leaf: rootNode,
879
- signingPubKey: leafPubKey,
880
- newSigningPubKey: newLeafPubKey,
950
+ keyDerivation: {
951
+ type: KeyDerivationType.LEAF,
952
+ path: leafId,
953
+ },
954
+ newKeyDerivation: newLeafDerivationPath,
881
955
  };
882
956
  const senderTransfer =
883
957
  await senderTransferService.sendTransferWithKeyTweaks(
@@ -892,17 +966,20 @@ describe("transfer v2", () => {
892
966
  Date.now(),
893
967
  );
894
968
 
895
- const finalLeafPubKey = await senderWallet
896
- .getSigner()
897
- .generatePublicKey(sha256(rootNode.id));
898
- const claimingNode = {
899
- leaf: rootNode,
900
- signingPubKey: newLeafPubKey,
901
- newSigningPubKey: finalLeafPubKey,
902
- };
903
- await senderTransferService.claimTransfer(receiverTransfer!, [
904
- claimingNode,
905
- ]);
969
+ const claimingNodes: LeafKeyTweak[] = receiverTransfer!.leaves.map(
970
+ (leaf) => ({
971
+ leaf: rootNode,
972
+ keyDerivation: {
973
+ type: KeyDerivationType.ECIES,
974
+ path: receiverTransfer!.leaves[0]!.secretCipher,
975
+ },
976
+ newKeyDerivation: {
977
+ type: KeyDerivationType.LEAF,
978
+ path: leaf.leaf!.id,
979
+ },
980
+ }),
981
+ );
982
+ await senderTransferService.claimTransfer(receiverTransfer!, claimingNodes);
906
983
 
907
984
  const balance = await senderWallet.getBalance();
908
985
  expect(balance.balance).toBe(1000n);