diff --git a/README.md b/README.md index a0b87a4..3567690 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,9 @@ https://github.com/user-attachments/assets/c4a50d2f-5bbb-48ac-9425-30ecc20ada7c - [ ] Mining tools - [ ] XMRig integration - [ ] P2Pool integration +- [ ] Anonymous network tools + - [ ] Tor integration + - [ ] I2P integration - [ ] Remote node management - [ ] No CORS connection diff --git a/app/main.ts b/app/main.ts index 5b15e02..85a6b55 100644 --- a/app/main.ts +++ b/app/main.ts @@ -143,7 +143,9 @@ async function createWindow(): Promise { allowRunningInsecureContent: (AppMainProcess.serve), contextIsolation: true, devTools: !app.isPackaged, - sandbox: true + sandbox: true, + defaultFontSize: process.platform == 'win32' ? 12 : 16, + defaultMonospaceFontSize: process.platform == 'win32' ? 11 : 13 }, show: false, autoHideMenuBar: true, @@ -755,6 +757,14 @@ try { // #endregion ipcMain.handle('show-error-box', (event: IpcMainInvokeEvent, title: string, content: string) => { + if (win) { + dialog.showMessageBoxSync(win, { + message: content, + type: 'error', + title: title != '' ? title : 'Error' + }); + return; + } dialog.showErrorBox(title, content); }); diff --git a/src/app/core/services/daemon/daemon.service.ts b/src/app/core/services/daemon/daemon.service.ts index a27aa8f..fee5b5e 100644 --- a/src/app/core/services/daemon/daemon.service.ts +++ b/src/app/core/services/daemon/daemon.service.ts @@ -884,6 +884,14 @@ export class DaemonService { } } + public async removeBootstrapDaemon(): Promise { + const response = await this.callRpc(new SetBootstrapDaemonRequest('', '', '', '')); + + if (typeof response.status == 'string' && response.status != 'OK') { + throw new Error(`Could not remove bootstrap daemon: ${response.status}`); + } + } + public async saveBc(): Promise { const response = await this.callRpc(new SaveBcRequest()); diff --git a/src/app/pages/bans/bans.component.html b/src/app/pages/bans/bans.component.html index f014979..b3b422a 100644 --- a/src/app/pages/bans/bans.component.html +++ b/src/app/pages/bans/bans.component.html @@ -14,7 +14,6 @@

List of banned IPs

-
} ]" - rows="15" cols="15" > + rows="10" cols="15" >
Invalid bans provided.
diff --git a/src/app/pages/blockchain/blockchain.component.html b/src/app/pages/blockchain/blockchain.component.html index d5913c2..bf9d6b7 100644 --- a/src/app/pages/blockchain/blockchain.component.html +++ b/src/app/pages/blockchain/blockchain.component.html @@ -269,7 +269,7 @@
-
+
@@ -399,7 +399,7 @@
-
+
@@ -454,7 +454,7 @@
-
+
diff --git a/src/app/pages/detail/detail.component.html b/src/app/pages/detail/detail.component.html index e0fba4a..a7076f0 100644 --- a/src/app/pages/detail/detail.component.html +++ b/src/app/pages/detail/detail.component.html @@ -132,10 +132,10 @@
-
\ No newline at end of file diff --git a/src/app/pages/detail/detail.component.ts b/src/app/pages/detail/detail.component.ts index 7755d1e..ee58f8e 100644 --- a/src/app/pages/detail/detail.component.ts +++ b/src/app/pages/detail/detail.component.ts @@ -344,4 +344,37 @@ export class DetailComponent extends BasePageComponent implements AfterViewInit this.settingBootstrapDaemon = false; } + public removingBootstrapDaemon: boolean = false; + public removeBootstrapDaemonSuccess: boolean = false; + public get canRemoveBootstrapDaemon(): boolean { + return this.daemonData.info ? this.daemonData.info.bootstrapDaemonAddress != '' : false; + } + + public async removeBootstrapDaemon(): Promise { + this.removingBootstrapDaemon = true; + + try { + if (!this.canRemoveBootstrapDaemon) { + throw new Error("Bootstrap daemon not set"); + } + + await this.daemonService.removeBootstrapDaemon(); + this.setBootstrapDaemonError = ''; + this.removeBootstrapDaemonSuccess = true; + } + + catch(error: any) { + console.error(error); + + if (error instanceof Error) { + this.setBootstrapDaemonError = error.message; + } + else { + this.setBootstrapDaemonError = `${error}`; + } + } + + this.removingBootstrapDaemon = false; + } + } diff --git a/src/app/pages/hard-fork-info/hard-fork-info.component.html b/src/app/pages/hard-fork-info/hard-fork-info.component.html index d634468..e614824 100644 --- a/src/app/pages/hard-fork-info/hard-fork-info.component.html +++ b/src/app/pages/hard-fork-info/hard-fork-info.component.html @@ -12,32 +12,40 @@
- @if(!loading) { - @for(card of cards; track card.header) { -
-
{{card.header}}
-
-
{{card.content}}
-
+

Look up information regarding hard fork voting and readiness.

+ + + + @if(!loading) { + @for(card of cards; track card.header) { +
+
{{card.header}}
+
+
{{card.content}}
- } +
} - @else { - @for(card of cards; track card.header) { -
-
{{card.header}}
-
-

- - - - - -

-
+ } + @else { + @for(card of cards; track card.header) { +
+
{{card.header}}
+
+

+ + + + + +

- } +
} + }
diff --git a/src/app/pages/hard-fork-info/hard-fork-info.component.ts b/src/app/pages/hard-fork-info/hard-fork-info.component.ts index 763ed3a..93f9be1 100644 --- a/src/app/pages/hard-fork-info/hard-fork-info.component.ts +++ b/src/app/pages/hard-fork-info/hard-fork-info.component.ts @@ -20,6 +20,7 @@ export class HardForkInfoComponent extends BasePageComponent implements AfterVie private votes: number; private voting: number; private window: number; + private state?: number; public get daemonRunning(): boolean { return this.daemonData.running; @@ -29,6 +30,19 @@ export class HardForkInfoComponent extends BasePageComponent implements AfterVie return this.daemonService.stopping; } + public get hardForkState(): string { + const state = this.state; + + if (state == 0) { + return 'There is likely a hard fork'; + } + else if (state == 1) { + return 'An update is needed to fork properly'; + } + + return ''; + } + public loading: boolean = false; constructor(private daemonData: DaemonDataService, private daemonService: DaemonService, navbarService: NavbarService, private ngZone: NgZone) { @@ -72,6 +86,8 @@ export class HardForkInfoComponent extends BasePageComponent implements AfterVie this.votes = info.votes; this.voting = info.voting; this.window = info.window; + this.enabled = info.enabled; + this.state = info.state; } catch(error) { console.error(error); diff --git a/src/app/pages/logs/logs.component.html b/src/app/pages/logs/logs.component.html index f071e7d..e71b359 100644 --- a/src/app/pages/logs/logs.component.html +++ b/src/app/pages/logs/logs.component.html @@ -752,7 +752,7 @@
-
+

Set the log hash rate display mode

diff --git a/src/app/pages/mining/mining.component.html b/src/app/pages/mining/mining.component.html index 1aac4d6..cc01e6b 100644 --- a/src/app/pages/mining/mining.component.html +++ b/src/app/pages/mining/mining.component.html @@ -86,7 +86,7 @@
-
+

Start mining on the daemon

@@ -258,7 +258,7 @@
-
+
@@ -296,7 +296,7 @@
-
+

Calculate PoW hash for a block candidate

@@ -313,7 +313,7 @@
+ rows="10" cols="15" >
Invalid blob data.
@@ -421,14 +421,14 @@
-
+

Easily enable merge mining with Monero without requiring software that manually alters the extra field in the coinbase tx to include the merkle root of the aux blocks

+ rows="10" cols="15" >
Invalid blob data.
@@ -448,7 +448,7 @@ } ] " - rows="15" cols="15" > + rows="10" cols="15" >
Invalid blob data.
@@ -481,7 +481,7 @@
-
+

Submit a mined block to the network

@@ -493,7 +493,7 @@ + rows="10" cols="15" >
Invalid blob data.
@@ -564,7 +564,7 @@
-
+

Generate a block and specify the address to receive the coinbase reward

diff --git a/src/app/pages/network/network.component.html b/src/app/pages/network/network.component.html index a41be92..b2e628d 100644 --- a/src/app/pages/network/network.component.html +++ b/src/app/pages/network/network.component.html @@ -23,7 +23,6 @@

Information about incoming and outgoing connections to your node

-
-
+
diff --git a/src/app/pages/outputs/outputs.component.html b/src/app/pages/outputs/outputs.component.html index a5f2543..f4b3c23 100644 --- a/src/app/pages/outputs/outputs.component.html +++ b/src/app/pages/outputs/outputs.component.html @@ -44,7 +44,7 @@
-
+
@@ -59,7 +59,7 @@ 'index': number } ]" - rows="15" cols="15" [(ngModel)]="getOutsJsonString" [ngModelOptions]="{standalone: true}"> + rows="10" cols="15" [(ngModel)]="getOutsJsonString" [ngModelOptions]="{standalone: true}"> Array of outputs
@@ -77,6 +77,8 @@
+
+
-
+

Get a histogram of output amounts

+ + + -
-
- - - - - - - - -
AmountBaseStart HeightDistributions
-
-
-
+
+ +
+ + + + + + + + + +
AmountBaseStart HeightDistributions
+
-

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.

+
@@ -130,7 +139,7 @@ ... , '2346534525' ]" - rows="15" cols="15" [(ngModel)]="getOutHistogramAmountsJsonString" [ngModelOptions]="{standalone: true}"> + rows="10" cols="15" [(ngModel)]="getOutHistogramAmountsJsonString" [ngModelOptions]="{standalone: true}"> Array of unsigned int
@@ -166,6 +175,8 @@
+
+
-
+
@@ -218,7 +229,7 @@ ... , '2346534525' ]" - rows="15" cols="15" [(ngModel)]="getOutDistributionAmountsJsonString" [ngModelOptions]="{standalone: true}"> + rows="10" cols="15" [(ngModel)]="getOutDistributionAmountsJsonString" [ngModelOptions]="{standalone: true}"> Array of unsigned int, amounts to look for
@@ -248,6 +259,8 @@
+
+
-
+

Check if outputs have been spent using the key image associated with the output

+ rows="10" cols="15" > List of key image hex strings to check.
Invalid key images. @@ -303,13 +316,13 @@
+ +
+ + +
-
- - - -
diff --git a/src/app/pages/peers/peers.component.html b/src/app/pages/peers/peers.component.html index 83c83a1..fdadc56 100644 --- a/src/app/pages/peers/peers.component.html +++ b/src/app/pages/peers/peers.component.html @@ -93,7 +93,7 @@
-
+
@@ -130,7 +130,7 @@
-
+
diff --git a/src/app/pages/settings/settings.component.html b/src/app/pages/settings/settings.component.html index 30986bf..5cbcdee 100644 --- a/src/app/pages/settings/settings.component.html +++ b/src/app/pages/settings/settings.component.html @@ -560,24 +560,22 @@

+ +

IPv6

-
-

IPv6

- -
- - - Specify IPv6 address to bind RPC server -
- -
- - - 18080 for mainnet, 28080 for testnet, 38080 for stagenet -
- +
+ + + Specify IPv6 address to bind RPC server
+
+ + + 18080 for mainnet, 28080 for testnet, 38080 for stagenet +
+ +
@@ -593,16 +591,16 @@
- - + +
- - + +
- - + +
@@ -873,11 +871,12 @@
diff --git a/src/app/pages/settings/settings.component.ts b/src/app/pages/settings/settings.component.ts index f2df875..a2b9eea 100644 --- a/src/app/pages/settings/settings.component.ts +++ b/src/app/pages/settings/settings.component.ts @@ -351,9 +351,15 @@ export class SettingsComponent { return; } - this.ngZone.run(() => { - this.currentSettings.monerodPath = file; - }); + const valid = await this.daemonService.checkValidMonerodPath(file); + if (valid) { + this.ngZone.run(() => { + this.currentSettings.monerodPath = file; + }); + } + else { + window.electronAPI.showErrorBox('Invalid monerod path', `Invalid monerod path provided: ${file}`); + } } public async chooseBanListFile(): Promise { diff --git a/src/app/pages/transactions/transactions.component.html b/src/app/pages/transactions/transactions.component.html index 9fd52aa..088eaab 100644 --- a/src/app/pages/transactions/transactions.component.html +++ b/src/app/pages/transactions/transactions.component.html @@ -155,7 +155,7 @@ ... , 'tx_hash_n' ]" - rows="15" cols="15" > + rows="10" cols="15" >
Invalid transaction IDs.
@@ -196,7 +196,7 @@
+ rows="10" cols="15" >
Invalid transaction hex.
@@ -359,7 +359,7 @@ ... , 'tx_hash_n' ]" - rows="15" cols="15" [(ngModel)]="flushTxIdsJsonString" [ngModelOptions]="{ standalone: true }"> + rows="10" cols="15" [(ngModel)]="flushTxIdsJsonString" [ngModelOptions]="{ standalone: true }"> List of transaction IDs to flush in tx pool