@buildonspark/spark-sdk 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/graphql/client.d.ts +24 -0
- package/dist/graphql/client.js +177 -0
- package/dist/graphql/client.js.map +1 -0
- package/dist/graphql/mutations/CompleteCoopExit.d.ts +1 -0
- package/dist/graphql/mutations/CompleteCoopExit.js +19 -0
- package/dist/graphql/mutations/CompleteCoopExit.js.map +1 -0
- package/dist/graphql/mutations/CompleteLeavesSwap.d.ts +1 -0
- package/dist/graphql/mutations/CompleteLeavesSwap.js +17 -0
- package/dist/graphql/mutations/CompleteLeavesSwap.js.map +1 -0
- package/dist/graphql/mutations/RequestCoopExit.d.ts +1 -0
- package/dist/graphql/mutations/RequestCoopExit.js +20 -0
- package/dist/graphql/mutations/RequestCoopExit.js.map +1 -0
- package/dist/graphql/mutations/RequestLightningReceive.d.ts +1 -0
- package/dist/graphql/mutations/RequestLightningReceive.js +26 -0
- package/dist/graphql/mutations/RequestLightningReceive.js.map +1 -0
- package/dist/graphql/mutations/RequestLightningSend.d.ts +1 -0
- package/dist/graphql/mutations/RequestLightningSend.js +18 -0
- package/dist/graphql/mutations/RequestLightningSend.js.map +1 -0
- package/dist/graphql/mutations/RequestSwapLeaves.d.ts +1 -0
- package/dist/graphql/mutations/RequestSwapLeaves.js +26 -0
- package/dist/graphql/mutations/RequestSwapLeaves.js.map +1 -0
- package/dist/graphql/objects/BitcoinNetwork.d.ts +17 -0
- package/dist/graphql/objects/BitcoinNetwork.js +20 -0
- package/dist/graphql/objects/BitcoinNetwork.js.map +1 -0
- package/dist/graphql/objects/CompleteCoopExitInput.d.ts +7 -0
- package/dist/graphql/objects/CompleteCoopExitInput.js +14 -0
- package/dist/graphql/objects/CompleteCoopExitInput.js.map +1 -0
- package/dist/graphql/objects/CompleteCoopExitOutput.d.ts +7 -0
- package/dist/graphql/objects/CompleteCoopExitOutput.js +19 -0
- package/dist/graphql/objects/CompleteCoopExitOutput.js.map +1 -0
- package/dist/graphql/objects/CompleteLeavesSwapInput.d.ts +8 -0
- package/dist/graphql/objects/CompleteLeavesSwapInput.js +16 -0
- package/dist/graphql/objects/CompleteLeavesSwapInput.js.map +1 -0
- package/dist/graphql/objects/CompleteLeavesSwapOutput.d.ts +7 -0
- package/dist/graphql/objects/CompleteLeavesSwapOutput.js +19 -0
- package/dist/graphql/objects/CompleteLeavesSwapOutput.js.map +1 -0
- package/dist/graphql/objects/Connection.d.ts +16 -0
- package/dist/graphql/objects/Connection.js +56 -0
- package/dist/graphql/objects/Connection.js.map +1 -0
- package/dist/graphql/objects/CoopExitFeeEstimateInput.d.ts +7 -0
- package/dist/graphql/objects/CoopExitFeeEstimateInput.js +14 -0
- package/dist/graphql/objects/CoopExitFeeEstimateInput.js.map +1 -0
- package/dist/graphql/objects/CoopExitFeeEstimateOutput.d.ts +8 -0
- package/dist/graphql/objects/CoopExitFeeEstimateOutput.js +26 -0
- package/dist/graphql/objects/CoopExitFeeEstimateOutput.js.map +1 -0
- package/dist/graphql/objects/CoopExitRequest.d.ts +32 -0
- package/dist/graphql/objects/CoopExitRequest.js +64 -0
- package/dist/graphql/objects/CoopExitRequest.js.map +1 -0
- package/dist/graphql/objects/CurrencyAmount.d.ts +24 -0
- package/dist/graphql/objects/CurrencyAmount.js +30 -0
- package/dist/graphql/objects/CurrencyAmount.js.map +1 -0
- package/dist/graphql/objects/CurrencyUnit.d.ts +27 -0
- package/dist/graphql/objects/CurrencyUnit.js +30 -0
- package/dist/graphql/objects/CurrencyUnit.js.map +1 -0
- package/dist/graphql/objects/Entity.d.ts +16 -0
- package/dist/graphql/objects/Entity.js +141 -0
- package/dist/graphql/objects/Entity.js.map +1 -0
- package/dist/graphql/objects/Invoice.d.ts +15 -0
- package/dist/graphql/objects/Invoice.js +45 -0
- package/dist/graphql/objects/Invoice.js.map +1 -0
- package/dist/graphql/objects/Leaf.d.ts +11 -0
- package/dist/graphql/objects/Leaf.js +29 -0
- package/dist/graphql/objects/Leaf.js.map +1 -0
- package/dist/graphql/objects/LeavesSwapFeeEstimateInput.d.ts +6 -0
- package/dist/graphql/objects/LeavesSwapFeeEstimateInput.js +12 -0
- package/dist/graphql/objects/LeavesSwapFeeEstimateInput.js.map +1 -0
- package/dist/graphql/objects/LeavesSwapFeeEstimateOutput.d.ts +8 -0
- package/dist/graphql/objects/LeavesSwapFeeEstimateOutput.js +26 -0
- package/dist/graphql/objects/LeavesSwapFeeEstimateOutput.js.map +1 -0
- package/dist/graphql/objects/LeavesSwapRequest.d.ts +32 -0
- package/dist/graphql/objects/LeavesSwapRequest.js +87 -0
- package/dist/graphql/objects/LeavesSwapRequest.js.map +1 -0
- package/dist/graphql/objects/LightningReceiveFeeEstimateInput.d.ts +8 -0
- package/dist/graphql/objects/LightningReceiveFeeEstimateInput.js +15 -0
- package/dist/graphql/objects/LightningReceiveFeeEstimateInput.js.map +1 -0
- package/dist/graphql/objects/LightningReceiveFeeEstimateOutput.d.ts +8 -0
- package/dist/graphql/objects/LightningReceiveFeeEstimateOutput.js +26 -0
- package/dist/graphql/objects/LightningReceiveFeeEstimateOutput.js.map +1 -0
- package/dist/graphql/objects/LightningReceiveRequest.d.ts +31 -0
- package/dist/graphql/objects/LightningReceiveRequest.js +93 -0
- package/dist/graphql/objects/LightningReceiveRequest.js.map +1 -0
- package/dist/graphql/objects/LightningReceiveRequestStatus.d.ts +16 -0
- package/dist/graphql/objects/LightningReceiveRequestStatus.js +19 -0
- package/dist/graphql/objects/LightningReceiveRequestStatus.js.map +1 -0
- package/dist/graphql/objects/LightningSendFeeEstimateInput.d.ts +6 -0
- package/dist/graphql/objects/LightningSendFeeEstimateInput.js +12 -0
- package/dist/graphql/objects/LightningSendFeeEstimateInput.js.map +1 -0
- package/dist/graphql/objects/LightningSendFeeEstimateOutput.d.ts +8 -0
- package/dist/graphql/objects/LightningSendFeeEstimateOutput.js +26 -0
- package/dist/graphql/objects/LightningSendFeeEstimateOutput.js.map +1 -0
- package/dist/graphql/objects/LightningSendRequest.d.ts +32 -0
- package/dist/graphql/objects/LightningSendRequest.js +78 -0
- package/dist/graphql/objects/LightningSendRequest.js.map +1 -0
- package/dist/graphql/objects/LightningSendRequestStatus.d.ts +15 -0
- package/dist/graphql/objects/LightningSendRequestStatus.js +18 -0
- package/dist/graphql/objects/LightningSendRequestStatus.js.map +1 -0
- package/dist/graphql/objects/PageInfo.d.ts +11 -0
- package/dist/graphql/objects/PageInfo.js +26 -0
- package/dist/graphql/objects/PageInfo.js.map +1 -0
- package/dist/graphql/objects/RequestCoopExitInput.d.ts +7 -0
- package/dist/graphql/objects/RequestCoopExitInput.js +14 -0
- package/dist/graphql/objects/RequestCoopExitInput.js.map +1 -0
- package/dist/graphql/objects/RequestCoopExitOutput.d.ts +7 -0
- package/dist/graphql/objects/RequestCoopExitOutput.js +19 -0
- package/dist/graphql/objects/RequestCoopExitOutput.js.map +1 -0
- package/dist/graphql/objects/RequestLeavesSwapInput.d.ts +13 -0
- package/dist/graphql/objects/RequestLeavesSwapInput.js +25 -0
- package/dist/graphql/objects/RequestLeavesSwapInput.js.map +1 -0
- package/dist/graphql/objects/RequestLeavesSwapOutput.d.ts +7 -0
- package/dist/graphql/objects/RequestLeavesSwapOutput.js +19 -0
- package/dist/graphql/objects/RequestLeavesSwapOutput.js.map +1 -0
- package/dist/graphql/objects/RequestLightningReceiveInput.d.ts +16 -0
- package/dist/graphql/objects/RequestLightningReceiveInput.js +21 -0
- package/dist/graphql/objects/RequestLightningReceiveInput.js.map +1 -0
- package/dist/graphql/objects/RequestLightningReceiveOutput.d.ts +7 -0
- package/dist/graphql/objects/RequestLightningReceiveOutput.js +19 -0
- package/dist/graphql/objects/RequestLightningReceiveOutput.js.map +1 -0
- package/dist/graphql/objects/RequestLightningSendInput.d.ts +7 -0
- package/dist/graphql/objects/RequestLightningSendInput.js +14 -0
- package/dist/graphql/objects/RequestLightningSendInput.js.map +1 -0
- package/dist/graphql/objects/RequestLightningSendOutput.d.ts +7 -0
- package/dist/graphql/objects/RequestLightningSendOutput.js +19 -0
- package/dist/graphql/objects/RequestLightningSendOutput.js.map +1 -0
- package/dist/graphql/objects/SparkCoopExitRequestStatus.d.ts +11 -0
- package/dist/graphql/objects/SparkCoopExitRequestStatus.js +14 -0
- package/dist/graphql/objects/SparkCoopExitRequestStatus.js.map +1 -0
- package/dist/graphql/objects/SparkLeavesSwapRequestStatus.d.ts +11 -0
- package/dist/graphql/objects/SparkLeavesSwapRequestStatus.js +14 -0
- package/dist/graphql/objects/SparkLeavesSwapRequestStatus.js.map +1 -0
- package/dist/graphql/objects/SparkTransferToLeavesConnection.d.ts +19 -0
- package/dist/graphql/objects/SparkTransferToLeavesConnection.js +45 -0
- package/dist/graphql/objects/SparkTransferToLeavesConnection.js.map +1 -0
- package/dist/graphql/objects/SwapLeaf.d.ts +9 -0
- package/dist/graphql/objects/SwapLeaf.js +23 -0
- package/dist/graphql/objects/SwapLeaf.js.map +1 -0
- package/dist/graphql/objects/Transfer.d.ts +24 -0
- package/dist/graphql/objects/Transfer.js +82 -0
- package/dist/graphql/objects/Transfer.js.map +1 -0
- package/dist/graphql/objects/UserLeafInput.d.ts +8 -0
- package/dist/graphql/objects/UserLeafInput.js +16 -0
- package/dist/graphql/objects/UserLeafInput.js.map +1 -0
- package/dist/graphql/objects/WalletUser.d.ts +21 -0
- package/dist/graphql/objects/WalletUser.js +48 -0
- package/dist/graphql/objects/WalletUser.js.map +1 -0
- package/dist/graphql/objects/index.d.ts +41 -0
- package/dist/graphql/objects/index.js +13 -0
- package/dist/graphql/objects/index.js.map +1 -0
- package/dist/graphql/queries/CoopExitFeeEstimate.d.ts +1 -0
- package/dist/graphql/queries/CoopExitFeeEstimate.js +18 -0
- package/dist/graphql/queries/CoopExitFeeEstimate.js.map +1 -0
- package/dist/graphql/queries/CurrentUser.d.ts +1 -0
- package/dist/graphql/queries/CurrentUser.js +10 -0
- package/dist/graphql/queries/CurrentUser.js.map +1 -0
- package/dist/graphql/queries/LightningReceiveFeeEstimate.d.ts +1 -0
- package/dist/graphql/queries/LightningReceiveFeeEstimate.js +18 -0
- package/dist/graphql/queries/LightningReceiveFeeEstimate.js.map +1 -0
- package/dist/graphql/queries/LightningSendFeeEstimate.d.ts +1 -0
- package/dist/graphql/queries/LightningSendFeeEstimate.js +16 -0
- package/dist/graphql/queries/LightningSendFeeEstimate.js.map +1 -0
- package/dist/proto/common.d.ts +58 -0
- package/dist/proto/common.js +350 -0
- package/dist/proto/common.js.map +1 -0
- package/dist/proto/google/protobuf/descriptor.d.ts +1228 -0
- package/dist/proto/google/protobuf/descriptor.js +5070 -0
- package/dist/proto/google/protobuf/descriptor.js.map +1 -0
- package/dist/proto/google/protobuf/duration.d.ts +99 -0
- package/dist/proto/google/protobuf/duration.js +90 -0
- package/dist/proto/google/protobuf/duration.js.map +1 -0
- package/dist/proto/google/protobuf/empty.d.ts +33 -0
- package/dist/proto/google/protobuf/empty.js +46 -0
- package/dist/proto/google/protobuf/empty.js.map +1 -0
- package/dist/proto/google/protobuf/timestamp.d.ts +128 -0
- package/dist/proto/google/protobuf/timestamp.js +90 -0
- package/dist/proto/google/protobuf/timestamp.js.map +1 -0
- package/dist/proto/mock.d.ts +48 -0
- package/dist/proto/mock.js +103 -0
- package/dist/proto/mock.js.map +1 -0
- package/dist/proto/spark.d.ts +1101 -0
- package/dist/proto/spark.js +9565 -0
- package/dist/proto/spark.js.map +1 -0
- package/dist/proto/spark_authn.d.ts +111 -0
- package/dist/proto/spark_authn.js +517 -0
- package/dist/proto/spark_authn.js.map +1 -0
- package/dist/proto/validate/validate.d.ts +1087 -0
- package/dist/proto/validate/validate.js +4437 -0
- package/dist/proto/validate/validate.js.map +1 -0
- package/dist/services/config.d.ts +24 -0
- package/dist/services/config.js +29 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/connection.d.ts +21 -0
- package/dist/services/connection.js +154 -0
- package/dist/services/connection.js.map +1 -0
- package/dist/services/coop-exit.d.ts +20 -0
- package/dist/services/coop-exit.js +102 -0
- package/dist/services/coop-exit.js.map +1 -0
- package/dist/services/deposit.d.ts +21 -0
- package/dist/services/deposit.js +214 -0
- package/dist/services/deposit.js.map +1 -0
- package/dist/services/lightning.d.ts +31 -0
- package/dist/services/lightning.js +196 -0
- package/dist/services/lightning.js.map +1 -0
- package/dist/services/token-transactions.d.ts +17 -0
- package/dist/services/token-transactions.js +297 -0
- package/dist/services/token-transactions.js.map +1 -0
- package/dist/services/transfer.d.ts +63 -0
- package/dist/services/transfer.js +499 -0
- package/dist/services/transfer.js.map +1 -0
- package/dist/services/tree-creation.d.ts +30 -0
- package/dist/services/tree-creation.js +404 -0
- package/dist/services/tree-creation.js.map +1 -0
- package/dist/signer/signer.d.ts +97 -0
- package/dist/signer/signer.js +239 -0
- package/dist/signer/signer.js.map +1 -0
- package/dist/spark-sdk.d.ts +87 -0
- package/dist/spark-sdk.js +675 -0
- package/dist/spark-sdk.js.map +1 -0
- package/dist/tests/adaptor-signature.test.d.ts +1 -0
- package/dist/tests/adaptor-signature.test.js +34 -0
- package/dist/tests/adaptor-signature.test.js.map +1 -0
- package/dist/tests/bitcoin.test.d.ts +1 -0
- package/dist/tests/bitcoin.test.js +77 -0
- package/dist/tests/bitcoin.test.js.map +1 -0
- package/dist/tests/coop-exit.test.d.ts +1 -0
- package/dist/tests/coop-exit.test.js +140 -0
- package/dist/tests/coop-exit.test.js.map +1 -0
- package/dist/tests/deposit.test.d.ts +1 -0
- package/dist/tests/deposit.test.js +57 -0
- package/dist/tests/deposit.test.js.map +1 -0
- package/dist/tests/keys.test.d.ts +1 -0
- package/dist/tests/keys.test.js +53 -0
- package/dist/tests/keys.test.js.map +1 -0
- package/dist/tests/lightning.test.d.ts +1 -0
- package/dist/tests/lightning.test.js +175 -0
- package/dist/tests/lightning.test.js.map +1 -0
- package/dist/tests/secret-sharing.test.d.ts +1 -0
- package/dist/tests/secret-sharing.test.js +41 -0
- package/dist/tests/secret-sharing.test.js.map +1 -0
- package/dist/tests/swap.test.d.ts +1 -0
- package/dist/tests/swap.test.js +131 -0
- package/dist/tests/swap.test.js.map +1 -0
- package/dist/tests/test-util.d.ts +24 -0
- package/dist/tests/test-util.js +137 -0
- package/dist/tests/test-util.js.map +1 -0
- package/dist/tests/tokens.test.d.ts +1 -0
- package/dist/tests/tokens.test.js +42 -0
- package/dist/tests/tokens.test.js.map +1 -0
- package/dist/tests/transfer.test.d.ts +1 -0
- package/dist/tests/transfer.test.js +175 -0
- package/dist/tests/transfer.test.js.map +1 -0
- package/dist/tests/tree-creation.test.d.ts +1 -0
- package/dist/tests/tree-creation.test.js +32 -0
- package/dist/tests/tree-creation.test.js.map +1 -0
- package/dist/tests/utils/spark-testing-wallet.d.ts +14 -0
- package/dist/tests/utils/spark-testing-wallet.js +13 -0
- package/dist/tests/utils/spark-testing-wallet.js.map +1 -0
- package/dist/tests/utils/test-faucet.d.ts +22 -0
- package/dist/tests/utils/test-faucet.js +148 -0
- package/dist/tests/utils/test-faucet.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/adaptor-signature.d.ts +7 -0
- package/dist/utils/adaptor-signature.js +114 -0
- package/dist/utils/adaptor-signature.js.map +1 -0
- package/dist/utils/bitcoin.d.ts +12 -0
- package/dist/utils/bitcoin.js +87 -0
- package/dist/utils/bitcoin.js.map +1 -0
- package/dist/utils/crypto.d.ts +1 -0
- package/dist/utils/crypto.js +14 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/index.d.ts +14 -0
- package/dist/utils/index.js +15 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/keys.d.ts +7 -0
- package/dist/utils/keys.js +68 -0
- package/dist/utils/keys.js.map +1 -0
- package/dist/utils/network.d.ts +11 -0
- package/dist/utils/network.js +26 -0
- package/dist/utils/network.js.map +1 -0
- package/dist/utils/proof.d.ts +1 -0
- package/dist/utils/proof.js +12 -0
- package/dist/utils/proof.js.map +1 -0
- package/dist/utils/response-validation.d.ts +1 -0
- package/dist/utils/response-validation.js +16 -0
- package/dist/utils/response-validation.js.map +1 -0
- package/dist/utils/secret-sharing.d.ts +26 -0
- package/dist/utils/secret-sharing.js +175 -0
- package/dist/utils/secret-sharing.js.map +1 -0
- package/dist/utils/signing.d.ts +12 -0
- package/dist/utils/signing.js +67 -0
- package/dist/utils/signing.js.map +1 -0
- package/dist/utils/token-hashing.d.ts +3 -0
- package/dist/utils/token-hashing.js +117 -0
- package/dist/utils/token-hashing.js.map +1 -0
- package/dist/utils/token-keyshares.d.ts +5 -0
- package/dist/utils/token-keyshares.js +17 -0
- package/dist/utils/token-keyshares.js.map +1 -0
- package/dist/utils/token-transactions.d.ts +5 -0
- package/dist/utils/token-transactions.js +40 -0
- package/dist/utils/token-transactions.js.map +1 -0
- package/dist/utils/transaction.d.ts +8 -0
- package/dist/utils/transaction.js +33 -0
- package/dist/utils/transaction.js.map +1 -0
- package/dist/utils/wasm-wrapper.d.ts +2 -0
- package/dist/utils/wasm-wrapper.js +36 -0
- package/dist/utils/wasm-wrapper.js.map +1 -0
- package/dist/utils/wasm.d.ts +54 -0
- package/dist/utils/wasm.js +26 -0
- package/dist/utils/wasm.js.map +1 -0
- package/dist/wasm/spark_bindings.d.ts +229 -0
- package/dist/wasm/spark_bindings.js +1097 -0
- package/dist/wasm/spark_bindings.js.map +1 -0
- package/dist/wasm/spark_bindings_bg.wasm +0 -0
- package/package.json +140 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { bytesToNumberBE, numberToBytesBE } from "@noble/curves/abstract/utils";
|
|
2
|
+
import { secp256k1 } from "@noble/curves/secp256k1";
|
|
3
|
+
import { sha256 } from "@scure/btc-signer/utils";
|
|
4
|
+
import { decode } from "light-bolt11-decoder";
|
|
5
|
+
import { InitiatePreimageSwapRequest_Reason, } from "../proto/spark.js";
|
|
6
|
+
import { getTxFromRawTxBytes } from "../utils/bitcoin.js";
|
|
7
|
+
import { getCrypto } from "../utils/crypto.js";
|
|
8
|
+
import { createRefundTx } from "../utils/transaction.js";
|
|
9
|
+
const crypto = getCrypto();
|
|
10
|
+
export class LightningService {
|
|
11
|
+
config;
|
|
12
|
+
connectionManager;
|
|
13
|
+
constructor(config, connectionManager) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.connectionManager = connectionManager;
|
|
16
|
+
}
|
|
17
|
+
async createLightningInvoice({ invoiceCreator, amountSats, memo, }) {
|
|
18
|
+
const randBytes = crypto.getRandomValues(new Uint8Array(32));
|
|
19
|
+
const preimage = numberToBytesBE(bytesToNumberBE(randBytes) % secp256k1.CURVE.n, 32);
|
|
20
|
+
return await this.createLightningInvoiceWithPreImage({
|
|
21
|
+
invoiceCreator,
|
|
22
|
+
amountSats,
|
|
23
|
+
memo,
|
|
24
|
+
preimage,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async createLightningInvoiceWithPreImage({ invoiceCreator, amountSats, memo, preimage, }) {
|
|
28
|
+
const paymentHash = sha256(preimage);
|
|
29
|
+
const invoice = await invoiceCreator(amountSats, paymentHash, memo);
|
|
30
|
+
if (!invoice) {
|
|
31
|
+
throw new Error("Error creating lightning invoice");
|
|
32
|
+
}
|
|
33
|
+
const shares = await this.config.signer.splitSecretWithProofs({
|
|
34
|
+
secret: preimage,
|
|
35
|
+
curveOrder: secp256k1.CURVE.n,
|
|
36
|
+
threshold: this.config.getConfig().threshold,
|
|
37
|
+
numShares: Object.keys(this.config.getConfig().signingOperators).length,
|
|
38
|
+
});
|
|
39
|
+
const errors = [];
|
|
40
|
+
const promises = Object.entries(this.config.getConfig().signingOperators).map(async ([_, operator]) => {
|
|
41
|
+
const share = shares[operator.id];
|
|
42
|
+
if (!share) {
|
|
43
|
+
throw new Error("Share not found");
|
|
44
|
+
}
|
|
45
|
+
const sparkClient = await this.connectionManager.createSparkClient(operator.address);
|
|
46
|
+
try {
|
|
47
|
+
await sparkClient.store_preimage_share({
|
|
48
|
+
paymentHash,
|
|
49
|
+
preimageShare: {
|
|
50
|
+
secretShare: numberToBytesBE(share.share, 32),
|
|
51
|
+
proofs: share.proofs,
|
|
52
|
+
},
|
|
53
|
+
threshold: this.config.getConfig().threshold,
|
|
54
|
+
invoiceString: invoice,
|
|
55
|
+
userIdentityPublicKey: await this.config.signer.getIdentityPublicKey(),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
errors.push(e);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
await Promise.all(promises);
|
|
63
|
+
if (errors.length > 0) {
|
|
64
|
+
throw new Error(`Error creating lightning invoice: ${errors[0]}`);
|
|
65
|
+
}
|
|
66
|
+
return invoice;
|
|
67
|
+
}
|
|
68
|
+
async swapNodesForPreimage({ leaves, receiverIdentityPubkey, paymentHash, invoiceString, isInboundPayment, }) {
|
|
69
|
+
const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
|
|
70
|
+
let signingCommitments;
|
|
71
|
+
try {
|
|
72
|
+
signingCommitments = await sparkClient.get_signing_commitments({
|
|
73
|
+
nodeIds: leaves.map((leaf) => leaf.leaf.id),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new Error(`Error getting signing commitments: ${error}`);
|
|
78
|
+
}
|
|
79
|
+
const userSignedRefunds = await this.signRefunds(leaves, signingCommitments.signingCommitments, receiverIdentityPubkey);
|
|
80
|
+
const transferId = crypto.randomUUID();
|
|
81
|
+
let bolt11String = "";
|
|
82
|
+
let amountSats = 0;
|
|
83
|
+
if (invoiceString) {
|
|
84
|
+
const decodedInvoice = decode(invoiceString);
|
|
85
|
+
let amountMsats = 0;
|
|
86
|
+
try {
|
|
87
|
+
amountMsats = Number(decodedInvoice.sections.find((section) => section.name === "amount")
|
|
88
|
+
?.value);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error("Error decoding invoice", error);
|
|
92
|
+
}
|
|
93
|
+
amountSats = amountMsats / 1000;
|
|
94
|
+
bolt11String = invoiceString;
|
|
95
|
+
}
|
|
96
|
+
const reason = isInboundPayment
|
|
97
|
+
? InitiatePreimageSwapRequest_Reason.REASON_RECEIVE
|
|
98
|
+
: InitiatePreimageSwapRequest_Reason.REASON_SEND;
|
|
99
|
+
let response;
|
|
100
|
+
try {
|
|
101
|
+
response = await sparkClient.initiate_preimage_swap({
|
|
102
|
+
paymentHash,
|
|
103
|
+
userSignedRefunds,
|
|
104
|
+
reason,
|
|
105
|
+
invoiceAmount: {
|
|
106
|
+
invoiceAmountProof: {
|
|
107
|
+
bolt11Invoice: bolt11String,
|
|
108
|
+
},
|
|
109
|
+
valueSats: amountSats,
|
|
110
|
+
},
|
|
111
|
+
transfer: {
|
|
112
|
+
transferId,
|
|
113
|
+
ownerIdentityPublicKey: await this.config.signer.getIdentityPublicKey(),
|
|
114
|
+
receiverIdentityPublicKey: receiverIdentityPubkey,
|
|
115
|
+
},
|
|
116
|
+
receiverIdentityPublicKey: receiverIdentityPubkey,
|
|
117
|
+
feeSats: 0,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new Error(`Error initiating preimage swap: ${error}`);
|
|
122
|
+
}
|
|
123
|
+
return response;
|
|
124
|
+
}
|
|
125
|
+
async queryUserSignedRefunds(paymentHash) {
|
|
126
|
+
const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
|
|
127
|
+
let response;
|
|
128
|
+
try {
|
|
129
|
+
response = await sparkClient.query_user_signed_refunds({
|
|
130
|
+
paymentHash,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
throw new Error(`Error querying user signed refunds: ${error}`);
|
|
135
|
+
}
|
|
136
|
+
return response.userSignedRefunds;
|
|
137
|
+
}
|
|
138
|
+
validateUserSignedRefund(userSignedRefund) {
|
|
139
|
+
const refundTx = getTxFromRawTxBytes(userSignedRefund.refundTx);
|
|
140
|
+
// TODO: Should we assert that the amount is always defined here?
|
|
141
|
+
return refundTx.getOutput(0).amount || 0n;
|
|
142
|
+
}
|
|
143
|
+
async providePreimage(preimage) {
|
|
144
|
+
const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
|
|
145
|
+
const paymentHash = sha256(preimage);
|
|
146
|
+
let response;
|
|
147
|
+
try {
|
|
148
|
+
response = await sparkClient.provide_preimage({
|
|
149
|
+
preimage,
|
|
150
|
+
paymentHash,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw new Error(`Error providing preimage: ${error}`);
|
|
155
|
+
}
|
|
156
|
+
if (!response.transfer) {
|
|
157
|
+
throw new Error("No transfer returned from coordinator");
|
|
158
|
+
}
|
|
159
|
+
return response.transfer;
|
|
160
|
+
}
|
|
161
|
+
async signRefunds(leaves, signingCommitments, receiverIdentityPubkey) {
|
|
162
|
+
const userSignedRefunds = [];
|
|
163
|
+
for (let i = 0; i < leaves.length; i++) {
|
|
164
|
+
const leaf = leaves[i];
|
|
165
|
+
if (!leaf?.leaf) {
|
|
166
|
+
throw new Error("Leaf not found in signRefunds");
|
|
167
|
+
}
|
|
168
|
+
const { refundTx, sighash } = createRefundTx(leaf.leaf, receiverIdentityPubkey, this.config.getNetwork());
|
|
169
|
+
const signingCommitment = await this.config.signer.getRandomSigningCommitment();
|
|
170
|
+
const signingNonceCommitments = signingCommitments[i]?.signingNonceCommitments;
|
|
171
|
+
if (!signingNonceCommitments) {
|
|
172
|
+
throw new Error("Signing nonce commitments not found in signRefunds");
|
|
173
|
+
}
|
|
174
|
+
const signingResult = await this.config.signer.signFrost({
|
|
175
|
+
message: sighash,
|
|
176
|
+
publicKey: leaf.signingPubKey,
|
|
177
|
+
privateAsPubKey: leaf.signingPubKey,
|
|
178
|
+
selfCommitment: signingCommitment,
|
|
179
|
+
statechainCommitments: signingNonceCommitments,
|
|
180
|
+
adaptorPubKey: new Uint8Array(),
|
|
181
|
+
verifyingKey: leaf.leaf.verifyingPublicKey,
|
|
182
|
+
});
|
|
183
|
+
userSignedRefunds.push({
|
|
184
|
+
nodeId: leaf.leaf.id,
|
|
185
|
+
refundTx: refundTx.toBytes(),
|
|
186
|
+
userSignature: signingResult,
|
|
187
|
+
userSignatureCommitment: signingCommitment,
|
|
188
|
+
signingCommitments: {
|
|
189
|
+
signingCommitments: signingNonceCommitments,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return userSignedRefunds;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=lightning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lightning.js","sourceRoot":"","sources":["../../src/services/lightning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LeafWithPreviousTransactionData, TokenTransaction } from "../proto/spark.js";
|
|
2
|
+
import { WalletConfigService } from "./config.js";
|
|
3
|
+
import { ConnectionManager } from "./connection.js";
|
|
4
|
+
export declare class TokenTransactionService {
|
|
5
|
+
protected readonly config: WalletConfigService;
|
|
6
|
+
protected readonly connectionManager: ConnectionManager;
|
|
7
|
+
constructor(config: WalletConfigService, connectionManager: ConnectionManager);
|
|
8
|
+
constructTransferTokenTransaction(selectedLeaves: LeafWithPreviousTransactionData[], recipientPublicKey: Uint8Array, tokenPublicKey: Uint8Array, tokenAmount: bigint): Promise<TokenTransaction>;
|
|
9
|
+
collectOperatorIdentityPublicKeys(): Uint8Array[];
|
|
10
|
+
broadcastTokenTransaction(tokenTransaction: TokenTransaction, leafToSpendSigningPublicKeys?: Uint8Array[], leafToSpendRevocationPublicKeys?: Uint8Array[]): Promise<TokenTransaction>;
|
|
11
|
+
finalizeTokenTransaction(finalTokenTransaction: TokenTransaction, leafToSpendRevocationKeys: Uint8Array[], threshold: number): Promise<TokenTransaction>;
|
|
12
|
+
constructConsolidateTokenTransaction(selectedLeaves: LeafWithPreviousTransactionData[], tokenPublicKey: Uint8Array): Promise<TokenTransaction>;
|
|
13
|
+
fetchOwnedTokenLeaves(ownerPublicKeys: Uint8Array[], tokenPublicKeys: Uint8Array[]): Promise<LeafWithPreviousTransactionData[]>;
|
|
14
|
+
syncTokenLeaves(tokenLeaves: Map<string, LeafWithPreviousTransactionData[]>): Promise<void>;
|
|
15
|
+
selectTokenLeaves(tokenLeaves: LeafWithPreviousTransactionData[], tokenAmount: bigint): LeafWithPreviousTransactionData[];
|
|
16
|
+
private signMessageWithKey;
|
|
17
|
+
}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { bytesToHex, bytesToNumberBE, numberToBytesBE, } from "@noble/curves/abstract/utils";
|
|
2
|
+
import { secp256k1 } from "@noble/curves/secp256k1";
|
|
3
|
+
import { validateResponses } from "../utils/response-validation.js";
|
|
4
|
+
import { hashOperatorSpecificTokenTransactionSignablePayload, hashTokenTransaction, } from "../utils/token-hashing.js";
|
|
5
|
+
import { recoverPrivateKeyFromKeyshares, } from "../utils/token-keyshares.js";
|
|
6
|
+
import { calculateAvailableTokenAmount, getTokenLeavesSum, } from "../utils/token-transactions.js";
|
|
7
|
+
export class TokenTransactionService {
|
|
8
|
+
config;
|
|
9
|
+
connectionManager;
|
|
10
|
+
constructor(config, connectionManager) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.connectionManager = connectionManager;
|
|
13
|
+
}
|
|
14
|
+
async constructTransferTokenTransaction(selectedLeaves, recipientPublicKey, tokenPublicKey, tokenAmount) {
|
|
15
|
+
let availableTokenAmount = calculateAvailableTokenAmount(selectedLeaves);
|
|
16
|
+
if (availableTokenAmount === tokenAmount) {
|
|
17
|
+
return {
|
|
18
|
+
tokenInput: {
|
|
19
|
+
$case: "transferInput",
|
|
20
|
+
transferInput: {
|
|
21
|
+
leavesToSpend: selectedLeaves.map((leaf) => ({
|
|
22
|
+
prevTokenTransactionHash: leaf.previousTransactionHash,
|
|
23
|
+
prevTokenTransactionLeafVout: leaf.previousTransactionVout,
|
|
24
|
+
})),
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
outputLeaves: [
|
|
28
|
+
{
|
|
29
|
+
ownerPublicKey: recipientPublicKey,
|
|
30
|
+
tokenPublicKey: tokenPublicKey,
|
|
31
|
+
tokenAmount: numberToBytesBE(tokenAmount, 16),
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
sparkOperatorIdentityPublicKeys: this.collectOperatorIdentityPublicKeys(),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const tokenAmountDifference = availableTokenAmount - tokenAmount;
|
|
39
|
+
return {
|
|
40
|
+
tokenInput: {
|
|
41
|
+
$case: "transferInput",
|
|
42
|
+
transferInput: {
|
|
43
|
+
leavesToSpend: selectedLeaves.map((leaf) => ({
|
|
44
|
+
prevTokenTransactionHash: leaf.previousTransactionHash,
|
|
45
|
+
prevTokenTransactionLeafVout: leaf.previousTransactionVout,
|
|
46
|
+
})),
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
outputLeaves: [
|
|
50
|
+
{
|
|
51
|
+
ownerPublicKey: recipientPublicKey,
|
|
52
|
+
tokenPublicKey: tokenPublicKey,
|
|
53
|
+
tokenAmount: numberToBytesBE(tokenAmount, 16),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
ownerPublicKey: await this.config.signer.getIdentityPublicKey(),
|
|
57
|
+
tokenPublicKey: tokenPublicKey,
|
|
58
|
+
tokenAmount: numberToBytesBE(tokenAmountDifference, 16),
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
sparkOperatorIdentityPublicKeys: this.collectOperatorIdentityPublicKeys(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
collectOperatorIdentityPublicKeys() {
|
|
66
|
+
const operatorKeys = [];
|
|
67
|
+
for (const [_, operator] of Object.entries(this.config.getConfig().signingOperators)) {
|
|
68
|
+
operatorKeys.push(operator.identityPublicKey);
|
|
69
|
+
}
|
|
70
|
+
return operatorKeys;
|
|
71
|
+
}
|
|
72
|
+
async broadcastTokenTransaction(tokenTransaction, leafToSpendSigningPublicKeys, leafToSpendRevocationPublicKeys) {
|
|
73
|
+
const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
|
|
74
|
+
const signingOperators = this.config.getConfig().signingOperators;
|
|
75
|
+
const partialTokenTransactionHash = hashTokenTransaction(tokenTransaction, true);
|
|
76
|
+
const ownerSignatures = [];
|
|
77
|
+
if (tokenTransaction.tokenInput.$case === "mintInput") {
|
|
78
|
+
const issuerPublicKey = tokenTransaction.tokenInput.mintInput.issuerPublicKey;
|
|
79
|
+
if (!issuerPublicKey) {
|
|
80
|
+
throw new Error("issuer public key cannot be nil");
|
|
81
|
+
}
|
|
82
|
+
const ownerSignature = await this.signMessageWithKey(partialTokenTransactionHash, issuerPublicKey);
|
|
83
|
+
ownerSignatures.push(ownerSignature);
|
|
84
|
+
}
|
|
85
|
+
else if (tokenTransaction.tokenInput.$case === "transferInput") {
|
|
86
|
+
const transferInput = tokenTransaction.tokenInput.transferInput;
|
|
87
|
+
if (!leafToSpendSigningPublicKeys || !leafToSpendRevocationPublicKeys) {
|
|
88
|
+
throw new Error("leafToSpendSigningPublicKeys and leafToSpendRevocationPublicKeys are required");
|
|
89
|
+
}
|
|
90
|
+
for (let i = 0; i < transferInput.leavesToSpend.length; i++) {
|
|
91
|
+
const key = leafToSpendSigningPublicKeys[i];
|
|
92
|
+
if (!key) {
|
|
93
|
+
throw new Error("key not found");
|
|
94
|
+
}
|
|
95
|
+
const ownerSignature = await this.signMessageWithKey(partialTokenTransactionHash, key);
|
|
96
|
+
ownerSignatures.push(ownerSignature);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Start the token transaction
|
|
100
|
+
const startResponse = await sparkClient.start_token_transaction({
|
|
101
|
+
identityPublicKey: await this.config.signer.getIdentityPublicKey(),
|
|
102
|
+
partialTokenTransaction: tokenTransaction,
|
|
103
|
+
tokenTransactionSignatures: {
|
|
104
|
+
ownerSignatures: ownerSignatures,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
// Validate keyshare configuration
|
|
108
|
+
if (startResponse.keyshareInfo?.ownerIdentifiers.length !==
|
|
109
|
+
Object.keys(signingOperators).length) {
|
|
110
|
+
throw new Error(`Keyshare operator count (${startResponse.keyshareInfo?.ownerIdentifiers.length}) does not match signing operator count (${Object.keys(signingOperators).length})`);
|
|
111
|
+
}
|
|
112
|
+
for (const identifier of startResponse.keyshareInfo?.ownerIdentifiers ||
|
|
113
|
+
[]) {
|
|
114
|
+
if (!signingOperators[identifier]) {
|
|
115
|
+
throw new Error(`Keyshare operator ${identifier} not found in signing operator list`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const finalTokenTransaction = startResponse.finalTokenTransaction;
|
|
119
|
+
const finalTokenTransactionHash = hashTokenTransaction(finalTokenTransaction, false);
|
|
120
|
+
const payload = {
|
|
121
|
+
finalTokenTransactionHash: finalTokenTransactionHash,
|
|
122
|
+
operatorIdentityPublicKey: await this.config.signer.getIdentityPublicKey(),
|
|
123
|
+
};
|
|
124
|
+
const payloadHash = await hashOperatorSpecificTokenTransactionSignablePayload(payload);
|
|
125
|
+
const operatorSpecificSignatures = [];
|
|
126
|
+
if (tokenTransaction.tokenInput.$case === "mintInput") {
|
|
127
|
+
const issuerPublicKey = tokenTransaction.tokenInput.mintInput.issuerPublicKey;
|
|
128
|
+
if (!issuerPublicKey) {
|
|
129
|
+
throw new Error("issuer public key cannot be nil");
|
|
130
|
+
}
|
|
131
|
+
const ownerSignature = await this.signMessageWithKey(payloadHash, issuerPublicKey);
|
|
132
|
+
operatorSpecificSignatures.push({
|
|
133
|
+
ownerPublicKey: issuerPublicKey,
|
|
134
|
+
ownerSignature: ownerSignature,
|
|
135
|
+
payload: payload,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
if (tokenTransaction.tokenInput.$case === "transferInput") {
|
|
139
|
+
const transferInput = tokenTransaction.tokenInput.transferInput;
|
|
140
|
+
for (let i = 0; i < transferInput.leavesToSpend.length; i++) {
|
|
141
|
+
const ownerSignature = await this.config.signer.signMessageWithIdentityKey(payloadHash);
|
|
142
|
+
operatorSpecificSignatures.push({
|
|
143
|
+
ownerPublicKey: await this.config.signer.getIdentityPublicKey(),
|
|
144
|
+
ownerSignature: ownerSignature,
|
|
145
|
+
payload: payload,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Submit sign_token_transaction to all SOs in parallel and track their indices
|
|
150
|
+
const soSignatures = await Promise.allSettled(Object.entries(signingOperators).map(async ([identifier, operator], index) => {
|
|
151
|
+
const internalSparkClient = await this.connectionManager.createSparkClient(operator.address);
|
|
152
|
+
const identityPublicKey = await this.config.signer.getIdentityPublicKey();
|
|
153
|
+
const response = await internalSparkClient.sign_token_transaction({
|
|
154
|
+
finalTokenTransaction,
|
|
155
|
+
operatorSpecificSignatures,
|
|
156
|
+
identityPublicKey,
|
|
157
|
+
});
|
|
158
|
+
return {
|
|
159
|
+
index,
|
|
160
|
+
identifier,
|
|
161
|
+
response,
|
|
162
|
+
};
|
|
163
|
+
}));
|
|
164
|
+
const threshold = startResponse.keyshareInfo.threshold;
|
|
165
|
+
const successfulSignatures = validateResponses(soSignatures);
|
|
166
|
+
if (tokenTransaction.tokenInput.$case === "transferInput") {
|
|
167
|
+
const leavesToSpend = tokenTransaction.tokenInput.transferInput.leavesToSpend;
|
|
168
|
+
let revocationKeys = [];
|
|
169
|
+
for (let leafIndex = 0; leafIndex < leavesToSpend.length; leafIndex++) {
|
|
170
|
+
// For each leaf, collect keyshares from all SOs that responded successfully
|
|
171
|
+
const leafKeyshares = successfulSignatures.map(({ identifier, response }) => ({
|
|
172
|
+
index: parseInt(identifier, 16),
|
|
173
|
+
keyshare: response.tokenTransactionRevocationKeyshares[leafIndex],
|
|
174
|
+
}));
|
|
175
|
+
if (leafKeyshares.length < threshold) {
|
|
176
|
+
throw new Error(`Insufficient keyshares for leaf ${leafIndex}: got ${leafKeyshares.length}, need ${threshold}`);
|
|
177
|
+
}
|
|
178
|
+
// Check for duplicate operator indices
|
|
179
|
+
const seenIndices = new Set();
|
|
180
|
+
for (const { index } of leafKeyshares) {
|
|
181
|
+
if (seenIndices.has(index)) {
|
|
182
|
+
throw new Error(`Duplicate operator index ${index} for leaf ${leafIndex}`);
|
|
183
|
+
}
|
|
184
|
+
seenIndices.add(index);
|
|
185
|
+
}
|
|
186
|
+
const recoveredPrivateKey = recoverPrivateKeyFromKeyshares(leafKeyshares, threshold);
|
|
187
|
+
const recoveredPublicKey = secp256k1.getPublicKey(recoveredPrivateKey, true);
|
|
188
|
+
if (!leafToSpendRevocationPublicKeys ||
|
|
189
|
+
!leafToSpendRevocationPublicKeys[leafIndex] ||
|
|
190
|
+
!recoveredPublicKey.every((byte, i) => byte === leafToSpendRevocationPublicKeys[leafIndex][i])) {
|
|
191
|
+
throw new Error(`Recovered public key does not match expected revocation public key for leaf ${leafIndex}`);
|
|
192
|
+
}
|
|
193
|
+
revocationKeys.push(recoveredPrivateKey);
|
|
194
|
+
}
|
|
195
|
+
// Finalize the token transaction with the keyshares
|
|
196
|
+
await this.finalizeTokenTransaction(finalTokenTransaction, revocationKeys, threshold);
|
|
197
|
+
}
|
|
198
|
+
return startResponse.finalTokenTransaction;
|
|
199
|
+
}
|
|
200
|
+
async finalizeTokenTransaction(finalTokenTransaction, leafToSpendRevocationKeys, threshold) {
|
|
201
|
+
const signingOperators = this.config.getConfig().signingOperators;
|
|
202
|
+
// Submit finalize_token_transaction to all SOs in parallel
|
|
203
|
+
const soResponses = await Promise.allSettled(Object.entries(signingOperators).map(async ([identifier, operator]) => {
|
|
204
|
+
const internalSparkClient = await this.connectionManager.createSparkClient(operator.address);
|
|
205
|
+
const identityPublicKey = await this.config.signer.getIdentityPublicKey();
|
|
206
|
+
const response = await internalSparkClient.finalize_token_transaction({
|
|
207
|
+
finalTokenTransaction,
|
|
208
|
+
leafToSpendRevocationKeys,
|
|
209
|
+
identityPublicKey,
|
|
210
|
+
});
|
|
211
|
+
return {
|
|
212
|
+
identifier,
|
|
213
|
+
response,
|
|
214
|
+
};
|
|
215
|
+
}));
|
|
216
|
+
validateResponses(soResponses);
|
|
217
|
+
return finalTokenTransaction;
|
|
218
|
+
}
|
|
219
|
+
async constructConsolidateTokenTransaction(selectedLeaves, tokenPublicKey) {
|
|
220
|
+
const tokenAmountSum = getTokenLeavesSum(selectedLeaves);
|
|
221
|
+
const transferTokenTransaction = {
|
|
222
|
+
tokenInput: {
|
|
223
|
+
$case: "transferInput",
|
|
224
|
+
transferInput: {
|
|
225
|
+
leavesToSpend: selectedLeaves.map((leaf) => ({
|
|
226
|
+
prevTokenTransactionHash: leaf.previousTransactionHash,
|
|
227
|
+
prevTokenTransactionLeafVout: leaf.previousTransactionVout,
|
|
228
|
+
})),
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
outputLeaves: [
|
|
232
|
+
{
|
|
233
|
+
ownerPublicKey: await this.config.signer.getIdentityPublicKey(),
|
|
234
|
+
tokenPublicKey: tokenPublicKey,
|
|
235
|
+
tokenAmount: numberToBytesBE(tokenAmountSum, 16),
|
|
236
|
+
},
|
|
237
|
+
],
|
|
238
|
+
sparkOperatorIdentityPublicKeys: this.collectOperatorIdentityPublicKeys(),
|
|
239
|
+
};
|
|
240
|
+
return transferTokenTransaction;
|
|
241
|
+
}
|
|
242
|
+
async fetchOwnedTokenLeaves(ownerPublicKeys, tokenPublicKeys) {
|
|
243
|
+
const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
|
|
244
|
+
const result = await sparkClient.get_owned_token_leaves({
|
|
245
|
+
ownerPublicKeys,
|
|
246
|
+
tokenPublicKeys,
|
|
247
|
+
});
|
|
248
|
+
return result.leavesWithPreviousTransactionData;
|
|
249
|
+
}
|
|
250
|
+
async syncTokenLeaves(tokenLeaves) {
|
|
251
|
+
const unsortedTokenLeaves = await this.fetchOwnedTokenLeaves(await this.config.signer.getTrackedPublicKeys(), []);
|
|
252
|
+
unsortedTokenLeaves.forEach((leaf) => {
|
|
253
|
+
const tokenKey = bytesToHex(leaf.leaf.tokenPublicKey);
|
|
254
|
+
const index = leaf.previousTransactionVout;
|
|
255
|
+
tokenLeaves.set(tokenKey, [{ ...leaf, previousTransactionVout: index }]);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
selectTokenLeaves(tokenLeaves, tokenAmount) {
|
|
259
|
+
if (calculateAvailableTokenAmount(tokenLeaves) < tokenAmount) {
|
|
260
|
+
throw new Error("Insufficient available token amount");
|
|
261
|
+
}
|
|
262
|
+
// First try to find an exact match
|
|
263
|
+
const exactMatch = tokenLeaves.find((item) => bytesToNumberBE(item.leaf.tokenAmount) === tokenAmount);
|
|
264
|
+
if (exactMatch) {
|
|
265
|
+
return [exactMatch];
|
|
266
|
+
}
|
|
267
|
+
// Sort by amount ascending for optimal selection.
|
|
268
|
+
// It's in user's interest to hold as little leaves as possible,
|
|
269
|
+
// so that in the event of a unilateral exit the fees are as low as possible
|
|
270
|
+
tokenLeaves.sort((a, b) => Number(bytesToNumberBE(a.leaf.tokenAmount) -
|
|
271
|
+
bytesToNumberBE(b.leaf.tokenAmount)));
|
|
272
|
+
let remainingAmount = tokenAmount;
|
|
273
|
+
const selectedLeaves = [];
|
|
274
|
+
// Select leaves using a greedy approach
|
|
275
|
+
for (const leafInfo of tokenLeaves) {
|
|
276
|
+
if (remainingAmount <= 0n)
|
|
277
|
+
break;
|
|
278
|
+
selectedLeaves.push(leafInfo);
|
|
279
|
+
remainingAmount -= bytesToNumberBE(leafInfo.leaf.tokenAmount);
|
|
280
|
+
}
|
|
281
|
+
if (remainingAmount > 0n) {
|
|
282
|
+
throw new Error("You do not have enough funds to complete the specified operation");
|
|
283
|
+
}
|
|
284
|
+
return selectedLeaves;
|
|
285
|
+
}
|
|
286
|
+
// Helper function for deciding if the signer public key is the identity public key
|
|
287
|
+
async signMessageWithKey(message, publicKey) {
|
|
288
|
+
if (bytesToHex(publicKey) ===
|
|
289
|
+
bytesToHex(await this.config.signer.getIdentityPublicKey())) {
|
|
290
|
+
return await this.config.signer.signMessageWithIdentityKey(message);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
return await this.config.signer.signMessageWithPublicKey(message, publicKey);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=token-transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-transactions.js","sourceRoot":"","sources":["../../src/services/token-transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Transaction } from "@scure/btc-signer";
|
|
2
|
+
import { LeafRefundTxSigningResult, NodeSignatures, QueryPendingTransfersResponse, Transfer, TreeNode } from "../proto/spark.js";
|
|
3
|
+
import { SigningCommitment } from "../signer/signer.js";
|
|
4
|
+
import { VerifiableSecretShare } from "../utils/secret-sharing.js";
|
|
5
|
+
import { WalletConfigService } from "./config.js";
|
|
6
|
+
import { ConnectionManager } from "./connection.js";
|
|
7
|
+
export type LeafKeyTweak = {
|
|
8
|
+
leaf: TreeNode;
|
|
9
|
+
signingPubKey: Uint8Array;
|
|
10
|
+
newSigningPubKey: Uint8Array;
|
|
11
|
+
};
|
|
12
|
+
export type ClaimLeafData = {
|
|
13
|
+
signingPubKey: Uint8Array;
|
|
14
|
+
tx?: Transaction;
|
|
15
|
+
refundTx?: Transaction;
|
|
16
|
+
signingNonceCommitment: SigningCommitment;
|
|
17
|
+
vout?: number;
|
|
18
|
+
};
|
|
19
|
+
export type LeafRefundSigningData = {
|
|
20
|
+
signingPubKey: Uint8Array;
|
|
21
|
+
receivingPubkey: Uint8Array;
|
|
22
|
+
tx: Transaction;
|
|
23
|
+
refundTx?: Transaction;
|
|
24
|
+
signingNonceCommitment: SigningCommitment;
|
|
25
|
+
vout: number;
|
|
26
|
+
};
|
|
27
|
+
export declare class BaseTransferService {
|
|
28
|
+
protected readonly config: WalletConfigService;
|
|
29
|
+
protected readonly connectionManager: ConnectionManager;
|
|
30
|
+
constructor(config: WalletConfigService, connectionManager: ConnectionManager);
|
|
31
|
+
sendTransferTweakKey(transfer: Transfer, leaves: LeafKeyTweak[], refundSignatureMap: Map<string, Uint8Array>): Promise<Transfer>;
|
|
32
|
+
signRefunds(leafDataMap: Map<string, ClaimLeafData>, operatorSigningResults: LeafRefundTxSigningResult[], adaptorPubKey?: Uint8Array): Promise<NodeSignatures[]>;
|
|
33
|
+
private prepareSendTransferKeyTweaks;
|
|
34
|
+
private prepareSingleSendTransferKeyTweak;
|
|
35
|
+
protected findShare(shares: VerifiableSecretShare[], operatorID: number): VerifiableSecretShare | undefined;
|
|
36
|
+
private compareTransfers;
|
|
37
|
+
}
|
|
38
|
+
export declare class TransferService extends BaseTransferService {
|
|
39
|
+
constructor(config: WalletConfigService, connectionManager: ConnectionManager);
|
|
40
|
+
sendTransfer(leaves: LeafKeyTweak[], receiverIdentityPubkey: Uint8Array, expiryTime: Date): Promise<Transfer>;
|
|
41
|
+
claimTransfer(transfer: Transfer, leaves: LeafKeyTweak[]): Promise<import("../proto/spark.js").FinalizeNodeSignaturesResponse>;
|
|
42
|
+
queryPendingTransfers(): Promise<QueryPendingTransfersResponse>;
|
|
43
|
+
verifyPendingTransfer(transfer: Transfer): Promise<Map<string, Uint8Array>>;
|
|
44
|
+
sendSwapSignRefund(leaves: LeafKeyTweak[], receiverIdentityPubkey: Uint8Array, expiryTime: Date, adaptorPubKey?: Uint8Array): Promise<{
|
|
45
|
+
transfer: Transfer;
|
|
46
|
+
signatureMap: Map<string, Uint8Array>;
|
|
47
|
+
leafDataMap: Map<string, LeafRefundSigningData>;
|
|
48
|
+
signingResults: LeafRefundTxSigningResult[];
|
|
49
|
+
}>;
|
|
50
|
+
sendTransferSignRefund(leaves: LeafKeyTweak[], receiverIdentityPubkey: Uint8Array, expiryTime: Date): Promise<{
|
|
51
|
+
transfer: Transfer;
|
|
52
|
+
signatureMap: Map<string, Uint8Array>;
|
|
53
|
+
leafDataMap: Map<string, LeafRefundSigningData>;
|
|
54
|
+
}>;
|
|
55
|
+
private prepareRefundSoSigningJobs;
|
|
56
|
+
claimTransferTweakKeys(transfer: Transfer, leaves: LeafKeyTweak[]): Promise<void>;
|
|
57
|
+
private prepareClaimLeavesKeyTweaks;
|
|
58
|
+
private prepareClaimLeafKeyTweaks;
|
|
59
|
+
claimTransferSignRefunds(transfer: Transfer, leafKeys: LeafKeyTweak[]): Promise<NodeSignatures[]>;
|
|
60
|
+
private finalizeTransfer;
|
|
61
|
+
cancelSendTransfer(transfer: Transfer): Promise<Transfer | undefined>;
|
|
62
|
+
queryPendingTransfersBySender(): Promise<QueryPendingTransfersResponse>;
|
|
63
|
+
}
|