* rm .DS_Store
* Add watchfrontenddev command for npm
* Fix toggle issues in sidenav (pinning and on page refresh)
* Add copy-to-clipboard fallback if navigator.clipboard is not available (#1336)
* add copy-to-clipboard fallback if navigator.clipboard is not available
* amend copy fallback
* clipboard copy lint fixes and frontend build
* fix: add missing boltz state `transaction.lockupFailed` (#1349)
* fix: boltzd docs link (#1354)
* exit gracefully (#1356)
* allow for eclair updated relayed audit format (#1363)
* feat: add boltz service to cln (#1352)
* lint fix
* Request Params Cleanup
* cln: Boltz auto-send (#1366)
* Bug-fix (CLN Boltz): Hide claim tx id and routing fee for non-zero conf reverse swap
* cln: Boltz auto-send
- Added auto send option for Swap In
- Checking compatiblity with v2.0.0 and above
* Test import fixes
* Update help.component.ts (#1379)
Fixed broken link under "Help" -> "Node Settings"
* Backend config fix (#1382)
* Updating Common Application Configuration
* Fixed get RTL Conf
* Update Application Settings
* application and settings case change
* Unified config models
* Default node update
* 2FA and Password reset
* Final application settings update
* Config Settings and Authentication case fixed
* Node Setting Fix
* Fiat currency Symbol fix
* CLN: Fiat symbol fix
* All: Fiat symbol fix
* Update node settings
* Services UI fix
* CLN: Removed child node settings
* All: Removed child node settings
* Test fixes
* mempool links for onchain information (#1383)
* Tests fix
Tests fix
* UI for Block Explorer Configuration (#1385)
* Bump fee with mempool information (#1386)
* Mempool openchannel minfee (#1388)
Open channel model block if min fee is higher
* Show error on login screen if rune is incorrect and getinfo throws error (#1391)
* cln: Removed channel lookup call for update policy (#1392)
* ECL: On-chain Transactions, Invoice and Payments pagination (#1393)
Done most of the UI changes to accommodate pagination on transactions, payments and invoices tables but true pagination cannot be implemented till total number of records are missing from the API response.
Once the issue https://github.com/ACINQ/eclair/issues/2855 is fixed, I will uncomment pagination changes in the frontend.
* lnd: Onchain CPFP (#1394)
- UTXO label bug fix
- Warning on utxo label for "sweep" in text.
* Bug fixes after testing
* Testing bug fixes (#1401)
* Bug fix 2: lnd: Link channel point to explorer and show fee on close channel too
* lnd: explorer link on pending channels
* Node lookup link on view channel peer pubkey
* Testing bug fixes (#1402)
* Bug fix 2: lnd: Link channel point to explorer and show fee on close channel too
* lnd: explorer link on pending channels
* Node lookup link on view channel peer pubkey
* test fixes
* ng update to v18.0.x
* Updating install with --legacy-peer-deps
---------
Co-authored-by: Grzegorz Kućmierz <gkucmierz@gmail.com>
Co-authored-by: lacksfish <lacksfish@gmail.com>
Co-authored-by: jackstar12 <62219658+jackstar12@users.noreply.github.com>
Co-authored-by: Kilian <19181985+kilrau@users.noreply.github.com>
Co-authored-by: Taylor King <taylorbradleyking@gmail.com>
Co-authored-by: Fishcake <128653975+fishcakeday@users.noreply.github.com>
Co-authored-by: Ant <72945059+2140data@users.noreply.github.com>
Some users prefer to use Apache2 instead of Nginx as their reverse proxy (because some people already have Apache2 up for some other reason). This adds a guide on how to do that.
If there is an error with `upstream dependency conflict` message then replace `npm install --omit=dev` with `npm install --omit=dev --legacy-peer-deps`.
### <aname="prep"></a>Prep for Execution
RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app.
@ -48,15 +52,17 @@ parameters have `default` values for initial setup and can be updated after RTL
The environment variable can also be used for all of the above configurations except the UI settings.<br/>
If the environment variables are set, it will take precedence over the parameters in the RTL-Config.json file.<br/>
<br/>
PORT (port number for the rtl node server, default 3000, Required)<br/>
PORT (port number for the rtl node server, default 3000, Optional)<br/>
HOST (host for the rtl node server, default localhost, Optional)<br/>
DB_DIRECTORY_PATH (Path for the folder where rtl database file should be saved, default RTL root directory, Optional)
APP_PASSWORD (Plaintext password to be provided by the parent container, NOT suggested for standalone RTL applications, to be used by Umbrel) (Optional)<br/>
LN_SERVER_URL (LN server URL for LNP REST APIs, default https://127.0.0.1:8080) (Optional)<br/>
SWAP_SERVER_URL (Swap server URL for REST APIs, default http://127.0.0.1:8081) (Optional)<br/>
BOLTZ_SERVER_URL (Boltz server URL for REST APIs, default http://127.0.0.1:9003) (Optional)<br/>
CONFIG_PATH (Full path of the LNP .conf file including the file name) (Optional for LND & CLN, Mandatory for ECL if LN_API_PASSWORD is undefined)<br/>
MACAROON_PATH (Path for the folder containing 'admin.macaroon' (LND)/'access.macaroon' (CLN) file, Required for LND & CLN)<br/>
MACAROON_PATH (Path for the folder containing 'admin.macaroon' for LND, Required for LND)<br/>
RUNE_PATH (Complete path for the file containing 'rune' for CLN where the file should define the rune in 'LIGHTNING_RUNE="your-rune"' format, Required for CLN)<br/>
SWAP_MACAROON_PATH (Path for the folder containing Loop's 'loop.macaroon', optional)<br/>
BOLTZ_MACAROON_PATH (Path for the folder containing Boltz's 'admin.macaroon', optional)<br/>
RTL_SSO (1 - single sign on via an external cookie, 0 - stand alone RTL authentication, Required)<br/>
@ -66,4 +72,5 @@ RTL_CONFIG_PATH (Path for the folder containing 'RTL-Config.json' file, Required
BITCOIND_CONFIG_PATH (Full path of the bitcoind.conf file including the file name, Optional)<br/>
CHANNEL_BACKUP_PATH (Folder location for saving the channel backup files, valid for LND implementation only, Required if ln implementation=LND else Optional)<br/>
ENABLE_OFFERS (Boolean flag to enable the offers feature on core lighning, default false, optional)<br/>
ENABLE_PEERSWAP (Boolean flag to enable the peerswap feature on core lighning, default false, optional)<br/>
LN_API_PASSWORD (Password for Eclair implementation if the eclair.conf path is not available, Required if ln implementation=ECL && config path is undefined)<br/>
@ -44,6 +44,7 @@ Contributions via code is the most sought after contribution and something we en
##### Install Dependencies
* Assuming that nodejs (v14 & above) and npm are already installed on your local machine. Go into your RTL root folder and run `npm install`.
* Use `npm install --legacy-peer-deps` if there is any dependency conflict.
* Sometimes after installation, user receives a message from npm to fix dependency vulnerability by running `npm audit fix`. Please do not follow this step as it can break some of the working RTL code on your machine. We audit and fix these vulnerabilities as soon as possible at our end.
RTL is now enabled to manage lightning nodes running Core Lightning.
RTL is now enabled to manage lightning nodes running Core Lightning
Follow the below steps to install and setup RTL to run on Core Lightning.
Follow the below steps to install and setup RTL to run on Core Lightning
### <aname="prereq"></a>Pre-requisites:
1. Functioning Core Lightning node. Follow install instructions on their [github](https://github.com/ElementsProject/lightning)
2. NodeJS - Can be downloaded [here](https://nodejs.org/en/download)
3. Cl-REST - Ensure that `cl-rest` API server is installed and running. Install instructions [here](https://github.com/Ride-The-Lightning/c-lightning-REST)
4. Copy the `access.macaroon` file from `cl-rest` to the device, on which RTL will be installed
3. CLNRest - Ensure that core lightning's `CLNRest` API server is configured. Configuration instructions [here](https://docs.corelightning.org/docs/rest#configuration)
4. Create/reuse core-lightning's rune. Check [`createrune`](https://docs.corelightning.org/reference/lightning-createrune) and [`showrunes`](https://docs.corelightning.org/reference/lightning-showrunes) documentation for more details on how to create runes
4. Copy the `rune` and save it in a file which must be accessible to RTL. The content of the file must be `LIGHTNING_RUNE="<your-rune>"`
### <aname="arch"></a>Architecture
![](../screenshots/RTL-CLN-Arch-2.png)
@ -32,7 +33,7 @@ To download from master (*not recommended*):
If there is an error with `upstream dependency conflict` message then replace `npm install --omit=dev` with `npm install --omit=dev --legacy-peer-deps`.
### <aname="prep"></a>Prep for Execution
RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app.
* Rename the file `Sample-RTL-Config.json` to `RTL-Config.json` located at`./RTL`..
* Locate the complete path of the readable `access.macaroon` from `cl-rest` on your node.
RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app
* Rename the file `Sample-RTL-Config.json` to `RTL-Config.json` located at`./RTL`
* Locate the complete path of the readable `.commando` file on your node
* Modify the RTL conf file per the example file below
Ensure that the follow values are correct per your config:
* `lnImplementation` - This should be `CLN`, indicating that RTL is connecting to a core lightning node.
* `macaroonPath` - Path of the folder containing `access.macaroon` file from cl-rest server.
* `lnServerUrl` - complete url with ip address and port of the cl-rest server.
* `multiPass` - Specify the password (in plain text) to access RTL. This password will be hashed and not stored as plain text.
* `configPath` (optional) - File path of the core lightning config file, if RTL server is local to the core lightning server.
* `lnImplementation` - This should be `CLN`, indicating that RTL is connecting to a core lightning node
* `runePath` - Path of the folder including **filename** which contains the `rune` for the node. The content of the file must be `LIGHTNING_RUNE="<your-rune>"`
* `lnServerUrl` - complete url with ip address and port of the CLNRest server
* `multiPass` - Specify the password (in plain text) to access RTL. This password will be hashed and not stored as plain text
* `configPath` (optional) - File path of the core lightning config file, if RTL server is local to the core lightning server
If there is an error with `upstream dependency conflict` message then replace `npm install --omit=dev` with `npm install --omit=dev --legacy-peer-deps`.
### <aname="prep"></a>Prep for Execution
RTL requires its own config file `RTL-Config.json`, to start the server and provide user authentication on the app.
* Rename the file `Sample-RTL-Config.json` to `RTL-Config.json` located at`./RTL`..
@ -56,6 +60,7 @@ Ensure that the follow values are correct per your config:
@ -20,16 +20,18 @@ This step is only required to configure the nodes, which will be remotely connec
2. Set `multiPass` to the preferred password. This password will be used to authenticate the user for RTL. Once authenticated, the user will be able to access all the nodes configured in the json file
3. Set the `port` to the preferred port number over which to run RTL
4. Set the `defaultNodeIndex` to configure the default start up node at server restart
5. `SSO` section can be used for single-sign-on from applications like BTCPayserver. If using RTL as a stand-alone app to connect with the nodes, keep the `rtlSSO=0` and ignore the rest of `SSO` section.
6. `nodes` section is a json array, with each element of the array representing the specific parameters for the LND node to connect with. `index` must be a number and start with 1. This number must be unique for each node in the array. For each element, two items need to be configured for each node on the network (`macaroonPath` and `lnServerUrl`).
7. `macaroonPath` should be set to the local path of the folder containing `admin.macaroon` file for each node. Each node must have a different folder for the `admin.macaroon` on the RTL server.
8. `swapMacaroonPath` should be set to the local path of the folder containing `loop.macaroon` file for loop.
9. `boltzMacaroonPath` should be set to the local path of the folder containing `admin.macaroon` file for boltz swaps.
10. `lnServerUrl` must be set to the service url for LND/Core Lightining REST APIs for each node, with the unique ip address of the node hosting LND/Core Lightning e.g. https://192.168.0.1:8080 OR https://192.168.0.1:3001. In this case the ip address of the node hosting LND/Core Lightning is '192.168.0.1'
11. `swapServerUrl` must be set to the swap service url. e.g. https://localhost:8081.
12. `boltzServerUrl` must be set to the boltz service url. e.g. https://localhost:9003.
13. `configPath` and `bitcoindConfigPath` are optional parameters which can be set only if the RTL is running locally on the same node. Else it can be set to "" or removed from the conf file all together.
14. `lnApiPassword` is mandatory in the ln implementation is ECL and configPath is missing. It is used to provide password for API authentication. It will be ignored in other ln implementations.
5. `dbDirectoryPath` should be set to the folder where RTL's database will be saved.
6. `SSO` section can be used for single-sign-on from applications like BTCPayserver. If using RTL as a stand-alone app to connect with the nodes, keep the `rtlSSO=0` and ignore the rest of `SSO` section.
7. `nodes` section is a json array, with each element of the array representing the specific parameters for the LND node to connect with. `index` must be a number and start with 1. This number must be unique for each node in the array. For each element, two items need to be configured for each node on the network (`macaroonPath` and `lnServerUrl`).
8. `macaroonPath` should be set to the local path of the folder containing `admin.macaroon` file for each node. Each node must have a different folder for the `admin.macaroon` on the RTL server.
9. `swapMacaroonPath` should be set to the local path of the folder containing `loop.macaroon` file for loop.
10. `boltzMacaroonPath` should be set to the local path of the folder containing `admin.macaroon` file for boltz swaps.
11. `lnServerUrl` must be set to the service url for LND/Core Lightining REST APIs for each node, with the unique ip address of the node hosting LND/Core Lightning e.g. https://192.168.0.1:8080 OR https://192.168.0.1:3001. In this case the ip address of the node hosting LND/Core Lightning is '192.168.0.1'
12. `swapServerUrl` must be set to the swap service url. e.g. https://127.0.0.1:8081.
13. `boltzServerUrl` must be set to the boltz service url. e.g. https://127.0.0.1:9003.
14. `configPath` and `bitcoindConfigPath` are optional parameters which can be set only if the RTL is running locally on the same node. Else it can be set to "" or removed from the conf file all together.
15. `lnApiPassword` is mandatory if the ln implementation is ECL and configPath is missing. It is used to provide password for API authentication. It will be ignored in other ln implementations.
16. `runePath` is mandatory for CLN implementation. It should be set to the local path of the folder including filename containing rune value. This rune value in the file should be saved in `LIGHTNING_RUNE="your-rune"` format.
- On Debian-based distros: `sudo apt install apache2`
- On Fedora-based distros: `sudo yum install httpd`
2. Install [Let's Encrypt](https://letsencrypt.org) to get a free TLS certificate. The easiest way to install is to use Snap: `sudo snap install certbot`.
3. Run `certbot` to get a Let's Encrypt certificate: `sudo certbot`. Follow the instructions given to validate your domain name and install the certificate only. You may choose to redirect HTTP traffic to HTTPS instead (which attempts to secure every connection even when the client device does not request it). Let's Encrypt does not issue certificates for IP addresses. if you don't have a domain name, but you can use a service like NoIP.
4. Locate the Let's Encrypt Apache2 configuration file. It's usually in `/etc/apache2/sites-enabled` and called "000-default-le-ssl.conf" or similar.
5. Add the following lines to the Apache2 configuration file between the VIrtualHost 443 tags. This will redirect Apache's document root on your webserver to instead point to RTL. Change "/" to something like "/rtl" if you would instead like to redirect "/rtl" to RTL and do something else at the document root. Change "3002" to whatever port number you are using if it is not 3002.
7. (Option) Edit ~/.rtl/rtl.js to disable insercure HTTP access to RTL entirely. Find these lines:
if (common.host) {
server.listen(common.port, common.host);
} else {
server.listen(common.port);
}
...and change them to:
if (common.host) {
server.listen(common.port, "127.0.0.1");
} else {
server.listen(common.port, "127.0.0.1");
}
This disables normal HTTP access to your server except if the client is on the same machine as the server. This will allow you to access http://localhost:3002 (or whatever port number you are using) on a browser that is on the same machine as RTL, but otherwise, you will have to access RTL through the Apache2 reverse proxy at https://yourdomain.tld/rtl, which will secure the connection with HTTPS.
Note: Occasionally you will receive "Invalid CSRF token, form tempered" when attempting to log in to RTL. If that happens, refresh the page and try again.
@ -4,39 +4,34 @@ This guide will allow you to remotely connect to RTL over Tor. This can work on
#### Server Setup
Install Tor on the same local machine as RTL. see the tor project wiki [here](https://trac.torproject.org/projects/tor/wiki)
On Debian based distros:
$> sudo apt install tor
Edit the `torrc` configuration file, and add the following lines:
Edit `/etc/tor/torrc` (Debian based distro) configuration file, and add the following lines:
```
HiddenServiceDir /var/db/tor/rtl/
HiddenServiceVersion 2
HiddenServiceAuthorizeClient stealth mydevice
HiddenServiceDir /var/lib/tor/rtl-service-v3/
HiddenServiceVersion 3
HiddenServicePort 3000 127.0.0.1:3000
```
Change `/var/db/tor/rtl/` to any directory you want to store the hidden service credentials.
Change `mydevice` to anything you want.
Change `/var/lib/tor/rtl-service-v3/` to any directory you want to store the hidden service credentials.
Save the changes to the `torrc` file and restart tor.
View the contents of the file `/var/db/tor/rtl/hostname`. It will show an onion address, an authentication password(cookie), and the associated `mydevice` label.
$> sudo systemctl restart tor
or sometimes:
$> sudo systemctl daemon-reload
View the contents of the file `/var/lib/tor/rtl-service-v3/hostname`. You need to be root. It will show an onion address. This is your address.
On Debian based distro:
$> su -c "cat /var/lib/tor/rtl-service-v3/hostname"
#### Client setup: Android
Download Orbot for android (add their repos to F-Droid here: https://guardianproject.info/fdroid/
Open orbot. Click the `⋮`, select `hidden services ˃`, select `Client cookies`.
Press the + button on the lower right. Type in the the onion address and secret cookie you revealed in file `/var/lnd/tor/rtl/hostname`.
Install Tor browser (or any other compatible browser) for Android from the app store
Go back to orbot's main screen, and select the gear icon under `tor enabled apps`.
Add your favorite tor compatible browser (I use brave) `Brave`, then press back.
Click `stop` on the big onion logo. Exit orbot and reopen it.
Turn on `VPN Mode`. Start your connection to the tor network by clicking on the big onion (if it has not automatically connected already)
Open the tor enabled browser and type in the onion address (example `z1234567890abc.onion:3000`)
Only you have access to this website! All traffic in the tor enabled browser will go over Tor (which is slower than clearnet).
Now open the tor enabled browser and type in the onion address (example `z1234567890abc.onion:3000`)
Only you have access to this website! All traffic in the brave browser will go over Tor (which is slower than clearnet).
To go back to clearnet browsing, turn off VPN mode in Orbot.
#### Client setup: Windows Tor Browser
#### Client setup: Windows Tor Browser (not updated)
Download and install Tor Browser for windows: https://www.torproject.org/download/
logger.log({selectedNode:req.session.selectedNode,level:'INFO',fileName:'Channels',msg:'Peer Channels List With Aliases Received',data:body.channels});
returnres.status(200).json(body.channels||[]);
});
logger.log({selectedNode:req.session.selectedNode,level:'INFO',fileName:'Channels',msg:'Channels List Received',data:body});
logger.log({selectedNode:req.session.selectedNode,level:'INFO',fileName:'Channels',msg:'Forwarding History Received For Status'+req.query.status,data:body});
logger.log({selectedNode:req.session.selectedNode,level:'DEBUG',fileName:'Channels',msg:'Paginated Forwarding History url'+options.url});
request.get(options).then((body)=>{
logger.log({selectedNode:req.session.selectedNode,level:'INFO',fileName:'Channels',msg:'Paginated Forwarding History Received For Status'+req.query.status,data:body});
res.status(200).json(body);
}).catch((errRes)=>{
consterr=common.handleError(errRes,'Channels','Paginated Forwarding History Error',req.session.selectedNode);
logger.log({selectedNode:req.session.selectedNode,level:'INFO',fileName:'Network',msg:'Network Fee Rates Received for '+req.params.feeRateStyle,data:body});
this.logger.log({selectedNode:clientExists.selectedNode,level:'INFO',fileName:'CLWebSocket',msg:'Disconnecting from the Core Lightning\'s Websocket Server..'});
logger.log({selectedNode:req.session.selectedNode,level:'INFO',fileName:'Payments',msg:'Payment Information Received for '+req.params.paymentHash,data:body});
logger.log({selectedNode:req.session.selectedNode,level:'INFO',fileName:'Transactions',msg:'Sorted Transactions List Received',data:body.transactions});
logger.log({selectedNode:req.session.selectedNode,level:'ERROR',fileName:'RTLConf',msg:'Node config does not exist!',error:{error:'Node config does not exist.'}});
logger.log({selectedNode:req.session.selectedNode,level:'ERROR',fileName:'RTLConf',msg:'Node config does not exist!',error:{error:'Node config does not exist.'}});
logger.log({selectedNode:req.session.selectedNode,level:'INFO',fileName:'RTLConf',msg:'Selected Node Updated To '+req.session.selectedNode.lnNode||''});
returnthis.handleError({statusCode:401,message:'Session expired after a day\'s inactivity'},'Session Expired','Session Expiry Error',this.initSelectedNode);
returnthis.handleError({statusCode:401,message:'Session expired after a day\'s inactivity'},'Session Expired','Session Expiry Error',this.selectedNode);
this.logger.log({selectedNode:this.initSelectedNode,level:'INFO',fileName:'Common',msg:'Updated Node Options for '+req.session.selectedNode.ln_node,data:req.session.selectedNode.options});
this.logger.log({selectedNode:this.selectedNode,level:'INFO',fileName:'Common',msg:'Updated Node Options for '+req.session.selectedNode.lnNode,data:req.session.selectedNode.authentication.options});
this.logger.log({selectedNode:this.initSelectedNode,level:'ERROR',fileName:'Common',msg:'Common Set Options Error',error:err});
node.options ={
this.logger.log({selectedNode:this.selectedNode,level:'ERROR',fileName:'Common',msg:'Common Set Options Error',error:err});
node.authentication.options ={
url:'',
rejectUnauthorized:false,
json:true,
form:''
};
}
this.logger.log({selectedNode:this.initSelectedNode,level:'INFO',fileName:'Common',msg:'Set Node Options for '+node.ln_node,data:node.options});
this.logger.log({selectedNode:this.selectedNode,level:'INFO',fileName:'Common',msg:'Set Node Options for '+node.lnNode,data:node.authentication.options});
this.logger.log({selectedNode:this.initSelectedNode,level:'INFO',fileName:'Common',msg:'Please note that, RTL has encrypted the plaintext password into its corresponding hash'});
this.logger.log({selectedNode:this.selectedNode,level:'INFO',fileName:'Common',msg:'Please note that, RTL has encrypted the plaintext password into its corresponding hash'});
this.logger.log({selectedNode:this.initSelectedNode,level:'ERROR',fileName:'Common',msg:'Error in Channel Backup for Node '+node.ln_node,error:err});
if(node.lnNode){
this.logger.log({selectedNode:this.selectedNode,level:'ERROR',fileName:'Common',msg:'Error in Channel Backup for Node '+node.lnNode,error:err});
}
else{
this.logger.log({selectedNode:this.initSelectedNode,level:'ERROR',fileName:'Common',msg:'Error in Channel Backup for File '+channel_backup_file,error:err});
this.logger.log({selectedNode:this.selectedNode,level:'ERROR',fileName:'Common',msg:'Error in Channel Backup for File '+channel_backup_file,error:err});
}
}
else{
if(node.ln_node){
this.logger.log({selectedNode:this.initSelectedNode,level:'INFO',fileName:'Common',msg:'Successful in Channel Backup for Node '+node.ln_node,data:body});
if(node.lnNode){
this.logger.log({selectedNode:this.selectedNode,level:'INFO',fileName:'Common',msg:'Successful in Channel Backup for Node '+node.lnNode,data:body});
}
else{
this.logger.log({selectedNode:this.initSelectedNode,level:'INFO',fileName:'Common',msg:'Successful in Channel Backup for File '+channel_backup_file,data:body});
this.logger.log({selectedNode:this.selectedNode,level:'INFO',fileName:'Common',msg:'Successful in Channel Backup for File '+channel_backup_file,data:body});
}
}
});
},(err)=>{
this.logger.log({selectedNode:this.initSelectedNode,level:'ERROR',fileName:'Common',msg:'Error in Channel Backup for Node '+node.ln_node,error:err});
this.logger.log({selectedNode:this.selectedNode,level:'ERROR',fileName:'Common',msg:'Error in Channel Backup for Node '+node.lnNode,error:err});
this.errMsg=this.errMsg+'\nPlease set config path Or api password for node index '+node.index+' in RTL-Config.json! It is mandatory for Eclair authentication!';
this.logger.log({selectedNode:this.common.initSelectedNode,level:'ERROR',fileName:'Config',msg:'Something went wrong while creating backup file: \n'+err});
this.logger.log({selectedNode:this.common.selectedNode,level:'ERROR',fileName:'Config',msg:'Something went wrong while creating backup file: \n'+err});
}
}
}
catch(err){
this.logger.log({selectedNode:this.common.initSelectedNode,level:'ERROR',fileName:'Config',msg:'Something went wrong while creating the backup directory: \n'+err});
this.logger.log({selectedNode:this.common.selectedNode,level:'ERROR',fileName:'Config',msg:'Something went wrong while creating the backup directory: \n'+err});
this.logger.log({selectedNode:this.common.initSelectedNode,level:'ERROR',fileName:'Config',msg:'Something went wrong while creating log file '+log_file+': \n'+err});
this.logger.log({selectedNode:this.common.selectedNode,level:'ERROR',fileName:'Config',msg:'Something went wrong while creating log file '+log_file+': \n'+err});
this.logger.log({selectedNode:this.common.initSelectedNode,level:'ERROR',fileName:'Config',msg:'Something went wrong while configuring the node server: \n'+err});
this.logger.log({selectedNode:this.common.selectedNode,level:'ERROR',fileName:'Config',msg:'Something went wrong while configuring the node server: \n'+err});
this.logger.log({selectedNode:this.common.initSelectedNode,level:'INFO',fileName:'WebSocketServer',msg:'Disconnected due to '+code+' : '+websocket.clientId+', Total WS clients: '+this.webSocketServer.clients.size});
this.logger.log({selectedNode:this.common.selectedNode,level:'INFO',fileName:'WebSocketServer',msg:'Disconnected due to '+code+' : '+websocket.clientId+', Total WS clients: '+this.webSocketServer.clients.size});
this.logger.log({selectedNode:!selectedNode?this.common.initSelectedNode :selectedNode,level:'ERROR',fileName:'WebSocketServer',msg:'Invalid Node Selection. Previous and current node indices can not be less than zero.'});
this.logger.log({selectedNode:!selectedNode?this.common.selectedNode :selectedNode,level:'ERROR',fileName:'WebSocketServer',msg:'Invalid Node Selection. Previous and current node indices can not be less than zero.'});