@arkade-os/skill 0.1.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.
Files changed (40) hide show
  1. package/README.md +116 -0
  2. package/SKILL.md +269 -0
  3. package/cli/arkade.mjs +1018 -0
  4. package/dist/cjs/index.js +88 -0
  5. package/dist/cjs/index.js.map +1 -0
  6. package/dist/cjs/skills/arkadeBitcoin.js +359 -0
  7. package/dist/cjs/skills/arkadeBitcoin.js.map +1 -0
  8. package/dist/cjs/skills/index.js +78 -0
  9. package/dist/cjs/skills/index.js.map +1 -0
  10. package/dist/cjs/skills/lendaswap.js +458 -0
  11. package/dist/cjs/skills/lendaswap.js.map +1 -0
  12. package/dist/cjs/skills/lightning.js +287 -0
  13. package/dist/cjs/skills/lightning.js.map +1 -0
  14. package/dist/cjs/skills/types.js +11 -0
  15. package/dist/cjs/skills/types.js.map +1 -0
  16. package/dist/esm/index.js +72 -0
  17. package/dist/esm/index.js.map +1 -0
  18. package/dist/esm/skills/arkadeBitcoin.js +354 -0
  19. package/dist/esm/skills/arkadeBitcoin.js.map +1 -0
  20. package/dist/esm/skills/index.js +69 -0
  21. package/dist/esm/skills/index.js.map +1 -0
  22. package/dist/esm/skills/lendaswap.js +453 -0
  23. package/dist/esm/skills/lendaswap.js.map +1 -0
  24. package/dist/esm/skills/lightning.js +282 -0
  25. package/dist/esm/skills/lightning.js.map +1 -0
  26. package/dist/esm/skills/types.js +10 -0
  27. package/dist/esm/skills/types.js.map +1 -0
  28. package/dist/types/index.d.ts +72 -0
  29. package/dist/types/index.d.ts.map +1 -0
  30. package/dist/types/skills/arkadeBitcoin.d.ts +218 -0
  31. package/dist/types/skills/arkadeBitcoin.d.ts.map +1 -0
  32. package/dist/types/skills/index.d.ts +67 -0
  33. package/dist/types/skills/index.d.ts.map +1 -0
  34. package/dist/types/skills/lendaswap.d.ts +152 -0
  35. package/dist/types/skills/lendaswap.d.ts.map +1 -0
  36. package/dist/types/skills/lightning.d.ts +181 -0
  37. package/dist/types/skills/lightning.d.ts.map +1 -0
  38. package/dist/types/skills/types.d.ts +548 -0
  39. package/dist/types/skills/types.d.ts.map +1 -0
  40. package/package.json +65 -0
@@ -0,0 +1,458 @@
1
+ "use strict";
2
+ /**
3
+ * LendaSwapSkill - Swap USDC/USDT from/to Arkade via LendaSwap.
4
+ *
5
+ * This skill provides stablecoin swap capabilities for Arkade wallets
6
+ * using the LendaSwap SDK for non-custodial BTC/stablecoin exchanges.
7
+ *
8
+ * @module skills/lendaswap
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.LendaSwapSkill = void 0;
12
+ exports.createLendaSwapSkill = createLendaSwapSkill;
13
+ /**
14
+ * Default LendaSwap API URL.
15
+ */
16
+ const DEFAULT_API_URL = "https://apilendaswap.lendasat.com/";
17
+ /**
18
+ * Token decimals for stablecoins.
19
+ */
20
+ const TOKEN_DECIMALS = {
21
+ usdc_pol: 6,
22
+ usdc_eth: 6,
23
+ usdc_arb: 6,
24
+ usdt_pol: 6,
25
+ usdt_eth: 6,
26
+ usdt_arb: 6,
27
+ };
28
+ function parseExpiry(raw, fallbackMs) {
29
+ if (raw === null || raw === undefined) {
30
+ return new Date(Date.now() + fallbackMs);
31
+ }
32
+ if (typeof raw === "string") {
33
+ const parsed = new Date(raw);
34
+ if (!Number.isNaN(parsed.getTime())) {
35
+ return parsed;
36
+ }
37
+ }
38
+ if (typeof raw === "number") {
39
+ const ms = raw < 1000000000000 ? raw * 1000 : raw;
40
+ return new Date(ms);
41
+ }
42
+ return new Date(Date.now() + fallbackMs);
43
+ }
44
+ /**
45
+ * LendaSwapSkill provides stablecoin swap capabilities for Arkade wallets
46
+ * using the LendaSwap SDK.
47
+ *
48
+ * This skill enables:
49
+ * - Swapping BTC from Arkade to USDC/USDT on Polygon, Ethereum, or Arbitrum
50
+ * - Receiving USDC/USDT and converting to BTC in your Arkade wallet
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * import { Wallet, SingleKey } from "@arkade-os/sdk";
55
+ * import { LendaSwapSkill } from "@arkade-os/skill";
56
+ *
57
+ * // Create a wallet
58
+ * const wallet = await Wallet.create({
59
+ * identity: SingleKey.fromHex(privateKeyHex),
60
+ * arkServerUrl: "https://arkade.computer",
61
+ * });
62
+ *
63
+ * // Create the LendaSwap skill
64
+ * const lendaswap = new LendaSwapSkill({
65
+ * wallet,
66
+ * apiKey: process.env.LENDASWAP_API_KEY,
67
+ * });
68
+ *
69
+ * // Get a quote for BTC to USDC
70
+ * const quote = await lendaswap.getQuoteBtcToStablecoin(100000, "usdc_pol");
71
+ * console.log("You'll receive:", quote.targetAmount, "USDC");
72
+ *
73
+ * // Execute the swap
74
+ * const result = await lendaswap.swapBtcToStablecoin({
75
+ * targetAddress: "0x...",
76
+ * targetToken: "usdc_pol",
77
+ * targetChain: "polygon",
78
+ * sourceAmount: 100000,
79
+ * });
80
+ * console.log("Swap created:", result.swapId);
81
+ * ```
82
+ */
83
+ class LendaSwapSkill {
84
+ /**
85
+ * Creates a new LendaSwapSkill instance.
86
+ *
87
+ * @param config - Configuration options
88
+ */
89
+ constructor(config) {
90
+ this.name = "lendaswap";
91
+ this.description = "Swap USDC/USDT from/to Arkade via LendaSwap non-custodial exchange";
92
+ this.version = "1.0.0";
93
+ this.swapStorage = new Map();
94
+ this.wallet = config.wallet;
95
+ this.apiUrl = config.apiUrl || DEFAULT_API_URL;
96
+ this.apiKey = config.apiKey;
97
+ this.referralCode = config.referralCode;
98
+ }
99
+ /**
100
+ * Check if the skill is available and properly configured.
101
+ */
102
+ async isAvailable() {
103
+ try {
104
+ const response = await this.fetchApi("/pairs");
105
+ return response.ok;
106
+ }
107
+ catch {
108
+ return false;
109
+ }
110
+ }
111
+ /**
112
+ * Get a quote for swapping BTC to stablecoins.
113
+ */
114
+ async getQuoteBtcToStablecoin(sourceAmount, targetToken) {
115
+ const response = await this.fetchApi("/quote", {
116
+ method: "POST",
117
+ body: JSON.stringify({
118
+ from: "btc_arkade",
119
+ to: targetToken,
120
+ amount: sourceAmount,
121
+ }),
122
+ });
123
+ if (!response.ok) {
124
+ throw new Error(`Failed to get quote: ${response.statusText}`);
125
+ }
126
+ const data = (await response.json());
127
+ return {
128
+ sourceToken: "btc_arkade",
129
+ targetToken,
130
+ sourceAmount,
131
+ targetAmount: data.targetAmount,
132
+ exchangeRate: data.exchangeRate,
133
+ fee: {
134
+ amount: data.fee?.amount || 0,
135
+ percentage: data.fee?.percentage || 0,
136
+ },
137
+ expiresAt: parseExpiry(data.expiresAt, 60000),
138
+ };
139
+ }
140
+ /**
141
+ * Get a quote for swapping stablecoins to BTC.
142
+ */
143
+ async getQuoteStablecoinToBtc(sourceAmount, sourceToken) {
144
+ const response = await this.fetchApi("/quote", {
145
+ method: "POST",
146
+ body: JSON.stringify({
147
+ from: sourceToken,
148
+ to: "btc_arkade",
149
+ amount: sourceAmount,
150
+ }),
151
+ });
152
+ if (!response.ok) {
153
+ throw new Error(`Failed to get quote: ${response.statusText}`);
154
+ }
155
+ const data = (await response.json());
156
+ return {
157
+ sourceToken,
158
+ targetToken: "btc_arkade",
159
+ sourceAmount,
160
+ targetAmount: data.targetAmount,
161
+ exchangeRate: data.exchangeRate,
162
+ fee: {
163
+ amount: data.fee?.amount || 0,
164
+ percentage: data.fee?.percentage || 0,
165
+ },
166
+ expiresAt: parseExpiry(data.expiresAt, 60000),
167
+ };
168
+ }
169
+ /**
170
+ * Swap BTC from Arkade to stablecoins on EVM.
171
+ */
172
+ async swapBtcToStablecoin(params) {
173
+ const arkAddress = await this.wallet.getAddress();
174
+ const response = await this.fetchApi("/swap/btc-to-evm", {
175
+ method: "POST",
176
+ body: JSON.stringify({
177
+ sourceAddress: arkAddress,
178
+ targetAddress: params.targetAddress,
179
+ targetToken: params.targetToken,
180
+ targetChain: params.targetChain,
181
+ sourceAmount: params.sourceAmount,
182
+ targetAmount: params.targetAmount,
183
+ referralCode: params.referralCode || this.referralCode,
184
+ }),
185
+ });
186
+ if (!response.ok) {
187
+ throw new Error(`Failed to create swap: ${response.statusText}`);
188
+ }
189
+ const data = (await response.json());
190
+ const resolvedSourceAmount = params.sourceAmount ?? data.sourceAmount ?? 0;
191
+ // Store swap locally
192
+ const storedSwap = {
193
+ swapId: data.swapId,
194
+ direction: "btc_to_stablecoin",
195
+ status: "awaiting_funding",
196
+ sourceToken: "btc_arkade",
197
+ targetToken: params.targetToken,
198
+ sourceAmount: resolvedSourceAmount,
199
+ targetAmount: data.targetAmount || 0,
200
+ exchangeRate: data.exchangeRate || 0,
201
+ createdAt: Date.now(),
202
+ response: data,
203
+ };
204
+ this.swapStorage.set(data.swapId, storedSwap);
205
+ return {
206
+ swapId: data.swapId,
207
+ status: "awaiting_funding",
208
+ sourceAmount: resolvedSourceAmount,
209
+ targetAmount: data.targetAmount || 0,
210
+ exchangeRate: data.exchangeRate || 0,
211
+ fee: {
212
+ amount: data.fee?.amount || 0,
213
+ percentage: data.fee?.percentage || 0,
214
+ },
215
+ expiresAt: new Date(data.expiresAt || Date.now() + 3600000),
216
+ paymentDetails: {
217
+ address: data.paymentAddress,
218
+ },
219
+ };
220
+ }
221
+ /**
222
+ * Swap stablecoins from EVM to BTC on Arkade.
223
+ */
224
+ async swapStablecoinToBtc(params) {
225
+ const arkAddress = await this.wallet.getAddress();
226
+ const targetAddress = params.targetAddress || arkAddress;
227
+ const response = await this.fetchApi("/swap/evm-to-arkade", {
228
+ method: "POST",
229
+ body: JSON.stringify({
230
+ sourceChain: params.sourceChain,
231
+ sourceToken: params.sourceToken,
232
+ sourceAmount: params.sourceAmount,
233
+ targetAddress,
234
+ userAddress: params.userAddress,
235
+ referralCode: params.referralCode || this.referralCode,
236
+ }),
237
+ });
238
+ if (!response.ok) {
239
+ throw new Error(`Failed to create swap: ${response.statusText}`);
240
+ }
241
+ const data = (await response.json());
242
+ // Store swap locally
243
+ const storedSwap = {
244
+ swapId: data.swapId,
245
+ direction: "stablecoin_to_btc",
246
+ status: "awaiting_funding",
247
+ sourceToken: params.sourceToken,
248
+ targetToken: "btc_arkade",
249
+ sourceAmount: params.sourceAmount,
250
+ targetAmount: data.targetAmount || 0,
251
+ exchangeRate: data.exchangeRate || 0,
252
+ createdAt: Date.now(),
253
+ response: data,
254
+ };
255
+ this.swapStorage.set(data.swapId, storedSwap);
256
+ return {
257
+ swapId: data.swapId,
258
+ status: "awaiting_funding",
259
+ sourceAmount: params.sourceAmount,
260
+ targetAmount: data.targetAmount || 0,
261
+ exchangeRate: data.exchangeRate || 0,
262
+ fee: {
263
+ amount: data.fee?.amount || 0,
264
+ percentage: data.fee?.percentage || 0,
265
+ },
266
+ expiresAt: new Date(data.expiresAt || Date.now() + 3600000),
267
+ paymentDetails: {
268
+ address: data.htlcAddress,
269
+ callData: data.fundingCallData,
270
+ },
271
+ };
272
+ }
273
+ /**
274
+ * Get the status of a swap.
275
+ */
276
+ async getSwapStatus(swapId) {
277
+ const response = await this.fetchApi(`/swap/${swapId}`);
278
+ if (!response.ok) {
279
+ throw new Error(`Failed to get swap status: ${response.statusText}`);
280
+ }
281
+ const data = (await response.json());
282
+ // Update local storage
283
+ const stored = this.swapStorage.get(swapId);
284
+ if (stored) {
285
+ stored.status = data.status;
286
+ stored.txid = data.txid;
287
+ if (data.status === "completed") {
288
+ stored.completedAt = Date.now();
289
+ }
290
+ }
291
+ return {
292
+ id: swapId,
293
+ direction: data.direction || stored?.direction || "btc_to_stablecoin",
294
+ status: data.status,
295
+ sourceToken: data.sourceToken || stored?.sourceToken || "",
296
+ targetToken: data.targetToken || stored?.targetToken || "",
297
+ sourceAmount: data.sourceAmount || stored?.sourceAmount || 0,
298
+ targetAmount: data.targetAmount || stored?.targetAmount || 0,
299
+ exchangeRate: data.exchangeRate || stored?.exchangeRate || 0,
300
+ createdAt: new Date(data.createdAt || stored?.createdAt || Date.now()),
301
+ completedAt: data.completedAt ? new Date(data.completedAt) : undefined,
302
+ txid: data.txid,
303
+ };
304
+ }
305
+ /**
306
+ * Get pending stablecoin swaps.
307
+ */
308
+ async getPendingSwaps() {
309
+ const pending = [];
310
+ for (const [id, swap] of this.swapStorage) {
311
+ if (swap.status !== "completed" &&
312
+ swap.status !== "expired" &&
313
+ swap.status !== "refunded" &&
314
+ swap.status !== "failed") {
315
+ try {
316
+ const status = await this.getSwapStatus(id);
317
+ pending.push(status);
318
+ }
319
+ catch {
320
+ // Swap might not exist on server anymore
321
+ pending.push({
322
+ id,
323
+ direction: swap.direction,
324
+ status: swap.status,
325
+ sourceToken: swap.sourceToken,
326
+ targetToken: swap.targetToken,
327
+ sourceAmount: swap.sourceAmount,
328
+ targetAmount: swap.targetAmount,
329
+ exchangeRate: swap.exchangeRate,
330
+ createdAt: new Date(swap.createdAt),
331
+ });
332
+ }
333
+ }
334
+ }
335
+ return pending;
336
+ }
337
+ /**
338
+ * Get stablecoin swap history.
339
+ */
340
+ async getSwapHistory() {
341
+ const history = [];
342
+ for (const [id, swap] of this.swapStorage) {
343
+ history.push({
344
+ id,
345
+ direction: swap.direction,
346
+ status: swap.status,
347
+ sourceToken: swap.sourceToken,
348
+ targetToken: swap.targetToken,
349
+ sourceAmount: swap.sourceAmount,
350
+ targetAmount: swap.targetAmount,
351
+ exchangeRate: swap.exchangeRate,
352
+ createdAt: new Date(swap.createdAt),
353
+ completedAt: swap.completedAt ? new Date(swap.completedAt) : undefined,
354
+ txid: swap.txid,
355
+ });
356
+ }
357
+ return history.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
358
+ }
359
+ /**
360
+ * Get available trading pairs.
361
+ */
362
+ async getAvailablePairs() {
363
+ const response = await this.fetchApi("/pairs");
364
+ if (!response.ok) {
365
+ throw new Error(`Failed to get pairs: ${response.statusText}`);
366
+ }
367
+ const data = (await response.json());
368
+ return (data.pairs || data || []).map((pair) => ({
369
+ from: pair.from || pair.source,
370
+ to: pair.to || pair.target,
371
+ minAmount: pair.minAmount || pair.min || 0,
372
+ maxAmount: pair.maxAmount || pair.max || 0,
373
+ feePercentage: pair.feePercentage || pair.fee || 0,
374
+ }));
375
+ }
376
+ /**
377
+ * Claim funds from a completed swap.
378
+ */
379
+ async claimSwap(swapId) {
380
+ const response = await this.fetchApi(`/swap/${swapId}/claim`, {
381
+ method: "POST",
382
+ });
383
+ if (!response.ok) {
384
+ throw new Error(`Failed to claim swap: ${response.statusText}`);
385
+ }
386
+ const data = (await response.json());
387
+ // Update local storage
388
+ const stored = this.swapStorage.get(swapId);
389
+ if (stored) {
390
+ stored.status = "completed";
391
+ stored.completedAt = Date.now();
392
+ stored.txid = data.txid;
393
+ }
394
+ return { txid: data.txid };
395
+ }
396
+ /**
397
+ * Refund an expired or failed swap.
398
+ */
399
+ async refundSwap(swapId) {
400
+ const response = await this.fetchApi(`/swap/${swapId}/refund`, {
401
+ method: "POST",
402
+ });
403
+ if (!response.ok) {
404
+ throw new Error(`Failed to refund swap: ${response.statusText}`);
405
+ }
406
+ const data = (await response.json());
407
+ // Update local storage
408
+ const stored = this.swapStorage.get(swapId);
409
+ if (stored) {
410
+ stored.status = "refunded";
411
+ stored.txid = data.txid;
412
+ }
413
+ return { txid: data.txid };
414
+ }
415
+ /**
416
+ * Get the underlying wallet instance.
417
+ */
418
+ getWallet() {
419
+ return this.wallet;
420
+ }
421
+ /**
422
+ * Get token decimals for a stablecoin.
423
+ */
424
+ getTokenDecimals(token) {
425
+ return TOKEN_DECIMALS[token] || 6;
426
+ }
427
+ /**
428
+ * Helper to fetch from LendaSwap API.
429
+ */
430
+ async fetchApi(path, options = {}) {
431
+ const url = `${this.apiUrl.replace(/\/$/, "")}${path}`;
432
+ return fetch(url, {
433
+ ...options,
434
+ headers: {
435
+ "Content-Type": "application/json",
436
+ "X-API-Key": this.apiKey,
437
+ ...options.headers,
438
+ },
439
+ });
440
+ }
441
+ }
442
+ exports.LendaSwapSkill = LendaSwapSkill;
443
+ /**
444
+ * Create a LendaSwapSkill from a wallet and API key.
445
+ *
446
+ * @param wallet - The Arkade wallet to use
447
+ * @param apiKey - LendaSwap API key
448
+ * @param options - Optional configuration
449
+ * @returns A new LendaSwapSkill instance
450
+ */
451
+ function createLendaSwapSkill(wallet, apiKey, options) {
452
+ return new LendaSwapSkill({
453
+ wallet,
454
+ apiKey,
455
+ ...options,
456
+ });
457
+ }
458
+ //# sourceMappingURL=lendaswap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lendaswap.js","sourceRoot":"","sources":["../../../src/skills/lendaswap.ts"],"names":[],"mappings":"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"}