lnlink-server 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.
Files changed (36) hide show
  1. package/README.md +461 -0
  2. package/dist/app.js +11165 -0
  3. package/dist/binaries.json +20 -0
  4. package/dist/build-info.json +41 -0
  5. package/dist/config.default.js +19 -0
  6. package/dist/index.js +19002 -0
  7. package/dist/index.js.map +7 -0
  8. package/dist/package.json +61 -0
  9. package/dist/prisma/migrations/20250918020814_/migration.sql +188 -0
  10. package/dist/prisma/migrations/20251114105314_auto_update/migration.sql +2 -0
  11. package/dist/prisma/migrations/migration_lock.toml +3 -0
  12. package/dist/prisma/schema.prisma +181 -0
  13. package/dist/proto/chainkit.proto +74 -0
  14. package/dist/proto/lightning.proto +5411 -0
  15. package/dist/proto/lit-status.proto +36 -0
  16. package/dist/proto/looprpc/client.proto +1435 -0
  17. package/dist/proto/price_oracle.proto +243 -0
  18. package/dist/proto/rfqrpc/rfq.proto +436 -0
  19. package/dist/proto/routerrpc/router.proto +1136 -0
  20. package/dist/proto/signrpc/signer.proto +709 -0
  21. package/dist/proto/stateservice.proto +73 -0
  22. package/dist/proto/swapserverrpc/common.proto +37 -0
  23. package/dist/proto/tapchannel.proto +306 -0
  24. package/dist/proto/tapcommon.proto +36 -0
  25. package/dist/proto/taprootassets.proto +1959 -0
  26. package/dist/proto/universe.proto +1063 -0
  27. package/dist/proto/walletkit.proto +1594 -0
  28. package/dist/proto/walletunlocker.proto +338 -0
  29. package/dist/public/css/initOwner.css +553 -0
  30. package/dist/public/favicon.ico +0 -0
  31. package/dist/public/init.html +70 -0
  32. package/dist/public/js/init.js +454 -0
  33. package/dist/setting.mainnet.json +22 -0
  34. package/dist/setting.regtest.json +22 -0
  35. package/dist/setting.testnet.json +22 -0
  36. package/package.json +91 -0
@@ -0,0 +1,553 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ background: linear-gradient(135deg, #0c0c0c 0%, #1a1a2e 50%, #16213e 100%);
9
+ min-height: 100vh;
10
+ color: #e0e0e0;
11
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
12
+ overflow-x: hidden;
13
+ }
14
+
15
+ /* Animated background particles */
16
+ body::before {
17
+ content: '';
18
+ position: fixed;
19
+ top: 0;
20
+ left: 0;
21
+ width: 100%;
22
+ height: 100%;
23
+ background-image:
24
+ radial-gradient(2px 2px at 20px 30px, rgba(255, 255, 255, 0.1), transparent),
25
+ radial-gradient(2px 2px at 40px 70px, rgba(255, 255, 255, 0.05), transparent),
26
+ radial-gradient(1px 1px at 90px 40px, rgba(255, 255, 255, 0.08), transparent);
27
+ background-size: 100px 100px;
28
+ animation: float 20s infinite linear;
29
+ pointer-events: none;
30
+ z-index: -1;
31
+ }
32
+
33
+ @keyframes float {
34
+ 0% {
35
+ transform: translate(0, 0);
36
+ }
37
+ 50% {
38
+ transform: translate(-10px, -10px);
39
+ }
40
+ 100% {
41
+ transform: translate(0, 0);
42
+ }
43
+ }
44
+
45
+ .root {
46
+ max-width: 1000px;
47
+ margin: 40px auto;
48
+ padding: 40px;
49
+ background: rgba(30, 30, 30, 0.95);
50
+ border-radius: 20px;
51
+ box-shadow:
52
+ 0 20px 60px rgba(0, 0, 0, 0.4),
53
+ 0 0 0 1px rgba(255, 255, 255, 0.05);
54
+ backdrop-filter: blur(10px);
55
+ position: relative;
56
+ overflow: hidden;
57
+ }
58
+
59
+ .root::before {
60
+ content: '';
61
+ position: absolute;
62
+ top: 0;
63
+ left: 0;
64
+ right: 0;
65
+ height: 3px;
66
+ background: linear-gradient(90deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #ffeaa7);
67
+ background-size: 200% 100%;
68
+ animation: shimmer 3s infinite;
69
+ }
70
+
71
+ @keyframes shimmer {
72
+ 0%, 100% {
73
+ background-position: 200% 0;
74
+ }
75
+ 50% {
76
+ background-position: -200% 0;
77
+ }
78
+ }
79
+
80
+ h1 {
81
+ color: #fff;
82
+ text-align: center;
83
+ margin-bottom: 40px;
84
+ font-size: 2.5rem;
85
+ font-weight: 300;
86
+ text-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
87
+ position: relative;
88
+ }
89
+
90
+ h1::after {
91
+ content: '';
92
+ position: absolute;
93
+ bottom: -10px;
94
+ left: 50%;
95
+ transform: translateX(-50%);
96
+ width: 80px;
97
+ height: 2px;
98
+ background: linear-gradient(90deg, #4ecdc4, #45b7d1);
99
+ border-radius: 1px;
100
+ }
101
+
102
+ /* Tab styling */
103
+ .nav-tabs {
104
+ border-bottom: 2px solid rgba(255, 255, 255, 0.1);
105
+ margin-bottom: 30px;
106
+ }
107
+
108
+ .nav-tabs .nav-link {
109
+ background: transparent;
110
+ border: none;
111
+ color: #b0b0b0;
112
+ padding: 15px 25px;
113
+ font-weight: 500;
114
+ transition: all 0.3s ease;
115
+ position: relative;
116
+ border-radius: 10px 10px 0 0;
117
+ }
118
+
119
+ .nav-tabs .nav-link:hover {
120
+ color: #4ecdc4;
121
+ background: rgba(78, 205, 196, 0.1);
122
+ border-color: transparent;
123
+ }
124
+
125
+ .nav-tabs .nav-link.active {
126
+ color: #fff;
127
+ background: rgba(78, 205, 196, 0.2);
128
+ border-color: transparent;
129
+ border-bottom: 2px solid #4ecdc4;
130
+ }
131
+
132
+ .nav-tabs .nav-link.active::after {
133
+ content: '';
134
+ position: absolute;
135
+ bottom: -2px;
136
+ left: 0;
137
+ width: 100%;
138
+ height: 2px;
139
+ background: linear-gradient(90deg, #4ecdc4, #45b7d1);
140
+ }
141
+
142
+ .tab-content {
143
+ min-height: 400px;
144
+ }
145
+
146
+ .info-section {
147
+ margin-bottom: 30px;
148
+ }
149
+
150
+ .info-title {
151
+ font-size: 1.2rem;
152
+ font-weight: 500;
153
+ color: #b0b0b0;
154
+ margin-bottom: 20px;
155
+ display: flex;
156
+ align-items: center;
157
+ gap: 10px;
158
+ }
159
+
160
+ .info-title i {
161
+ color: #4ecdc4;
162
+ }
163
+
164
+ .list-group {
165
+ background: transparent;
166
+ border: none;
167
+ gap: 12px;
168
+ display: grid;
169
+ grid-template-columns: repeat(2, 1fr);
170
+ }
171
+
172
+ .list-group-item {
173
+ background: rgba(45, 45, 55, 0.6);
174
+ border: 1px solid rgba(255, 255, 255, 0.1);
175
+ border-radius: 12px;
176
+ padding: 15px 20px;
177
+ color: #e0e0e0;
178
+ transition: all 0.3s ease;
179
+ position: relative;
180
+ overflow: hidden;
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: 8px;
184
+ }
185
+
186
+ .list-group-item::before {
187
+ content: '';
188
+ position: absolute;
189
+ top: 0;
190
+ left: 0;
191
+ width: 4px;
192
+ height: 100%;
193
+ background: linear-gradient(180deg, #4ecdc4, #45b7d1);
194
+ opacity: 0;
195
+ transition: opacity 0.3s ease;
196
+ }
197
+
198
+ .list-group-item:hover {
199
+ background: rgba(55, 55, 65, 0.8);
200
+ border-color: rgba(255, 255, 255, 0.2);
201
+ transform: translateY(-2px);
202
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2);
203
+ }
204
+
205
+ .list-group-item:hover::before {
206
+ opacity: 1;
207
+ }
208
+
209
+ .info-key {
210
+ font-weight: 600;
211
+ color: #b0b0b0;
212
+ font-size: 0.9rem;
213
+ text-transform: uppercase;
214
+ letter-spacing: 0.5px;
215
+ margin-bottom: 4px;
216
+ }
217
+
218
+ .info-value-container {
219
+ display: flex;
220
+ align-items: center;
221
+ }
222
+
223
+ .info-value {
224
+ color: #e0e0e0;
225
+ word-break: break-all;
226
+ font-size: 0.95rem;
227
+ line-height: 1.4;
228
+ font-weight: 500;
229
+ }
230
+
231
+ /* Status colors */
232
+ .status-success {
233
+ color: #4ade80 !important;
234
+ text-shadow: 0 0 10px rgba(74, 222, 128, 0.3);
235
+ }
236
+
237
+ .status-error {
238
+ color: #f87171 !important;
239
+ text-shadow: 0 0 10px rgba(248, 113, 113, 0.3);
240
+ }
241
+
242
+ .status-warning {
243
+ color: #fbbf24 !important;
244
+ text-shadow: 0 0 10px rgba(251, 191, 36, 0.3);
245
+ }
246
+
247
+ /* Status icons */
248
+ .status-icon {
249
+ margin-right: 8px;
250
+ font-size: 0.9rem;
251
+ }
252
+
253
+ /* Link styling */
254
+ .info-link {
255
+ color: #4ecdc4;
256
+ text-decoration: none;
257
+ transition: all 0.3s ease;
258
+ position: relative;
259
+ }
260
+
261
+ .info-link:hover {
262
+ color: #45b7d1;
263
+ text-decoration: none;
264
+ }
265
+
266
+ .info-link::after {
267
+ content: '';
268
+ position: absolute;
269
+ bottom: -2px;
270
+ left: 0;
271
+ width: 0;
272
+ height: 2px;
273
+ background: linear-gradient(90deg, #4ecdc4, #45b7d1);
274
+ transition: width 0.3s ease;
275
+ }
276
+
277
+ .info-link:hover::after {
278
+ width: 100%;
279
+ }
280
+
281
+ /* Form styling */
282
+ .form-section {
283
+ margin-top: 20px;
284
+ }
285
+
286
+ .form-control, .form-select {
287
+ background: rgba(45, 45, 55, 0.6);
288
+ border: 1px solid rgba(255, 255, 255, 0.1);
289
+ border-radius: 10px;
290
+ color: #e0e0e0;
291
+ padding: 12px 16px;
292
+ transition: all 0.3s ease;
293
+ }
294
+
295
+ /* Placeholder styling for better visibility */
296
+ .form-control::placeholder {
297
+ color: #a0a0a0;
298
+ opacity: 1;
299
+ }
300
+
301
+ .form-control::-webkit-input-placeholder {
302
+ color: #a0a0a0;
303
+ opacity: 1;
304
+ }
305
+
306
+ .form-control::-moz-placeholder {
307
+ color: #a0a0a0;
308
+ opacity: 1;
309
+ }
310
+
311
+ .form-control:-ms-input-placeholder {
312
+ color: #a0a0a0;
313
+ opacity: 1;
314
+ }
315
+
316
+ .form-control:focus, .form-select:focus {
317
+ background: rgba(55, 55, 65, 0.8);
318
+ border-color: #4ecdc4;
319
+ color: #e0e0e0;
320
+ box-shadow: 0 0 0 0.25rem rgba(78, 205, 196, 0.15);
321
+ }
322
+
323
+ .form-select option {
324
+ background: #2d2d37;
325
+ color: #e0e0e0;
326
+ }
327
+
328
+ .form-label {
329
+ color: #b0b0b0;
330
+ font-weight: 500;
331
+ margin-bottom: 8px;
332
+ }
333
+
334
+ .btn-primary {
335
+ background: linear-gradient(135deg, #4ecdc4, #45b7d1);
336
+ border: none;
337
+ border-radius: 10px;
338
+ padding: 12px 30px;
339
+ font-weight: 500;
340
+ transition: all 0.3s ease;
341
+ box-shadow: 0 4px 15px rgba(78, 205, 196, 0.3);
342
+ }
343
+
344
+ .btn-primary:hover {
345
+ background: linear-gradient(135deg, #45b7d1, #4ecdc4);
346
+ transform: translateY(-2px);
347
+ box-shadow: 0 6px 20px rgba(78, 205, 196, 0.4);
348
+ }
349
+
350
+ .btn-secondary {
351
+ background: rgba(108, 117, 125, 0.6);
352
+ border: 1px solid rgba(255, 255, 255, 0.1);
353
+ border-radius: 10px;
354
+ padding: 12px 30px;
355
+ font-weight: 500;
356
+ transition: all 0.3s ease;
357
+ color: #e0e0e0;
358
+ }
359
+
360
+ .btn-secondary:hover {
361
+ background: rgba(108, 117, 125, 0.8);
362
+ border-color: rgba(255, 255, 255, 0.2);
363
+ transform: translateY(-2px);
364
+ color: #e0e0e0;
365
+ }
366
+
367
+ .valid-feedback {
368
+ color: #4ade80;
369
+ }
370
+
371
+ .invalid-feedback {
372
+ color: #f87171;
373
+ }
374
+
375
+ /* Loading animation */
376
+ .loading {
377
+ display: inline-block;
378
+ width: 20px;
379
+ height: 20px;
380
+ border: 2px solid rgba(255, 255, 255, 0.3);
381
+ border-radius: 50%;
382
+ border-top-color: #4ecdc4;
383
+ animation: spin 1s ease-in-out infinite;
384
+ margin-right: 10px;
385
+ }
386
+
387
+ @keyframes spin {
388
+ to {
389
+ transform: rotate(360deg);
390
+ }
391
+ }
392
+
393
+ /* Advanced config grid */
394
+ .config-grid {
395
+ display: grid;
396
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
397
+ gap: 20px;
398
+ margin-top: 20px;
399
+ }
400
+
401
+ .config-group {
402
+ background: rgba(45, 45, 55, 0.3);
403
+ border-radius: 10px;
404
+ padding: 20px;
405
+ border: 1px solid rgba(255, 255, 255, 0.05);
406
+ }
407
+
408
+ .config-group h6 {
409
+ color: #4ecdc4;
410
+ margin-bottom: 15px;
411
+ font-weight: 600;
412
+ display: flex;
413
+ align-items: center;
414
+ gap: 8px;
415
+ }
416
+
417
+ /* Responsive design */
418
+ @media (max-width: 768px) {
419
+ .root {
420
+ margin: 20px;
421
+ padding: 30px 20px;
422
+ }
423
+
424
+ h1 {
425
+ font-size: 2rem;
426
+ }
427
+
428
+ .info-key {
429
+ font-size: 0.85rem;
430
+ margin-bottom: 6px;
431
+ }
432
+
433
+ .config-grid {
434
+ grid-template-columns: 1fr;
435
+ }
436
+
437
+ .list-group {
438
+ grid-template-columns: 1fr;
439
+ }
440
+
441
+ .nav-tabs .nav-link {
442
+ padding: 12px 15px;
443
+ font-size: 0.9rem;
444
+ }
445
+ }
446
+
447
+ /* Network indicator */
448
+ .network-indicator {
449
+ display: inline-block;
450
+ padding: 4px 12px;
451
+ border-radius: 20px;
452
+ font-size: 0.75rem;
453
+ font-weight: 600;
454
+ text-transform: uppercase;
455
+ margin-left: 10px;
456
+ }
457
+
458
+ .network-regtest {
459
+ background: rgba(251, 191, 36, 0.2);
460
+ color: #fbbf24;
461
+ border: 1px solid rgba(251, 191, 36, 0.3);
462
+ }
463
+
464
+ .network-testnet {
465
+ background: rgba(59, 130, 246, 0.2);
466
+ color: #3b82f6;
467
+ border: 1px solid rgba(59, 130, 246, 0.3);
468
+ }
469
+
470
+ .network-mainnet {
471
+ background: rgba(34, 197, 94, 0.2);
472
+ color: #22c55e;
473
+ border: 1px solid rgba(34, 197, 94, 0.3);
474
+ }
475
+
476
+ /* Modal styling improvements */
477
+ .modal-content {
478
+ background: rgba(30, 30, 30, 0.95);
479
+ border: 1px solid rgba(255, 255, 255, 0.1);
480
+ border-radius: 15px;
481
+ color: #e0e0e0;
482
+ backdrop-filter: blur(10px);
483
+ }
484
+
485
+ .modal-header {
486
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
487
+ background: rgba(40, 40, 50, 0.8);
488
+ border-radius: 15px 15px 0 0;
489
+ }
490
+
491
+ .modal-footer {
492
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
493
+ background: rgba(40, 40, 50, 0.8);
494
+ border-radius: 0 0 15px 15px;
495
+ }
496
+
497
+ .modal-title {
498
+ color: #fff;
499
+ font-weight: 500;
500
+ font-size: 1.25rem;
501
+ }
502
+
503
+ .modal-body {
504
+ background: rgba(25, 25, 35, 0.9);
505
+ color: #f0f0f0;
506
+ font-size: 1.1rem;
507
+ line-height: 1.6;
508
+ padding: 25px;
509
+ font-weight: 500;
510
+ }
511
+
512
+ /* Success modal styling */
513
+ #successModal .modal-title {
514
+ color: #4ade80;
515
+ }
516
+
517
+ #successModal .modal-body {
518
+ color: #4ade80;
519
+ font-weight: 600;
520
+ text-shadow: 0 1px 3px rgba(74, 222, 128, 0.2);
521
+ }
522
+
523
+ #successModal .modal-header {
524
+ background: rgba(34, 197, 94, 0.1);
525
+ border-bottom-color: rgba(74, 222, 128, 0.2);
526
+ }
527
+
528
+ /* Error modal styling */
529
+ #errorModal .modal-title {
530
+ color: #f87171;
531
+ }
532
+
533
+ #errorModal .modal-body {
534
+ color: #f87171;
535
+ font-weight: 600;
536
+ text-shadow: 0 1px 3px rgba(248, 113, 113, 0.2);
537
+ }
538
+
539
+ #errorModal .modal-header {
540
+ background: rgba(239, 68, 68, 0.1);
541
+ border-bottom-color: rgba(248, 113, 113, 0.2);
542
+ }
543
+
544
+ .btn-close {
545
+ filter: invert(1);
546
+ opacity: 0.7;
547
+ transition: opacity 0.3s ease;
548
+ }
549
+
550
+ .btn-close:hover {
551
+ opacity: 1;
552
+ transform: scale(1.1);
553
+ }
Binary file
@@ -0,0 +1,70 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>LND NOSTR Link</title>
8
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
9
+ integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
10
+ <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
11
+ <link href="css/initOwner.css" rel="stylesheet">
12
+ </head>
13
+
14
+ <body>
15
+ <div class="root">
16
+ <h1><i class="fas fa-bolt"></i> LND NOSTR Link</h1>
17
+
18
+ <!-- Main Content -->
19
+ <div id="main-content">
20
+ <!-- Configuration information will be loaded here dynamically -->
21
+ </div>
22
+ </div>
23
+
24
+ <!-- Error Modal -->
25
+ <div class="modal fade" id="errorModal" tabindex="-1" aria-labelledby="errorModalLabel" aria-hidden="true">
26
+ <div class="modal-dialog">
27
+ <div class="modal-content">
28
+ <div class="modal-header">
29
+ <h5 class="modal-title" id="errorModalLabel">
30
+ <i class="fas fa-exclamation-triangle text-warning"></i> Error
31
+ </h5>
32
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
33
+ </div>
34
+ <div class="modal-body" id="errorModalBody">
35
+ <!-- Error message will be inserted here -->
36
+ </div>
37
+ <div class="modal-footer">
38
+ <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </div>
43
+
44
+ <!-- Success Modal -->
45
+ <div class="modal fade" id="successModal" tabindex="-1" aria-labelledby="successModalLabel" aria-hidden="true">
46
+ <div class="modal-dialog">
47
+ <div class="modal-content">
48
+ <div class="modal-header">
49
+ <h5 class="modal-title" id="successModalLabel">
50
+ <i class="fas fa-check-circle text-success"></i> Success
51
+ </h5>
52
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
53
+ </div>
54
+ <div class="modal-body" id="successModalBody">
55
+ <!-- Success message will be inserted here -->
56
+ </div>
57
+ <div class="modal-footer">
58
+ <button type="button" class="btn btn-primary" data-bs-dismiss="modal">OK</button>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ </div>
63
+
64
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"
65
+ integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"
66
+ crossorigin="anonymous"></script>
67
+ <script src="js/init.js"></script>
68
+ </body>
69
+
70
+ </html>