@buildonspark/spark-sdk 0.0.15 → 0.0.17
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/services/config.d.ts +1 -0
- package/dist/services/config.js +4 -1
- package/dist/services/config.js.map +1 -1
- package/dist/services/wallet-config.d.ts +2 -0
- package/dist/services/wallet-config.js +2 -0
- package/dist/services/wallet-config.js.map +1 -1
- package/dist/signer/signer.js +4 -3
- package/dist/signer/signer.js.map +1 -1
- package/dist/spark-sdk.d.ts +4 -4
- package/dist/spark-sdk.js +26 -10
- package/dist/spark-sdk.js.map +1 -1
- package/package.json +4 -3
- package/src/examples/example.js +247 -0
- package/src/examples/example.ts +207 -0
- package/src/graphql/client.ts +282 -0
- package/src/graphql/mutations/CompleteCoopExit.ts +19 -0
- package/src/graphql/mutations/CompleteLeavesSwap.ts +17 -0
- package/src/graphql/mutations/RequestCoopExit.ts +20 -0
- package/src/graphql/mutations/RequestLightningReceive.ts +26 -0
- package/src/graphql/mutations/RequestLightningSend.ts +17 -0
- package/src/graphql/mutations/RequestSwapLeaves.ts +24 -0
- package/src/graphql/objects/BitcoinNetwork.ts +22 -0
- package/src/graphql/objects/CompleteCoopExitInput.ts +41 -0
- package/src/graphql/objects/CompleteCoopExitOutput.ts +45 -0
- package/src/graphql/objects/CompleteLeavesSwapInput.ts +45 -0
- package/src/graphql/objects/CompleteLeavesSwapOutput.ts +45 -0
- package/src/graphql/objects/CompleteSeedReleaseInput.ts +41 -0
- package/src/graphql/objects/CompleteSeedReleaseOutput.ts +43 -0
- package/src/graphql/objects/Connection.ts +90 -0
- package/src/graphql/objects/CoopExitFeeEstimateInput.ts +41 -0
- package/src/graphql/objects/CoopExitFeeEstimateOutput.ts +52 -0
- package/src/graphql/objects/CoopExitRequest.ts +118 -0
- package/src/graphql/objects/CurrencyAmount.ts +74 -0
- package/src/graphql/objects/CurrencyUnit.ts +32 -0
- package/src/graphql/objects/Entity.ts +202 -0
- package/src/graphql/objects/GetChallengeInput.ts +37 -0
- package/src/graphql/objects/GetChallengeOutput.ts +43 -0
- package/src/graphql/objects/Invoice.ts +83 -0
- package/src/graphql/objects/Leaf.ts +59 -0
- package/src/graphql/objects/LeavesSwapFeeEstimateInput.ts +37 -0
- package/src/graphql/objects/LeavesSwapFeeEstimateOutput.ts +52 -0
- package/src/graphql/objects/LeavesSwapRequest.ts +192 -0
- package/src/graphql/objects/LightningReceiveFeeEstimateInput.ts +41 -0
- package/src/graphql/objects/LightningReceiveFeeEstimateOutput.ts +52 -0
- package/src/graphql/objects/LightningReceiveRequest.ts +147 -0
- package/src/graphql/objects/LightningReceiveRequestStatus.ts +34 -0
- package/src/graphql/objects/LightningSendFeeEstimateInput.ts +37 -0
- package/src/graphql/objects/LightningSendFeeEstimateOutput.ts +52 -0
- package/src/graphql/objects/LightningSendRequest.ts +134 -0
- package/src/graphql/objects/LightningSendRequestStatus.ts +28 -0
- package/src/graphql/objects/NotifyReceiverTransferInput.ts +41 -0
- package/src/graphql/objects/PageInfo.ts +58 -0
- package/src/graphql/objects/Provider.ts +41 -0
- package/src/graphql/objects/RequestCoopExitInput.ts +41 -0
- package/src/graphql/objects/RequestCoopExitOutput.ts +45 -0
- package/src/graphql/objects/RequestLeavesSwapInput.ts +55 -0
- package/src/graphql/objects/RequestLeavesSwapOutput.ts +45 -0
- package/src/graphql/objects/RequestLightningReceiveInput.ts +58 -0
- package/src/graphql/objects/RequestLightningReceiveOutput.ts +45 -0
- package/src/graphql/objects/RequestLightningSendInput.ts +41 -0
- package/src/graphql/objects/RequestLightningSendOutput.ts +45 -0
- package/src/graphql/objects/SparkCoopExitRequestStatus.ts +20 -0
- package/src/graphql/objects/SparkLeavesSwapRequestStatus.ts +20 -0
- package/src/graphql/objects/SparkTransferToLeavesConnection.ts +79 -0
- package/src/graphql/objects/SparkWalletUser.ts +86 -0
- package/src/graphql/objects/StartSeedReleaseInput.ts +37 -0
- package/src/graphql/objects/SwapLeaf.ts +53 -0
- package/src/graphql/objects/Transfer.ts +98 -0
- package/src/graphql/objects/UserLeafInput.ts +28 -0
- package/src/graphql/objects/VerifyChallengeInput.ts +51 -0
- package/src/graphql/objects/VerifyChallengeOutput.ts +43 -0
- package/src/graphql/objects/WalletUserIdentityPublicKeyInput.ts +37 -0
- package/src/graphql/objects/WalletUserIdentityPublicKeyOutput.ts +43 -0
- package/src/graphql/objects/index.ts +67 -0
- package/src/graphql/queries/CoopExitFeeEstimate.ts +18 -0
- package/src/graphql/queries/CurrentUser.ts +10 -0
- package/src/graphql/queries/LightningReceiveFeeEstimate.ts +18 -0
- package/src/graphql/queries/LightningSendFeeEstimate.ts +16 -0
- package/src/proto/common.ts +431 -0
- package/src/proto/google/protobuf/descriptor.ts +6625 -0
- package/src/proto/google/protobuf/duration.ts +197 -0
- package/src/proto/google/protobuf/empty.ts +83 -0
- package/src/proto/google/protobuf/timestamp.ts +226 -0
- package/src/proto/mock.ts +151 -0
- package/src/proto/spark.ts +12727 -0
- package/src/proto/spark_authn.ts +673 -0
- package/src/proto/validate/validate.ts +6047 -0
- package/src/services/config.ts +75 -0
- package/src/services/connection.ts +264 -0
- package/src/services/coop-exit.ts +190 -0
- package/src/services/deposit.ts +327 -0
- package/src/services/lightning.ts +341 -0
- package/src/services/lrc20.ts +42 -0
- package/src/services/token-transactions.ts +499 -0
- package/src/services/transfer.ts +1188 -0
- package/src/services/tree-creation.ts +618 -0
- package/src/services/wallet-config.ts +143 -0
- package/src/signer/signer.ts +532 -0
- package/src/spark-sdk.ts +1665 -0
- package/src/tests/adaptor-signature.test.ts +64 -0
- package/src/tests/bitcoin.test.ts +122 -0
- package/src/tests/coop-exit.test.ts +233 -0
- package/src/tests/deposit.test.ts +98 -0
- package/src/tests/keys.test.ts +82 -0
- package/src/tests/lightning.test.ts +307 -0
- package/src/tests/secret-sharing.test.ts +63 -0
- package/src/tests/swap.test.ts +252 -0
- package/src/tests/test-util.ts +92 -0
- package/src/tests/tokens.test.ts +47 -0
- package/src/tests/transfer.test.ts +371 -0
- package/src/tests/tree-creation.test.ts +56 -0
- package/src/tests/utils/spark-testing-wallet.ts +37 -0
- package/src/tests/utils/test-faucet.ts +257 -0
- package/src/types/grpc.ts +8 -0
- package/src/types/index.ts +3 -0
- package/src/utils/adaptor-signature.ts +189 -0
- package/src/utils/bitcoin.ts +138 -0
- package/src/utils/crypto.ts +14 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/keys.ts +92 -0
- package/src/utils/mempool.ts +42 -0
- package/src/utils/network.ts +70 -0
- package/src/utils/proof.ts +17 -0
- package/src/utils/response-validation.ts +26 -0
- package/src/utils/secret-sharing.ts +263 -0
- package/src/utils/signing.ts +96 -0
- package/src/utils/token-hashing.ts +163 -0
- package/src/utils/token-keyshares.ts +31 -0
- package/src/utils/token-transactions.ts +71 -0
- package/src/utils/transaction.ts +45 -0
- package/src/utils/wasm-wrapper.ts +57 -0
- package/src/utils/wasm.ts +154 -0
- package/src/wasm/spark_bindings.d.ts +208 -0
- package/src/wasm/spark_bindings.js +1161 -0
- package/src/wasm/spark_bindings_bg.wasm +0 -0
- package/src/wasm/spark_bindings_bg.wasm.d.ts +136 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var utils_1 = require("@noble/curves/abstract/utils");
|
|
40
|
+
var readline_1 = require("readline");
|
|
41
|
+
var objects_1 = require("../../dist/graphql/objects");
|
|
42
|
+
var spark_sdk_1 = require("../../dist/spark-sdk");
|
|
43
|
+
var bitcoin_1 = require("../../dist/utils/bitcoin");
|
|
44
|
+
var network_1 = require("../../dist/utils/network");
|
|
45
|
+
// Initialize Spark Wallet
|
|
46
|
+
var walletMnemonic = "typical stereo dose party penalty decline neglect feel harvest abstract stage winter";
|
|
47
|
+
function runCLI() {
|
|
48
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
49
|
+
var wallet, rl, helpMessage, _loop_1, state_1;
|
|
50
|
+
var _a, _b;
|
|
51
|
+
return __generator(this, function (_c) {
|
|
52
|
+
switch (_c.label) {
|
|
53
|
+
case 0:
|
|
54
|
+
wallet = new spark_sdk_1.SparkWallet(network_1.Network.REGTEST);
|
|
55
|
+
rl = readline_1.default.createInterface({
|
|
56
|
+
input: process.stdin,
|
|
57
|
+
output: process.stdout,
|
|
58
|
+
});
|
|
59
|
+
helpMessage = "\n Available commands:\n genmnemonic - Generate a new mnemonic\n initwallet <mnemonic> - Create a new wallet from a mnemonic\n gendepositaddr - Generate a new deposit address\n completedeposit <pubkey> <verifyingKey> <rawtx> - Complete a deposit\n createinvoice <amount> <memo> - Create a new lightning invoice\n payinvoice <invoice> <amount> - Pay a lightning invoice\n balance - Show current wallet balance\n getleaves - Show current leaves\n sendtransfer <amount> <receiverPubKey> - Send a transfer\n pendingtransfers - Show pending transfers\n claimtransfer <transferId> - Claim a pending transfer\n help - Show this help message\n exit/quit - Exit the program\n";
|
|
60
|
+
console.log(helpMessage);
|
|
61
|
+
_loop_1 = function () {
|
|
62
|
+
var command, _d, firstWord, rest, args, lowerCommand, _e, mnemonic, pubKey, leafPubKey, depositAddress, depositTx, treeResp, invoice, fee, receiverPubKey, amount, pending_1, pendingTransfers, transfer, result, payResult, balance, leaves;
|
|
63
|
+
return __generator(this, function (_f) {
|
|
64
|
+
switch (_f.label) {
|
|
65
|
+
case 0: return [4 /*yield*/, new Promise(function (resolve) {
|
|
66
|
+
rl.question("> ", resolve);
|
|
67
|
+
})];
|
|
68
|
+
case 1:
|
|
69
|
+
command = _f.sent();
|
|
70
|
+
_d = command.split(" "), firstWord = _d[0], rest = _d.slice(1);
|
|
71
|
+
args = rest.join(" ");
|
|
72
|
+
lowerCommand = firstWord.toLowerCase();
|
|
73
|
+
if (lowerCommand === "exit" || lowerCommand === "quit") {
|
|
74
|
+
rl.close();
|
|
75
|
+
return [2 /*return*/, "break"];
|
|
76
|
+
}
|
|
77
|
+
_e = lowerCommand;
|
|
78
|
+
switch (_e) {
|
|
79
|
+
case "help": return [3 /*break*/, 2];
|
|
80
|
+
case "genmnemonic": return [3 /*break*/, 3];
|
|
81
|
+
case "initwallet": return [3 /*break*/, 4];
|
|
82
|
+
case "gendepositaddr": return [3 /*break*/, 6];
|
|
83
|
+
case "completedeposit": return [3 /*break*/, 8];
|
|
84
|
+
case "createinvoice": return [3 /*break*/, 10];
|
|
85
|
+
case "sendtransfer": return [3 /*break*/, 13];
|
|
86
|
+
case "pendingtransfers": return [3 /*break*/, 15];
|
|
87
|
+
case "claimtransfer": return [3 /*break*/, 17];
|
|
88
|
+
case "payinvoice": return [3 /*break*/, 20];
|
|
89
|
+
case "balance": return [3 /*break*/, 22];
|
|
90
|
+
case "getleaves": return [3 /*break*/, 24];
|
|
91
|
+
}
|
|
92
|
+
return [3 /*break*/, 26];
|
|
93
|
+
case 2:
|
|
94
|
+
console.log(helpMessage);
|
|
95
|
+
return [3 /*break*/, 26];
|
|
96
|
+
case 3:
|
|
97
|
+
mnemonic = wallet.generateMnemonic();
|
|
98
|
+
console.log(mnemonic);
|
|
99
|
+
return [3 /*break*/, 26];
|
|
100
|
+
case 4:
|
|
101
|
+
console.log(":".concat(args, ":"));
|
|
102
|
+
return [4 /*yield*/, wallet.createSparkWallet(args || walletMnemonic)];
|
|
103
|
+
case 5:
|
|
104
|
+
pubKey = _f.sent();
|
|
105
|
+
console.log("pubkey", pubKey);
|
|
106
|
+
return [3 /*break*/, 26];
|
|
107
|
+
case 6:
|
|
108
|
+
if (!wallet.isInitialized()) {
|
|
109
|
+
console.log("No wallet initialized");
|
|
110
|
+
return [3 /*break*/, 26];
|
|
111
|
+
}
|
|
112
|
+
leafPubKey = wallet.getSigner().generatePublicKey();
|
|
113
|
+
return [4 /*yield*/, wallet.generateDepositAddress(leafPubKey)];
|
|
114
|
+
case 7:
|
|
115
|
+
depositAddress = _f.sent();
|
|
116
|
+
console.log("Deposit address:", (_a = depositAddress.depositAddress) === null || _a === void 0 ? void 0 : _a.address);
|
|
117
|
+
console.log("Verifying key:", (0, utils_1.bytesToHex)(((_b = depositAddress.depositAddress) === null || _b === void 0 ? void 0 : _b.verifyingKey) || new Uint8Array()));
|
|
118
|
+
console.log("Pubkey:", (0, utils_1.bytesToHex)(leafPubKey));
|
|
119
|
+
return [3 /*break*/, 26];
|
|
120
|
+
case 8:
|
|
121
|
+
if (!wallet.isInitialized()) {
|
|
122
|
+
console.log("No wallet initialized");
|
|
123
|
+
return [3 /*break*/, 26];
|
|
124
|
+
}
|
|
125
|
+
depositTx = (0, bitcoin_1.getTxFromRawTxHex)(args[2]);
|
|
126
|
+
return [4 /*yield*/, wallet.createTreeRoot((0, utils_1.hexToBytes)(args[0]), (0, utils_1.hexToBytes)(args[1]), depositTx, 0)];
|
|
127
|
+
case 9:
|
|
128
|
+
treeResp = _f.sent();
|
|
129
|
+
console.log("Tree root:", treeResp.nodes);
|
|
130
|
+
return [3 /*break*/, 26];
|
|
131
|
+
case 10:
|
|
132
|
+
if (!wallet.isInitialized()) {
|
|
133
|
+
console.log("No wallet initialized");
|
|
134
|
+
return [3 /*break*/, 26];
|
|
135
|
+
}
|
|
136
|
+
return [4 /*yield*/, wallet.createLightningInvoice({
|
|
137
|
+
amountSats: parseInt(args),
|
|
138
|
+
memo: args[1],
|
|
139
|
+
expirySeconds: 60 * 60 * 24,
|
|
140
|
+
})];
|
|
141
|
+
case 11:
|
|
142
|
+
invoice = _f.sent();
|
|
143
|
+
return [4 /*yield*/, wallet.getLightningReceiveFeeEstimate({
|
|
144
|
+
amountSats: parseInt(args),
|
|
145
|
+
network: objects_1.BitcoinNetwork.REGTEST,
|
|
146
|
+
})];
|
|
147
|
+
case 12:
|
|
148
|
+
fee = _f.sent();
|
|
149
|
+
console.log("Invoice created:", invoice);
|
|
150
|
+
console.log("Fee: ".concat(fee === null || fee === void 0 ? void 0 : fee.feeEstimate.originalValue, " ").concat(fee === null || fee === void 0 ? void 0 : fee.feeEstimate.originalUnit));
|
|
151
|
+
return [3 /*break*/, 26];
|
|
152
|
+
case 13:
|
|
153
|
+
if (!wallet.isInitialized()) {
|
|
154
|
+
console.log("No wallet initialized");
|
|
155
|
+
return [3 /*break*/, 26];
|
|
156
|
+
}
|
|
157
|
+
receiverPubKey = (0, utils_1.hexToBytes)(args[1]);
|
|
158
|
+
amount = parseInt(args[0]);
|
|
159
|
+
return [4 /*yield*/, wallet.sendTransfer(amount, receiverPubKey)];
|
|
160
|
+
case 14:
|
|
161
|
+
_f.sent();
|
|
162
|
+
return [3 /*break*/, 26];
|
|
163
|
+
case 15:
|
|
164
|
+
if (!wallet.isInitialized()) {
|
|
165
|
+
console.log("No wallet initialized");
|
|
166
|
+
return [3 /*break*/, 26];
|
|
167
|
+
}
|
|
168
|
+
return [4 /*yield*/, wallet.queryPendingTransfers()];
|
|
169
|
+
case 16:
|
|
170
|
+
pending_1 = _f.sent();
|
|
171
|
+
console.log(pending_1);
|
|
172
|
+
return [3 /*break*/, 26];
|
|
173
|
+
case 17:
|
|
174
|
+
if (!wallet.isInitialized()) {
|
|
175
|
+
console.log("No wallet initialized");
|
|
176
|
+
return [3 /*break*/, 26];
|
|
177
|
+
}
|
|
178
|
+
if (!args) {
|
|
179
|
+
console.log("Please provide a transfer id");
|
|
180
|
+
return [3 /*break*/, 26];
|
|
181
|
+
}
|
|
182
|
+
return [4 /*yield*/, wallet.queryPendingTransfers()];
|
|
183
|
+
case 18:
|
|
184
|
+
pendingTransfers = _f.sent();
|
|
185
|
+
transfer = pendingTransfers.transfers.find(function (t) { return t.id === args; });
|
|
186
|
+
if (!transfer) {
|
|
187
|
+
console.log("Transfer not found");
|
|
188
|
+
return [3 /*break*/, 26];
|
|
189
|
+
}
|
|
190
|
+
return [4 /*yield*/, wallet.claimTransfer(transfer)];
|
|
191
|
+
case 19:
|
|
192
|
+
result = _f.sent();
|
|
193
|
+
console.log(result.nodes);
|
|
194
|
+
return [3 /*break*/, 26];
|
|
195
|
+
case 20:
|
|
196
|
+
if (!wallet.isInitialized()) {
|
|
197
|
+
console.log("No wallet initialized");
|
|
198
|
+
return [3 /*break*/, 26];
|
|
199
|
+
}
|
|
200
|
+
return [4 /*yield*/, wallet.payLightningInvoice({
|
|
201
|
+
invoice: args[0],
|
|
202
|
+
idempotencyKey: args[0],
|
|
203
|
+
amountSats: parseInt(args[1]),
|
|
204
|
+
})];
|
|
205
|
+
case 21:
|
|
206
|
+
payResult = _f.sent();
|
|
207
|
+
console.log(payResult);
|
|
208
|
+
return [3 /*break*/, 26];
|
|
209
|
+
case 22:
|
|
210
|
+
if (!wallet.isInitialized()) {
|
|
211
|
+
console.log("No wallet initialized");
|
|
212
|
+
return [3 /*break*/, 26];
|
|
213
|
+
}
|
|
214
|
+
return [4 /*yield*/, wallet.getBalance()];
|
|
215
|
+
case 23:
|
|
216
|
+
balance = _f.sent();
|
|
217
|
+
console.log(balance);
|
|
218
|
+
return [3 /*break*/, 26];
|
|
219
|
+
case 24:
|
|
220
|
+
if (!wallet.isInitialized()) {
|
|
221
|
+
console.log("No wallet initialized");
|
|
222
|
+
return [3 /*break*/, 26];
|
|
223
|
+
}
|
|
224
|
+
return [4 /*yield*/, wallet.getLeaves()];
|
|
225
|
+
case 25:
|
|
226
|
+
leaves = _f.sent();
|
|
227
|
+
console.log(leaves);
|
|
228
|
+
return [3 /*break*/, 26];
|
|
229
|
+
case 26: return [2 /*return*/];
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
_c.label = 1;
|
|
234
|
+
case 1:
|
|
235
|
+
if (!true) return [3 /*break*/, 3];
|
|
236
|
+
return [5 /*yield**/, _loop_1()];
|
|
237
|
+
case 2:
|
|
238
|
+
state_1 = _c.sent();
|
|
239
|
+
if (state_1 === "break")
|
|
240
|
+
return [3 /*break*/, 3];
|
|
241
|
+
return [3 /*break*/, 1];
|
|
242
|
+
case 3: return [2 /*return*/];
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
runCLI();
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import readline from "readline";
|
|
2
|
+
import { ConfigOptions } from "../../dist/services/wallet-config.js";
|
|
3
|
+
import { SparkWallet } from "../../dist/spark-sdk";
|
|
4
|
+
import { getLatestDepositTxId } from "../../dist/utils/mempool.js";
|
|
5
|
+
|
|
6
|
+
// Initialize Spark Wallet
|
|
7
|
+
const walletMnemonic =
|
|
8
|
+
"cctypical stereo dose party penalty decline neglect feel harvest abstract stage winter";
|
|
9
|
+
|
|
10
|
+
async function runCLI() {
|
|
11
|
+
// Get network from command line args
|
|
12
|
+
const network = process.argv.includes("mainnet") ? "MAINNET" : "REGTEST";
|
|
13
|
+
let wallet: SparkWallet | undefined;
|
|
14
|
+
|
|
15
|
+
const rl = readline.createInterface({
|
|
16
|
+
input: process.stdin,
|
|
17
|
+
output: process.stdout,
|
|
18
|
+
});
|
|
19
|
+
const helpMessage = `
|
|
20
|
+
Available commands:
|
|
21
|
+
initwallet [mnemonic | seed] - Create a new wallet from a mnemonic or seed. If no mnemonic or seed is provided, a new mnemonic will be generated.
|
|
22
|
+
getbalance - Get the wallet's balance
|
|
23
|
+
getdepositaddress - Get an address to deposit funds from L1 to Spark
|
|
24
|
+
getsparkaddress - Get the wallet's spark address
|
|
25
|
+
getlatesttx <address> - Get the latest deposit transaction id for an address
|
|
26
|
+
claimdeposit <txid> - Claim any pending deposits to the wallet
|
|
27
|
+
createinvoice <amount> <memo> - Create a new lightning invoice
|
|
28
|
+
payinvoice <invoice> - Pay a lightning invoice
|
|
29
|
+
sendtransfer <amount> <receiverSparkAddress> - Send a spark transfer
|
|
30
|
+
withdraw <onchainAddress> <amount> - Withdraw funds to an L1 address
|
|
31
|
+
sendtokentransfer <tokenPubKey> <amount> <receiverSparkAddress> - Transfer tokens
|
|
32
|
+
help - Show this help message
|
|
33
|
+
exit/quit
|
|
34
|
+
|
|
35
|
+
L1 commands:
|
|
36
|
+
tokenwithdraw <tokenPublicKey> [receiverPublicKey] - Unilaterally withdraw tokens to L1- Exit the program
|
|
37
|
+
`;
|
|
38
|
+
console.log(helpMessage);
|
|
39
|
+
|
|
40
|
+
while (true) {
|
|
41
|
+
const command = await new Promise<string>((resolve) => {
|
|
42
|
+
rl.question("> ", resolve);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const [firstWord, ...args] = command.split(" ");
|
|
46
|
+
const lowerCommand = firstWord.toLowerCase();
|
|
47
|
+
|
|
48
|
+
if (lowerCommand === "exit" || lowerCommand === "quit") {
|
|
49
|
+
rl.close();
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
switch (lowerCommand) {
|
|
54
|
+
case "help":
|
|
55
|
+
console.log(helpMessage);
|
|
56
|
+
break;
|
|
57
|
+
case "getlatesttx":
|
|
58
|
+
const latestTx = await getLatestDepositTxId(args[0]);
|
|
59
|
+
console.log(latestTx);
|
|
60
|
+
break;
|
|
61
|
+
case "claimdeposit":
|
|
62
|
+
if (!wallet) {
|
|
63
|
+
console.log("Please initialize a wallet first");
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
const depositResult = await wallet.claimDeposit(args[0]);
|
|
67
|
+
console.log(depositResult);
|
|
68
|
+
break;
|
|
69
|
+
case "initwallet":
|
|
70
|
+
const mnemonicOrSeed = args.join(" ");
|
|
71
|
+
const options: ConfigOptions = {
|
|
72
|
+
network: "REGTEST",
|
|
73
|
+
};
|
|
74
|
+
const { wallet: newWallet, mnemonic: newMnemonic } =
|
|
75
|
+
await SparkWallet.create({
|
|
76
|
+
mnemonicOrSeed,
|
|
77
|
+
options,
|
|
78
|
+
});
|
|
79
|
+
wallet = newWallet;
|
|
80
|
+
console.log("Mnemonic:", newMnemonic);
|
|
81
|
+
break;
|
|
82
|
+
case "getbalance":
|
|
83
|
+
if (!wallet) {
|
|
84
|
+
console.log("Please initialize a wallet first");
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
const balanceInfo = await wallet.getBalance();
|
|
88
|
+
console.log("Sats Balance: " + balanceInfo.balance);
|
|
89
|
+
if (balanceInfo.tokenBalances && balanceInfo.tokenBalances.size > 0) {
|
|
90
|
+
console.log("\nToken Balances:");
|
|
91
|
+
for (const [
|
|
92
|
+
tokenPublicKey,
|
|
93
|
+
tokenInfo,
|
|
94
|
+
] of balanceInfo.tokenBalances.entries()) {
|
|
95
|
+
console.log(` Token (${tokenPublicKey}):`);
|
|
96
|
+
console.log(` Balance: ${tokenInfo.balance}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
case "getdepositaddress":
|
|
101
|
+
if (!wallet) {
|
|
102
|
+
console.log("Please initialize a wallet first");
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
const depositAddress = await wallet.getDepositAddress();
|
|
106
|
+
console.log(depositAddress);
|
|
107
|
+
break;
|
|
108
|
+
case "getsparkaddress":
|
|
109
|
+
if (!wallet) {
|
|
110
|
+
console.log("Please initialize a wallet first");
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
const sparkAddress = await wallet.getSparkAddress();
|
|
114
|
+
console.log(sparkAddress);
|
|
115
|
+
break;
|
|
116
|
+
case "createinvoice":
|
|
117
|
+
if (!wallet) {
|
|
118
|
+
console.log("Please initialize a wallet first");
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
const invoice = await wallet.createLightningInvoice({
|
|
122
|
+
amountSats: parseInt(args[0]),
|
|
123
|
+
memo: args[1],
|
|
124
|
+
});
|
|
125
|
+
console.log(invoice);
|
|
126
|
+
break;
|
|
127
|
+
case "payinvoice":
|
|
128
|
+
if (!wallet) {
|
|
129
|
+
console.log("Please initialize a wallet first");
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
const payment = await wallet.payLightningInvoice({
|
|
133
|
+
invoice: args[0],
|
|
134
|
+
});
|
|
135
|
+
console.log(payment);
|
|
136
|
+
break;
|
|
137
|
+
case "sendtransfer":
|
|
138
|
+
if (!wallet) {
|
|
139
|
+
console.log("Please initialize a wallet first");
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
const transfer = await wallet.transfer({
|
|
143
|
+
amountSats: parseInt(args[0]),
|
|
144
|
+
receiverSparkAddress: args[1],
|
|
145
|
+
});
|
|
146
|
+
console.log(transfer);
|
|
147
|
+
break;
|
|
148
|
+
case "sendtokentransfer":
|
|
149
|
+
if (!wallet) {
|
|
150
|
+
console.log("Please initialize a wallet first");
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
if (args.length < 3) {
|
|
154
|
+
console.log(
|
|
155
|
+
"Usage: sendtokentransfer <tokenPubKey> <amount> <receiverPubKey>",
|
|
156
|
+
);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const tokenPubKey = args[0];
|
|
161
|
+
const tokenAmount = BigInt(parseInt(args[1]));
|
|
162
|
+
const tokenReceiverPubKey = args[2];
|
|
163
|
+
|
|
164
|
+
try {
|
|
165
|
+
const result = await wallet.transferTokens({
|
|
166
|
+
tokenPublicKey: tokenPubKey,
|
|
167
|
+
tokenAmount: tokenAmount,
|
|
168
|
+
receiverSparkAddress: tokenReceiverPubKey,
|
|
169
|
+
});
|
|
170
|
+
console.log(result);
|
|
171
|
+
} catch (error) {
|
|
172
|
+
console.error("Failed to transfer tokens:", error.message);
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
case "withdraw":
|
|
176
|
+
if (!wallet) {
|
|
177
|
+
console.log("Please initialize a wallet first");
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
const withdrawal = await wallet.withdraw({
|
|
181
|
+
onchainAddress: args[0],
|
|
182
|
+
targetAmountSats: parseInt(args[1]),
|
|
183
|
+
});
|
|
184
|
+
console.log(withdrawal);
|
|
185
|
+
break;
|
|
186
|
+
case "tokenwithdraw": {
|
|
187
|
+
if (!wallet) {
|
|
188
|
+
console.log("Please initialize a wallet first");
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
const tokenPublicKey = args[0];
|
|
192
|
+
const receiverPublicKey = args[1];
|
|
193
|
+
|
|
194
|
+
let withdrawResult = await wallet.withdrawTokens(
|
|
195
|
+
tokenPublicKey,
|
|
196
|
+
receiverPublicKey,
|
|
197
|
+
);
|
|
198
|
+
if (withdrawResult) {
|
|
199
|
+
console.log("Withdrawal L1 Transaction ID:", withdrawResult.txid);
|
|
200
|
+
}
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
runCLI();
|