@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,404 @@
|
|
|
1
|
+
import { Address, OutScript, Transaction } from "@scure/btc-signer";
|
|
2
|
+
import { sha256 } from "@scure/btc-signer/utils";
|
|
3
|
+
import { getP2TRAddressFromPublicKey, getSigHashFromTx, getTxFromRawTxBytes, getTxId, } from "../utils/bitcoin.js";
|
|
4
|
+
import { getNetwork } from "../utils/network.js";
|
|
5
|
+
const INITIAL_TIME_LOCK = 2000;
|
|
6
|
+
export class TreeCreationService {
|
|
7
|
+
config;
|
|
8
|
+
connectionManager;
|
|
9
|
+
constructor(config, connectionManager) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.connectionManager = connectionManager;
|
|
12
|
+
}
|
|
13
|
+
async generateDepositAddressForTree(vout, parentSigningPublicKey, parentTx, parentNode) {
|
|
14
|
+
if (!parentTx && !parentNode) {
|
|
15
|
+
throw new Error("No parent tx or parent node provided");
|
|
16
|
+
}
|
|
17
|
+
const id = parentNode?.id ?? getTxId(parentTx);
|
|
18
|
+
const tree = await this.createDepositAddressTree(parentSigningPublicKey, id);
|
|
19
|
+
const addressRequestNodes = this.createAddressRequestNodeFromTreeNodes(tree);
|
|
20
|
+
const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
|
|
21
|
+
const request = {
|
|
22
|
+
userIdentityPublicKey: await this.config.signer.getIdentityPublicKey(),
|
|
23
|
+
node: undefined,
|
|
24
|
+
};
|
|
25
|
+
if (parentNode) {
|
|
26
|
+
if (!parentNode.parentNodeId) {
|
|
27
|
+
throw new Error("Parent node ID is undefined");
|
|
28
|
+
}
|
|
29
|
+
request.source = {
|
|
30
|
+
$case: "parentNodeOutput",
|
|
31
|
+
parentNodeOutput: {
|
|
32
|
+
nodeId: parentNode.parentNodeId,
|
|
33
|
+
vout: vout,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
else if (parentTx) {
|
|
38
|
+
request.source = {
|
|
39
|
+
$case: "onChainUtxo",
|
|
40
|
+
onChainUtxo: {
|
|
41
|
+
vout: vout,
|
|
42
|
+
rawTx: parentTx.toBytes(),
|
|
43
|
+
network: this.config.getNetworkProto(),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
throw new Error("No parent node or parent tx provided");
|
|
49
|
+
}
|
|
50
|
+
request.node = {
|
|
51
|
+
userPublicKey: parentSigningPublicKey,
|
|
52
|
+
children: addressRequestNodes,
|
|
53
|
+
};
|
|
54
|
+
const root = {
|
|
55
|
+
address: undefined,
|
|
56
|
+
signingPublicKey: parentSigningPublicKey,
|
|
57
|
+
children: tree,
|
|
58
|
+
};
|
|
59
|
+
let response;
|
|
60
|
+
try {
|
|
61
|
+
response = await sparkClient.prepare_tree_address(request);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new Error(`Error preparing tree address: ${error}`);
|
|
65
|
+
}
|
|
66
|
+
if (!response.node) {
|
|
67
|
+
throw new Error("No node found in response");
|
|
68
|
+
}
|
|
69
|
+
this.applyAddressNodesToTree([root], [response.node]);
|
|
70
|
+
return root;
|
|
71
|
+
}
|
|
72
|
+
async createTree(vout, root, createLeaves, parentTx, parentNode) {
|
|
73
|
+
const request = {
|
|
74
|
+
userIdentityPublicKey: await this.config.signer.getIdentityPublicKey(),
|
|
75
|
+
node: undefined,
|
|
76
|
+
};
|
|
77
|
+
let tx;
|
|
78
|
+
if (parentTx) {
|
|
79
|
+
tx = parentTx;
|
|
80
|
+
request.source = {
|
|
81
|
+
$case: "onChainUtxo",
|
|
82
|
+
onChainUtxo: {
|
|
83
|
+
vout: vout,
|
|
84
|
+
rawTx: parentTx.toBytes(),
|
|
85
|
+
network: this.config.getNetworkProto(),
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
else if (parentNode) {
|
|
90
|
+
tx = getTxFromRawTxBytes(parentNode.nodeTx);
|
|
91
|
+
if (!parentNode.parentNodeId) {
|
|
92
|
+
throw new Error("Parent node ID is undefined");
|
|
93
|
+
}
|
|
94
|
+
request.source = {
|
|
95
|
+
$case: "parentNodeOutput",
|
|
96
|
+
parentNodeOutput: {
|
|
97
|
+
nodeId: parentNode.parentNodeId,
|
|
98
|
+
vout: vout,
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
throw new Error("No parent node or parent tx provided");
|
|
104
|
+
}
|
|
105
|
+
const rootCreationNode = await this.buildCreationNodesFromTree(vout, createLeaves, this.config.getNetwork(), root, tx);
|
|
106
|
+
request.node = rootCreationNode;
|
|
107
|
+
const sparkClient = await this.connectionManager.createSparkClient(this.config.getCoordinatorAddress());
|
|
108
|
+
let response;
|
|
109
|
+
try {
|
|
110
|
+
response = await sparkClient.create_tree(request);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new Error(`Error creating tree: ${error}`);
|
|
114
|
+
}
|
|
115
|
+
if (!response.node) {
|
|
116
|
+
throw new Error("No node found in response");
|
|
117
|
+
}
|
|
118
|
+
const creationResultTreeRoot = response.node;
|
|
119
|
+
const nodeSignatures = await this.signTreeCreation(tx, vout, root, rootCreationNode, creationResultTreeRoot);
|
|
120
|
+
let finalizeResp;
|
|
121
|
+
try {
|
|
122
|
+
finalizeResp = await sparkClient.finalize_node_signatures({
|
|
123
|
+
nodeSignatures: nodeSignatures,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
throw new Error(`Error finalizing node signatures in tree creation: ${error}`);
|
|
128
|
+
}
|
|
129
|
+
return finalizeResp;
|
|
130
|
+
}
|
|
131
|
+
async createDepositAddressTree(targetSigningPublicKey, nodeId) {
|
|
132
|
+
const leftKey = await this.config.signer.generatePublicKey(sha256(nodeId));
|
|
133
|
+
const leftNode = {
|
|
134
|
+
signingPublicKey: leftKey,
|
|
135
|
+
children: [],
|
|
136
|
+
};
|
|
137
|
+
const rightKey = await this.config.signer.subtractPrivateKeysGivenPublicKeys(targetSigningPublicKey, leftKey);
|
|
138
|
+
const rightNode = {
|
|
139
|
+
signingPublicKey: rightKey,
|
|
140
|
+
children: [],
|
|
141
|
+
};
|
|
142
|
+
return [leftNode, rightNode];
|
|
143
|
+
}
|
|
144
|
+
createAddressRequestNodeFromTreeNodes(treeNodes) {
|
|
145
|
+
const results = [];
|
|
146
|
+
for (const node of treeNodes) {
|
|
147
|
+
const result = {
|
|
148
|
+
userPublicKey: node.signingPublicKey,
|
|
149
|
+
children: this.createAddressRequestNodeFromTreeNodes(node.children),
|
|
150
|
+
};
|
|
151
|
+
results.push(result);
|
|
152
|
+
}
|
|
153
|
+
return results;
|
|
154
|
+
}
|
|
155
|
+
applyAddressNodesToTree(tree, addressNodes) {
|
|
156
|
+
for (let i = 0; i < tree.length; i++) {
|
|
157
|
+
if (!tree[i]) {
|
|
158
|
+
throw new Error("Tree or address node is undefined");
|
|
159
|
+
}
|
|
160
|
+
if (!addressNodes[i]) {
|
|
161
|
+
throw new Error("Address node is undefined");
|
|
162
|
+
}
|
|
163
|
+
// @ts-ignore
|
|
164
|
+
tree[i].address = addressNodes[i].address?.address;
|
|
165
|
+
// @ts-ignore
|
|
166
|
+
tree[i].verificationKey = addressNodes[i].address?.verifyingKey;
|
|
167
|
+
// @ts-ignore
|
|
168
|
+
this.applyAddressNodesToTree(tree[i].children, addressNodes[i].children);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async buildChildCreationNode(node, parentTx, vout, network) {
|
|
172
|
+
// internal node
|
|
173
|
+
const internalCreationNode = {
|
|
174
|
+
nodeTxSigningJob: undefined,
|
|
175
|
+
refundTxSigningJob: undefined,
|
|
176
|
+
children: [],
|
|
177
|
+
};
|
|
178
|
+
const tx = new Transaction();
|
|
179
|
+
tx.addInput({
|
|
180
|
+
txid: getTxId(parentTx),
|
|
181
|
+
index: vout,
|
|
182
|
+
});
|
|
183
|
+
const parentTxOut = parentTx.getOutput(vout);
|
|
184
|
+
if (!parentTxOut?.script || !parentTxOut?.amount) {
|
|
185
|
+
throw new Error("parentTxOut is undefined");
|
|
186
|
+
}
|
|
187
|
+
tx.addOutput({
|
|
188
|
+
script: parentTxOut.script,
|
|
189
|
+
amount: parentTxOut.amount,
|
|
190
|
+
});
|
|
191
|
+
// Add ephemeral anchor
|
|
192
|
+
tx.addOutput(this.ephemeralAnchorOutput());
|
|
193
|
+
const signingNonceCommitment = await this.config.signer.getRandomSigningCommitment();
|
|
194
|
+
const signingJob = {
|
|
195
|
+
signingPublicKey: node.signingPublicKey,
|
|
196
|
+
rawTx: tx.toBytes(),
|
|
197
|
+
signingNonceCommitment: signingNonceCommitment,
|
|
198
|
+
};
|
|
199
|
+
internalCreationNode.nodeTxSigningCommitment = signingNonceCommitment;
|
|
200
|
+
internalCreationNode.nodeTxSigningJob = signingJob;
|
|
201
|
+
// leaf node
|
|
202
|
+
const sequence = (1 << 30) | INITIAL_TIME_LOCK;
|
|
203
|
+
const childCreationNode = {
|
|
204
|
+
nodeTxSigningJob: undefined,
|
|
205
|
+
refundTxSigningJob: undefined,
|
|
206
|
+
children: [],
|
|
207
|
+
};
|
|
208
|
+
const childTx = new Transaction();
|
|
209
|
+
childTx.addInput({
|
|
210
|
+
txid: getTxId(tx),
|
|
211
|
+
index: 0,
|
|
212
|
+
sequence,
|
|
213
|
+
});
|
|
214
|
+
childTx.addOutput({
|
|
215
|
+
script: parentTxOut.script,
|
|
216
|
+
amount: parentTxOut.amount,
|
|
217
|
+
});
|
|
218
|
+
// Add ephemeral anchor
|
|
219
|
+
childTx.addOutput(this.ephemeralAnchorOutput());
|
|
220
|
+
const childSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
|
|
221
|
+
const childSigningJob = {
|
|
222
|
+
signingPublicKey: node.signingPublicKey,
|
|
223
|
+
rawTx: childTx.toBytes(),
|
|
224
|
+
signingNonceCommitment: childSigningNonceCommitment,
|
|
225
|
+
};
|
|
226
|
+
childCreationNode.nodeTxSigningCommitment = childSigningNonceCommitment;
|
|
227
|
+
childCreationNode.nodeTxSigningJob = childSigningJob;
|
|
228
|
+
const refundTx = new Transaction();
|
|
229
|
+
refundTx.addInput({
|
|
230
|
+
txid: getTxId(childTx),
|
|
231
|
+
index: 0,
|
|
232
|
+
sequence,
|
|
233
|
+
});
|
|
234
|
+
const refundP2trAddress = getP2TRAddressFromPublicKey(node.signingPublicKey, network);
|
|
235
|
+
const refundAddress = Address(getNetwork(network)).decode(refundP2trAddress);
|
|
236
|
+
const refundPkScript = OutScript.encode(refundAddress);
|
|
237
|
+
refundTx.addOutput({
|
|
238
|
+
script: refundPkScript,
|
|
239
|
+
amount: parentTxOut.amount,
|
|
240
|
+
});
|
|
241
|
+
const refundSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
|
|
242
|
+
const refundSigningJob = {
|
|
243
|
+
signingPublicKey: node.signingPublicKey,
|
|
244
|
+
rawTx: refundTx.toBytes(),
|
|
245
|
+
signingNonceCommitment: refundSigningNonceCommitment,
|
|
246
|
+
};
|
|
247
|
+
childCreationNode.refundTxSigningCommitment = refundSigningNonceCommitment;
|
|
248
|
+
childCreationNode.refundTxSigningJob = refundSigningJob;
|
|
249
|
+
internalCreationNode.children.push(childCreationNode);
|
|
250
|
+
return internalCreationNode;
|
|
251
|
+
}
|
|
252
|
+
ephemeralAnchorOutput() {
|
|
253
|
+
return {
|
|
254
|
+
script: new Uint8Array([0x51]), // OP_TRUE
|
|
255
|
+
amount: 0n,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
async buildCreationNodesFromTree(vout, createLeaves, network, root, parentTx) {
|
|
259
|
+
const parentTxOutput = parentTx.getOutput(vout);
|
|
260
|
+
if (!parentTxOutput?.script || !parentTxOutput?.amount) {
|
|
261
|
+
throw new Error("parentTxOutput is undefined");
|
|
262
|
+
}
|
|
263
|
+
const rootNodeTx = new Transaction();
|
|
264
|
+
rootNodeTx.addInput({
|
|
265
|
+
txid: getTxId(parentTx),
|
|
266
|
+
index: vout,
|
|
267
|
+
});
|
|
268
|
+
for (let i = 0; i < root.children.length; i++) {
|
|
269
|
+
const child = root.children[i];
|
|
270
|
+
if (!child || !child.address) {
|
|
271
|
+
throw new Error("child address is undefined");
|
|
272
|
+
}
|
|
273
|
+
const childAddress = Address(getNetwork(network)).decode(child.address);
|
|
274
|
+
const childPkScript = OutScript.encode(childAddress);
|
|
275
|
+
rootNodeTx.addOutput({
|
|
276
|
+
script: childPkScript,
|
|
277
|
+
amount: parentTxOutput.amount / 2n,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
// Add ephemeral anchor output
|
|
281
|
+
const anchor = this.ephemeralAnchorOutput();
|
|
282
|
+
rootNodeTx.addOutput(anchor);
|
|
283
|
+
const rootNodeSigningCommitment = await this.config.signer.getRandomSigningCommitment();
|
|
284
|
+
const rootNodeSigningJob = {
|
|
285
|
+
signingPublicKey: root.signingPublicKey,
|
|
286
|
+
rawTx: rootNodeTx.toBytes(),
|
|
287
|
+
signingNonceCommitment: rootNodeSigningCommitment,
|
|
288
|
+
};
|
|
289
|
+
const rootCreationNode = {
|
|
290
|
+
nodeTxSigningJob: rootNodeSigningJob,
|
|
291
|
+
refundTxSigningJob: undefined,
|
|
292
|
+
children: [],
|
|
293
|
+
};
|
|
294
|
+
rootCreationNode.nodeTxSigningCommitment = rootNodeSigningCommitment;
|
|
295
|
+
const leftChild = root.children[0];
|
|
296
|
+
const rightChild = root.children[1];
|
|
297
|
+
if (!leftChild || !rightChild) {
|
|
298
|
+
throw new Error("Root children are undefined");
|
|
299
|
+
}
|
|
300
|
+
const leftChildCreationNode = await this.buildChildCreationNode(leftChild, rootNodeTx, 0, network);
|
|
301
|
+
const rightChildCreationNode = await this.buildChildCreationNode(rightChild, rootNodeTx, 1, network);
|
|
302
|
+
rootCreationNode.children.push(leftChildCreationNode);
|
|
303
|
+
rootCreationNode.children.push(rightChildCreationNode);
|
|
304
|
+
return rootCreationNode;
|
|
305
|
+
}
|
|
306
|
+
async signNodeCreation(parentTx, vout, internalNode, creationNode, creationResponseNode) {
|
|
307
|
+
if (!creationNode.nodeTxSigningJob?.signingPublicKey ||
|
|
308
|
+
!internalNode.verificationKey) {
|
|
309
|
+
throw new Error("signingPublicKey or verificationKey is undefined");
|
|
310
|
+
}
|
|
311
|
+
const parentTxOutput = parentTx.getOutput(vout);
|
|
312
|
+
if (!parentTxOutput) {
|
|
313
|
+
throw new Error("parentTxOutput is undefined");
|
|
314
|
+
}
|
|
315
|
+
const tx = getTxFromRawTxBytes(creationNode.nodeTxSigningJob.rawTx);
|
|
316
|
+
const txSighash = getSigHashFromTx(tx, 0, parentTxOutput);
|
|
317
|
+
let nodeTxSignature = new Uint8Array();
|
|
318
|
+
if (creationNode.nodeTxSigningCommitment) {
|
|
319
|
+
const userSignature = await this.config.signer.signFrost({
|
|
320
|
+
message: txSighash,
|
|
321
|
+
publicKey: creationNode.nodeTxSigningJob.signingPublicKey,
|
|
322
|
+
privateAsPubKey: internalNode.signingPublicKey,
|
|
323
|
+
selfCommitment: creationNode.nodeTxSigningCommitment,
|
|
324
|
+
statechainCommitments: creationResponseNode.nodeTxSigningResult?.signingNonceCommitments,
|
|
325
|
+
verifyingKey: internalNode.verificationKey,
|
|
326
|
+
});
|
|
327
|
+
nodeTxSignature = await this.config.signer.aggregateFrost({
|
|
328
|
+
message: txSighash,
|
|
329
|
+
statechainSignatures: creationResponseNode.nodeTxSigningResult?.signatureShares,
|
|
330
|
+
statechainPublicKeys: creationResponseNode.nodeTxSigningResult?.publicKeys,
|
|
331
|
+
verifyingKey: internalNode.verificationKey,
|
|
332
|
+
statechainCommitments: creationResponseNode.nodeTxSigningResult?.signingNonceCommitments,
|
|
333
|
+
selfCommitment: creationNode.nodeTxSigningCommitment,
|
|
334
|
+
selfSignature: userSignature,
|
|
335
|
+
publicKey: internalNode.signingPublicKey,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
let refundTxSignature = new Uint8Array();
|
|
339
|
+
if (creationNode.refundTxSigningCommitment) {
|
|
340
|
+
const rawTx = creationNode.refundTxSigningJob?.rawTx;
|
|
341
|
+
if (!rawTx) {
|
|
342
|
+
throw new Error("rawTx is undefined");
|
|
343
|
+
}
|
|
344
|
+
if (!creationNode.refundTxSigningJob?.signingPublicKey) {
|
|
345
|
+
throw new Error("signingPublicKey is undefined");
|
|
346
|
+
}
|
|
347
|
+
const refundTx = getTxFromRawTxBytes(rawTx);
|
|
348
|
+
const refundTxSighash = getSigHashFromTx(refundTx, 0, parentTxOutput);
|
|
349
|
+
const refundSigningResponse = await this.config.signer.signFrost({
|
|
350
|
+
message: refundTxSighash,
|
|
351
|
+
publicKey: creationNode.refundTxSigningJob.signingPublicKey,
|
|
352
|
+
privateAsPubKey: internalNode.signingPublicKey,
|
|
353
|
+
selfCommitment: creationNode.refundTxSigningCommitment,
|
|
354
|
+
statechainCommitments: creationResponseNode.refundTxSigningResult?.signingNonceCommitments,
|
|
355
|
+
verifyingKey: internalNode.verificationKey,
|
|
356
|
+
});
|
|
357
|
+
refundTxSignature = await this.config.signer.aggregateFrost({
|
|
358
|
+
message: refundTxSighash,
|
|
359
|
+
statechainSignatures: creationResponseNode.refundTxSigningResult?.signatureShares,
|
|
360
|
+
statechainPublicKeys: creationResponseNode.refundTxSigningResult?.publicKeys,
|
|
361
|
+
verifyingKey: internalNode.verificationKey,
|
|
362
|
+
statechainCommitments: creationResponseNode.refundTxSigningResult?.signingNonceCommitments,
|
|
363
|
+
selfCommitment: creationNode.refundTxSigningCommitment,
|
|
364
|
+
selfSignature: refundSigningResponse,
|
|
365
|
+
publicKey: internalNode.signingPublicKey,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
tx: tx,
|
|
370
|
+
signature: {
|
|
371
|
+
nodeId: creationResponseNode.nodeId,
|
|
372
|
+
nodeTxSignature: nodeTxSignature,
|
|
373
|
+
refundTxSignature: refundTxSignature,
|
|
374
|
+
},
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
async signTreeCreation(tx, vout, root, rootCreationNode, creationResultTreeRoot) {
|
|
378
|
+
const rootSignature = await this.signNodeCreation(tx, vout, root, rootCreationNode, creationResultTreeRoot);
|
|
379
|
+
const firstRootChild = root.children[0];
|
|
380
|
+
const secondRootChild = root.children[1];
|
|
381
|
+
const firstRootChildCreationNode = rootCreationNode.children[0];
|
|
382
|
+
const secondRootChildCreationNode = rootCreationNode.children[1];
|
|
383
|
+
const firstRootChildCreationResult = creationResultTreeRoot.children[0];
|
|
384
|
+
const secondRootChildCreationResult = creationResultTreeRoot.children[1];
|
|
385
|
+
if (!firstRootChild || !secondRootChild) {
|
|
386
|
+
throw new Error("Root children are undefined");
|
|
387
|
+
}
|
|
388
|
+
if (!firstRootChildCreationNode || !secondRootChildCreationNode) {
|
|
389
|
+
throw new Error("Root child creation nodes are undefined");
|
|
390
|
+
}
|
|
391
|
+
if (!firstRootChildCreationResult || !secondRootChildCreationResult) {
|
|
392
|
+
throw new Error("Root child creation results are undefined");
|
|
393
|
+
}
|
|
394
|
+
const leftChildSignature = await this.signNodeCreation(rootSignature.tx, 0, firstRootChild, firstRootChildCreationNode, firstRootChildCreationResult);
|
|
395
|
+
const rightChildSignature = await this.signNodeCreation(rootSignature.tx, 1, secondRootChild, secondRootChildCreationNode, secondRootChildCreationResult);
|
|
396
|
+
const signatures = [
|
|
397
|
+
rootSignature.signature,
|
|
398
|
+
leftChildSignature.signature,
|
|
399
|
+
rightChildSignature.signature,
|
|
400
|
+
];
|
|
401
|
+
return signatures;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=tree-creation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-creation.js","sourceRoot":"","sources":["../../src/services/tree-creation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { TreeNode } from "../proto/spark.js";
|
|
2
|
+
import { VerifiableSecretShare } from "../utils/secret-sharing.js";
|
|
3
|
+
export type SigningNonce = {
|
|
4
|
+
binding: Uint8Array;
|
|
5
|
+
hiding: Uint8Array;
|
|
6
|
+
};
|
|
7
|
+
export type SigningCommitment = {
|
|
8
|
+
binding: Uint8Array;
|
|
9
|
+
hiding: Uint8Array;
|
|
10
|
+
};
|
|
11
|
+
export type SignFrostParams = {
|
|
12
|
+
message: Uint8Array;
|
|
13
|
+
privateAsPubKey: Uint8Array;
|
|
14
|
+
publicKey: Uint8Array;
|
|
15
|
+
verifyingKey: Uint8Array;
|
|
16
|
+
selfCommitment: SigningCommitment;
|
|
17
|
+
statechainCommitments?: {
|
|
18
|
+
[key: string]: SigningCommitment;
|
|
19
|
+
} | undefined;
|
|
20
|
+
adaptorPubKey?: Uint8Array | undefined;
|
|
21
|
+
};
|
|
22
|
+
export type AggregateFrostParams = Omit<SignFrostParams, "privateAsPubKey"> & {
|
|
23
|
+
selfSignature: Uint8Array;
|
|
24
|
+
statechainSignatures?: {
|
|
25
|
+
[key: string]: Uint8Array;
|
|
26
|
+
} | undefined;
|
|
27
|
+
statechainPublicKeys?: {
|
|
28
|
+
[key: string]: Uint8Array;
|
|
29
|
+
} | undefined;
|
|
30
|
+
};
|
|
31
|
+
export type SplitSecretWithProofsParams = {
|
|
32
|
+
secret: Uint8Array;
|
|
33
|
+
curveOrder: bigint;
|
|
34
|
+
threshold: number;
|
|
35
|
+
numShares: number;
|
|
36
|
+
isSecretPubkey?: boolean;
|
|
37
|
+
};
|
|
38
|
+
interface SparkSigner {
|
|
39
|
+
getIdentityPublicKey(): Promise<Uint8Array>;
|
|
40
|
+
generateMnemonic(): Promise<string>;
|
|
41
|
+
createSparkWalletFromMnemonic(mnemonic: string): Promise<string>;
|
|
42
|
+
createSparkWalletFromSeed(seed: Uint8Array | string): Promise<string>;
|
|
43
|
+
restoreSigningKeysFromLeafs(leafs: TreeNode[]): Promise<void>;
|
|
44
|
+
getTrackedPublicKeys(): Promise<Uint8Array[]>;
|
|
45
|
+
generatePublicKey(hash?: Uint8Array): Promise<Uint8Array>;
|
|
46
|
+
removePublicKey(publicKey: Uint8Array): Promise<void>;
|
|
47
|
+
getSchnorrPublicKey(publicKey: Uint8Array): Promise<Uint8Array>;
|
|
48
|
+
signSchnorr(message: Uint8Array, publicKey: Uint8Array): Promise<Uint8Array>;
|
|
49
|
+
subtractPrivateKeysGivenPublicKeys(first: Uint8Array, second: Uint8Array): Promise<Uint8Array>;
|
|
50
|
+
splitSecretWithProofs(params: SplitSecretWithProofsParams): Promise<VerifiableSecretShare[]>;
|
|
51
|
+
signFrost(params: SignFrostParams): Promise<Uint8Array>;
|
|
52
|
+
aggregateFrost(params: AggregateFrostParams): Promise<Uint8Array>;
|
|
53
|
+
signMessageWithPublicKey(message: Uint8Array, publicKey: Uint8Array, compact?: boolean): Promise<Uint8Array>;
|
|
54
|
+
signMessageWithIdentityKey(message: Uint8Array, compact?: boolean): Promise<Uint8Array>;
|
|
55
|
+
encryptLeafPrivateKeyEcies(receiverPublicKey: Uint8Array, publicKey: Uint8Array): Promise<Uint8Array>;
|
|
56
|
+
decryptEcies(ciphertext: Uint8Array): Promise<Uint8Array>;
|
|
57
|
+
getRandomSigningCommitment(): Promise<SigningCommitment>;
|
|
58
|
+
getSspIdentityPublicKey(): Promise<Uint8Array>;
|
|
59
|
+
hashRandomPrivateKey(): Promise<Uint8Array>;
|
|
60
|
+
generateAdaptorFromSignature(signature: Uint8Array): Promise<{
|
|
61
|
+
adaptorSignature: Uint8Array;
|
|
62
|
+
adaptorPublicKey: Uint8Array;
|
|
63
|
+
}>;
|
|
64
|
+
}
|
|
65
|
+
declare class DefaultSparkSigner implements SparkSigner {
|
|
66
|
+
private identityPrivateKey;
|
|
67
|
+
private publicKeyToPrivateKeyMap;
|
|
68
|
+
private commitmentToNonceMap;
|
|
69
|
+
private deriveSigningKey;
|
|
70
|
+
restoreSigningKeysFromLeafs(leafs: TreeNode[]): Promise<void>;
|
|
71
|
+
getSchnorrPublicKey(publicKey: Uint8Array): Promise<Uint8Array>;
|
|
72
|
+
signSchnorr(message: Uint8Array, publicKey: Uint8Array): Promise<Uint8Array>;
|
|
73
|
+
getIdentityPublicKey(): Promise<Uint8Array>;
|
|
74
|
+
generateMnemonic(): Promise<string>;
|
|
75
|
+
createSparkWalletFromMnemonic(mnemonic: string): Promise<string>;
|
|
76
|
+
getTrackedPublicKeys(): Promise<Uint8Array[]>;
|
|
77
|
+
generatePublicKey(hash?: Uint8Array): Promise<Uint8Array>;
|
|
78
|
+
removePublicKey(publicKey: Uint8Array): Promise<void>;
|
|
79
|
+
subtractPrivateKeysGivenPublicKeys(first: Uint8Array, second: Uint8Array): Promise<Uint8Array>;
|
|
80
|
+
splitSecretWithProofs({ secret, curveOrder, threshold, numShares, isSecretPubkey, }: SplitSecretWithProofsParams): Promise<VerifiableSecretShare[]>;
|
|
81
|
+
signFrost({ message, privateAsPubKey, publicKey, verifyingKey, selfCommitment, statechainCommitments, adaptorPubKey, }: SignFrostParams): Promise<Uint8Array>;
|
|
82
|
+
aggregateFrost({ message, publicKey, verifyingKey, selfCommitment, statechainCommitments, adaptorPubKey, selfSignature, statechainSignatures, statechainPublicKeys, }: AggregateFrostParams): Promise<Uint8Array>;
|
|
83
|
+
createSparkWalletFromSeed(seed: Uint8Array): Promise<string>;
|
|
84
|
+
signMessageWithPublicKey(message: Uint8Array, publicKey: Uint8Array, compact?: boolean): Promise<Uint8Array>;
|
|
85
|
+
signMessageWithIdentityKey(message: Uint8Array, compact?: boolean): Promise<Uint8Array>;
|
|
86
|
+
encryptLeafPrivateKeyEcies(receiverPublicKey: Uint8Array, publicKey: Uint8Array): Promise<Uint8Array>;
|
|
87
|
+
decryptEcies(ciphertext: Uint8Array): Promise<Uint8Array>;
|
|
88
|
+
getRandomSigningCommitment(): Promise<SigningCommitment>;
|
|
89
|
+
getSspIdentityPublicKey(): Promise<Uint8Array>;
|
|
90
|
+
hashRandomPrivateKey(): Promise<Uint8Array>;
|
|
91
|
+
generateAdaptorFromSignature(signature: Uint8Array): Promise<{
|
|
92
|
+
adaptorSignature: Uint8Array;
|
|
93
|
+
adaptorPublicKey: Uint8Array;
|
|
94
|
+
}>;
|
|
95
|
+
}
|
|
96
|
+
export { DefaultSparkSigner };
|
|
97
|
+
export type { SparkSigner };
|