@lightsparkdev/lightspark-sdk 0.4.10 → 1.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/CHANGELOG.md +30 -0
- package/README.md +1 -1
- package/dist/{chunk-NXUFC5J7.js → chunk-LZC5C5NI.js} +2908 -635
- package/dist/{index-3ffe9e7b.d.ts → index-09d4ac20.d.ts} +373 -62
- package/dist/index.cjs +3395 -842
- package/dist/index.d.ts +2 -2
- package/dist/index.js +390 -94
- package/dist/objects/index.cjs +2735 -553
- package/dist/objects/index.d.ts +1 -1
- package/dist/objects/index.js +17 -5
- package/package.json +12 -9
- package/src/NodeKeyLoaderCache.ts +87 -0
- package/src/SigningKeyLoader.ts +177 -0
- package/src/auth/AccountTokenAuthProvider.ts +4 -4
- package/src/client.ts +209 -118
- package/src/graphql/CreateInvoice.ts +3 -2
- package/src/graphql/CreateLnurlInvoice.ts +2 -0
- package/src/graphql/CreateUmaInvoice.ts +23 -0
- package/src/graphql/MultiNodeDashboard.ts +0 -3
- package/src/graphql/PayUmaInvoice.ts +29 -0
- package/src/graphql/RecoverNodeSigningKey.ts +1 -1
- package/src/graphql/SingleNodeDashboard.ts +0 -1
- package/src/lightspark_crypto/lightspark_crypto.d.ts +157 -0
- package/src/lightspark_crypto/lightspark_crypto.js +1010 -0
- package/src/lightspark_crypto/lightspark_crypto_bg.wasm +0 -0
- package/src/lightspark_crypto/lightspark_crypto_bg.wasm.d.ts +120 -0
- package/src/lightspark_crypto/package.json +11 -0
- package/src/objects/Account.ts +437 -120
- package/src/objects/AccountToApiTokensConnection.ts +3 -3
- package/src/objects/AccountToChannelsConnection.ts +4 -4
- package/src/objects/AccountToNodesConnection.ts +2 -15
- package/src/objects/AccountToPaymentRequestsConnection.ts +3 -3
- package/src/objects/AccountToTransactionsConnection.ts +6 -6
- package/src/objects/AccountToWalletsConnection.ts +2 -2
- package/src/objects/Balances.ts +2 -2
- package/src/objects/Channel.ts +4 -4
- package/src/objects/ChannelClosingTransaction.ts +2 -2
- package/src/objects/ChannelOpeningTransaction.ts +2 -2
- package/src/objects/ChannelToTransactionsConnection.ts +4 -4
- package/src/objects/{CryptoSanctionsScreeningProvider.ts → ComplianceProvider.ts} +3 -3
- package/src/objects/Connection.ts +25 -31
- package/src/objects/CreateApiTokenInput.ts +1 -1
- package/src/objects/CreateApiTokenOutput.ts +1 -1
- package/src/objects/CreateInvoiceInput.ts +0 -6
- package/src/objects/CreateLnurlInvoiceInput.ts +1 -7
- package/src/objects/CreateNodeWalletAddressInput.ts +1 -1
- package/src/objects/CreateNodeWalletAddressOutput.ts +1 -1
- package/src/objects/CreateTestModeInvoiceInput.ts +1 -1
- package/src/objects/CreateTestModeInvoiceOutput.ts +1 -1
- package/src/objects/CreateTestModePaymentInput.ts +1 -1
- package/src/objects/CreateTestModePaymentoutput.ts +14 -2
- package/src/objects/CreateUmaInvoiceInput.ts +24 -0
- package/src/objects/DeclineToSignMessagesInput.ts +16 -0
- package/src/objects/DeclineToSignMessagesOutput.ts +28 -0
- package/src/objects/DeleteApiTokenOutput.ts +1 -1
- package/src/objects/Entity.ts +401 -66
- package/src/objects/GraphNode.ts +3 -3
- package/src/objects/IdAndSignature.ts +16 -0
- package/src/objects/IncomingPayment.ts +21 -8
- package/src/objects/IncomingPaymentAttempt.ts +2 -2
- package/src/objects/IncomingPaymentToAttemptsConnection.ts +3 -3
- package/src/objects/Invoice.ts +118 -21
- package/src/objects/InvoiceData.ts +118 -21
- package/src/objects/LightningFeeEstimateForInvoiceInput.ts +1 -1
- package/src/objects/LightningFeeEstimateForNodeInput.ts +1 -1
- package/src/objects/LightningFeeEstimateOutput.ts +2 -2
- package/src/objects/LightningTransaction.ts +155 -31
- package/src/objects/LightsparkNode.ts +272 -112
- package/src/objects/LightsparkNodeOwner.ts +8 -4
- package/src/objects/LightsparkNodeToChannelsConnection.ts +3 -3
- package/src/objects/LightsparkNodeWithOSK.ts +389 -0
- package/src/objects/LightsparkNodeWithRemoteSigning.ts +384 -0
- package/src/objects/Node.ts +213 -60
- package/src/objects/NodeToAddressesConnection.ts +2 -2
- package/src/objects/OnChainTransaction.ts +2 -2
- package/src/objects/OutgoingPayment.ts +139 -24
- package/src/objects/OutgoingPaymentAttempt.ts +5 -5
- package/src/objects/OutgoingPaymentAttemptToHopsConnection.ts +3 -3
- package/src/objects/OutgoingPaymentToAttemptsConnection.ts +3 -3
- package/src/objects/OutgoingPaymentsForInvoiceQueryInput.ts +25 -0
- package/src/objects/OutgoingPaymentsForInvoiceQueryOutput.ts +28 -0
- package/src/objects/PayUmaInvoiceInput.ts +25 -0
- package/src/objects/{LightsparkNodePurpose.ts → PaymentDirection.ts} +5 -7
- package/src/objects/PaymentRequest.ts +119 -22
- package/src/objects/PaymentRequestData.ts +119 -22
- package/src/objects/PostTransactionData.ts +39 -0
- package/src/objects/RegisterPaymentInput.ts +31 -0
- package/src/objects/RegisterPaymentOutput.ts +23 -0
- package/src/objects/ReleaseChannelPerCommitmentSecretInput.ts +23 -0
- package/src/objects/ReleaseChannelPerCommitmentSecretOutput.ts +23 -0
- package/src/objects/ReleasePaymentPreimageInput.ts +20 -0
- package/src/objects/ReleasePaymentPreimageOutput.ts +23 -0
- package/src/objects/RemoteSigningSubEventType.ts +26 -0
- package/src/objects/RequestWithdrawalInput.ts +1 -1
- package/src/objects/RequestWithdrawalOutput.ts +1 -1
- package/src/objects/RoutingTransaction.ts +1 -1
- package/src/objects/ScreenNodeInput.ts +20 -0
- package/src/objects/ScreenNodeOutput.ts +22 -0
- package/src/objects/SetInvoicePaymentHashInput.ts +24 -0
- package/src/objects/SetInvoicePaymentHashOutput.ts +23 -0
- package/src/objects/SignInvoiceInput.ts +19 -0
- package/src/objects/SignInvoiceOutput.ts +21 -0
- package/src/objects/SignMessagesInput.ts +18 -0
- package/src/objects/SignMessagesOutput.ts +26 -0
- package/src/objects/Signable.ts +58 -0
- package/src/objects/SignablePayload.ts +93 -0
- package/src/objects/SignablePayloadStatus.ts +17 -0
- package/src/objects/SingleNodeDashboard.ts +0 -2
- package/src/objects/Transaction.ts +153 -29
- package/src/objects/TransactionFailures.ts +1 -1
- package/src/objects/UpdateChannelPerCommitmentPointInput.ts +25 -0
- package/src/objects/UpdateChannelPerCommitmentPointOutput.ts +23 -0
- package/src/objects/UpdateNodeSharedSecretInput.ts +18 -0
- package/src/objects/UpdateNodeSharedSecretOutput.ts +23 -0
- package/src/objects/Wallet.ts +271 -51
- package/src/objects/WalletToPaymentRequestsConnection.ts +3 -3
- package/src/objects/WalletToTransactionsConnection.ts +3 -3
- package/src/objects/WithdrawalRequest.ts +6 -6
- package/src/objects/WithdrawalRequestToChannelClosingTransactionsConnection.ts +2 -2
- package/src/objects/WithdrawalRequestToChannelOpeningTransactionsConnection.ts +2 -2
- package/src/objects/index.ts +37 -4
- package/src/{__tests__ → tests}/webhooks.test.ts +1 -1
- package/src/webhooks.ts +1 -1
- package/src/objects/ScreenBitcoinAddressesInput.ts +0 -23
- package/src/objects/ScreenBitcoinAddressesOutput.ts +0 -25
package/dist/objects/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { A as Account, a as AccountToApiTokensConnection, b as AccountToChannelsConnection, c as AccountToNodesConnection, d as AccountToPaymentRequestsConnection, e as AccountToTransactionsConnection, f as AccountToWalletsConnection, g as ApiToken, B as Balances, i as BitcoinNetwork, j as BlockchainBalance, C as Channel, k as ChannelClosingTransaction, m as ChannelFees, n as ChannelOpeningTransaction, p as ChannelStatus, q as ChannelToTransactionsConnection, r as
|
|
1
|
+
export { A as Account, a as AccountToApiTokensConnection, b as AccountToChannelsConnection, c as AccountToNodesConnection, d as AccountToPaymentRequestsConnection, e as AccountToTransactionsConnection, f as AccountToWalletsConnection, g as ApiToken, B as Balances, i as BitcoinNetwork, j as BlockchainBalance, C as Channel, k as ChannelClosingTransaction, m as ChannelFees, n as ChannelOpeningTransaction, p as ChannelStatus, q as ChannelToTransactionsConnection, r as ComplianceProvider, s as Connection, t as CreateApiTokenInput, u as CreateApiTokenOutput, v as CreateInvoiceInput, w as CreateInvoiceOutput, x as CreateLnurlInvoiceInput, y as CreateNodeWalletAddressInput, z as CreateNodeWalletAddressOutput, D as CreateTestModeInvoiceInput, E as CreateTestModeInvoiceOutput, F as CreateTestModePaymentInput, G as CreateTestModePaymentoutput, H as CreateUmaInvoiceInput, I as CurrencyAmount, J as CurrencyUnit, K as DeclineToSignMessagesInput, M as DeclineToSignMessagesOutput, N as DeleteApiTokenInput, O as DeleteApiTokenOutput, P as Deposit, R as Entity, S as FeeEstimate, T as FundNodeInput, U as FundNodeOutput, V as GraphNode, X as Hop, Z as HtlcAttemptFailureCode, _ as IdAndSignature, $ as IncomingPayment, a0 as IncomingPaymentAttempt, a2 as IncomingPaymentAttemptStatus, a3 as IncomingPaymentToAttemptsConnection, a4 as Invoice, a6 as InvoiceData, a7 as InvoiceType, a8 as LightningFeeEstimateForInvoiceInput, a9 as LightningFeeEstimateForNodeInput, aa as LightningFeeEstimateOutput, ab as LightningTransaction, ad as LightsparkNode, ae as LightsparkNodeOwner, ag as LightsparkNodeStatus, ah as LightsparkNodeToChannelsConnection, ai as LightsparkNodeWithOSK, aj as LightsparkNodeWithRemoteSigning, ak as Node, al as NodeAddress, am as NodeAddressType, an as NodeToAddressesConnection, ao as OnChainTransaction, aq as OutgoingPayment, ar as OutgoingPaymentAttempt, as as OutgoingPaymentAttemptStatus, at as OutgoingPaymentAttemptToHopsConnection, aw as OutgoingPaymentToAttemptsConnection, au as OutgoingPaymentsForInvoiceQueryInput, av as OutgoingPaymentsForInvoiceQueryOutput, ax as PageInfo, ay as PayInvoiceInput, az as PayInvoiceOutput, aG as PayUmaInvoiceInput, aA as PaymentDirection, aB as PaymentFailureReason, aC as PaymentRequest, aE as PaymentRequestData, aF as PaymentRequestStatus, aH as Permission, aI as PostTransactionData, aJ as RegisterPaymentInput, aK as RegisterPaymentOutput, aL as ReleaseChannelPerCommitmentSecretInput, aM as ReleaseChannelPerCommitmentSecretOutput, aN as ReleasePaymentPreimageInput, aO as ReleasePaymentPreimageOutput, aP as RemoteSigningSubEventType, aQ as RequestWithdrawalInput, aR as RequestWithdrawalOutput, aS as RichText, aT as RiskRating, aU as RoutingTransaction, aW as RoutingTransactionFailureReason, aX as ScreenNodeInput, aY as ScreenNodeOutput, aZ as Secret, a_ as SendPaymentInput, a$ as SendPaymentOutput, b0 as SetInvoicePaymentHashInput, b1 as SetInvoicePaymentHashOutput, b7 as SignInvoiceInput, b8 as SignInvoiceOutput, b9 as SignMessagesInput, ba as SignMessagesOutput, b2 as Signable, b4 as SignablePayload, b6 as SignablePayloadStatus, bb as SingleNodeDashboard, bc as Transaction, be as TransactionFailures, bf as TransactionStatus, bg as TransactionType, bh as TransactionUpdate, bi as UpdateChannelPerCommitmentPointInput, bj as UpdateChannelPerCommitmentPointOutput, bk as UpdateNodeSharedSecretInput, bl as UpdateNodeSharedSecretOutput, bm as Wallet, bn as WalletStatus, bo as WalletToPaymentRequestsConnection, bp as WalletToTransactionsConnection, W as WebhookEventType, bq as Withdrawal, bs as WithdrawalMode, bt as WithdrawalRequest, bu as WithdrawalRequestStatus, bv as WithdrawalRequestToChannelClosingTransactionsConnection, bw as WithdrawalRequestToChannelOpeningTransactionsConnection, h as getApiTokenQuery, l as getChannelClosingTransactionQuery, o as getChannelOpeningTransactionQuery, Q as getDepositQuery, Y as getHopQuery, a1 as getIncomingPaymentAttemptQuery, a5 as getInvoiceQuery, ac as getLightningTransactionQuery, af as getLightsparkNodeOwnerQuery, ap as getOnChainTransactionQuery, aD as getPaymentRequestQuery, aV as getRoutingTransactionQuery, b5 as getSignablePayloadQuery, b3 as getSignableQuery, bd as getTransactionQuery, br as getWithdrawalQuery } from '../index-09d4ac20.js';
|
|
2
2
|
import '@lightsparkdev/core';
|
|
3
3
|
import 'zen-observable';
|
package/dist/objects/index.js
CHANGED
|
@@ -4,26 +4,30 @@ import {
|
|
|
4
4
|
BitcoinNetwork_default,
|
|
5
5
|
ChannelStatus_default,
|
|
6
6
|
Channel_default,
|
|
7
|
-
|
|
7
|
+
ComplianceProvider_default,
|
|
8
8
|
CurrencyUnit_default,
|
|
9
9
|
GraphNode_default,
|
|
10
10
|
HtlcAttemptFailureCode_default,
|
|
11
11
|
IncomingPaymentAttemptStatus_default,
|
|
12
12
|
IncomingPayment_default,
|
|
13
13
|
InvoiceType_default,
|
|
14
|
-
LightsparkNodePurpose_default,
|
|
15
14
|
LightsparkNodeStatus_default,
|
|
15
|
+
LightsparkNodeWithOSK_default,
|
|
16
|
+
LightsparkNodeWithRemoteSigning_default,
|
|
16
17
|
LightsparkNode_default,
|
|
17
18
|
NodeAddressType_default,
|
|
18
19
|
Node_default,
|
|
19
20
|
OutgoingPaymentAttemptStatus_default,
|
|
20
21
|
OutgoingPaymentAttempt_default,
|
|
21
22
|
OutgoingPayment_default,
|
|
23
|
+
PaymentDirection_default,
|
|
22
24
|
PaymentFailureReason_default,
|
|
23
25
|
PaymentRequestStatus_default,
|
|
24
26
|
Permission_default,
|
|
27
|
+
RemoteSigningSubEventType_default,
|
|
25
28
|
RiskRating_default,
|
|
26
29
|
RoutingTransactionFailureReason_default,
|
|
30
|
+
SignablePayloadStatus_default,
|
|
27
31
|
TransactionStatus_default,
|
|
28
32
|
TransactionType_default,
|
|
29
33
|
WalletStatus_default,
|
|
@@ -44,9 +48,11 @@ import {
|
|
|
44
48
|
getOnChainTransactionQuery,
|
|
45
49
|
getPaymentRequestQuery,
|
|
46
50
|
getRoutingTransactionQuery,
|
|
51
|
+
getSignablePayloadQuery,
|
|
52
|
+
getSignableQuery,
|
|
47
53
|
getTransactionQuery,
|
|
48
54
|
getWithdrawalQuery
|
|
49
|
-
} from "../chunk-
|
|
55
|
+
} from "../chunk-LZC5C5NI.js";
|
|
50
56
|
import "../chunk-NIMBE7W3.js";
|
|
51
57
|
export {
|
|
52
58
|
Account_default as Account,
|
|
@@ -54,7 +60,7 @@ export {
|
|
|
54
60
|
BitcoinNetwork_default as BitcoinNetwork,
|
|
55
61
|
Channel_default as Channel,
|
|
56
62
|
ChannelStatus_default as ChannelStatus,
|
|
57
|
-
|
|
63
|
+
ComplianceProvider_default as ComplianceProvider,
|
|
58
64
|
CurrencyUnit_default as CurrencyUnit,
|
|
59
65
|
GraphNode_default as GraphNode,
|
|
60
66
|
HtlcAttemptFailureCode_default as HtlcAttemptFailureCode,
|
|
@@ -62,18 +68,22 @@ export {
|
|
|
62
68
|
IncomingPaymentAttemptStatus_default as IncomingPaymentAttemptStatus,
|
|
63
69
|
InvoiceType_default as InvoiceType,
|
|
64
70
|
LightsparkNode_default as LightsparkNode,
|
|
65
|
-
LightsparkNodePurpose_default as LightsparkNodePurpose,
|
|
66
71
|
LightsparkNodeStatus_default as LightsparkNodeStatus,
|
|
72
|
+
LightsparkNodeWithOSK_default as LightsparkNodeWithOSK,
|
|
73
|
+
LightsparkNodeWithRemoteSigning_default as LightsparkNodeWithRemoteSigning,
|
|
67
74
|
Node_default as Node,
|
|
68
75
|
NodeAddressType_default as NodeAddressType,
|
|
69
76
|
OutgoingPayment_default as OutgoingPayment,
|
|
70
77
|
OutgoingPaymentAttempt_default as OutgoingPaymentAttempt,
|
|
71
78
|
OutgoingPaymentAttemptStatus_default as OutgoingPaymentAttemptStatus,
|
|
79
|
+
PaymentDirection_default as PaymentDirection,
|
|
72
80
|
PaymentFailureReason_default as PaymentFailureReason,
|
|
73
81
|
PaymentRequestStatus_default as PaymentRequestStatus,
|
|
74
82
|
Permission_default as Permission,
|
|
83
|
+
RemoteSigningSubEventType_default as RemoteSigningSubEventType,
|
|
75
84
|
RiskRating_default as RiskRating,
|
|
76
85
|
RoutingTransactionFailureReason_default as RoutingTransactionFailureReason,
|
|
86
|
+
SignablePayloadStatus_default as SignablePayloadStatus,
|
|
77
87
|
TransactionStatus_default as TransactionStatus,
|
|
78
88
|
TransactionType_default as TransactionType,
|
|
79
89
|
Wallet_default as Wallet,
|
|
@@ -94,6 +104,8 @@ export {
|
|
|
94
104
|
getOnChainTransactionQuery,
|
|
95
105
|
getPaymentRequestQuery,
|
|
96
106
|
getRoutingTransactionQuery,
|
|
107
|
+
getSignablePayloadQuery,
|
|
108
|
+
getSignableQuery,
|
|
97
109
|
getTransactionQuery,
|
|
98
110
|
getWithdrawalQuery
|
|
99
111
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lightsparkdev/lightspark-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Lightspark JS SDK",
|
|
5
5
|
"author": "Lightspark Inc.",
|
|
6
6
|
"keywords": [
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"url": "https://github.com/lightsparkdev/js-sdk/issues"
|
|
20
20
|
},
|
|
21
21
|
"engines": {
|
|
22
|
-
"node": ">=
|
|
22
|
+
"node": ">=18.17.0"
|
|
23
23
|
},
|
|
24
24
|
"exports": {
|
|
25
25
|
".": {
|
|
@@ -48,7 +48,9 @@
|
|
|
48
48
|
"main": "./dist/index.js",
|
|
49
49
|
"module": "./dist/index.js",
|
|
50
50
|
"browser": {
|
|
51
|
-
"crypto": false
|
|
51
|
+
"crypto": false,
|
|
52
|
+
"fs": false,
|
|
53
|
+
"path": false
|
|
52
54
|
},
|
|
53
55
|
"files": [
|
|
54
56
|
"src/*",
|
|
@@ -56,13 +58,14 @@
|
|
|
56
58
|
"CHANGELOG.md"
|
|
57
59
|
],
|
|
58
60
|
"scripts": {
|
|
59
|
-
"build": "tsup
|
|
61
|
+
"build": "tsup",
|
|
60
62
|
"clean": "rm -rf .turbo && rm -rf dist",
|
|
61
63
|
"dev": "yarn build -- --watch",
|
|
62
64
|
"docs": "typedoc src",
|
|
63
65
|
"format:fix": "prettier src --write",
|
|
64
66
|
"format": "prettier src --check",
|
|
65
67
|
"lint:fix": "eslint --fix .",
|
|
68
|
+
"lint:fix:continue": "eslint --fix . || exit 0",
|
|
66
69
|
"lint:watch": "esw ./src -w --ext .ts,.tsx,.js --color",
|
|
67
70
|
"lint": "eslint .",
|
|
68
71
|
"postversion": "yarn build",
|
|
@@ -72,7 +75,7 @@
|
|
|
72
75
|
},
|
|
73
76
|
"license": "Apache-2.0",
|
|
74
77
|
"dependencies": {
|
|
75
|
-
"@lightsparkdev/core": "0.
|
|
78
|
+
"@lightsparkdev/core": "1.0.0",
|
|
76
79
|
"auto-bind": "^5.0.1",
|
|
77
80
|
"crypto": "^1.0.1",
|
|
78
81
|
"crypto-browserify": "^3.12.0",
|
|
@@ -86,14 +89,14 @@
|
|
|
86
89
|
"@lightsparkdev/eslint-config": "*",
|
|
87
90
|
"@lightsparkdev/tsconfig": "0.0.0",
|
|
88
91
|
"@types/crypto-js": "^4.1.1",
|
|
89
|
-
"@types/jest": "^29.5.
|
|
92
|
+
"@types/jest": "^29.5.3",
|
|
90
93
|
"@types/ws": "^8.5.4",
|
|
91
94
|
"eslint": "^8.3.0",
|
|
92
95
|
"eslint-watch": "^8.0.0",
|
|
93
|
-
"jest": "^29.
|
|
94
|
-
"prettier": "
|
|
96
|
+
"jest": "^29.6.2",
|
|
97
|
+
"prettier": "3.0.2",
|
|
95
98
|
"prettier-plugin-organize-imports": "^3.2.2",
|
|
96
|
-
"ts-jest": "^29.
|
|
99
|
+
"ts-jest": "^29.1.1",
|
|
97
100
|
"ts-node": "^10.9.1",
|
|
98
101
|
"tsc-absolute": "^1.0.1",
|
|
99
102
|
"tsup": "^6.7.0",
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LightsparkSigningException,
|
|
3
|
+
type CryptoInterface,
|
|
4
|
+
type NodeKeyCache,
|
|
5
|
+
type Requester,
|
|
6
|
+
type SigningKey,
|
|
7
|
+
} from "@lightsparkdev/core";
|
|
8
|
+
import {
|
|
9
|
+
isMasterSeedSigningKeyLoaderArgs,
|
|
10
|
+
isNodeIdAndPasswordSigningKeyLoaderArgs,
|
|
11
|
+
MasterSeedSigningKeyLoader,
|
|
12
|
+
NodeIdAndPasswordSigningKeyLoader,
|
|
13
|
+
type SigningKeyLoader,
|
|
14
|
+
type SigningKeyLoaderArgs,
|
|
15
|
+
} from "./SigningKeyLoader.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A cache for SigningKeyLoaders associated with nodes.
|
|
19
|
+
*/
|
|
20
|
+
export default class NodeKeyLoaderCache {
|
|
21
|
+
private idToLoader: Map<string, SigningKeyLoader>;
|
|
22
|
+
|
|
23
|
+
constructor(
|
|
24
|
+
private readonly nodeKeyCache: NodeKeyCache,
|
|
25
|
+
private readonly cryptoImpl: CryptoInterface = DefaultCrypto,
|
|
26
|
+
) {
|
|
27
|
+
this.idToLoader = new Map();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Sets the signing key loader for a node.
|
|
32
|
+
* Instantiates a signing key loader based on the type of args passed in by the user.
|
|
33
|
+
*
|
|
34
|
+
* @param nodeId The ID of the node to get the key for
|
|
35
|
+
* @param loaderArgs Loader arguments for loading the key
|
|
36
|
+
* @param requester Requester used for loading the key
|
|
37
|
+
*/
|
|
38
|
+
setLoader(
|
|
39
|
+
nodeId: string,
|
|
40
|
+
loaderArgs: SigningKeyLoaderArgs,
|
|
41
|
+
requester: Requester,
|
|
42
|
+
) {
|
|
43
|
+
let loader: SigningKeyLoader;
|
|
44
|
+
if (isNodeIdAndPasswordSigningKeyLoaderArgs(loaderArgs)) {
|
|
45
|
+
loader = new NodeIdAndPasswordSigningKeyLoader(
|
|
46
|
+
{ nodeId, ...loaderArgs },
|
|
47
|
+
requester,
|
|
48
|
+
this.cryptoImpl,
|
|
49
|
+
);
|
|
50
|
+
} else if (isMasterSeedSigningKeyLoaderArgs(loaderArgs)) {
|
|
51
|
+
loader = new MasterSeedSigningKeyLoader({ ...loaderArgs });
|
|
52
|
+
} else {
|
|
53
|
+
throw new LightsparkSigningException("Invalid signing key loader args");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
this.idToLoader.set(nodeId, loader);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Gets the key for a node using the loader set by [setLoader]
|
|
61
|
+
*
|
|
62
|
+
* @param id The ID of the node to get the key for
|
|
63
|
+
* @returns The loaded key
|
|
64
|
+
*/
|
|
65
|
+
async getKeyWithLoader(id: string): Promise<SigningKey | undefined> {
|
|
66
|
+
if (this.nodeKeyCache.hasKey(id)) {
|
|
67
|
+
return this.nodeKeyCache.getKey(id);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const loader = this.idToLoader.get(id);
|
|
71
|
+
if (!loader) {
|
|
72
|
+
throw new LightsparkSigningException(
|
|
73
|
+
"No signing key loader found for node " + id,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
const loaderResult = await loader.loadSigningKey();
|
|
77
|
+
if (!loaderResult) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return this.nodeKeyCache.loadKey(
|
|
82
|
+
id,
|
|
83
|
+
{ key: loaderResult.key },
|
|
84
|
+
loaderResult.type,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import {
|
|
2
|
+
b64encode,
|
|
3
|
+
LightsparkSigningException,
|
|
4
|
+
SigningKeyType,
|
|
5
|
+
type CryptoInterface,
|
|
6
|
+
type Maybe,
|
|
7
|
+
type Requester,
|
|
8
|
+
} from "@lightsparkdev/core";
|
|
9
|
+
import { RecoverNodeSigningKey } from "./graphql/RecoverNodeSigningKey.js";
|
|
10
|
+
import { BitcoinNetwork } from "./index.js";
|
|
11
|
+
import {
|
|
12
|
+
LightsparkSigner,
|
|
13
|
+
Network,
|
|
14
|
+
} from "./lightspark_crypto/lightspark_crypto.js";
|
|
15
|
+
|
|
16
|
+
const SIGNING_KEY_PATH = "m/5";
|
|
17
|
+
|
|
18
|
+
const getCryptoLibNetwork = (bitcoinNetwork: BitcoinNetwork): Network => {
|
|
19
|
+
switch (bitcoinNetwork) {
|
|
20
|
+
case BitcoinNetwork.MAINNET:
|
|
21
|
+
return Network.Bitcoin;
|
|
22
|
+
case BitcoinNetwork.TESTNET:
|
|
23
|
+
return Network.Testnet;
|
|
24
|
+
case BitcoinNetwork.REGTEST:
|
|
25
|
+
return Network.Regtest;
|
|
26
|
+
default:
|
|
27
|
+
throw new Error(
|
|
28
|
+
`Unsupported lightspark_crypto network ${bitcoinNetwork}.`,
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Args for creating a new SigningKeyLoader. Must be one of the sub types.
|
|
35
|
+
*/
|
|
36
|
+
export type SigningKeyLoaderArgs =
|
|
37
|
+
| NodeIdAndPasswordSigningKeyLoaderArgs
|
|
38
|
+
| MasterSeedSigningKeyLoaderArgs;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Args for creating a new SigningKeyLoader from a node ID and password.
|
|
42
|
+
* This cannot be used if you are using remote signing. It is used to recover an RSA operation signing key using
|
|
43
|
+
* the password you chose when setting up your node. For REGTEST nodes, the password is "1234!@#$".
|
|
44
|
+
*/
|
|
45
|
+
export interface NodeIdAndPasswordSigningKeyLoaderArgs {
|
|
46
|
+
password: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Internal version of NodeIdAndPasswordSigningKeyLoaderArgs that includes the node ID.
|
|
51
|
+
*/
|
|
52
|
+
interface NodeIdAndPasswordSigningKeyLoaderArgsInternal
|
|
53
|
+
extends NodeIdAndPasswordSigningKeyLoaderArgs {
|
|
54
|
+
nodeId: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Args for creating a new SigningKeyLoader from a master seed and network.
|
|
59
|
+
* This should be used if you are using remote signing, rather than an RSA operation signing key.
|
|
60
|
+
*/
|
|
61
|
+
export interface MasterSeedSigningKeyLoaderArgs {
|
|
62
|
+
masterSeed: Uint8Array;
|
|
63
|
+
network: BitcoinNetwork;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* The result of loading a signing key.
|
|
68
|
+
*/
|
|
69
|
+
export interface SigningKeyLoaderResult {
|
|
70
|
+
key: string;
|
|
71
|
+
type: SigningKeyType;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface SigningKeyLoader {
|
|
75
|
+
loadSigningKey: () => Promise<SigningKeyLoaderResult | undefined>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function isNodeIdAndPasswordSigningKeyLoaderArgs(
|
|
79
|
+
args: SigningKeyLoaderArgs,
|
|
80
|
+
): args is NodeIdAndPasswordSigningKeyLoaderArgs {
|
|
81
|
+
return (args as NodeIdAndPasswordSigningKeyLoaderArgs).password !== undefined;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function isMasterSeedSigningKeyLoaderArgs(
|
|
85
|
+
args: SigningKeyLoaderArgs,
|
|
86
|
+
): args is MasterSeedSigningKeyLoaderArgs {
|
|
87
|
+
return (args as MasterSeedSigningKeyLoaderArgs).masterSeed !== undefined;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Key loader that loads an RSA signing key by providing a node ID and password to recover the key from Lightspark.
|
|
92
|
+
*/
|
|
93
|
+
export class NodeIdAndPasswordSigningKeyLoader implements SigningKeyLoader {
|
|
94
|
+
private readonly nodeId: string;
|
|
95
|
+
private readonly password: string;
|
|
96
|
+
private readonly requester: Requester;
|
|
97
|
+
private readonly cryptoImpl: CryptoInterface;
|
|
98
|
+
|
|
99
|
+
constructor(
|
|
100
|
+
args: NodeIdAndPasswordSigningKeyLoaderArgsInternal,
|
|
101
|
+
requester: Requester,
|
|
102
|
+
cryptoImpl: CryptoInterface,
|
|
103
|
+
) {
|
|
104
|
+
this.nodeId = args.nodeId;
|
|
105
|
+
this.password = args.password;
|
|
106
|
+
this.requester = requester;
|
|
107
|
+
this.cryptoImpl = cryptoImpl;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async loadSigningKey() {
|
|
111
|
+
const encryptedKey = await this.recoverNodeSigningKey();
|
|
112
|
+
if (!encryptedKey) {
|
|
113
|
+
console.warn("No encrypted key found for node " + this.nodeId);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const signingPrivateKey =
|
|
118
|
+
await this.cryptoImpl.decryptSecretWithNodePassword(
|
|
119
|
+
encryptedKey.cipher,
|
|
120
|
+
encryptedKey.encrypted_value,
|
|
121
|
+
this.password,
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
if (!signingPrivateKey) {
|
|
125
|
+
throw new LightsparkSigningException(
|
|
126
|
+
"Unable to decrypt signing key with provided password. Please try again.",
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let signingPrivateKeyPEM = "";
|
|
131
|
+
if (new Uint8Array(signingPrivateKey)[0] === 48) {
|
|
132
|
+
// Support DER format - https://github.com/lightsparkdev/webdev/pull/1982
|
|
133
|
+
signingPrivateKeyPEM = b64encode(signingPrivateKey);
|
|
134
|
+
} else {
|
|
135
|
+
const dec = new TextDecoder();
|
|
136
|
+
signingPrivateKeyPEM = dec.decode(signingPrivateKey);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return { key: signingPrivateKeyPEM, type: SigningKeyType.RSASigningKey };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
private async recoverNodeSigningKey(): Promise<
|
|
143
|
+
Maybe<{ encrypted_value: string; cipher: string }>
|
|
144
|
+
> {
|
|
145
|
+
const response = await this.requester.makeRawRequest(
|
|
146
|
+
RecoverNodeSigningKey,
|
|
147
|
+
{ nodeId: this.nodeId },
|
|
148
|
+
);
|
|
149
|
+
const nodeEntity = response.entity;
|
|
150
|
+
if (nodeEntity?.__typename === "LightsparkNodeWithOSK") {
|
|
151
|
+
return nodeEntity.encrypted_signing_private_key;
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Key loader that loads a Secp256k1 signing key from a master seed.
|
|
159
|
+
*/
|
|
160
|
+
export class MasterSeedSigningKeyLoader implements SigningKeyLoader {
|
|
161
|
+
private readonly masterSeed: Uint8Array;
|
|
162
|
+
private readonly network: BitcoinNetwork;
|
|
163
|
+
|
|
164
|
+
constructor(args: MasterSeedSigningKeyLoaderArgs) {
|
|
165
|
+
this.masterSeed = args.masterSeed;
|
|
166
|
+
this.network = args.network;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async loadSigningKey() {
|
|
170
|
+
const lightsparkSigner = LightsparkSigner.from_bytes(
|
|
171
|
+
this.masterSeed,
|
|
172
|
+
getCryptoLibNetwork(this.network),
|
|
173
|
+
);
|
|
174
|
+
const privateKey = lightsparkSigner.derive_private_key(SIGNING_KEY_PATH);
|
|
175
|
+
return { key: privateKey, type: SigningKeyType.Secp256k1SigningKey };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -9,16 +9,16 @@ class AccountTokenAuthProvider implements AuthProvider {
|
|
|
9
9
|
|
|
10
10
|
constructor(
|
|
11
11
|
private readonly apiTokenClientId: string,
|
|
12
|
-
private readonly apiTokenClientSecret: string
|
|
12
|
+
private readonly apiTokenClientSecret: string,
|
|
13
13
|
) {
|
|
14
14
|
this.utf8AuthBytes = new TextEncoder().encode(
|
|
15
|
-
`${apiTokenClientId}:${apiTokenClientSecret}
|
|
15
|
+
`${apiTokenClientId}:${apiTokenClientSecret}`,
|
|
16
16
|
);
|
|
17
17
|
autoBind(this);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
async addWsConnectionParams(
|
|
21
|
-
params: Record<string, string
|
|
21
|
+
params: Record<string, string>,
|
|
22
22
|
): Promise<Record<string, string>> {
|
|
23
23
|
return Object.assign({}, params, {
|
|
24
24
|
client_id: this.apiTokenClientId,
|
|
@@ -27,7 +27,7 @@ class AccountTokenAuthProvider implements AuthProvider {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
async addAuthHeaders(
|
|
30
|
-
headers: Record<string, string
|
|
30
|
+
headers: Record<string, string>,
|
|
31
31
|
): Promise<Record<string, string>> {
|
|
32
32
|
return Object.assign({}, headers, {
|
|
33
33
|
authorization: `Basic ${b64encode(this.utf8AuthBytes)}`,
|