From 91b38d1fb45c514734702066eb5e15c3c9862b71 Mon Sep 17 00:00:00 2001 From: everoddandeven Date: Thu, 3 Oct 2024 22:35:30 +0200 Subject: [PATCH] Wide implementation --- app/main.ts | 10 +- src/app/app.component.ts | 15 - .../services/daemon/daemon-data.service.ts | 27 +- .../core/services/daemon/daemon.service.ts | 55 +- .../blockchain/blockchain.component.html | 26 + .../pages/blockchain/blockchain.component.ts | 29 +- src/app/pages/detail/detail.component.ts | 14 +- src/app/pages/outputs/outputs.component.html | 152 +++++- src/app/pages/outputs/outputs.component.ts | 133 ++++- .../pages/settings/settings.component.html | 48 +- src/app/pages/settings/settings.component.ts | 241 +-------- .../daemon-not-running.component.html | 8 +- .../daemon-not-running.component.ts | 6 +- .../components/navbar/navbar.service.ts | 11 +- .../components/sidebar/sidebar.component.scss | 129 ++--- .../components/sidebar/sidebar.component.ts | 1 + src/common/DaemonSettings.ts | 485 +++++++++--------- 17 files changed, 795 insertions(+), 595 deletions(-) diff --git a/app/main.ts b/app/main.ts index 24499c9..5fc42dc 100644 --- a/app/main.ts +++ b/app/main.ts @@ -122,8 +122,14 @@ function getMonerodVersion(monerodFilePath: string): void { } function startMoneroDaemon(commandOptions: string[]): ChildProcessWithoutNullStreams { - const monerodPath = getMonerodPath(); - + //const monerodPath = getMonerodPath(); + const monerodPath = commandOptions.shift(); + + if (!monerodPath) { + win?.webContents.send('monero-sterr', `Invalid monerod path provided: ${monerodPath}`); + throw Error("Invalid monerod path provided"); + } + console.log("Starting monerod daemon with options: " + commandOptions.join(" ")); // Avvia il processo usando spawn diff --git a/src/app/app.component.ts b/src/app/app.component.ts index e0b143c..66aa1c9 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -46,21 +46,6 @@ export class AppComponent { private async load(): Promise { this.loading = true; - if (!window.indexedDB) { - console.log("Il tuo browser non supporta indexedDB"); - } - else { - console.log("Browser supports IndexedDB"); - var request = window.indexedDB.open("dati", 1); - console.log(request); - - request.onsuccess = function(event: Event) { - if(event.target instanceof IDBOpenDBRequest) { - console.log(event.target.result) - } - }; - } - try { this.daemonRunning = await this.daemonService.isRunning(); } diff --git a/src/app/core/services/daemon/daemon-data.service.ts b/src/app/core/services/daemon/daemon-data.service.ts index da6d1a8..fd1cd8e 100644 --- a/src/app/core/services/daemon/daemon-data.service.ts +++ b/src/app/core/services/daemon/daemon-data.service.ts @@ -1,6 +1,6 @@ import { EventEmitter, Injectable } from '@angular/core'; import { DaemonService } from './daemon.service'; -import { BlockCount, BlockHeader, DaemonInfo, SyncInfo } from '../../../../common'; +import { BlockCount, BlockHeader, Chain, DaemonInfo, SyncInfo } from '../../../../common'; @Injectable({ providedIn: 'root' @@ -31,6 +31,9 @@ export class DaemonDataService { private _lastBlockHeader?: BlockHeader; private _gettingLastBlockHeader: boolean = false; + private _altChains: Chain[] = []; + private _gettingAltChains: boolean = false; + public readonly syncStart: EventEmitter = new EventEmitter(); public readonly syncEnd: EventEmitter = new EventEmitter(); public readonly syncError: EventEmitter = new EventEmitter(); @@ -115,6 +118,14 @@ export class DaemonDataService { return this._gettingLastBlockHeader; } + public get AltChains(): Chain[] { + return this._altChains; + } + + public get gettingAltChains(): boolean { + return this._gettingAltChains; + } + public setRefreshTimeout(ms: number = 5000): void { this.refreshTimeoutMs = ms; } @@ -144,6 +155,10 @@ export class DaemonDataService { return Date.now() - this._lastRefresh <= this.refreshTimeoutMs; } + private async getInfo(): Promise { + + } + private async refresh(): Promise { if (this.refreshing || this.tooEarlyForRefresh) { return; @@ -157,6 +172,11 @@ export class DaemonDataService { this._daemonRunning = await this.daemonService.isRunning(); this._firstRefresh = false; + if (!this._daemonRunning) { + this.syncEnd.emit(); + return; + } + this._gettingDaemonInfo = true; this._daemonInfo = await this.daemonService.getInfo(); this._gettingDaemonInfo = false; @@ -179,6 +199,10 @@ export class DaemonDataService { if (firstRefresh) this._isBlockchainPruned = (await this.daemonService.pruneBlockchain(true)).pruned; this._gettingIsBlockchainPruned = false; + this._gettingAltChains = true; + this._altChains = await this.daemonService.getAlternateChains(); + this._gettingAltChains = false; + this._lastRefresh = Date.now(); } catch(error) { console.error(error); @@ -187,6 +211,7 @@ export class DaemonDataService { this._gettingBlockCount = false; this._gettingLastBlockHeader = false; this._gettingIsBlockchainPruned = false; + this._gettingAltChains = false; this.syncError.emit(error); diff --git a/src/app/core/services/daemon/daemon.service.ts b/src/app/core/services/daemon/daemon.service.ts index fd20461..e1bedbf 100644 --- a/src/app/core/services/daemon/daemon.service.ts +++ b/src/app/core/services/daemon/daemon.service.ts @@ -98,6 +98,8 @@ export class DaemonService { public readonly onDaemonStopStart: EventEmitter = new EventEmitter(); public readonly onDaemonStopEnd: EventEmitter = new EventEmitter(); + private isRunningPromise?: Promise; + private readonly headers: { [key: string]: string } = { "Access-Control-Allow-Headers": "*", // this will allow all CORS requests "Access-Control-Allow-Methods": 'POST,GET' // this states the allowed methods @@ -237,13 +239,17 @@ export class DaemonService { return response; } catch (error) { - if (error instanceof HttpErrorResponse && error.status == 0) { - const wasRunning = this.daemonRunning; - this.daemonRunning = false; - - if (wasRunning) { - this.onDaemonStatusChanged.emit(false); + if (error instanceof HttpErrorResponse) { + if (error.status == 0) { + const wasRunning = this.daemonRunning; + this.daemonRunning = false; + + if (wasRunning) { + this.onDaemonStatusChanged.emit(false); + } } + + throw new Error(error.message); } throw error; @@ -282,26 +288,37 @@ export class DaemonService { } - public async isRunning(force: boolean = false): Promise { + private async checkDaemonIsRunning(): Promise { try { - if (!force && this.daemonRunning != undefined) { - return this.daemonRunning; - } - await this.callRpc(new EmptyRpcRequest()); } catch(error) { if (error instanceof MethodNotFoundError) { - this.daemonRunning = true; - return this.daemonRunning; + return true; } - + console.error(error); } - - this.daemonRunning = false; - return this.daemonRunning; + return false; + } + + public async isRunning(force: boolean = false): Promise { + if (this.isRunningPromise) { + return await this.isRunningPromise; + } + + if (!force && this.daemonRunning != undefined) { + return this.daemonRunning; + } + + this.isRunningPromise = this.checkDaemonIsRunning(); + + this.daemonRunning = await this.isRunningPromise; + + this.isRunningPromise = undefined; + + return this.daemonRunning; } public async getBlock(heightOrHash: number | string, fillPowHash: boolean = false): Promise { @@ -678,6 +695,10 @@ export class DaemonService { public async isKeyImageSpent(...keyImages: string[]): Promise { const response = await this.callRpc(new IsKeyImageSpentRequest(keyImages)); + if (response.status != 'OK') { + throw new Error(response.status); + } + return response.spent_status; } diff --git a/src/app/pages/blockchain/blockchain.component.html b/src/app/pages/blockchain/blockchain.component.html index ea2098d..232f8cf 100644 --- a/src/app/pages/blockchain/blockchain.component.html +++ b/src/app/pages/blockchain/blockchain.component.html @@ -423,6 +423,32 @@ +
+ + + + + + +
+ + + + +
+ + +
+ + + + +
+
+
+ +
+

Get a histogram of output amounts. For all amounts (possibly filtered by parameters), gives the number of outputs on the chain for that amount. RingCT outputs counts as 0 amount.

+
+
+
+ + + Array of unsigned int +
+
+
+
+ +
+ + + +
+ +
+ + + +
+ +
+ + +
+ +
+ +
+ + + +
+ +
+
+
+ + +
+ +
+ + + + +
+
+
+ +
+

Get Outputs

+
+
+
+ + + Array of unsigned int, amounts to look for +
+
+
+
+ +
+ + + Starting height to check from +
+ +
+ + + Ending height to check up to +
+ +
+ + +
+ Cumulative result +
+ +
+
+
+ + +
+ +
+

Key images spent status

+ + + + + + + +
Key ImageStatus
+ +
+ +
+
@@ -47,8 +196,9 @@
- + List of key image hex strings to check.
Invalid key images.
diff --git a/src/app/pages/outputs/outputs.component.ts b/src/app/pages/outputs/outputs.component.ts index bbfb1d3..de6bf39 100644 --- a/src/app/pages/outputs/outputs.component.ts +++ b/src/app/pages/outputs/outputs.component.ts @@ -2,7 +2,7 @@ import { AfterViewInit, Component, NgZone } from '@angular/core'; import { NavbarLink } from '../../shared/components/navbar/navbar.model'; import { DaemonService } from '../../core/services/daemon/daemon.service'; import { NavbarService } from '../../shared/components/navbar/navbar.service'; -import { Output } from '../../../common'; +import { HistogramEntry, Output, OutputDistribution } from '../../../common'; @Component({ selector: 'app-outputs', @@ -17,11 +17,63 @@ export class OutputsComponent implements AfterViewInit { public getOutsJsonString: string = ''; public getOutsGetTxId: boolean = false; - public keyImages: string = ''; + public keyImagesJsonString: string = ''; public isKeyImageSpentError: string = ''; - public isKeyImageSpentResult?: boolean; + public isKeyImageSpentResult?: { keyImage: string, spentStatus: string }[]; public gettingKeyImages: boolean = false; + public get validKeyImages(): boolean { + try { + const keyImages: string[] = JSON.parse(this.keyImagesJsonString); + + if (!Array.isArray(keyImages)) { + return false; + } + + keyImages.forEach((keyImage: string) => { + if (typeof keyImage != 'string') { + throw new Error(); + } + }); + + return true; + } catch(error) { + return false; + } + } + + public get keyImages(): string[] { + if (!this.validKeyImages) { + return []; + } + + return JSON.parse(this.keyImagesJsonString); + } + + public getOutHistogramAmountsJsonString: string = ''; + public getOutHistogramMinCount: number = 0; + public getOutHistogramMaxCount: number = 0; + public getOutHistogramUnlocked: boolean = false; + public getOutHistogramRecentCutoff: number = 0; + public getOutHistogramResult?: HistogramEntry[]; + public getOutHistogramError: string = ''; + public gettingOutHistogram: boolean = false; + + public getOutDistributionAmountsJsonString: string = ''; + public getOutDistributionFromHeight: number = 0; + public getOutDistributionToHeight: number = 0; + public getOutDistributionCumulative: boolean = false; + public getOutDistributionResult?: OutputDistribution[]; + public getOutDistributionError: string = ''; + + public get getOutDistributionAmounts(): number[] { + if (!this.validOutDistributionAmounts) { + return []; + } + + return JSON.parse(this.getOutDistributionAmountsJsonString); + } + constructor(private daemonService: DaemonService, private navbarService: NavbarService, private ngZone: NgZone) { this.navbarLinks = [ new NavbarLink('pills-outputs-overview-tab', '#pills-outputs-overview', 'outputs-overview', true, 'Overview'), @@ -67,7 +119,7 @@ export class OutputsComponent implements AfterViewInit { } } - public validOuts(): boolean { + public get validOuts(): boolean { try { const _outs: any[] = JSON.parse(this.getOutsJsonString); @@ -93,11 +145,80 @@ export class OutputsComponent implements AfterViewInit { } - public async isKeyImageSpent(): Promise { + public get validOutDistributionAmounts(): boolean { + try { + const amounts: number[] = JSON.parse(this.getOutDistributionAmountsJsonString); + + if(!Array.isArray(amounts)) { + return false; + } + + amounts.forEach((amount) => { + if (typeof amount != 'number' || amount <= 0) throw new Error(""); + }) + + return true; + } + catch(error) { + return false; + } + } + + public async getOutDistribution(): Promise { + try + { + const amounts = this.getOutDistributionAmounts; + const cumulative = this.getOutDistributionCumulative; + const fromHeight = this.getOutDistributionFromHeight; + const toHeight = this.getOutDistributionToHeight; + + this.getOutDistributionResult = await this.daemonService.getOutputDistribution(amounts, cumulative, fromHeight, toHeight); + this.getOutDistributionError = ''; + } + catch(error) { + this.getOutDistributionError = `${error}`; + } + } + + public async getOutHistogram(): Promise { } + public async isKeyImageSpent(): Promise { + this.gettingKeyImages = true; + try { + const keyImages: string[] = this.keyImages; + + const spentList: number[] = await this.daemonService.isKeyImageSpent(...keyImages); + + if (keyImages.length != spentList.length) { + throw new Error("Invalid spent list size response"); + } + + this.isKeyImageSpentResult = []; + for(let i = 0; i < keyImages.length; i++) { + const ki = keyImages[i]; + const spentStatus = spentList[i]; + + this.isKeyImageSpentResult.push({ + keyImage: ki, + spentStatus: spentStatus == 0 ? 'unspent' : spentStatus == 1 ? 'spent in blockchain' : spentStatus == 2 ? 'spent in tx pool' : 'unknown' + }) + + const $table = $('#keyImagesTable'); + $table.bootstrapTable({}); + $table.bootstrapTable('load', this.isKeyImageSpentResult); + this.isKeyImageSpentError = ''; + } + + } catch(error) { + this.isKeyImageSpentError = `${error}`; + this.isKeyImageSpentResult = undefined; + } + + this.gettingKeyImages = false; + } + public async load() { - await this.getOuts(); } } diff --git a/src/app/pages/settings/settings.component.html b/src/app/pages/settings/settings.component.html index 77d926f..d873564 100644 --- a/src/app/pages/settings/settings.component.html +++ b/src/app/pages/settings/settings.component.html @@ -1,20 +1,48 @@

Settings

- +
+ +
- -
-
+ +
+
+
+

Node

+ +
+
+ + + Path to monerod executable +
+
+ +
+ +
+
+ + + Path to XMRig executable +
+ +
+
+
+
+ +

General

diff --git a/src/app/pages/settings/settings.component.ts b/src/app/pages/settings/settings.component.ts index 1b7b9e7..e102777 100644 --- a/src/app/pages/settings/settings.component.ts +++ b/src/app/pages/settings/settings.component.ts @@ -1,9 +1,8 @@ import { AfterViewInit, Component } from '@angular/core'; import { NavbarService } from '../../shared/components/navbar/navbar.service'; -import { NavigationEnd, NavigationStart, Router } from '@angular/router'; +import { Router } from '@angular/router'; import { NavbarLink } from '../../shared/components/navbar/navbar.model'; import { DaemonSettings } from '../../../common/DaemonSettings'; -import { FormsModule, NgModel } from '@angular/forms'; import { DaemonService } from '../../core/services/daemon/daemon.service'; @Component({ @@ -27,7 +26,8 @@ export class SettingsComponent implements AfterViewInit { this.loading = true; this.navbarLinks = [ - new NavbarLink('pills-rpc-tab', '#pills-rpc', 'pills-rpc', true, 'RPC'), + new NavbarLink('pills-general-tab', '#pills-general', 'pills-general', true, 'General'), + new NavbarLink('pills-rpc-tab', '#pills-rpc', 'pills-rpc', false, 'RPC'), new NavbarLink('pills-p2p-tab', '#pills-p2p', 'pills-p2p', false, 'P2P'), new NavbarLink('pills-blockchain-tab', '#pills-blockchain', 'pills-blockchain', false, 'Blockchain'), new NavbarLink('pills-mining-tab', '#pills-mining', 'pills-mining', false, 'Mining'), @@ -46,13 +46,6 @@ export class SettingsComponent implements AfterViewInit { this.rpcLoginPassword = ''; } - this.router.events.subscribe((event) => { - if (event instanceof NavigationEnd) { - if (event.url != '/settings') return; - this.onNavigationEnd(); - } - }); - this.load(); } @@ -70,12 +63,12 @@ export class SettingsComponent implements AfterViewInit { return true; } - return false; } ngAfterViewInit(): void { this.navbarService.setLinks(this.navbarLinks); + this.navbarService.enableLinks(); } public OnOfflineChange() { @@ -136,8 +129,13 @@ export class SettingsComponent implements AfterViewInit { } } - private onNavigationEnd(): void { - + public onMonerodPathChange(): void { + if (document) { + const element = document.getElementById('general-monerod-path'); + if (element.files) { + this.currentSettings.monerodPath = element.files[0].path; + } + } } public async OnSave(): Promise { @@ -150,220 +148,3 @@ export class SettingsComponent implements AfterViewInit { this.originalSettings = this.currentSettings.clone(); } } -/** - * --log-file arg (=/home/sidney/.bitmonero/bitmonero.log, /home/sidney/.bitmonero/testnet/bitmonero.log if 'testnet', /home/sidney/.bitmonero/stagenet/bitmonero.log if 'stagenet') - Specify log file - --log-level arg - --max-log-file-size arg (=104850000) Specify maximum log file size [B] - --max-log-files arg (=50) Specify maximum number of rotated log - files to be saved (no limit by setting - to 0) - --max-concurrency arg (=0) Max number of threads to use for a - parallel job - --proxy arg Network communication through proxy: - i.e. "127.0.0.1:9050" - --proxy-allow-dns-leaks Allow DNS leaks outside of proxy - --public-node Allow other users to use the node as a - remote (restricted RPC mode, view-only - commands) and advertise it over P2P - --zmq-rpc-bind-ip arg (=127.0.0.1) IP for ZMQ RPC server to listen on - --zmq-rpc-bind-port arg (=18082, 28082 if 'testnet', 38082 if 'stagenet') - Port for ZMQ RPC server to listen on - --zmq-pub arg Address for ZMQ pub - tcp://ip:port or - ipc://path - --no-zmq Disable ZMQ RPC server - --data-dir arg (=/home/sidney/.bitmonero, /home/sidney/.bitmonero/testnet if 'testnet', /home/sidney/.bitmonero/stagenet if 'stagenet') - Specify data directory - --test-drop-download For net tests: in download, discard ALL - blocks instead checking/saving them - (very fast) - --test-drop-download-height arg (=0) Like test-drop-download but discards - only after around certain height - --testnet Run on testnet. The wallet must be - launched with --testnet flag. - --stagenet Run on stagenet. The wallet must be - launched with --stagenet flag. - --regtest Run in a regression testing mode. - --keep-fakechain Don't delete any existing database when - in fakechain mode. - --fixed-difficulty arg (=0) Fixed difficulty used for testing. - --enforce-dns-checkpointing checkpoints from DNS server will be - enforced - --prep-blocks-threads arg (=4) Max number of threads to use when - preparing block hashes in groups. - --fast-block-sync arg (=1) Sync up most of the way by using - embedded, known block hashes. - --show-time-stats arg (=0) Show time-stats when processing - blocks/txs and disk synchronization. - --block-sync-size arg (=0) How many blocks to sync at once during - chain synchronization (0 = adaptive). - --check-updates arg (=notify) Check for new versions of monero: - [disabled|notify|download|update] - --fluffy-blocks Relay blocks as fluffy blocks - (obsolete, now default) - --no-fluffy-blocks Relay blocks as normal blocks - --test-dbg-lock-sleep arg (=0) Sleep time in ms, defaults to 0 (off), - used to debug before/after locking - mutex. Values 100 to 1000 are good for - tests. - --offline Do not listen for peers, nor connect to - any - --disable-dns-checkpoints Do not retrieve checkpoints from DNS - --block-download-max-size arg (=0) Set maximum size of block download - queue in bytes (0 for default) - --sync-pruned-blocks Allow syncing from nodes with only - pruned blocks - --max-txpool-weight arg (=648000000) Set maximum txpool weight in bytes. - --block-notify arg Run a program for each new block, '%s' - will be replaced by the block hash - --prune-blockchain Prune blockchain - --reorg-notify arg Run a program for each reorg, '%s' will - be replaced by the split height, '%h' - will be replaced by the new blockchain - height, '%n' will be replaced by the - number of new blocks in the new chain, - and '%d' will be replaced by the number - of blocks discarded from the old chain - --block-rate-notify arg Run a program when the block rate - undergoes large fluctuations. This - might be a sign of large amounts of - hash rate going on and off the Monero - network, and thus be of potential - interest in predicting attacks. %t will - be replaced by the number of minutes - for the observation window, %b by the - number of blocks observed within that - window, and %e by the number of blocks - that was expected in that window. It is - suggested that this notification is - used to automatically increase the - number of confirmations required before - a payment is acted upon. - --keep-alt-blocks Keep alternative blocks on restart - --extra-messages-file arg Specify file for extra messages to - include into coinbase transactions - --start-mining arg Specify wallet address to mining for - --mining-threads arg Specify mining threads count - --bg-mining-enable enable background mining - --bg-mining-ignore-battery if true, assumes plugged in when unable - to query system power status - --bg-mining-min-idle-interval arg Specify min lookback interval in - seconds for determining idle state - --bg-mining-idle-threshold arg Specify minimum avg idle percentage - over lookback interval - --bg-mining-miner-target arg Specify maximum percentage cpu use by - miner(s) - --db-sync-mode arg (=fast:async:250000000bytes) - Specify sync option, using format - [safe|fast|fastest]:[sync|async]:[[blocks]| - [bytes]]. - --db-salvage Try to salvage a blockchain database if - it seems corrupted - --p2p-bind-ip arg (=0.0.0.0) Interface for p2p network protocol - (IPv4) - --p2p-bind-ipv6-address arg (=::) Interface for p2p network protocol - (IPv6) - --p2p-bind-port arg (=18080, 28080 if 'testnet', 38080 if 'stagenet') - Port for p2p network protocol (IPv4) - --p2p-bind-port-ipv6 arg (=18080, 28080 if 'testnet', 38080 if 'stagenet') - Port for p2p network protocol (IPv6) - --p2p-use-ipv6 Enable IPv6 for p2p - --p2p-ignore-ipv4 Ignore unsuccessful IPv4 bind for p2p - --p2p-external-port arg (=0) External port for p2p network protocol - (if port forwarding used with NAT) - --allow-local-ip Allow local ip add to peer list, mostly - in debug purposes - --add-peer arg Manually add peer to local peerlist - --add-priority-node arg Specify list of peers to connect to and - attempt to keep the connection open - --add-exclusive-node arg Specify list of peers to connect to - only. If this option is given the - options add-priority-node and seed-node - are ignored - --seed-node arg Connect to a node to retrieve peer - addresses, and disconnect - --tx-proxy arg Send local txes through proxy: - ,[,max_con - nections][,disable_noise] i.e. - "tor,127.0.0.1:9050,100,disable_noise" - --anonymous-inbound arg ,<[bind-ip:]por - t>[,max_connections] i.e. - "x.onion,127.0.0.1:18083,100" - --ban-list arg Specify ban list file, one IP address - per line - --hide-my-port Do not announce yourself as peerlist - candidate - --no-sync Don't synchronize the blockchain with - other peers - --enable-dns-blocklist Apply realtime blocklist from DNS - --no-igd Disable UPnP port mapping - --igd arg (=delayed) UPnP port mapping (disabled, enabled, - delayed) - --out-peers arg (=-1) set max number of out peers - --in-peers arg (=-1) set max number of in peers - --tos-flag arg (=-1) set TOS flag - --limit-rate-up arg (=2048) set limit-rate-up [kB/s] - --limit-rate-down arg (=8192) set limit-rate-down [kB/s] - --limit-rate arg (=-1) set limit-rate [kB/s] - --pad-transactions Pad relayed transactions to help defend - against traffic volume analysis - --max-connections-per-ip arg (=1) Maximum number of connections allowed - from the same IP address - --rpc-bind-port arg (=18081, 28081 if 'testnet', 38081 if 'stagenet') - Port for RPC server - --rpc-restricted-bind-port arg Port for restricted RPC server - --restricted-rpc Restrict RPC to view only commands and - do not return privacy sensitive data in - RPC calls - --bootstrap-daemon-address arg URL of a 'bootstrap' remote daemon that - the connected wallets can use while - this daemon is still not fully synced. - Use 'auto' to enable automatic public - nodes discovering and bootstrap daemon - switching - --bootstrap-daemon-login arg Specify username:password for the - bootstrap daemon login - --bootstrap-daemon-proxy arg : socks proxy to use for - bootstrap daemon connections - --rpc-bind-ip arg (=127.0.0.1) Specify IP to bind RPC server - --rpc-bind-ipv6-address arg (=::1) Specify IPv6 address to bind RPC server - --rpc-restricted-bind-ip arg (=127.0.0.1) - Specify IP to bind restricted RPC - server - --rpc-restricted-bind-ipv6-address arg (=::1) - Specify IPv6 address to bind restricted - RPC server - --rpc-use-ipv6 Allow IPv6 for RPC - --rpc-ignore-ipv4 Ignore unsuccessful IPv4 bind for RPC - --rpc-login arg Specify username[:password] required - for RPC server - --confirm-external-bind Confirm rpc-bind-ip value is NOT a - loopback (local) IP - --rpc-access-control-origins arg Specify a comma separated list of - origins to allow cross origin resource - sharing - --rpc-ssl arg (=autodetect) Enable SSL on RPC connections: - enabled|disabled|autodetect - --rpc-ssl-private-key arg Path to a PEM format private key - --rpc-ssl-certificate arg Path to a PEM format certificate - --rpc-ssl-ca-certificates arg Path to file containing concatenated - PEM format certificate(s) to replace - system CA(s). - --rpc-ssl-allowed-fingerprints arg List of certificate fingerprints to - allow - --rpc-ssl-allow-chained Allow user (via --rpc-ssl-certificates) - chain certificates - --disable-rpc-ban Do not ban hosts on RPC errors - --rpc-ssl-allow-any-cert Allow any peer certificate - --rpc-payment-address arg Restrict RPC to clients sending - micropayment to this address - --rpc-payment-difficulty arg (=1000) Restrict RPC to clients sending - micropayment at this difficulty - --rpc-payment-credits arg (=100) Restrict RPC to clients sending - micropayment, yields that many credits - per payment - --rpc-payment-allow-free-loopback Allow free access from the loopback - address (ie, the local host) - - */ \ No newline at end of file diff --git a/src/app/shared/components/daemon-not-running/daemon-not-running.component.html b/src/app/shared/components/daemon-not-running/daemon-not-running.component.html index 8fd2932..14eb173 100644 --- a/src/app/shared/components/daemon-not-running/daemon-not-running.component.html +++ b/src/app/shared/components/daemon-not-running/daemon-not-running.component.html @@ -1,11 +1,13 @@
-

Daemon not running

-

Start monero daemon

+

Daemon not running

+

Daemon not configured

+

Start monero daemon

+

Configure monero daemon

Daemon is starting

Starting monero daemon

- +