@buildonspark/spark-sdk 0.5.0 → 0.5.1
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 +26 -0
- package/dist/bare/index.cjs +1608 -3635
- package/dist/bare/index.d.cts +27 -435
- package/dist/bare/index.d.ts +27 -435
- package/dist/bare/index.js +1608 -3634
- package/dist/{chunk-RU434ZAE.js → chunk-F3BFSHVR.js} +357 -391
- package/dist/{chunk-UYEB2VPG.js → chunk-IOIEBLMK.js} +7 -1
- package/dist/{chunk-EU3I7GFB.js → chunk-STB6WMU7.js} +1 -1
- package/dist/{chunk-JE3MXMPW.js → chunk-UTECVGQQ.js} +93 -202
- package/dist/{chunk-ZP6Z6DFX.js → chunk-YFVVYZCS.js} +37 -5
- package/dist/{client-D1dLzWu0.d.ts → client-C9kc4cog.d.cts} +9 -3
- package/dist/{client-CVn0R_eM.d.cts → client-eyjf4knu.d.ts} +9 -3
- package/dist/graphql/objects/index.cjs +7 -1
- package/dist/graphql/objects/index.d.cts +3 -3
- package/dist/graphql/objects/index.d.ts +3 -3
- package/dist/graphql/objects/index.js +1 -1
- package/dist/index.browser.d.ts +27 -435
- package/dist/index.browser.js +1613 -3639
- package/dist/index.node.cjs +1613 -3640
- package/dist/index.node.d.cts +7 -8
- package/dist/index.node.d.ts +7 -8
- package/dist/index.node.js +5 -7
- package/dist/native/index.react-native.cjs +1613 -3640
- package/dist/native/index.react-native.d.cts +27 -435
- package/dist/native/index.react-native.d.ts +27 -435
- package/dist/native/index.react-native.js +1613 -3639
- package/dist/proto/spark.cjs +93 -202
- package/dist/proto/spark.d.cts +1 -1
- package/dist/proto/spark.d.ts +1 -1
- package/dist/proto/spark.js +1 -1
- package/dist/proto/spark_token.cjs +36 -4
- package/dist/proto/spark_token.d.cts +4 -1
- package/dist/proto/spark_token.d.ts +4 -1
- package/dist/proto/spark_token.js +2 -2
- package/dist/{spark-2Fxnvl8K.d.cts → spark-d6w3BLGZ.d.cts} +10 -328
- package/dist/{spark-2Fxnvl8K.d.ts → spark-d6w3BLGZ.d.ts} +10 -328
- package/dist/{spark-wallet.node-DlhZiDgY.d.ts → spark-wallet.node-MReThHBY.d.ts} +6 -7
- package/dist/{spark-wallet.node-xKJXzAEd.d.cts → spark-wallet.node-eR0svGws.d.cts} +6 -7
- package/dist/tests/test-utils.cjs +409 -2429
- package/dist/tests/test-utils.d.cts +3 -3
- package/dist/tests/test-utils.d.ts +3 -3
- package/dist/tests/test-utils.js +5 -5
- package/dist/types/index.cjs +100 -203
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +3 -3
- package/package.json +3 -3
- package/src/graphql/client.ts +36 -1
- package/src/graphql/objects/LightningSendRequestStatus.ts +25 -13
- package/src/proto/common.ts +1 -1
- package/src/proto/google/protobuf/descriptor.ts +1 -1
- package/src/proto/google/protobuf/duration.ts +1 -1
- package/src/proto/google/protobuf/empty.ts +1 -1
- package/src/proto/google/protobuf/timestamp.ts +1 -1
- package/src/proto/mock.ts +1 -1
- package/src/proto/spark.ts +113 -446
- package/src/proto/spark_authn.ts +1 -1
- package/src/proto/spark_token.ts +41 -2
- package/src/proto/validate/validate.ts +1 -1
- package/src/services/connection/connection.ts +23 -60
- package/src/services/coop-exit.ts +3 -5
- package/src/services/deposit.ts +1 -1
- package/src/services/lightning.ts +1 -1
- package/src/services/signing.ts +5 -6
- package/src/services/transfer.ts +250 -240
- package/src/services/wallet-config.ts +22 -5
- package/src/spark-wallet/proto-descriptors.ts +1 -1
- package/src/spark-wallet/proto-reflection.ts +0 -2
- package/src/spark-wallet/spark-wallet.ts +2 -2
- package/src/spark_descriptors.pb +0 -0
- package/src/tests/bufbuild-reflection.test.ts +2 -3
- package/src/tests/integration/coop-exit.test.ts +6 -1
- package/src/tests/integration/htlc.test.ts +5 -0
- package/src/tests/integration/lightning.test.ts +24 -4
- package/src/tests/integration/time-sync.test.ts +18 -0
- package/src/tests/integration/transfer.test.ts +42 -7
- package/src/tests/ssp-client-retry.test.ts +161 -0
- package/src/tests/token-hashing.test.ts +92 -0
- package/src/utils/token-hashing.ts +4 -51
- package/src/utils/transaction.ts +1 -2
- package/src/utils/unilateral-exit.ts +139 -142
package/src/services/transfer.ts
CHANGED
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
QueryTransfersResponse,
|
|
17
17
|
RenewNodeZeroTimelockSigningJob,
|
|
18
18
|
RenewRefundTimelockSigningJob,
|
|
19
|
-
SecretProof,
|
|
20
19
|
SendLeafKeyTweak,
|
|
21
20
|
SendLeafKeyTweaks,
|
|
22
21
|
SigningJob,
|
|
@@ -45,6 +44,7 @@ import {
|
|
|
45
44
|
createInitialTimelockNodeTx,
|
|
46
45
|
createInitialTimelockRefundTxs,
|
|
47
46
|
createZeroTimelockNodeTx,
|
|
47
|
+
getCurrentTimelock,
|
|
48
48
|
} from "../utils/transaction.js";
|
|
49
49
|
import { getTransferPackageSigningPayload } from "../utils/transfer_package.js";
|
|
50
50
|
import { WalletConfigService } from "./config.js";
|
|
@@ -297,27 +297,29 @@ export class BaseTransferService {
|
|
|
297
297
|
);
|
|
298
298
|
|
|
299
299
|
const sparkFrost = getSparkFrost();
|
|
300
|
-
const
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
300
|
+
const encryptedKeyTweaksEntries = await Promise.all(
|
|
301
|
+
Array.from(keyTweakInputMap.entries()).map(async ([key, value]) => {
|
|
302
|
+
const protoToEncrypt: SendLeafKeyTweaks = {
|
|
303
|
+
leavesToSend: value,
|
|
304
|
+
};
|
|
305
305
|
|
|
306
|
-
|
|
307
|
-
|
|
306
|
+
const protoToEncryptBinary =
|
|
307
|
+
SendLeafKeyTweaks.encode(protoToEncrypt).finish();
|
|
308
308
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
309
|
+
const operator = this.config.getSigningOperators()[key];
|
|
310
|
+
if (!operator) {
|
|
311
|
+
throw new SparkValidationError("Operator not found");
|
|
312
|
+
}
|
|
313
313
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
encryptedKeyTweaks[key] = Uint8Array.from(encryptedProto);
|
|
319
|
-
}
|
|
314
|
+
const encryptedProto = await sparkFrost.encryptEcies(
|
|
315
|
+
protoToEncryptBinary,
|
|
316
|
+
hexToBytes(operator.identityPublicKey),
|
|
317
|
+
);
|
|
320
318
|
|
|
319
|
+
return [key, Uint8Array.from(encryptedProto)] as const;
|
|
320
|
+
}),
|
|
321
|
+
);
|
|
322
|
+
const encryptedKeyTweaks = Object.fromEntries(encryptedKeyTweaksEntries);
|
|
321
323
|
const transferPackage: TransferPackage = {
|
|
322
324
|
leavesToSend: cpfpLeafSigningJobs,
|
|
323
325
|
keyTweakPackage: encryptedKeyTweaks,
|
|
@@ -376,26 +378,29 @@ export class BaseTransferService {
|
|
|
376
378
|
);
|
|
377
379
|
|
|
378
380
|
const sparkFrost = getSparkFrost();
|
|
379
|
-
const
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
381
|
+
const encryptedKeyTweaksEntries = await Promise.all(
|
|
382
|
+
Array.from(keyTweakInputMap.entries()).map(async ([key, value]) => {
|
|
383
|
+
const protoToEncrypt: SendLeafKeyTweaks = {
|
|
384
|
+
leavesToSend: value,
|
|
385
|
+
};
|
|
384
386
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
+
const protoToEncryptBinary =
|
|
388
|
+
SendLeafKeyTweaks.encode(protoToEncrypt).finish();
|
|
387
389
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
390
|
+
const operator = this.config.getSigningOperators()[key];
|
|
391
|
+
if (!operator) {
|
|
392
|
+
throw new SparkValidationError("Operator not found");
|
|
393
|
+
}
|
|
392
394
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
395
|
+
const encryptedProto = await sparkFrost.encryptEcies(
|
|
396
|
+
protoToEncryptBinary,
|
|
397
|
+
hexToBytes(operator.identityPublicKey),
|
|
398
|
+
);
|
|
399
|
+
|
|
400
|
+
return [key, Uint8Array.from(encryptedProto)] as const;
|
|
401
|
+
}),
|
|
402
|
+
);
|
|
403
|
+
const encryptedKeyTweaks = Object.fromEntries(encryptedKeyTweaksEntries);
|
|
399
404
|
|
|
400
405
|
const transferPackage: TransferPackage = {
|
|
401
406
|
leavesToSend: cpfpLeafSigningJobs,
|
|
@@ -581,21 +586,27 @@ export class BaseTransferService {
|
|
|
581
586
|
): Promise<Map<string, SendLeafKeyTweak[]>> {
|
|
582
587
|
const leavesTweaksMap = new Map<string, SendLeafKeyTweak[]>();
|
|
583
588
|
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
589
|
+
const results = await Promise.all(
|
|
590
|
+
leaves.map(async (leaf) => {
|
|
591
|
+
const cpfpRefundSignature = cpfpRefundSignatureMap.get(leaf.leaf.id);
|
|
592
|
+
const directRefundSignature = directRefundSignatureMap.get(
|
|
593
|
+
leaf.leaf.id,
|
|
594
|
+
);
|
|
595
|
+
const directFromCpfpRefundSignature =
|
|
596
|
+
directFromCpfpRefundSignatureMap.get(leaf.leaf.id);
|
|
597
|
+
|
|
598
|
+
return await this.prepareSingleSendTransferKeyTweak(
|
|
599
|
+
transferID,
|
|
600
|
+
leaf,
|
|
601
|
+
receiverIdentityPubkey,
|
|
602
|
+
cpfpRefundSignature,
|
|
603
|
+
directRefundSignature,
|
|
604
|
+
directFromCpfpRefundSignature,
|
|
605
|
+
);
|
|
606
|
+
}),
|
|
607
|
+
);
|
|
608
|
+
for (const result of results) {
|
|
609
|
+
for (const [identifier, leafTweak] of result) {
|
|
599
610
|
leavesTweaksMap.set(identifier, [
|
|
600
611
|
...(leavesTweaksMap.get(identifier) || []),
|
|
601
612
|
leafTweak,
|
|
@@ -714,15 +725,10 @@ export class TransferService extends BaseTransferService {
|
|
|
714
725
|
}
|
|
715
726
|
|
|
716
727
|
async claimTransfer(transfer: Transfer, leaves: LeafKeyTweak[]) {
|
|
717
|
-
let proofMap: Map<string, Uint8Array[]> | undefined;
|
|
718
728
|
if (transfer.status === TransferStatus.TRANSFER_STATUS_SENDER_KEY_TWEAKED) {
|
|
719
|
-
|
|
729
|
+
await this.claimTransferTweakKeys(transfer, leaves);
|
|
720
730
|
}
|
|
721
|
-
const signatures = await this.claimTransferSignRefunds(
|
|
722
|
-
transfer,
|
|
723
|
-
leaves,
|
|
724
|
-
proofMap,
|
|
725
|
-
);
|
|
731
|
+
const signatures = await this.claimTransferSignRefunds(transfer, leaves);
|
|
726
732
|
return await this.finalizeNodeSignatures(signatures);
|
|
727
733
|
}
|
|
728
734
|
|
|
@@ -786,39 +792,41 @@ export class TransferService extends BaseTransferService {
|
|
|
786
792
|
transfer: Transfer,
|
|
787
793
|
): Promise<Map<string, Uint8Array>> {
|
|
788
794
|
const leafPubKeyMap = new Map<string, Uint8Array>();
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
795
|
+
await Promise.all(
|
|
796
|
+
transfer.leaves.map(async (leaf) => {
|
|
797
|
+
if (!leaf.leaf) {
|
|
798
|
+
throw new Error("Leaf is undefined");
|
|
799
|
+
}
|
|
793
800
|
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
801
|
+
const encoder = new TextEncoder();
|
|
802
|
+
const leafIdBytes = encoder.encode(leaf.leaf.id);
|
|
803
|
+
const transferIdBytes = encoder.encode(transfer.id);
|
|
797
804
|
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
805
|
+
const payload = new Uint8Array([
|
|
806
|
+
...leafIdBytes,
|
|
807
|
+
...transferIdBytes,
|
|
808
|
+
...leaf.secretCipher,
|
|
809
|
+
]);
|
|
803
810
|
|
|
804
|
-
|
|
811
|
+
const payloadHash = sha256(payload);
|
|
805
812
|
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
813
|
+
if (
|
|
814
|
+
!secp256k1.verify(
|
|
815
|
+
leaf.signature,
|
|
816
|
+
payloadHash,
|
|
817
|
+
transfer.senderIdentityPublicKey,
|
|
818
|
+
)
|
|
819
|
+
) {
|
|
820
|
+
throw new Error("Signature verification failed");
|
|
821
|
+
}
|
|
815
822
|
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
823
|
+
const leafSecret = await this.config.signer.decryptEcies(
|
|
824
|
+
leaf.secretCipher,
|
|
825
|
+
);
|
|
819
826
|
|
|
820
|
-
|
|
821
|
-
|
|
827
|
+
leafPubKeyMap.set(leaf.leaf.id, leafSecret);
|
|
828
|
+
}),
|
|
829
|
+
);
|
|
822
830
|
return leafPubKeyMap;
|
|
823
831
|
}
|
|
824
832
|
|
|
@@ -919,45 +927,47 @@ export class TransferService extends BaseTransferService {
|
|
|
919
927
|
}> {
|
|
920
928
|
const transferId = uuidv7();
|
|
921
929
|
const leafDataMap = new Map<string, LeafRefundSigningData>();
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
930
|
+
await Promise.all(
|
|
931
|
+
leaves.map(async (leaf) => {
|
|
932
|
+
const signingNonceCommitment =
|
|
933
|
+
await this.config.signer.getRandomSigningCommitment();
|
|
934
|
+
const directSigningNonceCommitment =
|
|
935
|
+
await this.config.signer.getRandomSigningCommitment();
|
|
936
|
+
const directFromCpfpRefundSigningNonceCommitment =
|
|
937
|
+
await this.config.signer.getRandomSigningCommitment();
|
|
938
|
+
|
|
939
|
+
const tx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
|
|
940
|
+
const refundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
|
|
941
|
+
|
|
942
|
+
const directTx =
|
|
943
|
+
leaf.leaf.directTx.length > 0
|
|
944
|
+
? getTxFromRawTxBytes(leaf.leaf.directTx)
|
|
945
|
+
: undefined;
|
|
946
|
+
|
|
947
|
+
const directRefundTx =
|
|
948
|
+
leaf.leaf.directRefundTx.length > 0
|
|
949
|
+
? getTxFromRawTxBytes(leaf.leaf.directRefundTx)
|
|
950
|
+
: undefined;
|
|
951
|
+
const directFromCpfpRefundTx =
|
|
952
|
+
leaf.leaf.directFromCpfpRefundTx.length > 0
|
|
953
|
+
? getTxFromRawTxBytes(leaf.leaf.directFromCpfpRefundTx)
|
|
954
|
+
: undefined;
|
|
955
|
+
|
|
956
|
+
leafDataMap.set(leaf.leaf.id, {
|
|
957
|
+
keyDerivation: leaf.keyDerivation,
|
|
958
|
+
receivingPubkey: receiverIdentityPubkey,
|
|
959
|
+
signingNonceCommitment,
|
|
960
|
+
directSigningNonceCommitment,
|
|
961
|
+
tx,
|
|
962
|
+
directTx,
|
|
963
|
+
refundTx,
|
|
964
|
+
directRefundTx,
|
|
965
|
+
directFromCpfpRefundTx,
|
|
966
|
+
directFromCpfpRefundSigningNonceCommitment,
|
|
967
|
+
vout: leaf.leaf.vout,
|
|
968
|
+
});
|
|
969
|
+
}),
|
|
970
|
+
);
|
|
961
971
|
|
|
962
972
|
const signingJobs = await this.prepareRefundSoSigningJobs(
|
|
963
973
|
leaves,
|
|
@@ -1033,82 +1043,92 @@ export class TransferService extends BaseTransferService {
|
|
|
1033
1043
|
isForClaim?: boolean,
|
|
1034
1044
|
): Promise<LeafRefundTxSigningJob[]> {
|
|
1035
1045
|
const signingJobs: LeafRefundTxSigningJob[] = [];
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1046
|
+
const results = await Promise.all(
|
|
1047
|
+
leaves.map(async (leaf) => {
|
|
1048
|
+
const refundSigningData = leafDataMap.get(leaf.leaf.id);
|
|
1049
|
+
if (!refundSigningData) {
|
|
1050
|
+
throw new Error(`Leaf data not found for leaf ${leaf.leaf.id}`);
|
|
1051
|
+
}
|
|
1041
1052
|
|
|
1042
|
-
|
|
1053
|
+
const nodeTx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
|
|
1043
1054
|
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1055
|
+
let directNodeTx: Transaction | undefined;
|
|
1056
|
+
if (leaf.leaf.directTx.length > 0) {
|
|
1057
|
+
directNodeTx = getTxFromRawTxBytes(leaf.leaf.directTx);
|
|
1058
|
+
}
|
|
1048
1059
|
|
|
1049
|
-
|
|
1060
|
+
const currRefundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
|
|
1050
1061
|
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1062
|
+
const currentSequence = currRefundTx.getInput(0).sequence;
|
|
1063
|
+
if (!currentSequence) {
|
|
1064
|
+
throw new SparkValidationError("Invalid refund transaction", {
|
|
1065
|
+
field: "sequence",
|
|
1066
|
+
value: currRefundTx.getInput(0),
|
|
1067
|
+
expected: "Non-null sequence",
|
|
1068
|
+
});
|
|
1069
|
+
}
|
|
1059
1070
|
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1071
|
+
const refundTxsParams = {
|
|
1072
|
+
nodeTx: nodeTx,
|
|
1073
|
+
directNodeTx: directNodeTx,
|
|
1074
|
+
sequence: currentSequence,
|
|
1075
|
+
receivingPubkey: refundSigningData.receivingPubkey,
|
|
1076
|
+
network: this.config.getNetwork(),
|
|
1077
|
+
};
|
|
1067
1078
|
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
refundSigningData.
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1079
|
+
const { cpfpRefundTx, directRefundTx, directFromCpfpRefundTx } =
|
|
1080
|
+
isForClaim
|
|
1081
|
+
? createCurrentTimelockRefundTxs(refundTxsParams)
|
|
1082
|
+
: createDecrementedTimelockRefundTxs(refundTxsParams);
|
|
1083
|
+
|
|
1084
|
+
const isZeroNode = !getCurrentTimelock(nodeTx.getInput(0).sequence);
|
|
1085
|
+
|
|
1086
|
+
refundSigningData.refundTx = cpfpRefundTx;
|
|
1087
|
+
refundSigningData.directRefundTx =
|
|
1088
|
+
directRefundTx && !isZeroNode ? directRefundTx : undefined;
|
|
1089
|
+
refundSigningData.directFromCpfpRefundTx = directFromCpfpRefundTx;
|
|
1090
|
+
|
|
1091
|
+
const cpfpRefundNonceCommitmentProto =
|
|
1092
|
+
refundSigningData.signingNonceCommitment;
|
|
1093
|
+
const directRefundNonceCommitmentProto =
|
|
1094
|
+
refundSigningData.directSigningNonceCommitment;
|
|
1095
|
+
const directFromCpfpRefundNonceCommitmentProto =
|
|
1096
|
+
refundSigningData.directFromCpfpRefundSigningNonceCommitment;
|
|
1097
|
+
|
|
1098
|
+
const signingPublicKey =
|
|
1099
|
+
await this.config.signer.getPublicKeyFromDerivation(
|
|
1100
|
+
refundSigningData.keyDerivation,
|
|
1101
|
+
);
|
|
1102
|
+
return {
|
|
1103
|
+
leafId: leaf.leaf.id,
|
|
1104
|
+
refundTxSigningJob: {
|
|
1105
|
+
signingPublicKey,
|
|
1106
|
+
rawTx: cpfpRefundTx.toBytes(),
|
|
1107
|
+
signingNonceCommitment: cpfpRefundNonceCommitmentProto.commitment,
|
|
1108
|
+
},
|
|
1109
|
+
directRefundTxSigningJob:
|
|
1110
|
+
directRefundTx && !isZeroNode
|
|
1111
|
+
? {
|
|
1112
|
+
signingPublicKey,
|
|
1113
|
+
rawTx: directRefundTx.toBytes(),
|
|
1114
|
+
signingNonceCommitment:
|
|
1115
|
+
directRefundNonceCommitmentProto.commitment,
|
|
1116
|
+
}
|
|
1117
|
+
: undefined,
|
|
1118
|
+
directFromCpfpRefundTxSigningJob: directFromCpfpRefundTx
|
|
1119
|
+
? {
|
|
1120
|
+
signingPublicKey,
|
|
1121
|
+
rawTx: directFromCpfpRefundTx.toBytes(),
|
|
1122
|
+
signingNonceCommitment:
|
|
1123
|
+
directFromCpfpRefundNonceCommitmentProto.commitment,
|
|
1124
|
+
}
|
|
1125
|
+
: undefined,
|
|
1126
|
+
};
|
|
1127
|
+
}),
|
|
1128
|
+
);
|
|
1129
|
+
|
|
1130
|
+
for (const result of results) {
|
|
1131
|
+
signingJobs.push(result);
|
|
1112
1132
|
}
|
|
1113
1133
|
|
|
1114
1134
|
return signingJobs;
|
|
@@ -1117,9 +1137,8 @@ export class TransferService extends BaseTransferService {
|
|
|
1117
1137
|
async claimTransferTweakKeys(
|
|
1118
1138
|
transfer: Transfer,
|
|
1119
1139
|
leaves: LeafKeyTweak[],
|
|
1120
|
-
): Promise<
|
|
1121
|
-
const
|
|
1122
|
-
await this.prepareClaimLeavesKeyTweaks(leaves);
|
|
1140
|
+
): Promise<void> {
|
|
1141
|
+
const leavesTweaksMap = await this.prepareClaimLeavesKeyTweaks(leaves);
|
|
1123
1142
|
|
|
1124
1143
|
const errors: Error[] = [];
|
|
1125
1144
|
|
|
@@ -1164,21 +1183,18 @@ export class TransferService extends BaseTransferService {
|
|
|
1164
1183
|
if (errors.length > 0) {
|
|
1165
1184
|
throw errors[0];
|
|
1166
1185
|
}
|
|
1167
|
-
|
|
1168
|
-
return proofMap;
|
|
1169
1186
|
}
|
|
1170
1187
|
|
|
1171
|
-
private async prepareClaimLeavesKeyTweaks(
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
}> {
|
|
1188
|
+
private async prepareClaimLeavesKeyTweaks(
|
|
1189
|
+
leaves: LeafKeyTweak[],
|
|
1190
|
+
): Promise<Map<string, ClaimLeafKeyTweak[]>> {
|
|
1175
1191
|
const leafDataMap = new Map<string, ClaimLeafKeyTweak[]>();
|
|
1176
|
-
const proofMap = new Map<string, Uint8Array[]>();
|
|
1177
|
-
for (const leaf of leaves) {
|
|
1178
|
-
const { leafKeyTweaks: leafData, proofs } =
|
|
1179
|
-
await this.prepareClaimLeafKeyTweaks(leaf);
|
|
1180
|
-
proofMap.set(leaf.leaf.id, proofs);
|
|
1181
1192
|
|
|
1193
|
+
const results = await Promise.all(
|
|
1194
|
+
leaves.map((leaf) => this.prepareClaimLeafKeyTweaks(leaf)),
|
|
1195
|
+
);
|
|
1196
|
+
|
|
1197
|
+
for (const { leafKeyTweaks: leafData } of results) {
|
|
1182
1198
|
for (const [identifier, leafTweak] of leafData) {
|
|
1183
1199
|
leafDataMap.set(identifier, [
|
|
1184
1200
|
...(leafDataMap.get(identifier) || []),
|
|
@@ -1186,7 +1202,8 @@ export class TransferService extends BaseTransferService {
|
|
|
1186
1202
|
]);
|
|
1187
1203
|
}
|
|
1188
1204
|
}
|
|
1189
|
-
|
|
1205
|
+
|
|
1206
|
+
return leafDataMap;
|
|
1190
1207
|
}
|
|
1191
1208
|
|
|
1192
1209
|
private async prepareClaimLeafKeyTweaks(leaf: LeafKeyTweak): Promise<{
|
|
@@ -1249,32 +1266,33 @@ export class TransferService extends BaseTransferService {
|
|
|
1249
1266
|
async claimTransferSignRefunds(
|
|
1250
1267
|
transfer: Transfer,
|
|
1251
1268
|
leafKeys: LeafKeyTweak[],
|
|
1252
|
-
proofMap?: Map<string, Uint8Array[]>,
|
|
1253
1269
|
): Promise<NodeSignatures[]> {
|
|
1254
1270
|
const leafDataMap: Map<string, LeafRefundSigningData> = new Map();
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1271
|
+
await Promise.all(
|
|
1272
|
+
leafKeys.map(async (leafKey) => {
|
|
1273
|
+
const tx = getTxFromRawTxBytes(leafKey.leaf.nodeTx);
|
|
1274
|
+
const directTx =
|
|
1275
|
+
leafKey.leaf.directTx.length > 0
|
|
1276
|
+
? getTxFromRawTxBytes(leafKey.leaf.directTx)
|
|
1277
|
+
: undefined;
|
|
1278
|
+
|
|
1279
|
+
leafDataMap.set(leafKey.leaf.id, {
|
|
1280
|
+
keyDerivation: leafKey.newKeyDerivation,
|
|
1281
|
+
receivingPubkey: await this.config.signer.getPublicKeyFromDerivation(
|
|
1282
|
+
leafKey.newKeyDerivation,
|
|
1283
|
+
),
|
|
1284
|
+
signingNonceCommitment:
|
|
1285
|
+
await this.config.signer.getRandomSigningCommitment(),
|
|
1286
|
+
directSigningNonceCommitment:
|
|
1287
|
+
await this.config.signer.getRandomSigningCommitment(),
|
|
1288
|
+
directFromCpfpRefundSigningNonceCommitment:
|
|
1289
|
+
await this.config.signer.getRandomSigningCommitment(),
|
|
1290
|
+
tx,
|
|
1291
|
+
directTx,
|
|
1292
|
+
vout: leafKey.leaf.vout,
|
|
1293
|
+
});
|
|
1294
|
+
}),
|
|
1295
|
+
);
|
|
1278
1296
|
|
|
1279
1297
|
const signingJobs = await this.prepareRefundSoSigningJobs(
|
|
1280
1298
|
leafKeys,
|
|
@@ -1287,14 +1305,6 @@ export class TransferService extends BaseTransferService {
|
|
|
1287
1305
|
);
|
|
1288
1306
|
let resp: ClaimTransferSignRefundsResponse;
|
|
1289
1307
|
|
|
1290
|
-
const secretProofMap: { [key: string]: SecretProof } = {};
|
|
1291
|
-
if (proofMap) {
|
|
1292
|
-
for (const [leafId, proof] of proofMap.entries()) {
|
|
1293
|
-
secretProofMap[leafId] = {
|
|
1294
|
-
proofs: proof,
|
|
1295
|
-
};
|
|
1296
|
-
}
|
|
1297
|
-
}
|
|
1298
1308
|
try {
|
|
1299
1309
|
resp = await sparkClient.claim_transfer_sign_refunds_v2({
|
|
1300
1310
|
transferId: transfer.id,
|