@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
@@ -24,109 +24,117 @@ import { SparkWalletTesting } from "../utils/spark-testing-wallet.js";
24
24
  import { BitcoinFaucet } from "../utils/test-faucet.js";
25
25
  import { RPCError } from "../../errors/types.js";
26
26
 
27
+ const testLocalOnly = process.env.GITHUB_ACTIONS ? it.skip : it;
28
+
27
29
  describe("Transfer", () => {
28
30
  jest.setTimeout(15_000);
29
- it("test transfer", async () => {
30
- const faucet = BitcoinFaucet.getInstance();
31
+ testLocalOnly(
32
+ "test transfer",
33
+ async () => {
34
+ const faucet = BitcoinFaucet.getInstance();
31
35
 
32
- const options: ConfigOptions = {
33
- network: "LOCAL",
34
- };
36
+ const options: ConfigOptions = {
37
+ network: "LOCAL",
38
+ };
35
39
 
36
- const { wallet: senderWallet } = await SparkWalletTesting.initialize({
37
- options,
38
- });
40
+ const { wallet: senderWallet } = await SparkWalletTesting.initialize({
41
+ options,
42
+ });
39
43
 
40
- const senderConfigService = new WalletConfigService(
41
- options,
42
- senderWallet.getSigner(),
43
- );
44
- const senderConnectionManager = new ConnectionManager(senderConfigService);
45
- const signingService = new SigningService(senderConfigService);
46
- const senderTransferService = new TransferService(
47
- senderConfigService,
48
- senderConnectionManager,
49
- signingService,
50
- );
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
+ );
51
57
 
52
- const leafPubKey = await senderWallet.getSigner().generatePublicKey();
53
- const rootNode = await createNewTree(
54
- senderWallet,
55
- leafPubKey,
56
- faucet,
57
- 1000n,
58
- );
58
+ const leafPubKey = await senderWallet.getSigner().generatePublicKey();
59
+ const rootNode = await createNewTree(
60
+ senderWallet,
61
+ leafPubKey,
62
+ faucet,
63
+ 1000n,
64
+ );
59
65
 
60
- const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
66
+ const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
61
67
 
62
- const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
63
- options,
64
- });
65
- const receiverPubkey = await receiverWallet.getIdentityPublicKey();
68
+ const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
69
+ options,
70
+ });
71
+ const receiverPubkey = await receiverWallet.getIdentityPublicKey();
66
72
 
67
- const receiverConfigService = new WalletConfigService(
68
- options,
69
- receiverWallet.getSigner(),
70
- );
71
- const receiverConnectionManager = new ConnectionManager(
72
- receiverConfigService,
73
- );
74
- const receiverSigningService = new SigningService(receiverConfigService);
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);
75
81
 
76
- const receiverTransferService = new TransferService(
77
- receiverConfigService,
78
- receiverConnectionManager,
79
- receiverSigningService,
80
- );
82
+ const receiverTransferService = new TransferService(
83
+ receiverConfigService,
84
+ receiverConnectionManager,
85
+ receiverSigningService,
86
+ );
81
87
 
82
- const transferNode = {
83
- leaf: rootNode,
84
- signingPubKey: leafPubKey,
85
- newSigningPubKey: newLeafPubKey,
86
- };
88
+ const transferNode = {
89
+ leaf: rootNode,
90
+ signingPubKey: leafPubKey,
91
+ newSigningPubKey: newLeafPubKey,
92
+ };
87
93
 
88
- const senderTransfer = await senderTransferService.sendTransfer(
89
- [transferNode],
90
- hexToBytes(receiverPubkey),
91
- );
94
+ const senderTransfer = await senderTransferService.sendTransfer(
95
+ [transferNode],
96
+ hexToBytes(receiverPubkey),
97
+ );
92
98
 
93
- const pendingTransfer = await receiverWallet.queryPendingTransfers();
99
+ const pendingTransfer = await receiverWallet.queryPendingTransfers();
94
100
 
95
- expect(pendingTransfer.transfers.length).toBe(1);
101
+ expect(pendingTransfer.transfers.length).toBe(1);
96
102
 
97
- const receiverTransfer = pendingTransfer.transfers[0];
103
+ const receiverTransfer = pendingTransfer.transfers[0];
98
104
 
99
- expect(receiverTransfer!.id).toBe(senderTransfer.id);
105
+ expect(receiverTransfer!.id).toBe(senderTransfer.id);
100
106
 
101
- const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(
102
- receiverTransfer!,
103
- );
107
+ const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(
108
+ receiverTransfer!,
109
+ );
104
110
 
105
- expect(leafPrivKeyMap.size).toBe(1);
111
+ expect(leafPrivKeyMap.size).toBe(1);
106
112
 
107
- const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
108
- expect(leafPrivKeyMapBytes).toBeDefined();
109
- expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
113
+ const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
114
+ expect(leafPrivKeyMapBytes).toBeDefined();
115
+ expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
110
116
 
111
- const finalLeafPubKey = await receiverWallet
112
- .getSigner()
113
- .generatePublicKey(sha256(rootNode.id));
117
+ const finalLeafPubKey = await receiverWallet
118
+ .getSigner()
119
+ .generatePublicKey(sha256(rootNode.id));
114
120
 
115
- const claimingNode = {
116
- leaf: rootNode,
117
- signingPubKey: newLeafPubKey,
118
- newSigningPubKey: finalLeafPubKey,
119
- };
121
+ const claimingNode = {
122
+ leaf: rootNode,
123
+ signingPubKey: newLeafPubKey,
124
+ newSigningPubKey: finalLeafPubKey,
125
+ };
120
126
 
121
- await receiverTransferService.claimTransfer(receiverTransfer!, [
122
- claimingNode,
123
- ]);
127
+ await receiverTransferService.claimTransfer(receiverTransfer!, [
128
+ claimingNode,
129
+ ]);
124
130
 
125
- const balance = await receiverWallet.getBalance();
126
- expect(balance.balance).toBe(1000n);
127
- }, 30000);
131
+ const balance = await receiverWallet.getBalance();
132
+ expect(balance.balance).toBe(1000n);
133
+ },
134
+ 30000,
135
+ );
128
136
 
129
- it("test transfer with separate", async () => {
137
+ testLocalOnly("test transfer with separate", async () => {
130
138
  const faucet = BitcoinFaucet.getInstance();
131
139
 
132
140
  const options: ConfigOptions = {
@@ -262,7 +270,7 @@ describe("Transfer", () => {
262
270
  );
263
271
  });
264
272
 
265
- it("cancel transfer", async () => {
273
+ testLocalOnly("cancel transfer", async () => {
266
274
  const faucet = BitcoinFaucet.getInstance();
267
275
 
268
276
  const options: ConfigOptions = {
@@ -369,202 +377,207 @@ describe("Transfer", () => {
369
377
  ]);
370
378
  });
371
379
 
372
- it("test that when the receiver has tweaked the key on some SOs, we can still claim the transfer", async () => {
373
- const faucet = BitcoinFaucet.getInstance();
374
-
375
- const options: ConfigOptions = {
376
- network: "LOCAL",
377
- };
378
-
379
- const { wallet: senderWallet } = await SparkWalletTesting.initialize({
380
- options,
381
- });
382
-
383
- const senderConfigService = new WalletConfigService(
384
- options,
385
- senderWallet.getSigner(),
386
- );
387
- const senderConnectionManager = new ConnectionManager(senderConfigService);
388
- const senderSigningService = new SigningService(senderConfigService);
389
- const senderTransferService = new TransferService(
390
- senderConfigService,
391
- senderConnectionManager,
392
- senderSigningService,
393
- );
394
-
395
- const leafPubKey = await senderWallet.getSigner().generatePublicKey();
396
- const rootNode = await createNewTree(
397
- senderWallet,
398
- leafPubKey,
399
- faucet,
400
- 1000n,
401
- );
402
-
403
- const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
380
+ testLocalOnly(
381
+ "test that when the receiver has tweaked the key on some SOs, we can still claim the transfer",
382
+ async () => {
383
+ const faucet = BitcoinFaucet.getInstance();
404
384
 
405
- const soToRemove =
406
- "0000000000000000000000000000000000000000000000000000000000000005";
407
- const localSigningOperators = getLocalSigningOperators();
408
- const signingOperators = Object.fromEntries(
409
- Object.entries(localSigningOperators).filter(
410
- ([key]) => key !== soToRemove,
411
- ),
412
- );
413
- const missingOperatorOptions = {
414
- ...LOCAL_WALLET_CONFIG,
415
- signingOperators,
416
- };
417
- const mnemonic = generateMnemonic(wordlist);
418
- const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
419
- options: missingOperatorOptions,
420
- mnemonicOrSeed: mnemonic,
421
- });
385
+ const options: ConfigOptions = {
386
+ network: "LOCAL",
387
+ };
422
388
 
423
- const receiverPubkey = await receiverWallet.getIdentityPublicKey();
389
+ const { wallet: senderWallet } = await SparkWalletTesting.initialize({
390
+ options,
391
+ });
424
392
 
425
- const receiverConfigService = new WalletConfigService(
426
- missingOperatorOptions,
427
- receiverWallet.getSigner(),
428
- );
429
- const receiverConnectionManager = new ConnectionManager(
430
- receiverConfigService,
431
- );
432
- const receiverSigningService = new SigningService(receiverConfigService);
433
- const receiverTransferService = new TransferService(
434
- receiverConfigService,
435
- receiverConnectionManager,
436
- receiverSigningService,
437
- );
393
+ const senderConfigService = new WalletConfigService(
394
+ options,
395
+ senderWallet.getSigner(),
396
+ );
397
+ const senderConnectionManager = new ConnectionManager(
398
+ senderConfigService,
399
+ );
400
+ const senderSigningService = new SigningService(senderConfigService);
401
+ const senderTransferService = new TransferService(
402
+ senderConfigService,
403
+ senderConnectionManager,
404
+ senderSigningService,
405
+ );
438
406
 
439
- const transferNode = {
440
- leaf: rootNode,
441
- signingPubKey: leafPubKey,
442
- newSigningPubKey: newLeafPubKey,
443
- };
407
+ const leafPubKey = await senderWallet.getSigner().generatePublicKey();
408
+ const rootNode = await createNewTree(
409
+ senderWallet,
410
+ leafPubKey,
411
+ faucet,
412
+ 1000n,
413
+ );
444
414
 
445
- const senderTransfer = await senderTransferService.sendTransfer(
446
- [transferNode],
447
- hexToBytes(receiverPubkey),
448
- );
415
+ const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
449
416
 
450
- const pendingTransfer = await receiverWallet.queryPendingTransfers();
417
+ const soToRemove =
418
+ "0000000000000000000000000000000000000000000000000000000000000005";
419
+ const localSigningOperators = getLocalSigningOperators();
420
+ const signingOperators = Object.fromEntries(
421
+ Object.entries(localSigningOperators).filter(
422
+ ([key]) => key !== soToRemove,
423
+ ),
424
+ );
425
+ const missingOperatorOptions = {
426
+ ...LOCAL_WALLET_CONFIG,
427
+ signingOperators,
428
+ };
429
+ const mnemonic = generateMnemonic(wordlist);
430
+ const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
431
+ options: missingOperatorOptions,
432
+ mnemonicOrSeed: mnemonic,
433
+ });
451
434
 
452
- expect(pendingTransfer.transfers.length).toBe(1);
435
+ const receiverPubkey = await receiverWallet.getIdentityPublicKey();
453
436
 
454
- const receiverTransfer = pendingTransfer.transfers[0];
455
-
456
- expect(receiverTransfer!.id).toBe(senderTransfer.id);
437
+ const receiverConfigService = new WalletConfigService(
438
+ missingOperatorOptions,
439
+ receiverWallet.getSigner(),
440
+ );
441
+ const receiverConnectionManager = new ConnectionManager(
442
+ receiverConfigService,
443
+ );
444
+ const receiverSigningService = new SigningService(receiverConfigService);
445
+ const receiverTransferService = new TransferService(
446
+ receiverConfigService,
447
+ receiverConnectionManager,
448
+ receiverSigningService,
449
+ );
457
450
 
458
- const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(
459
- receiverTransfer!,
460
- );
451
+ const transferNode = {
452
+ leaf: rootNode,
453
+ signingPubKey: leafPubKey,
454
+ newSigningPubKey: newLeafPubKey,
455
+ };
461
456
 
462
- expect(leafPrivKeyMap.size).toBe(1);
457
+ const senderTransfer = await senderTransferService.sendTransfer(
458
+ [transferNode],
459
+ hexToBytes(receiverPubkey),
460
+ );
463
461
 
464
- const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
465
- expect(leafPrivKeyMapBytes).toBeDefined();
466
- expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
462
+ const pendingTransfer = await receiverWallet.queryPendingTransfers();
467
463
 
468
- const finalLeafPubKey = await receiverWallet
469
- .getSigner()
470
- .generatePublicKey(sha256(rootNode.id));
464
+ expect(pendingTransfer.transfers.length).toBe(1);
471
465
 
472
- const claimingNode = {
473
- leaf: rootNode,
474
- signingPubKey: newLeafPubKey,
475
- newSigningPubKey: finalLeafPubKey,
476
- };
466
+ const receiverTransfer = pendingTransfer.transfers[0];
477
467
 
478
- // Tweak the key with only 4 out of the 5 operators
479
- await receiverTransferService.claimTransferTweakKeys(receiverTransfer!, [
480
- claimingNode,
481
- ]);
468
+ expect(receiverTransfer!.id).toBe(senderTransfer.id);
482
469
 
483
- const receiverOptions = {
484
- ...LOCAL_WALLET_CONFIG,
485
- };
470
+ const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(
471
+ receiverTransfer!,
472
+ );
486
473
 
487
- const { wallet: receiverWalletWithAllOperators } =
488
- await SparkWalletTesting.initialize({
489
- options: receiverOptions,
490
- mnemonicOrSeed: mnemonic,
491
- });
492
- const receiverConfigServiceWithAllOperators = new WalletConfigService(
493
- receiverOptions,
494
- receiverWalletWithAllOperators.getSigner(),
495
- );
496
- const receiverConnectionManagerWithAllOperators = new ConnectionManager(
497
- receiverConfigServiceWithAllOperators,
498
- );
499
- const receiverSigningServiceWithAllOperators = new SigningService(
500
- receiverConfigServiceWithAllOperators,
501
- );
474
+ expect(leafPrivKeyMap.size).toBe(1);
475
+
476
+ const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
477
+ expect(leafPrivKeyMapBytes).toBeDefined();
478
+ expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
479
+
480
+ const finalLeafPubKey = await receiverWallet
481
+ .getSigner()
482
+ .generatePublicKey(sha256(rootNode.id));
483
+
484
+ const claimingNode = {
485
+ leaf: rootNode,
486
+ signingPubKey: newLeafPubKey,
487
+ newSigningPubKey: finalLeafPubKey,
488
+ };
489
+
490
+ // Tweak the key with only 4 out of the 5 operators
491
+ await receiverTransferService.claimTransferTweakKeys(receiverTransfer!, [
492
+ claimingNode,
493
+ ]);
494
+
495
+ const receiverOptions = {
496
+ ...LOCAL_WALLET_CONFIG,
497
+ };
498
+
499
+ const { wallet: receiverWalletWithAllOperators } =
500
+ await SparkWalletTesting.initialize({
501
+ options: receiverOptions,
502
+ mnemonicOrSeed: mnemonic,
503
+ });
504
+ const receiverConfigServiceWithAllOperators = new WalletConfigService(
505
+ receiverOptions,
506
+ receiverWalletWithAllOperators.getSigner(),
507
+ );
508
+ const receiverConnectionManagerWithAllOperators = new ConnectionManager(
509
+ receiverConfigServiceWithAllOperators,
510
+ );
511
+ const receiverSigningServiceWithAllOperators = new SigningService(
512
+ receiverConfigServiceWithAllOperators,
513
+ );
502
514
 
503
- const receiverTransferServiceWithAllOperators = new TransferService(
504
- receiverConfigServiceWithAllOperators,
505
- receiverConnectionManagerWithAllOperators,
506
- receiverSigningServiceWithAllOperators,
507
- );
515
+ const receiverTransferServiceWithAllOperators = new TransferService(
516
+ receiverConfigServiceWithAllOperators,
517
+ receiverConnectionManagerWithAllOperators,
518
+ receiverSigningServiceWithAllOperators,
519
+ );
508
520
 
509
- const { wallet: receiverWalletWithMissingOperatorAsCoordinator } =
510
- await SparkWalletTesting.initialize({
511
- options: {
512
- ...LOCAL_WALLET_CONFIG,
513
- coodinatorIdentifier: soToRemove,
514
- },
515
- mnemonicOrSeed: mnemonic,
516
- });
521
+ const { wallet: receiverWalletWithMissingOperatorAsCoordinator } =
522
+ await SparkWalletTesting.initialize({
523
+ options: {
524
+ ...LOCAL_WALLET_CONFIG,
525
+ coodinatorIdentifier: soToRemove,
526
+ },
527
+ mnemonicOrSeed: mnemonic,
528
+ });
529
+
530
+ const pendingTransferWithMissingOperatorAsCoordinator =
531
+ await receiverWalletWithMissingOperatorAsCoordinator.queryPendingTransfers();
532
+
533
+ expect(
534
+ pendingTransferWithMissingOperatorAsCoordinator.transfers.length,
535
+ ).toBe(1);
536
+ expect(
537
+ pendingTransferWithMissingOperatorAsCoordinator.transfers[0]!.status,
538
+ ).toBe(TransferStatus.TRANSFER_STATUS_SENDER_KEY_TWEAKED);
539
+
540
+ const pendingTransferWithAllOperators =
541
+ await receiverWalletWithAllOperators.queryPendingTransfers();
542
+
543
+ expect(pendingTransferWithAllOperators.transfers.length).toBe(1);
544
+ expect(pendingTransferWithAllOperators.transfers[0]!.status).toBe(
545
+ TransferStatus.TRANSFER_STATUS_RECEIVER_KEY_TWEAKED,
546
+ );
517
547
 
518
- const pendingTransferWithMissingOperatorAsCoordinator =
519
- await receiverWalletWithMissingOperatorAsCoordinator.queryPendingTransfers();
548
+ const receiverTransferWithAllOperators =
549
+ pendingTransferWithAllOperators.transfers[0];
520
550
 
521
- expect(
522
- pendingTransferWithMissingOperatorAsCoordinator.transfers.length,
523
- ).toBe(1);
524
- expect(
525
- pendingTransferWithMissingOperatorAsCoordinator.transfers[0]!.status,
526
- ).toBe(TransferStatus.TRANSFER_STATUS_SENDER_KEY_TWEAKED);
551
+ expect(receiverTransferWithAllOperators!.id).toBe(senderTransfer.id);
527
552
 
528
- const pendingTransferWithAllOperators =
529
- await receiverWalletWithAllOperators.queryPendingTransfers();
553
+ const leafPrivKeyMapWithAllOperators =
554
+ await receiverWalletWithAllOperators.verifyPendingTransfer(
555
+ receiverTransferWithAllOperators!,
556
+ );
530
557
 
531
- expect(pendingTransferWithAllOperators.transfers.length).toBe(1);
532
- expect(pendingTransferWithAllOperators.transfers[0]!.status).toBe(
533
- TransferStatus.TRANSFER_STATUS_RECEIVER_KEY_TWEAKED,
534
- );
558
+ expect(leafPrivKeyMapWithAllOperators.size).toBe(1);
535
559
 
536
- const receiverTransferWithAllOperators =
537
- pendingTransferWithAllOperators.transfers[0];
560
+ const leafPrivKeyMapBytesWithAllOperators =
561
+ leafPrivKeyMapWithAllOperators.get(rootNode.id);
562
+ expect(leafPrivKeyMapBytesWithAllOperators).toBeDefined();
563
+ expect(bytesToHex(leafPrivKeyMapBytesWithAllOperators!)).toBe(
564
+ bytesToHex(newLeafPubKey),
565
+ );
538
566
 
539
- expect(receiverTransferWithAllOperators!.id).toBe(senderTransfer.id);
567
+ await receiverWalletWithAllOperators
568
+ .getSigner()
569
+ .restoreSigningKeysFromLeafs([claimingNode.leaf]);
540
570
 
541
- const leafPrivKeyMapWithAllOperators =
542
571
  await receiverWalletWithAllOperators.verifyPendingTransfer(
543
- receiverTransferWithAllOperators!,
572
+ receiverTransfer!,
544
573
  );
545
574
 
546
- expect(leafPrivKeyMapWithAllOperators.size).toBe(1);
547
-
548
- const leafPrivKeyMapBytesWithAllOperators =
549
- leafPrivKeyMapWithAllOperators.get(rootNode.id);
550
- expect(leafPrivKeyMapBytesWithAllOperators).toBeDefined();
551
- expect(bytesToHex(leafPrivKeyMapBytesWithAllOperators!)).toBe(
552
- bytesToHex(newLeafPubKey),
553
- );
554
-
555
- await receiverWalletWithAllOperators
556
- .getSigner()
557
- .restoreSigningKeysFromLeafs([claimingNode.leaf]);
558
-
559
- await receiverWalletWithAllOperators.verifyPendingTransfer(
560
- receiverTransfer!,
561
- );
562
-
563
- await receiverTransferServiceWithAllOperators.claimTransfer(
564
- receiverTransfer!,
565
- [claimingNode],
566
- );
567
- });
575
+ await receiverTransferServiceWithAllOperators.claimTransfer(
576
+ receiverTransfer!,
577
+ [claimingNode],
578
+ );
579
+ },
580
+ );
568
581
 
569
582
  it("test incoming transfer rpc stream", async () => {
570
583
  const faucet = BitcoinFaucet.getInstance();
@@ -0,0 +1,54 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import { Network, NetworkType } from "../utils/network.js";
3
+ import {
4
+ decodeHumanReadableTokenIdentifier,
5
+ encodeHumanReadableTokenIdentifier,
6
+ } from "../utils/token-identifier.js";
7
+
8
+ const TEST_TOKEN_IDENTIFIER = new Uint8Array([
9
+ 63, 122, 103, 46, 122, 5, 97, 185, 253, 135, 91, 94, 115, 80, 198, 19, 246,
10
+ 106, 151, 26, 124, 57, 156, 44, 26, 105, 66, 164, 126, 75, 150, 248,
11
+ ]);
12
+
13
+ const getExpectedTokenIdentifier = (network: NetworkType) => {
14
+ switch (network) {
15
+ case "MAINNET":
16
+ return "btk18aaxwtn6q4smnlv8td08x5xxz0mx49c60suectq6d9p2gljtjmuquewrjx";
17
+ case "TESTNET":
18
+ return "btkt18aaxwtn6q4smnlv8td08x5xxz0mx49c60suectq6d9p2gljtjmuqclz9p3";
19
+ case "SIGNET":
20
+ return "btks18aaxwtn6q4smnlv8td08x5xxz0mx49c60suectq6d9p2gljtjmuqh8f7qe";
21
+ case "REGTEST":
22
+ return "btkrt18aaxwtn6q4smnlv8td08x5xxz0mx49c60suectq6d9p2gljtjmuqree9zq";
23
+ case "LOCAL":
24
+ return "btkl18aaxwtn6q4smnlv8td08x5xxz0mx49c60suectq6d9p2gljtjmuq2p4x2m";
25
+ }
26
+ };
27
+
28
+ describe("token identifier", () => {
29
+ test("encodeHumanReadableTokenIdentifier", () => {
30
+ const netKeys = Object.values(Network).filter((v) => isNaN(Number(v)));
31
+ for (const network of netKeys) {
32
+ const tokenIdentifier = encodeHumanReadableTokenIdentifier({
33
+ tokenIdentifier: TEST_TOKEN_IDENTIFIER,
34
+ network: network as NetworkType,
35
+ });
36
+ expect(tokenIdentifier).toBe(
37
+ getExpectedTokenIdentifier(network as NetworkType),
38
+ );
39
+ }
40
+ });
41
+
42
+ test("decodeHumanReadableTokenIdentifier", () => {
43
+ const netKeys = Object.values(Network).filter((v) => isNaN(Number(v)));
44
+ for (const network of netKeys) {
45
+ const identifier = getExpectedTokenIdentifier(network as NetworkType);
46
+ const decoded = decodeHumanReadableTokenIdentifier(
47
+ identifier,
48
+ network as NetworkType,
49
+ );
50
+ expect(decoded.tokenIdentifier).toEqual(TEST_TOKEN_IDENTIFIER);
51
+ expect(decoded.network).toEqual(network as NetworkType);
52
+ }
53
+ });
54
+ });