@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.
- package/CHANGELOG.md +17 -0
- package/dist/{RequestLightningSendInput-BxbCtwpV.d.cts → RequestLightningSendInput-2cSh_In4.d.cts} +1 -1
- package/dist/{RequestLightningSendInput-RGel43ks.d.ts → RequestLightningSendInput-CN6BNg_g.d.ts} +1 -1
- package/dist/address/index.cjs +2 -2
- package/dist/address/index.d.cts +2 -2
- package/dist/address/index.d.ts +2 -2
- package/dist/address/index.js +2 -2
- package/dist/{chunk-EKFD62HN.js → chunk-4EMV7HHW.js} +2 -1
- package/dist/{chunk-4Q2ZDYYU.js → chunk-BGGEVUJK.js} +1157 -208
- package/dist/{chunk-CIZNCBKE.js → chunk-C2S227QR.js} +648 -45
- package/dist/{chunk-WPTRVD2V.js → chunk-DXR2PXJU.js} +15 -15
- package/dist/{chunk-NBCNYDWJ.js → chunk-HHNQ3ZHC.js} +2 -2
- package/dist/{chunk-DAXGVPVM.js → chunk-HSCLBJEL.js} +2 -2
- package/dist/{chunk-6AFUC5M2.js → chunk-HWJWKEIU.js} +8 -2
- package/dist/{chunk-A2ZLMH6I.js → chunk-JB64OQES.js} +259 -327
- package/dist/{chunk-KEKGSH7B.js → chunk-KMUMFYFX.js} +3 -3
- package/dist/chunk-LHRD2WT6.js +2374 -0
- package/dist/{chunk-HTMXTJRK.js → chunk-N5VZVCGJ.js} +4 -4
- package/dist/{chunk-SQKXGAIR.js → chunk-NTFKFRQ2.js} +1 -1
- package/dist/{chunk-K4BJARWM.js → chunk-OBFKIEMP.js} +1 -1
- package/dist/{chunk-UBT6EDVJ.js → chunk-OFCJFZ4I.js} +1 -1
- package/dist/{chunk-XX4RRWOX.js → chunk-UXDODSDT.js} +8 -10
- package/dist/graphql/objects/index.d.cts +5 -4
- package/dist/graphql/objects/index.d.ts +5 -4
- package/dist/index-CKL5DodV.d.cts +214 -0
- package/dist/index-COm59SPw.d.ts +214 -0
- package/dist/index.cjs +4026 -1315
- package/dist/index.d.cts +764 -19
- package/dist/index.d.ts +764 -19
- package/dist/index.js +23 -27
- package/dist/index.node.cjs +4026 -1319
- package/dist/index.node.d.cts +10 -8
- package/dist/index.node.d.ts +10 -8
- package/dist/index.node.js +23 -31
- package/dist/native/index.cjs +4027 -1316
- package/dist/native/index.d.cts +281 -85
- package/dist/native/index.d.ts +281 -85
- package/dist/native/index.js +4018 -1307
- package/dist/{network-CfxLnaot.d.cts → network-Css46DAz.d.cts} +1 -1
- package/dist/{network-CroCOQ0B.d.ts → network-hynb7iTZ.d.ts} +1 -1
- package/dist/proto/lrc20.cjs +222 -19
- package/dist/proto/lrc20.d.cts +1 -1
- package/dist/proto/lrc20.d.ts +1 -1
- package/dist/proto/lrc20.js +2 -2
- package/dist/proto/spark.cjs +1154 -205
- package/dist/proto/spark.d.cts +1 -1
- package/dist/proto/spark.d.ts +1 -1
- package/dist/proto/spark.js +3 -1
- package/dist/proto/spark_token.cjs +1377 -58
- package/dist/proto/spark_token.d.cts +153 -15
- package/dist/proto/spark_token.d.ts +153 -15
- package/dist/proto/spark_token.js +40 -4
- package/dist/{sdk-types-CTbTdDbE.d.ts → sdk-types-CKBsylfW.d.ts} +1 -1
- package/dist/{sdk-types-BeCBoozO.d.cts → sdk-types-Ct8xmN7l.d.cts} +1 -1
- package/dist/services/config.cjs +2 -2
- package/dist/services/config.d.cts +5 -4
- package/dist/services/config.d.ts +5 -4
- package/dist/services/config.js +6 -6
- package/dist/services/connection.cjs +2438 -262
- package/dist/services/connection.d.cts +5 -4
- package/dist/services/connection.d.ts +5 -4
- package/dist/services/connection.js +4 -4
- package/dist/services/index.cjs +5937 -3154
- package/dist/services/index.d.cts +7 -6
- package/dist/services/index.d.ts +7 -6
- package/dist/services/index.js +17 -15
- package/dist/services/lrc-connection.cjs +223 -20
- package/dist/services/lrc-connection.d.cts +5 -4
- package/dist/services/lrc-connection.d.ts +5 -4
- package/dist/services/lrc-connection.js +4 -4
- package/dist/services/token-transactions.cjs +840 -236
- package/dist/services/token-transactions.d.cts +25 -7
- package/dist/services/token-transactions.d.ts +25 -7
- package/dist/services/token-transactions.js +5 -4
- package/dist/services/wallet-config.cjs +3 -1
- package/dist/services/wallet-config.d.cts +7 -5
- package/dist/services/wallet-config.d.ts +7 -5
- package/dist/services/wallet-config.js +3 -1
- package/dist/signer/signer.cjs +1 -1
- package/dist/signer/signer.d.cts +3 -2
- package/dist/signer/signer.d.ts +3 -2
- package/dist/signer/signer.js +2 -2
- package/dist/{signer-D7vfYik9.d.ts → signer-BP6F__oR.d.cts} +2 -6
- package/dist/{signer-DaY8c60s.d.cts → signer-BVZJXcq7.d.ts} +2 -6
- package/dist/{spark-C4ZrsgjC.d.cts → spark-DbzGfse6.d.cts} +93 -15
- package/dist/{spark-C4ZrsgjC.d.ts → spark-DbzGfse6.d.ts} +93 -15
- package/dist/spark_bindings/native/index.cjs +183 -0
- package/dist/spark_bindings/native/index.d.cts +14 -0
- package/dist/spark_bindings/native/index.d.ts +14 -0
- package/dist/spark_bindings/native/index.js +141 -0
- package/dist/spark_bindings/wasm/index.cjs +1093 -0
- package/dist/spark_bindings/wasm/index.d.cts +47 -0
- package/dist/spark_bindings/wasm/index.d.ts +47 -0
- package/dist/{chunk-K4C4W5FC.js → spark_bindings/wasm/index.js} +7 -6
- package/dist/types/index.cjs +1156 -208
- package/dist/types/index.d.cts +5 -4
- package/dist/types/index.d.ts +5 -4
- package/dist/types/index.js +2 -2
- package/dist/types-C-Rp0Oo7.d.cts +46 -0
- package/dist/types-C-Rp0Oo7.d.ts +46 -0
- package/dist/utils/index.cjs +65 -13
- package/dist/utils/index.d.cts +14 -134
- package/dist/utils/index.d.ts +14 -134
- package/dist/utils/index.js +13 -13
- package/package.json +22 -2
- package/src/index.node.ts +0 -1
- package/src/index.ts +0 -1
- package/src/native/index.ts +1 -2
- package/src/proto/common.ts +5 -5
- package/src/proto/google/protobuf/descriptor.ts +34 -34
- package/src/proto/google/protobuf/duration.ts +2 -2
- package/src/proto/google/protobuf/empty.ts +2 -2
- package/src/proto/google/protobuf/timestamp.ts +2 -2
- package/src/proto/mock.ts +4 -4
- package/src/proto/spark.ts +1452 -185
- package/src/proto/spark_authn.ts +7 -7
- package/src/proto/spark_token.ts +1668 -105
- package/src/proto/validate/validate.ts +24 -24
- package/src/services/bolt11-spark.ts +62 -187
- package/src/services/coop-exit.ts +3 -0
- package/src/services/lrc20.ts +1 -1
- package/src/services/token-transactions.ts +197 -9
- package/src/services/transfer.ts +22 -0
- package/src/services/tree-creation.ts +13 -0
- package/src/services/wallet-config.ts +2 -2
- package/src/spark-wallet/spark-wallet.node.ts +0 -4
- package/src/spark-wallet/spark-wallet.ts +76 -108
- package/src/spark-wallet/types.ts +39 -3
- package/src/tests/bolt11-spark.test.ts +7 -15
- package/src/tests/integration/ssp/coop-exit.test.ts +7 -7
- package/src/tests/integration/swap.test.ts +453 -433
- package/src/tests/integration/transfer.test.ts +261 -248
- package/src/tests/token-identifier.test.ts +54 -0
- package/src/tests/tokens.test.ts +218 -23
- package/src/utils/token-hashing.ts +320 -44
- package/src/utils/token-identifier.ts +88 -0
- package/src/utils/token-transaction-validation.ts +350 -5
- package/src/utils/token-transactions.ts +12 -8
- package/src/utils/transaction.ts +0 -6
- package/dist/chunk-B3AMIGJG.js +0 -1073
- package/dist/index-CZmDdSts.d.cts +0 -829
- package/dist/index-ClIRO_3y.d.ts +0 -829
- 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
|
-
|
|
30
|
-
|
|
31
|
+
testLocalOnly(
|
|
32
|
+
"test transfer",
|
|
33
|
+
async () => {
|
|
34
|
+
const faucet = BitcoinFaucet.getInstance();
|
|
31
35
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
const options: ConfigOptions = {
|
|
37
|
+
network: "LOCAL",
|
|
38
|
+
};
|
|
35
39
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
const { wallet: senderWallet } = await SparkWalletTesting.initialize({
|
|
41
|
+
options,
|
|
42
|
+
});
|
|
39
43
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
senderConfigService
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
66
|
+
const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
|
|
61
67
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
68
|
+
const { wallet: receiverWallet } = await SparkWalletTesting.initialize({
|
|
69
|
+
options,
|
|
70
|
+
});
|
|
71
|
+
const receiverPubkey = await receiverWallet.getIdentityPublicKey();
|
|
66
72
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
82
|
+
const receiverTransferService = new TransferService(
|
|
83
|
+
receiverConfigService,
|
|
84
|
+
receiverConnectionManager,
|
|
85
|
+
receiverSigningService,
|
|
86
|
+
);
|
|
81
87
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
88
|
+
const transferNode = {
|
|
89
|
+
leaf: rootNode,
|
|
90
|
+
signingPubKey: leafPubKey,
|
|
91
|
+
newSigningPubKey: newLeafPubKey,
|
|
92
|
+
};
|
|
87
93
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
94
|
+
const senderTransfer = await senderTransferService.sendTransfer(
|
|
95
|
+
[transferNode],
|
|
96
|
+
hexToBytes(receiverPubkey),
|
|
97
|
+
);
|
|
92
98
|
|
|
93
|
-
|
|
99
|
+
const pendingTransfer = await receiverWallet.queryPendingTransfers();
|
|
94
100
|
|
|
95
|
-
|
|
101
|
+
expect(pendingTransfer.transfers.length).toBe(1);
|
|
96
102
|
|
|
97
|
-
|
|
103
|
+
const receiverTransfer = pendingTransfer.transfers[0];
|
|
98
104
|
|
|
99
|
-
|
|
105
|
+
expect(receiverTransfer!.id).toBe(senderTransfer.id);
|
|
100
106
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
107
|
+
const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(
|
|
108
|
+
receiverTransfer!,
|
|
109
|
+
);
|
|
104
110
|
|
|
105
|
-
|
|
111
|
+
expect(leafPrivKeyMap.size).toBe(1);
|
|
106
112
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
113
|
+
const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
|
|
114
|
+
expect(leafPrivKeyMapBytes).toBeDefined();
|
|
115
|
+
expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
|
|
110
116
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
117
|
+
const finalLeafPubKey = await receiverWallet
|
|
118
|
+
.getSigner()
|
|
119
|
+
.generatePublicKey(sha256(rootNode.id));
|
|
114
120
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
121
|
+
const claimingNode = {
|
|
122
|
+
leaf: rootNode,
|
|
123
|
+
signingPubKey: newLeafPubKey,
|
|
124
|
+
newSigningPubKey: finalLeafPubKey,
|
|
125
|
+
};
|
|
120
126
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
127
|
+
await receiverTransferService.claimTransfer(receiverTransfer!, [
|
|
128
|
+
claimingNode,
|
|
129
|
+
]);
|
|
124
130
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
131
|
+
const balance = await receiverWallet.getBalance();
|
|
132
|
+
expect(balance.balance).toBe(1000n);
|
|
133
|
+
},
|
|
134
|
+
30000,
|
|
135
|
+
);
|
|
128
136
|
|
|
129
|
-
|
|
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
|
-
|
|
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
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
389
|
+
const { wallet: senderWallet } = await SparkWalletTesting.initialize({
|
|
390
|
+
options,
|
|
391
|
+
});
|
|
424
392
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
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
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
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
|
-
|
|
446
|
-
[transferNode],
|
|
447
|
-
hexToBytes(receiverPubkey),
|
|
448
|
-
);
|
|
415
|
+
const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
|
|
449
416
|
|
|
450
|
-
|
|
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
|
-
|
|
435
|
+
const receiverPubkey = await receiverWallet.getIdentityPublicKey();
|
|
453
436
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
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
|
-
|
|
459
|
-
|
|
460
|
-
|
|
451
|
+
const transferNode = {
|
|
452
|
+
leaf: rootNode,
|
|
453
|
+
signingPubKey: leafPubKey,
|
|
454
|
+
newSigningPubKey: newLeafPubKey,
|
|
455
|
+
};
|
|
461
456
|
|
|
462
|
-
|
|
457
|
+
const senderTransfer = await senderTransferService.sendTransfer(
|
|
458
|
+
[transferNode],
|
|
459
|
+
hexToBytes(receiverPubkey),
|
|
460
|
+
);
|
|
463
461
|
|
|
464
|
-
|
|
465
|
-
expect(leafPrivKeyMapBytes).toBeDefined();
|
|
466
|
-
expect(bytesToHex(leafPrivKeyMapBytes!)).toBe(bytesToHex(newLeafPubKey));
|
|
462
|
+
const pendingTransfer = await receiverWallet.queryPendingTransfers();
|
|
467
463
|
|
|
468
|
-
|
|
469
|
-
.getSigner()
|
|
470
|
-
.generatePublicKey(sha256(rootNode.id));
|
|
464
|
+
expect(pendingTransfer.transfers.length).toBe(1);
|
|
471
465
|
|
|
472
|
-
|
|
473
|
-
leaf: rootNode,
|
|
474
|
-
signingPubKey: newLeafPubKey,
|
|
475
|
-
newSigningPubKey: finalLeafPubKey,
|
|
476
|
-
};
|
|
466
|
+
const receiverTransfer = pendingTransfer.transfers[0];
|
|
477
467
|
|
|
478
|
-
|
|
479
|
-
await receiverTransferService.claimTransferTweakKeys(receiverTransfer!, [
|
|
480
|
-
claimingNode,
|
|
481
|
-
]);
|
|
468
|
+
expect(receiverTransfer!.id).toBe(senderTransfer.id);
|
|
482
469
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
470
|
+
const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(
|
|
471
|
+
receiverTransfer!,
|
|
472
|
+
);
|
|
486
473
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
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
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
515
|
+
const receiverTransferServiceWithAllOperators = new TransferService(
|
|
516
|
+
receiverConfigServiceWithAllOperators,
|
|
517
|
+
receiverConnectionManagerWithAllOperators,
|
|
518
|
+
receiverSigningServiceWithAllOperators,
|
|
519
|
+
);
|
|
508
520
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
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
|
-
|
|
519
|
-
|
|
548
|
+
const receiverTransferWithAllOperators =
|
|
549
|
+
pendingTransferWithAllOperators.transfers[0];
|
|
520
550
|
|
|
521
|
-
|
|
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
|
-
|
|
529
|
-
|
|
553
|
+
const leafPrivKeyMapWithAllOperators =
|
|
554
|
+
await receiverWalletWithAllOperators.verifyPendingTransfer(
|
|
555
|
+
receiverTransferWithAllOperators!,
|
|
556
|
+
);
|
|
530
557
|
|
|
531
|
-
|
|
532
|
-
expect(pendingTransferWithAllOperators.transfers[0]!.status).toBe(
|
|
533
|
-
TransferStatus.TRANSFER_STATUS_RECEIVER_KEY_TWEAKED,
|
|
534
|
-
);
|
|
558
|
+
expect(leafPrivKeyMapWithAllOperators.size).toBe(1);
|
|
535
559
|
|
|
536
|
-
|
|
537
|
-
|
|
560
|
+
const leafPrivKeyMapBytesWithAllOperators =
|
|
561
|
+
leafPrivKeyMapWithAllOperators.get(rootNode.id);
|
|
562
|
+
expect(leafPrivKeyMapBytesWithAllOperators).toBeDefined();
|
|
563
|
+
expect(bytesToHex(leafPrivKeyMapBytesWithAllOperators!)).toBe(
|
|
564
|
+
bytesToHex(newLeafPubKey),
|
|
565
|
+
);
|
|
538
566
|
|
|
539
|
-
|
|
567
|
+
await receiverWalletWithAllOperators
|
|
568
|
+
.getSigner()
|
|
569
|
+
.restoreSigningKeysFromLeafs([claimingNode.leaf]);
|
|
540
570
|
|
|
541
|
-
const leafPrivKeyMapWithAllOperators =
|
|
542
571
|
await receiverWalletWithAllOperators.verifyPendingTransfer(
|
|
543
|
-
|
|
572
|
+
receiverTransfer!,
|
|
544
573
|
);
|
|
545
574
|
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
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
|
+
});
|