@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
|
@@ -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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
senderConfig
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
receiverConfig
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
senderWallet
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
receiverWallet
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
await
|
|
174
|
-
|
|
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
|
-
|
|
343
|
+
hexToBytes(receiverPubkey),
|
|
344
|
+
new Date(Date.now() + 10 * 60 * 1000),
|
|
177
345
|
);
|
|
178
346
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
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
|
-
|
|
386
|
-
|
|
387
|
-
|
|
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
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
senderTransfer,
|
|
400
|
-
senderLeavesToTransfer,
|
|
401
|
-
senderRefundSignatureMap,
|
|
451
|
+
await receiverTransferService.deliverTransferPackage(
|
|
452
|
+
receiverTransfer,
|
|
453
|
+
receiverLeavesToTransfer,
|
|
454
|
+
newReceiverRefundSignatureMap,
|
|
402
455
|
);
|
|
403
456
|
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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
|
});
|