@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,175 @@
|
|
|
1
|
+
//@ts-nocheck
|
|
2
|
+
import { describe, expect, it } from "@jest/globals";
|
|
3
|
+
import { bytesToHex, equalBytes, hexToBytes, } from "@noble/curves/abstract/utils";
|
|
4
|
+
import { sha256 } from "@scure/btc-signer/utils";
|
|
5
|
+
import { WalletConfigService } from "../services/config.js";
|
|
6
|
+
import { ConnectionManager } from "../services/connection.js";
|
|
7
|
+
import { TransferService } from "../services/transfer.js";
|
|
8
|
+
import { Network } from "../utils/network.js";
|
|
9
|
+
import { createNewTree } from "./test-util.js";
|
|
10
|
+
import { SparkWalletTesting } from "./utils/spark-testing-wallet.js";
|
|
11
|
+
import { BitcoinFaucet } from "./utils/test-faucet.js";
|
|
12
|
+
describe("Transfer", () => {
|
|
13
|
+
// Skip all tests if running in GitHub Actions
|
|
14
|
+
const testFn = process.env.GITHUB_ACTIONS ? it.skip : it;
|
|
15
|
+
testFn("test transfer", async () => {
|
|
16
|
+
const faucet = new BitcoinFaucet("http://127.0.0.1:18443", "admin1", "123");
|
|
17
|
+
const senderWallet = new SparkWalletTesting(Network.LOCAL);
|
|
18
|
+
await senderWallet.initWalletFromMnemonic();
|
|
19
|
+
const senderConfigService = new WalletConfigService(Network.LOCAL, senderWallet.getSigner());
|
|
20
|
+
const senderConnectionManager = new ConnectionManager(senderConfigService);
|
|
21
|
+
const senderTransferService = new TransferService(senderConfigService, senderConnectionManager);
|
|
22
|
+
const leafPubKey = await senderWallet.getSigner().generatePublicKey();
|
|
23
|
+
const rootNode = await createNewTree(senderWallet, leafPubKey, faucet, 1000n);
|
|
24
|
+
const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
|
|
25
|
+
const receiverWallet = new SparkWalletTesting(Network.LOCAL);
|
|
26
|
+
await receiverWallet.initWalletFromMnemonic();
|
|
27
|
+
const receiverPubkey = await receiverWallet.getIdentityPublicKey();
|
|
28
|
+
const receiverConfigService = new WalletConfigService(Network.LOCAL, receiverWallet.getSigner());
|
|
29
|
+
const receiverConnectionManager = new ConnectionManager(receiverConfigService);
|
|
30
|
+
const receiverTransferService = new TransferService(receiverConfigService, receiverConnectionManager);
|
|
31
|
+
const transferNode = {
|
|
32
|
+
leaf: rootNode,
|
|
33
|
+
signingPubKey: leafPubKey,
|
|
34
|
+
newSigningPubKey: newLeafPubKey,
|
|
35
|
+
};
|
|
36
|
+
const senderTransfer = await senderTransferService.sendTransfer([transferNode], hexToBytes(receiverPubkey), new Date(Date.now() + 10 * 60 * 1000));
|
|
37
|
+
const pendingTransfer = await receiverWallet.queryPendingTransfers();
|
|
38
|
+
expect(pendingTransfer.transfers.length).toBe(1);
|
|
39
|
+
const receiverTransfer = pendingTransfer.transfers[0];
|
|
40
|
+
expect(receiverTransfer.id).toBe(senderTransfer.id);
|
|
41
|
+
const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(receiverTransfer);
|
|
42
|
+
expect(leafPrivKeyMap.size).toBe(1);
|
|
43
|
+
const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
|
|
44
|
+
expect(leafPrivKeyMapBytes).toBeDefined();
|
|
45
|
+
expect(bytesToHex(leafPrivKeyMapBytes)).toBe(bytesToHex(newLeafPubKey));
|
|
46
|
+
const finalLeafPubKey = await receiverWallet
|
|
47
|
+
.getSigner()
|
|
48
|
+
.generatePublicKey(sha256(rootNode.id));
|
|
49
|
+
const claimingNode = {
|
|
50
|
+
leaf: rootNode,
|
|
51
|
+
signingPubKey: newLeafPubKey,
|
|
52
|
+
newSigningPubKey: finalLeafPubKey,
|
|
53
|
+
};
|
|
54
|
+
await receiverTransferService.claimTransfer(receiverTransfer, [
|
|
55
|
+
claimingNode,
|
|
56
|
+
]);
|
|
57
|
+
const newReceiverWallet = new SparkWalletTesting(Network.LOCAL);
|
|
58
|
+
await newReceiverWallet.initWalletFromMnemonic();
|
|
59
|
+
const newReceiverPubkey = await newReceiverWallet.getIdentityPublicKey();
|
|
60
|
+
await receiverWallet.sendTransfer({
|
|
61
|
+
amount: 1000,
|
|
62
|
+
receiverPubKey: hexToBytes(newReceiverPubkey),
|
|
63
|
+
});
|
|
64
|
+
const newPendingTransfer = await newReceiverWallet.queryPendingTransfers();
|
|
65
|
+
expect(newPendingTransfer.transfers.length).toBe(1);
|
|
66
|
+
await newReceiverWallet.getBalance();
|
|
67
|
+
}, 30000);
|
|
68
|
+
testFn("test transfer with separate", async () => {
|
|
69
|
+
const faucet = new BitcoinFaucet("http://127.0.0.1:18443", "admin1", "123");
|
|
70
|
+
const senderWallet = new SparkWalletTesting(Network.LOCAL);
|
|
71
|
+
await senderWallet.initWalletFromMnemonic();
|
|
72
|
+
const senderConfigService = new WalletConfigService(Network.LOCAL, senderWallet.getSigner());
|
|
73
|
+
const senderConnectionManager = new ConnectionManager(senderConfigService);
|
|
74
|
+
const senderTransferService = new TransferService(senderConfigService, senderConnectionManager);
|
|
75
|
+
const receiverWallet = new SparkWalletTesting(Network.LOCAL);
|
|
76
|
+
await receiverWallet.initWalletFromMnemonic();
|
|
77
|
+
const receiverPubkey = await receiverWallet.getIdentityPublicKey();
|
|
78
|
+
const receiverConfigService = new WalletConfigService(Network.LOCAL, receiverWallet.getSigner());
|
|
79
|
+
const receiverConnectionManager = new ConnectionManager(receiverConfigService);
|
|
80
|
+
const receiverTransferService = new TransferService(receiverConfigService, receiverConnectionManager);
|
|
81
|
+
const leafPubKey = await senderWallet.getSigner().generatePublicKey();
|
|
82
|
+
const rootNode = await createNewTree(senderWallet, leafPubKey, faucet, 100000n);
|
|
83
|
+
const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
|
|
84
|
+
const transferNode = {
|
|
85
|
+
leaf: rootNode,
|
|
86
|
+
signingPubKey: leafPubKey,
|
|
87
|
+
newSigningPubKey: newLeafPubKey,
|
|
88
|
+
};
|
|
89
|
+
const leavesToTransfer = [transferNode];
|
|
90
|
+
const senderTransfer = await senderTransferService.sendTransfer(leavesToTransfer, hexToBytes(receiverPubkey), new Date(Date.now() + 10 * 60 * 1000));
|
|
91
|
+
// Receiver queries pending transfer
|
|
92
|
+
const pendingTransfer = await receiverWallet.queryPendingTransfers();
|
|
93
|
+
expect(pendingTransfer.transfers.length).toBe(1);
|
|
94
|
+
const receiverTransfer = pendingTransfer.transfers[0];
|
|
95
|
+
expect(receiverTransfer.id).toBe(senderTransfer.id);
|
|
96
|
+
const leafPrivKeyMap = await receiverWallet.verifyPendingTransfer(receiverTransfer);
|
|
97
|
+
expect(leafPrivKeyMap.size).toBe(1);
|
|
98
|
+
const leafPrivKeyMapBytes = leafPrivKeyMap.get(rootNode.id);
|
|
99
|
+
expect(leafPrivKeyMapBytes).toBeDefined();
|
|
100
|
+
expect(equalBytes(leafPrivKeyMapBytes, newLeafPubKey)).toBe(true);
|
|
101
|
+
const finalLeafPubKey = await receiverWallet
|
|
102
|
+
.getSigner()
|
|
103
|
+
.generatePublicKey(sha256(rootNode.id));
|
|
104
|
+
const claimingNode = {
|
|
105
|
+
leaf: receiverTransfer.leaves[0].leaf,
|
|
106
|
+
signingPubKey: newLeafPubKey,
|
|
107
|
+
newSigningPubKey: finalLeafPubKey,
|
|
108
|
+
};
|
|
109
|
+
const transferService = new TransferService(receiverConfigService, new ConnectionManager(receiverConfigService));
|
|
110
|
+
await transferService.claimTransferTweakKeys(receiverTransfer, [
|
|
111
|
+
claimingNode,
|
|
112
|
+
]);
|
|
113
|
+
const newPendingTransfer = await receiverWallet.queryPendingTransfers();
|
|
114
|
+
expect(newPendingTransfer.transfers.length).toBe(1);
|
|
115
|
+
const newReceiverTransfer = newPendingTransfer.transfers[0];
|
|
116
|
+
expect(newReceiverTransfer.id).toBe(receiverTransfer.id);
|
|
117
|
+
const newLeafPubKeyMap = await receiverWallet.verifyPendingTransfer(newReceiverTransfer);
|
|
118
|
+
expect(newLeafPubKeyMap.size).toBe(1);
|
|
119
|
+
const newLeafPubKeyMapBytes = newLeafPubKeyMap.get(rootNode.id);
|
|
120
|
+
expect(newLeafPubKeyMapBytes).toBeDefined();
|
|
121
|
+
expect(bytesToHex(newLeafPubKeyMapBytes)).toBe(bytesToHex(newLeafPubKey));
|
|
122
|
+
await transferService.claimTransferSignRefunds(newReceiverTransfer, [
|
|
123
|
+
claimingNode,
|
|
124
|
+
]);
|
|
125
|
+
const newNewPendingTransfer = await receiverWallet.queryPendingTransfers();
|
|
126
|
+
expect(newNewPendingTransfer.transfers.length).toBe(1);
|
|
127
|
+
await receiverTransferService.claimTransfer(newNewPendingTransfer.transfers[0], [claimingNode]);
|
|
128
|
+
});
|
|
129
|
+
testFn("cancel transfer", async () => {
|
|
130
|
+
const faucet = new BitcoinFaucet("http://127.0.0.1:18443", "admin1", "123");
|
|
131
|
+
const senderWallet = new SparkWalletTesting(Network.LOCAL);
|
|
132
|
+
await senderWallet.initWalletFromMnemonic();
|
|
133
|
+
const receiverWallet = new SparkWalletTesting(Network.LOCAL);
|
|
134
|
+
await receiverWallet.initWalletFromMnemonic();
|
|
135
|
+
const receiverPubkey = await receiverWallet.getIdentityPublicKey();
|
|
136
|
+
const receiverConfigService = new WalletConfigService(Network.LOCAL, receiverWallet.getSigner());
|
|
137
|
+
const receiverConnectionManager = new ConnectionManager(receiverConfigService);
|
|
138
|
+
const receiverTransferService = new TransferService(receiverConfigService, receiverConnectionManager);
|
|
139
|
+
const leafPubKey = await senderWallet.getSigner().generatePublicKey();
|
|
140
|
+
const rootNode = await createNewTree(senderWallet, leafPubKey, faucet, 100000n);
|
|
141
|
+
const newLeafPubKey = await senderWallet.getSigner().generatePublicKey();
|
|
142
|
+
const transferNode = {
|
|
143
|
+
leaf: rootNode,
|
|
144
|
+
signingPubKey: leafPubKey,
|
|
145
|
+
newSigningPubKey: newLeafPubKey,
|
|
146
|
+
};
|
|
147
|
+
const senderConfigService = new WalletConfigService(Network.LOCAL, senderWallet.getSigner());
|
|
148
|
+
const senderConnectionManager = new ConnectionManager(senderConfigService);
|
|
149
|
+
const senderTransferService = new TransferService(senderConfigService, senderConnectionManager);
|
|
150
|
+
const senderTransfer = await senderTransferService.sendTransferSignRefund([transferNode], hexToBytes(receiverPubkey), new Date(Date.now() + 10 * 60 * 1000));
|
|
151
|
+
await senderTransferService.cancelSendTransfer(senderTransfer.transfer);
|
|
152
|
+
const newSenderTransfer = await senderTransferService.sendTransfer([transferNode], hexToBytes(receiverPubkey), new Date(Date.now() + 10 * 60 * 1000));
|
|
153
|
+
const pendingTransfer = await receiverWallet.queryPendingTransfers();
|
|
154
|
+
expect(pendingTransfer.transfers.length).toBe(1);
|
|
155
|
+
const receiverTransfer = pendingTransfer.transfers[0];
|
|
156
|
+
expect(receiverTransfer.id).toBe(newSenderTransfer.id);
|
|
157
|
+
const leafPubKeyMap = await receiverWallet.verifyPendingTransfer(receiverTransfer);
|
|
158
|
+
expect(leafPubKeyMap.size).toBe(1);
|
|
159
|
+
const leafPubKeyMapBytes = leafPubKeyMap.get(rootNode.id);
|
|
160
|
+
expect(leafPubKeyMapBytes).toBeDefined();
|
|
161
|
+
expect(equalBytes(leafPubKeyMapBytes, newLeafPubKey)).toBe(true);
|
|
162
|
+
const finalLeafPubKey = await receiverWallet
|
|
163
|
+
.getSigner()
|
|
164
|
+
.generatePublicKey(sha256(rootNode.id));
|
|
165
|
+
const claimingNode = {
|
|
166
|
+
leaf: receiverTransfer.leaves[0].leaf,
|
|
167
|
+
signingPubKey: newLeafPubKey,
|
|
168
|
+
newSigningPubKey: finalLeafPubKey,
|
|
169
|
+
};
|
|
170
|
+
await receiverTransferService.claimTransfer(receiverTransfer, [
|
|
171
|
+
claimingNode,
|
|
172
|
+
]);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
//# sourceMappingURL=transfer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.test.js","sourceRoot":"","sources":["../../src/tests/transfer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, expect, it } from "@jest/globals";
|
|
2
|
+
import { bytesToHex } from "@noble/curves/abstract/utils";
|
|
3
|
+
import { getTxFromRawTxBytes, getTxId } from "../utils/bitcoin.js";
|
|
4
|
+
import { Network } from "../utils/network.js";
|
|
5
|
+
import { createDummyTx } from "../utils/wasm.js";
|
|
6
|
+
import { SparkWalletTesting } from "./utils/spark-testing-wallet.js";
|
|
7
|
+
describe("Tree Creation", () => {
|
|
8
|
+
// Skip all tests if running in GitHub Actions
|
|
9
|
+
const testFn = process.env.GITHUB_ACTIONS ? it.skip : it;
|
|
10
|
+
testFn("test tree creation address generation", async () => {
|
|
11
|
+
const wallet = new SparkWalletTesting(Network.LOCAL);
|
|
12
|
+
await wallet.initWalletFromMnemonic();
|
|
13
|
+
const pubKey = await wallet.getSigner().generatePublicKey();
|
|
14
|
+
const depositResp = await wallet.generateDepositAddress(pubKey);
|
|
15
|
+
expect(depositResp.depositAddress).toBeDefined();
|
|
16
|
+
const dummyTx = createDummyTx({
|
|
17
|
+
address: depositResp.depositAddress.address,
|
|
18
|
+
amountSats: 65536n,
|
|
19
|
+
});
|
|
20
|
+
const depositTxHex = bytesToHex(dummyTx.tx);
|
|
21
|
+
const depositTx = getTxFromRawTxBytes(dummyTx.tx);
|
|
22
|
+
const vout = 0;
|
|
23
|
+
const txid = getTxId(depositTx);
|
|
24
|
+
if (!txid) {
|
|
25
|
+
throw new Error("txid not found");
|
|
26
|
+
}
|
|
27
|
+
const treeResp = await wallet.generateDepositAddressForTree(vout, pubKey, depositTx);
|
|
28
|
+
const treeNodes = await wallet.createTree(vout, treeResp, true, depositTx);
|
|
29
|
+
console.log("tree nodes:", treeNodes);
|
|
30
|
+
}, 30000);
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=tree-creation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-creation.test.js","sourceRoot":"","sources":["../../src/tests/tree-creation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,8CAA8C;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzD,MAAM,CACJ,uCAAuC,EACvC,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAEtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAE5D,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAEhE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QAEjD,MAAM,OAAO,GAAG,aAAa,CAAC;YAC5B,OAAO,EAAE,WAAW,CAAC,cAAe,CAAC,OAAO;YAC5C,UAAU,EAAE,MAAM;SACnB,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAElD,MAAM,IAAI,GAAG,CAAC,CAAC;QACf,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,6BAA6B,CACzD,IAAI,EACJ,MAAM,EACN,SAAS,CACV,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,UAAU,CACvC,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,SAAS,CACV,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC,EACD,KAAK,CACN,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { QueryPendingTransfersResponse, Transfer } from "../../proto/spark.js";
|
|
2
|
+
import { SparkSigner } from "../../signer/signer.js";
|
|
3
|
+
import { SparkWallet } from "../../spark-sdk.js";
|
|
4
|
+
interface ISparkWalletTesting extends SparkWallet {
|
|
5
|
+
getSigner(): SparkSigner;
|
|
6
|
+
queryPendingTransfers(): Promise<QueryPendingTransfersResponse>;
|
|
7
|
+
verifyPendingTransfer(transfer: Transfer): Promise<Map<string, Uint8Array>>;
|
|
8
|
+
}
|
|
9
|
+
export declare class SparkWalletTesting extends SparkWallet implements ISparkWalletTesting {
|
|
10
|
+
getSigner(): SparkSigner;
|
|
11
|
+
queryPendingTransfers(): Promise<QueryPendingTransfersResponse>;
|
|
12
|
+
verifyPendingTransfer(transfer: Transfer): Promise<Map<string, Uint8Array>>;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SparkWallet } from "../../spark-sdk.js";
|
|
2
|
+
export class SparkWalletTesting extends SparkWallet {
|
|
3
|
+
getSigner() {
|
|
4
|
+
return this.config.signer;
|
|
5
|
+
}
|
|
6
|
+
async queryPendingTransfers() {
|
|
7
|
+
return await this.transferService.queryPendingTransfers();
|
|
8
|
+
}
|
|
9
|
+
async verifyPendingTransfer(transfer) {
|
|
10
|
+
return await this.transferService.verifyPendingTransfer(transfer);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=spark-testing-wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spark-testing-wallet.js","sourceRoot":"","sources":["../../../src/tests/utils/spark-testing-wallet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,MAAM,OAAO,kBACX,SAAQ,WAAW;IAGZ,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAEM,KAAK,CAAC,qBAAqB;QAChC,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;IAC5D,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,QAAkB;QAElB,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Transaction } from "@scure/btc-signer";
|
|
2
|
+
import { TransactionInput, TransactionOutput } from "@scure/btc-signer/psbt";
|
|
3
|
+
export type FaucetCoin = {
|
|
4
|
+
key: Uint8Array;
|
|
5
|
+
outpoint: TransactionInput;
|
|
6
|
+
txout: TransactionOutput;
|
|
7
|
+
};
|
|
8
|
+
export declare class BitcoinFaucet {
|
|
9
|
+
private url;
|
|
10
|
+
private username;
|
|
11
|
+
private password;
|
|
12
|
+
private coins;
|
|
13
|
+
private static instance;
|
|
14
|
+
constructor(url: string, username: string, password: string);
|
|
15
|
+
fund(): Promise<FaucetCoin | undefined>;
|
|
16
|
+
refill(): Promise<void>;
|
|
17
|
+
signFaucetCoin(unsignedTx: Transaction, fundingTxOut: TransactionOutput, key: Uint8Array): Promise<Transaction>;
|
|
18
|
+
private call;
|
|
19
|
+
generateToAddress(numBlocks: number, address: string): Promise<any>;
|
|
20
|
+
getBlock(blockHash: string): Promise<any>;
|
|
21
|
+
broadcastTx(txHex: string): Promise<any>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { bytesToHex, hexToBytes } from "@noble/curves/abstract/utils";
|
|
2
|
+
import { schnorr, secp256k1 } from "@noble/curves/secp256k1";
|
|
3
|
+
import { SigHash, Transaction } from "@scure/btc-signer";
|
|
4
|
+
import { taprootTweakPrivKey } from "@scure/btc-signer/utils";
|
|
5
|
+
import { getP2TRAddressFromPublicKey, getP2TRScriptFromPublicKey, } from "../../utils/bitcoin.js";
|
|
6
|
+
import { Network } from "../../utils/network.js";
|
|
7
|
+
export class BitcoinFaucet {
|
|
8
|
+
url;
|
|
9
|
+
username;
|
|
10
|
+
password;
|
|
11
|
+
coins = [];
|
|
12
|
+
static instance = null;
|
|
13
|
+
constructor(url, username, password) {
|
|
14
|
+
this.url = url;
|
|
15
|
+
this.username = username;
|
|
16
|
+
this.password = password;
|
|
17
|
+
if (BitcoinFaucet.instance) {
|
|
18
|
+
return BitcoinFaucet.instance;
|
|
19
|
+
}
|
|
20
|
+
BitcoinFaucet.instance = this;
|
|
21
|
+
}
|
|
22
|
+
async fund() {
|
|
23
|
+
// If no coins available, refill the faucet
|
|
24
|
+
if (this.coins.length === 0) {
|
|
25
|
+
await this.refill();
|
|
26
|
+
}
|
|
27
|
+
// Take the first coin from the faucet
|
|
28
|
+
const coin = this.coins[0];
|
|
29
|
+
// Remove the used coin from the array
|
|
30
|
+
this.coins = this.coins.slice(1);
|
|
31
|
+
return coin;
|
|
32
|
+
}
|
|
33
|
+
async refill() {
|
|
34
|
+
// Generate key for initial block reward
|
|
35
|
+
const key = secp256k1.utils.randomPrivateKey();
|
|
36
|
+
const pubKey = secp256k1.getPublicKey(key);
|
|
37
|
+
const address = getP2TRAddressFromPublicKey(pubKey, Network.LOCAL);
|
|
38
|
+
// Mine a block to this address
|
|
39
|
+
const blockHash = await this.generateToAddress(1, address);
|
|
40
|
+
// Get block and funding transaction
|
|
41
|
+
const block = await this.getBlock(blockHash[0]);
|
|
42
|
+
const fundingTx = Transaction.fromRaw(hexToBytes(block.tx[0].hex), {
|
|
43
|
+
allowUnknownOutputs: true,
|
|
44
|
+
});
|
|
45
|
+
// Mine 100 blocks to make funds spendable
|
|
46
|
+
const randomKey = secp256k1.utils.randomPrivateKey();
|
|
47
|
+
const randomPubKey = secp256k1.getPublicKey(randomKey);
|
|
48
|
+
const randomAddress = getP2TRAddressFromPublicKey(randomPubKey, Network.LOCAL);
|
|
49
|
+
await this.generateToAddress(100, randomAddress);
|
|
50
|
+
const fundingTxId = block.tx[0].txid;
|
|
51
|
+
const fundingOutpoint = {
|
|
52
|
+
txid: fundingTxId,
|
|
53
|
+
index: 0,
|
|
54
|
+
};
|
|
55
|
+
const splitTx = new Transaction();
|
|
56
|
+
splitTx.addInput(fundingOutpoint);
|
|
57
|
+
let initialValue = fundingTx.getOutput(0).amount;
|
|
58
|
+
const coinAmount = 10000000n;
|
|
59
|
+
const coinKeys = [];
|
|
60
|
+
while (initialValue > coinAmount + 100000n) {
|
|
61
|
+
const coinKey = secp256k1.utils.randomPrivateKey();
|
|
62
|
+
const coinPubKey = secp256k1.getPublicKey(coinKey);
|
|
63
|
+
coinKeys.push(coinKey);
|
|
64
|
+
const script = getP2TRScriptFromPublicKey(coinPubKey, Network.LOCAL);
|
|
65
|
+
splitTx.addOutput({
|
|
66
|
+
script,
|
|
67
|
+
amount: coinAmount,
|
|
68
|
+
});
|
|
69
|
+
initialValue -= coinAmount;
|
|
70
|
+
}
|
|
71
|
+
// Sign and broadcast
|
|
72
|
+
const signedSplitTx = await this.signFaucetCoin(splitTx, fundingTx.getOutput(0), key);
|
|
73
|
+
await this.broadcastTx(bytesToHex(signedSplitTx.extract()));
|
|
74
|
+
// Create faucet coins
|
|
75
|
+
const splitTxId = signedSplitTx.id;
|
|
76
|
+
for (let i = 0; i < signedSplitTx.outputsLength; i++) {
|
|
77
|
+
this.coins.push({
|
|
78
|
+
// @ts-ignore - It's a test file
|
|
79
|
+
key: coinKeys[i],
|
|
80
|
+
outpoint: {
|
|
81
|
+
txid: hexToBytes(splitTxId),
|
|
82
|
+
index: i,
|
|
83
|
+
},
|
|
84
|
+
txout: signedSplitTx.getOutput(i),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async signFaucetCoin(unsignedTx, fundingTxOut, key) {
|
|
89
|
+
const pubKey = secp256k1.getPublicKey(key);
|
|
90
|
+
const internalKey = pubKey.slice(1); // Remove the 0x02/0x03 prefix
|
|
91
|
+
const script = getP2TRScriptFromPublicKey(pubKey, Network.LOCAL);
|
|
92
|
+
unsignedTx.updateInput(0, {
|
|
93
|
+
tapInternalKey: internalKey,
|
|
94
|
+
witnessUtxo: {
|
|
95
|
+
script,
|
|
96
|
+
amount: fundingTxOut.amount,
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
const sighash = unsignedTx.preimageWitnessV1(0, new Array(unsignedTx.inputsLength).fill(script), SigHash.DEFAULT, new Array(unsignedTx.inputsLength).fill(fundingTxOut.amount));
|
|
100
|
+
const merkleRoot = new Uint8Array();
|
|
101
|
+
const tweakedKey = taprootTweakPrivKey(key, merkleRoot);
|
|
102
|
+
if (!tweakedKey)
|
|
103
|
+
throw new Error("Invalid private key for taproot tweaking");
|
|
104
|
+
const signature = schnorr.sign(sighash, tweakedKey);
|
|
105
|
+
unsignedTx.updateInput(0, {
|
|
106
|
+
tapKeySig: signature,
|
|
107
|
+
});
|
|
108
|
+
unsignedTx.finalize();
|
|
109
|
+
return unsignedTx;
|
|
110
|
+
}
|
|
111
|
+
async call(method, params) {
|
|
112
|
+
try {
|
|
113
|
+
const response = await fetch(this.url, {
|
|
114
|
+
method: "POST",
|
|
115
|
+
headers: {
|
|
116
|
+
"Content-Type": "application/json",
|
|
117
|
+
Authorization: "Basic " + btoa(`${this.username}:${this.password}`),
|
|
118
|
+
},
|
|
119
|
+
body: JSON.stringify({
|
|
120
|
+
jsonrpc: "1.0",
|
|
121
|
+
id: "spark-js",
|
|
122
|
+
method,
|
|
123
|
+
params,
|
|
124
|
+
}),
|
|
125
|
+
});
|
|
126
|
+
const data = await response.json();
|
|
127
|
+
if (data.error) {
|
|
128
|
+
console.error(`RPC Error for method ${method}:`, data.error);
|
|
129
|
+
throw new Error(`Bitcoin RPC error: ${data.error.message}`);
|
|
130
|
+
}
|
|
131
|
+
return data.result;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error("Error calling Bitcoin RPC:", error);
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async generateToAddress(numBlocks, address) {
|
|
139
|
+
return await this.call("generatetoaddress", [numBlocks, address]);
|
|
140
|
+
}
|
|
141
|
+
async getBlock(blockHash) {
|
|
142
|
+
return await this.call("getblock", [blockHash, 2]);
|
|
143
|
+
}
|
|
144
|
+
async broadcastTx(txHex) {
|
|
145
|
+
return await this.call("sendrawtransaction", [txHex, 0]);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=test-faucet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-faucet.js","sourceRoot":"","sources":["../../../src/tests/utils/test-faucet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,OAAO,KAAK,WAAW,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function generateSignatureFromExistingAdaptor(signature: Uint8Array, adaptorPrivateKeyBytes: Uint8Array): Uint8Array;
|
|
2
|
+
export declare function generateAdaptorFromSignature(signature: Uint8Array): {
|
|
3
|
+
adaptorSignature: Uint8Array;
|
|
4
|
+
adaptorPrivateKey: Uint8Array;
|
|
5
|
+
};
|
|
6
|
+
export declare function validateOutboundAdaptorSignature(pubkey: Uint8Array, hash: Uint8Array, signature: Uint8Array, adaptorPubkey: Uint8Array): boolean;
|
|
7
|
+
export declare function applyAdaptorToSignature(pubkey: Uint8Array, hash: Uint8Array, signature: Uint8Array, adaptorPrivateKeyBytes: Uint8Array): Uint8Array;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { mod } from "@noble/curves/abstract/modular";
|
|
2
|
+
import { bytesToNumberBE, numberToBytesBE } from "@noble/curves/abstract/utils";
|
|
3
|
+
import { schnorr, secp256k1 } from "@noble/curves/secp256k1";
|
|
4
|
+
export function generateSignatureFromExistingAdaptor(signature, adaptorPrivateKeyBytes) {
|
|
5
|
+
const { r, s } = parseSignature(signature);
|
|
6
|
+
const sBigInt = bytesToNumberBE(s);
|
|
7
|
+
const tBigInt = bytesToNumberBE(adaptorPrivateKeyBytes);
|
|
8
|
+
const newS = mod(sBigInt - tBigInt, secp256k1.CURVE.n);
|
|
9
|
+
const newSignature = new Uint8Array([...r, ...numberToBytesBE(newS, 32)]);
|
|
10
|
+
return newSignature;
|
|
11
|
+
}
|
|
12
|
+
export function generateAdaptorFromSignature(signature) {
|
|
13
|
+
const adaptorPrivateKey = secp256k1.utils.randomPrivateKey();
|
|
14
|
+
const { r, s } = parseSignature(signature);
|
|
15
|
+
const sBigInt = bytesToNumberBE(s);
|
|
16
|
+
const tBigInt = bytesToNumberBE(adaptorPrivateKey);
|
|
17
|
+
// Calculate s - adaptorPrivateKey
|
|
18
|
+
const newS = mod(sBigInt - tBigInt, secp256k1.CURVE.n);
|
|
19
|
+
const newSignature = new Uint8Array([...r, ...numberToBytesBE(newS, 32)]);
|
|
20
|
+
return {
|
|
21
|
+
adaptorSignature: newSignature,
|
|
22
|
+
adaptorPrivateKey: adaptorPrivateKey,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function validateOutboundAdaptorSignature(pubkey, hash, signature, adaptorPubkey) {
|
|
26
|
+
return schnorrVerifyWithAdaptor(signature, hash, pubkey, adaptorPubkey, false);
|
|
27
|
+
}
|
|
28
|
+
export function applyAdaptorToSignature(pubkey, hash, signature, adaptorPrivateKeyBytes) {
|
|
29
|
+
// Parse the signature
|
|
30
|
+
const { r, s } = parseSignature(signature);
|
|
31
|
+
// Convert values to bigints
|
|
32
|
+
const sBigInt = bytesToNumberBE(s);
|
|
33
|
+
const adaptorPrivateKey = bytesToNumberBE(adaptorPrivateKeyBytes);
|
|
34
|
+
// Try adding adaptor to s first
|
|
35
|
+
const newS = mod(sBigInt + adaptorPrivateKey, secp256k1.CURVE.n);
|
|
36
|
+
const newSig = new Uint8Array([...r, ...numberToBytesBE(newS, 32)]);
|
|
37
|
+
if (schnorr.verify(newSig, hash, pubkey)) {
|
|
38
|
+
return newSig;
|
|
39
|
+
}
|
|
40
|
+
// If adding didn't work, try subtracting
|
|
41
|
+
const altS = mod(sBigInt - adaptorPrivateKey, secp256k1.CURVE.n);
|
|
42
|
+
const altSig = new Uint8Array([...r, ...numberToBytesBE(altS, 32)]);
|
|
43
|
+
if (schnorr.verify(altSig, hash, pubkey)) {
|
|
44
|
+
return altSig;
|
|
45
|
+
}
|
|
46
|
+
throw new Error("Cannot apply adaptor to signature");
|
|
47
|
+
}
|
|
48
|
+
// Step 1: P = lift_x(int(pk))
|
|
49
|
+
// Step 2: r = int(sig[0:32])
|
|
50
|
+
// Step 3: s = int(sig[32:64])
|
|
51
|
+
// Step 4: e = int(tagged_hash("BIP0340/challenge", bytes(r) || bytes(P) || m)) mod n
|
|
52
|
+
// Step 5: R = sG - eP
|
|
53
|
+
// Step 6: R = R + T
|
|
54
|
+
function schnorrVerifyWithAdaptor(signature, hash, pubKeyBytes, adaptorPubkey, inbound) {
|
|
55
|
+
// Step 1: Verify message length
|
|
56
|
+
if (hash.length !== 32) {
|
|
57
|
+
throw new Error(`wrong size for message (got ${hash.length}, want 32)`);
|
|
58
|
+
}
|
|
59
|
+
// Step 2: Lift x coordinate to curve point
|
|
60
|
+
const pubKey = schnorr.utils.lift_x(bytesToNumberBE(pubKeyBytes));
|
|
61
|
+
pubKey.assertValidity();
|
|
62
|
+
// Parse signature
|
|
63
|
+
// Step 3 and 4 is handled by parseSignature
|
|
64
|
+
const { r, s } = parseSignature(signature);
|
|
65
|
+
// Step 5: Compute challenge
|
|
66
|
+
const commitmenet = schnorr.utils.taggedHash("BIP0340/challenge", r, pubKey.toRawBytes().slice(1), hash);
|
|
67
|
+
if (commitmenet.length > 32) {
|
|
68
|
+
throw new Error("hash of (r || P || m) too big");
|
|
69
|
+
}
|
|
70
|
+
const e = mod(bytesToNumberBE(commitmenet), secp256k1.CURVE.n);
|
|
71
|
+
const negE = mod(-e, secp256k1.CURVE.n); // Negate e before multiplication
|
|
72
|
+
// Step 6: Calculate R = sG - eP
|
|
73
|
+
const R = secp256k1.ProjectivePoint.BASE.multiplyAndAddUnsafe(pubKey, bytesToNumberBE(s), negE);
|
|
74
|
+
if (!R) {
|
|
75
|
+
throw new Error("R is undefined");
|
|
76
|
+
}
|
|
77
|
+
R.assertValidity();
|
|
78
|
+
// Step 6.5: Add adaptor public key T to R
|
|
79
|
+
const adaptorPoint = secp256k1.ProjectivePoint.fromHex(adaptorPubkey);
|
|
80
|
+
const newR = R.add(adaptorPoint);
|
|
81
|
+
// Step 7: Check for point at infinity (if not inbound)
|
|
82
|
+
if (!inbound && newR.equals(secp256k1.ProjectivePoint.ZERO)) {
|
|
83
|
+
throw new Error("calculated R point is the point at infinity");
|
|
84
|
+
}
|
|
85
|
+
// Step 8: Check if R.y is odd
|
|
86
|
+
newR.assertValidity();
|
|
87
|
+
if (!newR.hasEvenY()) {
|
|
88
|
+
throw new Error("calculated R y-value is odd");
|
|
89
|
+
}
|
|
90
|
+
// Step 9: Check if R.x == r
|
|
91
|
+
const rNum = bytesToNumberBE(r);
|
|
92
|
+
if (newR.toAffine().x !== rNum) {
|
|
93
|
+
throw new Error("calculated R point was not given R");
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
function parseSignature(signature) {
|
|
98
|
+
if (signature.length < 64) {
|
|
99
|
+
throw new Error(`malformed signature: too short: ${signature.length} < 64`);
|
|
100
|
+
}
|
|
101
|
+
if (signature.length > 64) {
|
|
102
|
+
throw new Error(`malformed signature: too long: ${signature.length} > 64`);
|
|
103
|
+
}
|
|
104
|
+
const r = signature.slice(0, 32);
|
|
105
|
+
const s = signature.slice(32, 64);
|
|
106
|
+
if (bytesToNumberBE(r) >= secp256k1.CURVE.Fp.ORDER) {
|
|
107
|
+
throw new Error(`invalid signature: r >= field prime`);
|
|
108
|
+
}
|
|
109
|
+
if (bytesToNumberBE(s) >= secp256k1.CURVE.n) {
|
|
110
|
+
throw new Error(`invalid signature: s >= group order`);
|
|
111
|
+
}
|
|
112
|
+
return { r, s };
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=adaptor-signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptor-signature.js","sourceRoot":"","sources":["../../src/utils/adaptor-signature.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as btc from "@scure/btc-signer";
|
|
2
|
+
import { TransactionOutput } from "@scure/btc-signer/psbt";
|
|
3
|
+
import { Network } from "./network.js";
|
|
4
|
+
export declare function computeTaprootKeyNoScript(pubkey: Uint8Array): Uint8Array;
|
|
5
|
+
export declare function getP2TRScriptFromPublicKey(pubKey: Uint8Array, network: Network): Uint8Array;
|
|
6
|
+
export declare function getP2TRAddressFromPublicKey(pubKey: Uint8Array, network: Network): string;
|
|
7
|
+
export declare function getP2TRAddressFromPkScript(pkScript: Uint8Array, network: Network): string;
|
|
8
|
+
export declare function getTxFromRawTxHex(rawTxHex: string): btc.Transaction;
|
|
9
|
+
export declare function getTxFromRawTxBytes(rawTxBytes: Uint8Array): btc.Transaction;
|
|
10
|
+
export declare function getSigHashFromTx(tx: btc.Transaction, inputIndex: number, prevOutput: TransactionOutput): Uint8Array;
|
|
11
|
+
export declare function getTxId(tx: btc.Transaction): string;
|
|
12
|
+
export declare function getTxIdNoReverse(tx: btc.Transaction): string;
|