Fix templates, missing implementations, behavior improvement, update README TO DO
Some checks are pending
MacOS - x64 DMG Build / build (20) (push) Waiting to run
Lint Test / build (20) (push) Waiting to run
Linux - AppImage Build / build (20) (push) Waiting to run
Linux - x86_64 RPM Build / build (20) (push) Waiting to run
Linux - x64 DEB Build / build (20) (push) Waiting to run
MacOS Build / build (20) (push) Waiting to run
Windows Build / build (20) (push) Waiting to run

This commit is contained in:
argenius 2024-11-18 02:04:16 +01:00
parent 357cddd95e
commit f2f112c81d
17 changed files with 213 additions and 116 deletions

View file

@ -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

View file

@ -143,7 +143,9 @@ async function createWindow(): Promise<BrowserWindow> {
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);
});

View file

@ -884,6 +884,14 @@ export class DaemonService {
}
}
public async removeBootstrapDaemon(): Promise<void> {
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<void> {
const response = await this.callRpc(new SaveBcRequest());

View file

@ -14,7 +14,6 @@
<div [hidden]="!daemonRunning || daemonStopping" class="tab-content" id="pills-tabContent">
<div class="tab-pane fade show active" id="pills-overview" role="tabpanel" aria-labelledby="pills-overview-tab" tabindex="0">
<h4 class="mb-3">List of banned IPs</h4>
<br>
<table
id="bansTable"
data-toggle="bansTable"
@ -80,7 +79,7 @@
'seconds': <number>
}
]"
rows="15" cols="15" ></textarea>
rows="10" cols="15" ></textarea>
<div class="invalid-feedback">
Invalid bans provided.
</div>

View file

@ -269,7 +269,7 @@
<hr *ngIf="block" class="my-4">
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div class="form-check form-switch col-md-6">
<label for="get-block-by-hash" class="form-check-label">Look up by hash</label>
@ -399,7 +399,7 @@
<hr *ngIf="blockHeader" class="my-4">
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div class="form-check form-switch col-md-6">
<label for="get-block-header-by-hash" class="form-check-label">Look up by hash</label>
@ -454,7 +454,7 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div class="col-sm-6">

View file

@ -132,10 +132,10 @@
</div>
</div>
<div *ngIf="setBootstrapDaemonSuccess" class="alert alert-success d-flex align-items-center justify-content-center text-center" role="alert">
<div *ngIf="setBootstrapDaemonSuccess || removeBootstrapDaemonSuccess" class="alert alert-success d-flex align-items-center justify-content-center text-center" role="alert">
<h4><i class="bi bi-check-circle m-2"></i></h4>&nbsp;&nbsp;
<div>
Successfully set bootstrap daemon
{{ setBootstrapDaemonSuccess ? 'Successfully set bootstrap daemon' : removeBootstrapDaemonSuccess ? 'Successfully removed bootstrap daemon' : 'Unknown' }}
</div>
</div>
@ -202,10 +202,13 @@
<hr class="my-4">
<button *ngIf="!settingBootstrapDaemon" class="w-100 btn btn-primary btn-lg" type="submit" [disabled]="!canSetBootstrapDaemon" (click)="setBootstrapDaemon()">Set Bootstrap Daemon</button>
<button *ngIf="settingBootstrapDaemon" class="w-100 btn btn-primary btn-lg" type="button" disabled>
<button *ngIf="!settingBootstrapDaemon && !removingBootstrapDaemon" class="w-50 btn btn-primary btn-lg" type="submit" [disabled]="!canSetBootstrapDaemon" (click)="setBootstrapDaemon()">Set Bootstrap Daemon</button>
<button *ngIf="!settingBootstrapDaemon && !removingBootstrapDaemon" class="w-50 btn btn-primary btn-lg" type="submit" [disabled]="!canRemoveBootstrapDaemon" (click)="removeBootstrapDaemon()">Remove Bootstrap Daemon</button>
<button *ngIf="settingBootstrapDaemon || removingBootstrapDaemon" class="w-100 btn btn-primary btn-lg" type="button" disabled>
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
Setting Bootstrap Daemon
{{ settingBootstrapDaemon ? 'Setting Bootstrap Daemon' : removingBootstrapDaemon ? 'Removing Bootstrap Daemon' : 'Unknown' }}
</button>
</div>
</div>

View file

@ -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<void> {
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;
}
}

View file

@ -12,32 +12,40 @@
</div>
<div *ngIf="daemonRunning && !daemonStopping" class="row d-flex justify-content-center">
@if(!loading) {
@for(card of cards; track card.header) {
<div class="card text-bg-dark m-3 text-center" style="max-width: 18rem;">
<div class="card-header">{{card.header}}</div>
<div class="card-body">
<h5 class="card-title">{{card.content}}</h5>
</div>
<h4 class="mb-3">Look up information regarding hard fork voting and readiness.</h4>
<div *ngIf="hardForkState !== ''" class="alert alert-info d-flex text-center" role="alert">
<div>
{{ hardForkState }}
</div>
</div>
@if(!loading) {
@for(card of cards; track card.header) {
<div class="card text-bg-dark m-3 text-center" style="max-width: 18rem;">
<div class="card-header">{{card.header}}</div>
<div class="card-body">
<h5 class="card-title">{{card.content}}</h5>
</div>
}
</div>
}
@else {
@for(card of cards; track card.header) {
<div class="card text-bg-dark m-3 text-center" style="max-width: 18rem;">
<div class="card-header">{{card.header}}</div>
<div class="card-body">
<p class="card-text placeholder-glow">
<span class="placeholder col-7"></span>
<span class="placeholder col-4"></span>
<span class="placeholder col-4"></span>
<span class="placeholder col-6"></span>
<span class="placeholder col-8"></span>
</p>
</div>
}
@else {
@for(card of cards; track card.header) {
<div class="card text-bg-dark m-3 text-center" style="max-width: 18rem;">
<div class="card-header">{{card.header}}</div>
<div class="card-body">
<p class="card-text placeholder-glow">
<span class="placeholder col-7"></span>
<span class="placeholder col-4"></span>
<span class="placeholder col-4"></span>
<span class="placeholder col-6"></span>
<span class="placeholder col-8"></span>
</p>
</div>
}
</div>
}
}
</div>
<app-daemon-not-running></app-daemon-not-running>

View file

@ -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);

View file

@ -752,7 +752,7 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<h4 class="mb-3">Set the log hash rate display mode</h4>
<div class="row gy-3">

View file

@ -86,7 +86,7 @@
</div>
<div *ngIf="!coreBusy && miningStatus && !miningStatus.active" class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<h4 class="mb-3">Start mining on the daemon</h4>
<div class="col-sm-12">
@ -258,7 +258,7 @@
<hr *ngIf="blockTemplate" class="my-4">
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div class="col-sm-9">
@ -296,7 +296,7 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<h4 class="mb-3">Calculate PoW hash for a block candidate</h4>
<div class="col-sm-6">
@ -313,7 +313,7 @@
<div class="col-sm-12">
<label for="calc-pow-blob-data" class="form-label">Blob data</label>
<textarea [(ngModel)]="calcPowBlobData" [ngModelOptions]="{standalone: true}" type="text" class="form-control" id="calc-pow-blob-data" placeholder=""
rows="15" cols="15" ></textarea>
rows="10" cols="15" ></textarea>
<div class="invalid-feedback">
Invalid blob data.
</div>
@ -421,14 +421,14 @@
<hr *ngIf="addAuxPowResult !== undefined" class="my-4">
<div *ngIf="!coreBusy" class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<h4 class="mb-3">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</h4>
<div class="col-sm-12">
<label for="add-aux-pow-block-template-blob" class="form-label">Block Template Blob</label>
<textarea [(ngModel)]="addAuxPowBlockTemplateBlob" [ngModelOptions]="{standalone: true}" type="text" class="form-control" id="calc-pow-blob-data" placeholder=""
rows="15" cols="15" ></textarea>
rows="10" cols="15" ></textarea>
<div class="invalid-feedback">
Invalid blob data.
</div>
@ -448,7 +448,7 @@
}
]
"
rows="15" cols="15" ></textarea>
rows="10" cols="15" ></textarea>
<div class="invalid-feedback">
Invalid blob data.
</div>
@ -481,7 +481,7 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="col-md-12 col-lg-12">
<h4 class="mb-3">Submit a mined block to the network</h4>
@ -493,7 +493,7 @@
<textarea [(ngModel)]="submitBlockBlobDataJsonString" [ngModelOptions]="{standalone: true}" type="text" [class]="!modifiedSubmitBlockBlobData ? 'form-control' : validBlobData() ? 'form-control' : 'form-control is-invalid'" id="tx_ids" placeholder="[
'0707e6bdfedc053771512f1bc27c62731ae9e8f2443db64ce742f4e57f5cf8d393de28551e441a0000000002fb830a01ffbf830a018cfe88bee283060274c0aae2ef5730e680308d9c00b6da59187ad0352efe3c71d36eeeb28782f29f2501bd56b952c3ddc3e350c2631d3a5086cac172c56893831228b17de296ff4669de020200000000'
]"
rows="15" cols="15" ></textarea>
rows="10" cols="15" ></textarea>
<div class="invalid-feedback">
Invalid blob data.
</div>
@ -564,7 +564,7 @@
<hr *ngIf="generatedBlocks" class="my-4">
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<h4 class="mb-3">Generate a block and specify the address to receive the coinbase reward</h4>
<div class="col-sm-6">

View file

@ -23,7 +23,6 @@
<div class="tab-pane fade" id="pills-connections" role="tabpanel" aria-labelledby="pills-connections-tab" tabindex="0">
<h4 class="mb-3">Information about incoming and outgoing connections to your node</h4>
<br>
<div class="m-3">
<table
id="connectionsTable"
@ -87,7 +86,7 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div class="col-sm-6">

View file

@ -44,7 +44,7 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div class="col-sm-12">
@ -59,7 +59,7 @@
'index': number
}
]"
rows="15" cols="15" [(ngModel)]="getOutsJsonString" [ngModelOptions]="{standalone: true}"></textarea>
rows="10" cols="15" [(ngModel)]="getOutsJsonString" [ngModelOptions]="{standalone: true}"></textarea>
<small class="text-body-secondary">Array of outputs</small>
</div>
</div>
@ -77,6 +77,8 @@
</div>
</div>
<hr class="my-4">
<button *ngIf="!gettingOuts" class="w-100 btn btn-primary btn-lg" type="button" [disabled]="!validOuts" (click)="getOuts()">Get Outputs</button>
<button *ngIf="gettingOuts" class="w-100 btn btn-primary btn-lg" type="button" disabled>
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
@ -84,8 +86,15 @@
</button>
</div>
<div class="tab-pane fade" id="pills-outputs-histogram" role="tabpanel" aria-labelledby="pills-outputs-histogram-tab" tabindex="0">
<h4 class="mb-3">Get a histogram of output amounts</h4>
<div class="alert alert-info d-flex text-center" role="alert">
<div>
For all amounts (possibly filtered by parameters), gives the number of outputs on the chain for that amount. RingCT outputs counts as 0 amount.
</div>
</div>
<div *ngIf="getOutDistributionError !== ''" class="alert alert-danger d-flex align-items-center justify-content-center text-center" role="alert">
<h4><i class="bi bi-exclamation-triangle m-2"></i></h4>&nbsp;&nbsp;
<div>
@ -93,33 +102,33 @@
</div>
</div>
<div [hidden]="getOutHistogramResult === undefined">
<table
id="outHistrogramsTable"
data-toggle="outHistogramsTable"
data-toolbar="#toolbar"
data-pagination="true"
data-search="true"
data-show-columns="true"
data-show-columns-search="true"
>
<thead>
<tr>
<th data-field="amount">Amount</th>
<th data-field="base">Base</th>
<th data-field="startHeight">Start Height</th>
<th data-field="distributions">Distributions</th>
</tr>
</thead>
</table>
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div [hidden]="getOutHistogramResult === undefined">
<table
id="outHistrogramsTable"
data-toggle="outHistogramsTable"
data-toolbar="#toolbar"
data-pagination="true"
data-search="true"
data-show-columns="true"
data-show-columns-search="true"
>
<thead>
<tr>
<th data-field="amount">Amount</th>
<th data-field="base">Base</th>
<th data-field="startHeight">Start Height</th>
<th data-field="distributions">Distributions</th>
</tr>
</thead>
</table>
</div>
<div class="col-sm-12">
<h4 class="mb-3">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.</h4>
<form class="needs-validation" novalidate="">
<div class="row g-3">
<div class="col-12">
@ -130,7 +139,7 @@
... ,
'2346534525'
]"
rows="15" cols="15" [(ngModel)]="getOutHistogramAmountsJsonString" [ngModelOptions]="{standalone: true}"></textarea>
rows="10" cols="15" [(ngModel)]="getOutHistogramAmountsJsonString" [ngModelOptions]="{standalone: true}"></textarea>
<small class="text-body-secondary">Array of unsigned int</small>
</div>
</div>
@ -166,6 +175,8 @@
</div>
</div>
<hr class="my-4">
<button *ngIf="!gettingOutHistogram" class="w-100 btn btn-primary btn-lg" type="button" [disabled]="!validOutHistogramAmounts" (click)="getOutHistogram()">Get Output Histogram</button>
<button *ngIf="gettingOutHistogram" class="w-100 btn btn-primary btn-lg" type="button" disabled>
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
@ -203,7 +214,7 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div class="col-sm-12">
@ -218,7 +229,7 @@
... ,
'2346534525'
]"
rows="15" cols="15" [(ngModel)]="getOutDistributionAmountsJsonString" [ngModelOptions]="{standalone: true}"></textarea>
rows="10" cols="15" [(ngModel)]="getOutDistributionAmountsJsonString" [ngModelOptions]="{standalone: true}"></textarea>
<small class="text-body-secondary">Array of unsigned int, amounts to look for</small>
</div>
</div>
@ -248,6 +259,8 @@
</div>
</div>
<hr class="my-4">
<button *ngIf="!gettingOutDistribution" class="w-100 btn btn-primary btn-lg" type="button" [disabled]="!validOutDistributionAmounts" (click)="getOutDistribution()">Get Out Distribution</button>
<button *ngIf="gettingOutDistribution" class="w-100 btn btn-primary btn-lg" type="button" disabled>
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
@ -288,14 +301,14 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<h4 class="mb-3">Check if outputs have been spent using the key image associated with the output</h4>
<div class="col-sm-12">
<label for="key-images" class="form-label">Key images</label>
<textarea [(ngModel)]="keyImagesJsonString" [ngModelOptions]="{standalone: true}" type="text" class="form-control" id="key-images" placeholder=""
rows="15" cols="15" ></textarea>
rows="10" cols="15" ></textarea>
<small class="text-body-secondary">List of key image hex strings to check.</small>
<div class="invalid-feedback">
Invalid key images.
@ -303,13 +316,13 @@
</div>
</div>
<hr class="my-4">
<button *ngIf="!gettingKeyImages" class="w-100 btn btn-primary btn-lg" type="button" (click)="isKeyImageSpent()">Is Key Image Spent</button>
<button *ngIf="gettingKeyImages" class="w-100 btn btn-primary btn-lg" type="button" disabled>Checking Key Images ...</button>
</div>
<hr class="my-4">
<button *ngIf="!gettingKeyImages" class="w-100 btn btn-primary btn-lg" type="button" (click)="isKeyImageSpent()">Is Key Image Spent</button>
<button *ngIf="gettingKeyImages" class="w-100 btn btn-primary btn-lg" type="button" disabled>Checking Key Images ...</button>
</div>
</div>
</div>

View file

@ -93,7 +93,7 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div class="col-sm-6">
@ -130,7 +130,7 @@
</div>
<div class="row g-5 p-2">
<div class="cold-md-7 col-lg-12">
<div class="col-md-12 col-lg-12">
<div class="row gy-3">
<div class="col-sm-6">

View file

@ -560,24 +560,22 @@
</div>
<hr class="my-4">
<h4 class="mb-3">IPv6</h4>
<div class="row g-3">
<h4 class="mb-3">IPv6</h4>
<div class="col-md-6">
<label for="p2p-bind-ipv6-address" class="form-label">Bind IPv6 address</label>
<input type="text" class="form-control" id="p2p-bind-ipv6-address" placeholder="::1" [(ngModel)]="currentSettings.p2pBindIpv6Address" [ngModelOptions]="{standalone: true}">
<small class="text-body-secondary">Specify IPv6 address to bind RPC server</small>
</div>
<div class="col-md-6">
<label for="p2p-bind-port-ipv6" class="form-label">Bind IPv6 port</label>
<input type="number" min="0" class="form-control" id="p2p-bind-port-ipv6" placeholder="18080" [(ngModel)]="currentSettings.p2pBindPortIpv6" [ngModelOptions]="{standalone: true}">
<small class="text-body-secondary">18080 for mainnet, 28080 for testnet, 38080 for stagenet</small>
</div>
<div class="col-md-6">
<label for="p2p-bind-ipv6-address" class="form-label">Bind IPv6 address</label>
<input type="text" class="form-control" id="p2p-bind-ipv6-address" placeholder="::1" [(ngModel)]="currentSettings.p2pBindIpv6Address" [ngModelOptions]="{standalone: true}">
<small class="text-body-secondary">Specify IPv6 address to bind RPC server</small>
</div>
<div class="col-md-6">
<label for="p2p-bind-port-ipv6" class="form-label">Bind IPv6 port</label>
<input type="number" min="0" class="form-control" id="p2p-bind-port-ipv6" placeholder="18080" [(ngModel)]="currentSettings.p2pBindPortIpv6" [ngModelOptions]="{standalone: true}">
<small class="text-body-secondary">18080 for mainnet, 28080 for testnet, 38080 for stagenet</small>
</div>
</div>
</div>
</div>
@ -593,16 +591,16 @@
<div class="my-3">
<div class="form-check">
<input id="credit" name="paymentMethod" type="radio" class="form-check-input" [value]="'mainnet'" [(ngModel)]="networkType" [ngModelOptions]="{standalone: true}" (change)="OnNetworkTypeChange()">
<label class="form-check-label" for="credit">mainnet</label>
<input id="net-type-mainnet" name="networkType" type="radio" class="form-check-input" [value]="'mainnet'" [(ngModel)]="networkType" [ngModelOptions]="{standalone: true}" (change)="OnNetworkTypeChange()">
<label class="form-check-label" for="net-type-mainnet">mainnet</label>
</div>
<div class="form-check">
<input id="debit" name="paymentMethod" type="radio" class="form-check-input" [value]="'testnet'" [(ngModel)]="networkType" [ngModelOptions]="{standalone: true}" (change)="OnNetworkTypeChange()">
<label class="form-check-label" for="debit">testnet</label>
<input id="net-type-testnet" name="networkType" type="radio" class="form-check-input" [value]="'testnet'" [(ngModel)]="networkType" [ngModelOptions]="{standalone: true}" (change)="OnNetworkTypeChange()">
<label class="form-check-label" for="net-type-testnet">testnet</label>
</div>
<div class="form-check">
<input id="paypal" name="paymentMethod" type="radio" class="form-check-input" [value]="'stagenet'" [(ngModel)]="networkType" [ngModelOptions]="{standalone: true}" (change)="OnNetworkTypeChange()">
<label class="form-check-label" for="paypal">stagenet</label>
<input id="net-type-stagenet" name="networkType" type="radio" class="form-check-input" [value]="'stagenet'" [(ngModel)]="networkType" [ngModelOptions]="{standalone: true}" (change)="OnNetworkTypeChange()">
<label class="form-check-label" for="net-type-stagenet">stagenet</label>
</div>
</div>
@ -873,11 +871,12 @@
<div class="col-md-4">
<label for="log-level" class="form-label">Log level</label>
<select class="form-select" id="log-level" [(ngModel)]="currentSettings.logLevel" [ngModelOptions]="{standalone: true}">
<option [ngValue]="0">Info</option>
<option [ngValue]="1">Warning</option>
<option [ngValue]="2">Debug</option>
<option [ngValue]="3">Error</option>
<option [ngValue]="4">Trace</option>
<option [ngValue]="0">0</option>
<option [ngValue]="1">1</option>
<option [ngValue]="2">2</option>
<option [ngValue]="3">3</option>
<option [ngValue]="4">4</option>
<small class="text-body-secondary"> 0-4 with 0 being minimal logging and 4 being full tracing. Defaults to 0. These are general presets and do not directly map to severity levels. For example, even with minimal 0, you may see some most important INFO entries</small>
</select>
</div>

View file

@ -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<void> {

View file

@ -155,7 +155,7 @@
... ,
'tx_hash_n'
]"
rows="15" cols="15" ></textarea>
rows="10" cols="15" ></textarea>
<div class="invalid-feedback">
Invalid transaction IDs.
</div>
@ -196,7 +196,7 @@
<div class="col-12">
<label for="send-raw-tx-tx-as-hex" class="form-label">Tx as hex</label>
<textarea [(ngModel)]="rawTxJsonString" [ngModelOptions]="{standalone: true}" type="text" class="form-control" id="send-raw-tx-tx-as-hex" placeholder="de6a3..."
rows="15" cols="15" ></textarea>
rows="10" cols="15" ></textarea>
<div class="invalid-feedback">
Invalid transaction hex.
</div>
@ -359,7 +359,7 @@
... ,
'tx_hash_n'
]"
rows="15" cols="15" [(ngModel)]="flushTxIdsJsonString" [ngModelOptions]="{ standalone: true }"></textarea>
rows="10" cols="15" [(ngModel)]="flushTxIdsJsonString" [ngModelOptions]="{ standalone: true }"></textarea>
<small class="text-body-secondary">List of transaction IDs to flush in tx pool</small>
</div>