mirror of
https://github.com/everoddandeven/monerod-gui.git
synced 2024-12-22 11:39:25 +00:00
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
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:
parent
357cddd95e
commit
f2f112c81d
17 changed files with 213 additions and 116 deletions
|
@ -109,6 +109,9 @@ https://github.com/user-attachments/assets/c4a50d2f-5bbb-48ac-9425-30ecc20ada7c
|
||||||
- [ ] Mining tools
|
- [ ] Mining tools
|
||||||
- [ ] XMRig integration
|
- [ ] XMRig integration
|
||||||
- [ ] P2Pool integration
|
- [ ] P2Pool integration
|
||||||
|
- [ ] Anonymous network tools
|
||||||
|
- [ ] Tor integration
|
||||||
|
- [ ] I2P integration
|
||||||
- [ ] Remote node management
|
- [ ] Remote node management
|
||||||
- [ ] No CORS connection
|
- [ ] No CORS connection
|
||||||
|
|
||||||
|
|
12
app/main.ts
12
app/main.ts
|
@ -143,7 +143,9 @@ async function createWindow(): Promise<BrowserWindow> {
|
||||||
allowRunningInsecureContent: (AppMainProcess.serve),
|
allowRunningInsecureContent: (AppMainProcess.serve),
|
||||||
contextIsolation: true,
|
contextIsolation: true,
|
||||||
devTools: !app.isPackaged,
|
devTools: !app.isPackaged,
|
||||||
sandbox: true
|
sandbox: true,
|
||||||
|
defaultFontSize: process.platform == 'win32' ? 12 : 16,
|
||||||
|
defaultMonospaceFontSize: process.platform == 'win32' ? 11 : 13
|
||||||
},
|
},
|
||||||
show: false,
|
show: false,
|
||||||
autoHideMenuBar: true,
|
autoHideMenuBar: true,
|
||||||
|
@ -755,6 +757,14 @@ try {
|
||||||
// #endregion
|
// #endregion
|
||||||
|
|
||||||
ipcMain.handle('show-error-box', (event: IpcMainInvokeEvent, title: string, content: string) => {
|
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);
|
dialog.showErrorBox(title, content);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -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> {
|
public async saveBc(): Promise<void> {
|
||||||
const response = await this.callRpc(new SaveBcRequest());
|
const response = await this.callRpc(new SaveBcRequest());
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
<div [hidden]="!daemonRunning || daemonStopping" class="tab-content" id="pills-tabContent">
|
<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">
|
<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>
|
<h4 class="mb-3">List of banned IPs</h4>
|
||||||
<br>
|
|
||||||
<table
|
<table
|
||||||
id="bansTable"
|
id="bansTable"
|
||||||
data-toggle="bansTable"
|
data-toggle="bansTable"
|
||||||
|
@ -80,7 +79,7 @@
|
||||||
'seconds': <number>
|
'seconds': <number>
|
||||||
}
|
}
|
||||||
]"
|
]"
|
||||||
rows="15" cols="15" ></textarea>
|
rows="10" cols="15" ></textarea>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
Invalid bans provided.
|
Invalid bans provided.
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
<hr *ngIf="block" class="my-4">
|
<hr *ngIf="block" class="my-4">
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
<div class="form-check form-switch col-md-6">
|
<div class="form-check form-switch col-md-6">
|
||||||
<label for="get-block-by-hash" class="form-check-label">Look up by hash</label>
|
<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">
|
<hr *ngIf="blockHeader" class="my-4">
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
<div class="form-check form-switch col-md-6">
|
<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>
|
<label for="get-block-header-by-hash" class="form-check-label">Look up by hash</label>
|
||||||
|
@ -454,7 +454,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
|
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
|
|
|
@ -132,10 +132,10 @@
|
||||||
</div>
|
</div>
|
||||||
</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>
|
<h4><i class="bi bi-check-circle m-2"></i></h4>
|
||||||
<div>
|
<div>
|
||||||
Successfully set bootstrap daemon
|
{{ setBootstrapDaemonSuccess ? 'Successfully set bootstrap daemon' : removeBootstrapDaemonSuccess ? 'Successfully removed bootstrap daemon' : 'Unknown' }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -202,10 +202,13 @@
|
||||||
|
|
||||||
<hr class="my-4">
|
<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 && !removingBootstrapDaemon" class="w-50 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]="!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>
|
<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>
|
</button>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
|
@ -344,4 +344,37 @@ export class DetailComponent extends BasePageComponent implements AfterViewInit
|
||||||
this.settingBootstrapDaemon = false;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,32 +12,40 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="daemonRunning && !daemonStopping" class="row d-flex justify-content-center">
|
<div *ngIf="daemonRunning && !daemonStopping" class="row d-flex justify-content-center">
|
||||||
@if(!loading) {
|
<h4 class="mb-3">Look up information regarding hard fork voting and readiness.</h4>
|
||||||
@for(card of cards; track card.header) {
|
|
||||||
<div class="card text-bg-dark m-3 text-center" style="max-width: 18rem;">
|
<div *ngIf="hardForkState !== ''" class="alert alert-info d-flex text-center" role="alert">
|
||||||
<div class="card-header">{{card.header}}</div>
|
<div>
|
||||||
<div class="card-body">
|
{{ hardForkState }}
|
||||||
<h5 class="card-title">{{card.content}}</h5>
|
</div>
|
||||||
</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>
|
||||||
}
|
</div>
|
||||||
}
|
}
|
||||||
@else {
|
}
|
||||||
@for(card of cards; track card.header) {
|
@else {
|
||||||
<div class="card text-bg-dark m-3 text-center" style="max-width: 18rem;">
|
@for(card of cards; track card.header) {
|
||||||
<div class="card-header">{{card.header}}</div>
|
<div class="card text-bg-dark m-3 text-center" style="max-width: 18rem;">
|
||||||
<div class="card-body">
|
<div class="card-header">{{card.header}}</div>
|
||||||
<p class="card-text placeholder-glow">
|
<div class="card-body">
|
||||||
<span class="placeholder col-7"></span>
|
<p class="card-text placeholder-glow">
|
||||||
<span class="placeholder col-4"></span>
|
<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-4"></span>
|
||||||
<span class="placeholder col-8"></span>
|
<span class="placeholder col-6"></span>
|
||||||
</p>
|
<span class="placeholder col-8"></span>
|
||||||
</div>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
}
|
</div>
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<app-daemon-not-running></app-daemon-not-running>
|
<app-daemon-not-running></app-daemon-not-running>
|
||||||
|
|
|
@ -20,6 +20,7 @@ export class HardForkInfoComponent extends BasePageComponent implements AfterVie
|
||||||
private votes: number;
|
private votes: number;
|
||||||
private voting: number;
|
private voting: number;
|
||||||
private window: number;
|
private window: number;
|
||||||
|
private state?: number;
|
||||||
|
|
||||||
public get daemonRunning(): boolean {
|
public get daemonRunning(): boolean {
|
||||||
return this.daemonData.running;
|
return this.daemonData.running;
|
||||||
|
@ -29,6 +30,19 @@ export class HardForkInfoComponent extends BasePageComponent implements AfterVie
|
||||||
return this.daemonService.stopping;
|
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;
|
public loading: boolean = false;
|
||||||
|
|
||||||
constructor(private daemonData: DaemonDataService, private daemonService: DaemonService, navbarService: NavbarService, private ngZone: NgZone) {
|
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.votes = info.votes;
|
||||||
this.voting = info.voting;
|
this.voting = info.voting;
|
||||||
this.window = info.window;
|
this.window = info.window;
|
||||||
|
this.enabled = info.enabled;
|
||||||
|
this.state = info.state;
|
||||||
}
|
}
|
||||||
catch(error) {
|
catch(error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
|
|
@ -752,7 +752,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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>
|
<h4 class="mb-3">Set the log hash rate display mode</h4>
|
||||||
|
|
||||||
<div class="row gy-3">
|
<div class="row gy-3">
|
||||||
|
|
|
@ -86,7 +86,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="!coreBusy && miningStatus && !miningStatus.active" class="row g-5 p-2">
|
<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">
|
<div class="row gy-3">
|
||||||
<h4 class="mb-3">Start mining on the daemon</h4>
|
<h4 class="mb-3">Start mining on the daemon</h4>
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
|
@ -258,7 +258,7 @@
|
||||||
<hr *ngIf="blockTemplate" class="my-4">
|
<hr *ngIf="blockTemplate" class="my-4">
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
|
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
|
@ -296,7 +296,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
<h4 class="mb-3">Calculate PoW hash for a block candidate</h4>
|
<h4 class="mb-3">Calculate PoW hash for a block candidate</h4>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
|
@ -313,7 +313,7 @@
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<label for="calc-pow-blob-data" class="form-label">Blob data</label>
|
<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=""
|
<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">
|
<div class="invalid-feedback">
|
||||||
Invalid blob data.
|
Invalid blob data.
|
||||||
</div>
|
</div>
|
||||||
|
@ -421,14 +421,14 @@
|
||||||
<hr *ngIf="addAuxPowResult !== undefined" class="my-4">
|
<hr *ngIf="addAuxPowResult !== undefined" class="my-4">
|
||||||
|
|
||||||
<div *ngIf="!coreBusy" class="row g-5 p-2">
|
<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">
|
<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>
|
<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">
|
<div class="col-sm-12">
|
||||||
<label for="add-aux-pow-block-template-blob" class="form-label">Block Template Blob</label>
|
<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=""
|
<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">
|
<div class="invalid-feedback">
|
||||||
Invalid blob data.
|
Invalid blob data.
|
||||||
</div>
|
</div>
|
||||||
|
@ -448,7 +448,7 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
"
|
"
|
||||||
rows="15" cols="15" ></textarea>
|
rows="10" cols="15" ></textarea>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
Invalid blob data.
|
Invalid blob data.
|
||||||
</div>
|
</div>
|
||||||
|
@ -481,7 +481,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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">
|
<div class="col-md-12 col-lg-12">
|
||||||
|
|
||||||
<h4 class="mb-3">Submit a mined block to the network</h4>
|
<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="[
|
<textarea [(ngModel)]="submitBlockBlobDataJsonString" [ngModelOptions]="{standalone: true}" type="text" [class]="!modifiedSubmitBlockBlobData ? 'form-control' : validBlobData() ? 'form-control' : 'form-control is-invalid'" id="tx_ids" placeholder="[
|
||||||
'0707e6bdfedc053771512f1bc27c62731ae9e8f2443db64ce742f4e57f5cf8d393de28551e441a0000000002fb830a01ffbf830a018cfe88bee283060274c0aae2ef5730e680308d9c00b6da59187ad0352efe3c71d36eeeb28782f29f2501bd56b952c3ddc3e350c2631d3a5086cac172c56893831228b17de296ff4669de020200000000'
|
'0707e6bdfedc053771512f1bc27c62731ae9e8f2443db64ce742f4e57f5cf8d393de28551e441a0000000002fb830a01ffbf830a018cfe88bee283060274c0aae2ef5730e680308d9c00b6da59187ad0352efe3c71d36eeeb28782f29f2501bd56b952c3ddc3e350c2631d3a5086cac172c56893831228b17de296ff4669de020200000000'
|
||||||
]"
|
]"
|
||||||
rows="15" cols="15" ></textarea>
|
rows="10" cols="15" ></textarea>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
Invalid blob data.
|
Invalid blob data.
|
||||||
</div>
|
</div>
|
||||||
|
@ -564,7 +564,7 @@
|
||||||
<hr *ngIf="generatedBlocks" class="my-4">
|
<hr *ngIf="generatedBlocks" class="my-4">
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
<h4 class="mb-3">Generate a block and specify the address to receive the coinbase reward</h4>
|
<h4 class="mb-3">Generate a block and specify the address to receive the coinbase reward</h4>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
|
|
||||||
<div class="tab-pane fade" id="pills-connections" role="tabpanel" aria-labelledby="pills-connections-tab" tabindex="0">
|
<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>
|
<h4 class="mb-3">Information about incoming and outgoing connections to your node</h4>
|
||||||
<br>
|
|
||||||
<div class="m-3">
|
<div class="m-3">
|
||||||
<table
|
<table
|
||||||
id="connectionsTable"
|
id="connectionsTable"
|
||||||
|
@ -87,7 +86,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
|
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
|
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
|
@ -59,7 +59,7 @@
|
||||||
'index': number
|
'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>
|
<small class="text-body-secondary">Array of outputs</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -77,6 +77,8 @@
|
||||||
</div>
|
</div>
|
||||||
</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]="!validOuts" (click)="getOuts()">Get Outputs</button>
|
||||||
<button *ngIf="gettingOuts" class="w-100 btn btn-primary btn-lg" type="button" disabled>
|
<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>
|
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
||||||
|
@ -84,8 +86,15 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="tab-pane fade" id="pills-outputs-histogram" role="tabpanel" aria-labelledby="pills-outputs-histogram-tab" tabindex="0">
|
<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">
|
<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>
|
<h4><i class="bi bi-exclamation-triangle m-2"></i></h4>
|
||||||
<div>
|
<div>
|
||||||
|
@ -93,33 +102,33 @@
|
||||||
</div>
|
</div>
|
||||||
</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="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="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">
|
<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="">
|
<form class="needs-validation" novalidate="">
|
||||||
<div class="row g-3">
|
<div class="row g-3">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
|
@ -130,7 +139,7 @@
|
||||||
... ,
|
... ,
|
||||||
'2346534525'
|
'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>
|
<small class="text-body-secondary">Array of unsigned int</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -166,6 +175,8 @@
|
||||||
</div>
|
</div>
|
||||||
</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]="!validOutHistogramAmounts" (click)="getOutHistogram()">Get Output Histogram</button>
|
||||||
<button *ngIf="gettingOutHistogram" class="w-100 btn btn-primary btn-lg" type="button" disabled>
|
<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>
|
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
||||||
|
@ -203,7 +214,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
|
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
|
@ -218,7 +229,7 @@
|
||||||
... ,
|
... ,
|
||||||
'2346534525'
|
'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>
|
<small class="text-body-secondary">Array of unsigned int, amounts to look for</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -248,6 +259,8 @@
|
||||||
</div>
|
</div>
|
||||||
</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]="!validOutDistributionAmounts" (click)="getOutDistribution()">Get Out Distribution</button>
|
||||||
<button *ngIf="gettingOutDistribution" class="w-100 btn btn-primary btn-lg" type="button" disabled>
|
<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>
|
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
||||||
|
@ -288,14 +301,14 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
<h4 class="mb-3">Check if outputs have been spent using the key image associated with the output</h4>
|
<h4 class="mb-3">Check if outputs have been spent using the key image associated with the output</h4>
|
||||||
|
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<label for="key-images" class="form-label">Key images</label>
|
<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=""
|
<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>
|
<small class="text-body-secondary">List of key image hex strings to check.</small>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
Invalid key images.
|
Invalid key images.
|
||||||
|
@ -303,13 +316,13 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</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>
|
</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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -93,7 +93,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
|
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
|
@ -130,7 +130,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row g-5 p-2">
|
<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="row gy-3">
|
||||||
|
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
|
|
|
@ -560,24 +560,22 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="my-4">
|
<hr class="my-4">
|
||||||
|
|
||||||
|
<h4 class="mb-3">IPv6</h4>
|
||||||
|
|
||||||
<div class="row g-3">
|
<div class="col-md-6">
|
||||||
<h4 class="mb-3">IPv6</h4>
|
<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}">
|
||||||
<div class="col-md-6">
|
<small class="text-body-secondary">Specify IPv6 address to bind RPC server</small>
|
||||||
<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 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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -593,16 +591,16 @@
|
||||||
|
|
||||||
<div class="my-3">
|
<div class="my-3">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input id="credit" name="paymentMethod" type="radio" class="form-check-input" [value]="'mainnet'" [(ngModel)]="networkType" [ngModelOptions]="{standalone: true}" (change)="OnNetworkTypeChange()">
|
<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="credit">mainnet</label>
|
<label class="form-check-label" for="net-type-mainnet">mainnet</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input id="debit" name="paymentMethod" type="radio" class="form-check-input" [value]="'testnet'" [(ngModel)]="networkType" [ngModelOptions]="{standalone: true}" (change)="OnNetworkTypeChange()">
|
<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="debit">testnet</label>
|
<label class="form-check-label" for="net-type-testnet">testnet</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input id="paypal" name="paymentMethod" type="radio" class="form-check-input" [value]="'stagenet'" [(ngModel)]="networkType" [ngModelOptions]="{standalone: true}" (change)="OnNetworkTypeChange()">
|
<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="paypal">stagenet</label>
|
<label class="form-check-label" for="net-type-stagenet">stagenet</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -873,11 +871,12 @@
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<label for="log-level" class="form-label">Log level</label>
|
<label for="log-level" class="form-label">Log level</label>
|
||||||
<select class="form-select" id="log-level" [(ngModel)]="currentSettings.logLevel" [ngModelOptions]="{standalone: true}">
|
<select class="form-select" id="log-level" [(ngModel)]="currentSettings.logLevel" [ngModelOptions]="{standalone: true}">
|
||||||
<option [ngValue]="0">Info</option>
|
<option [ngValue]="0">0</option>
|
||||||
<option [ngValue]="1">Warning</option>
|
<option [ngValue]="1">1</option>
|
||||||
<option [ngValue]="2">Debug</option>
|
<option [ngValue]="2">2</option>
|
||||||
<option [ngValue]="3">Error</option>
|
<option [ngValue]="3">3</option>
|
||||||
<option [ngValue]="4">Trace</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>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -351,9 +351,15 @@ export class SettingsComponent {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ngZone.run(() => {
|
const valid = await this.daemonService.checkValidMonerodPath(file);
|
||||||
this.currentSettings.monerodPath = 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> {
|
public async chooseBanListFile(): Promise<void> {
|
||||||
|
|
|
@ -155,7 +155,7 @@
|
||||||
... ,
|
... ,
|
||||||
'tx_hash_n'
|
'tx_hash_n'
|
||||||
]"
|
]"
|
||||||
rows="15" cols="15" ></textarea>
|
rows="10" cols="15" ></textarea>
|
||||||
<div class="invalid-feedback">
|
<div class="invalid-feedback">
|
||||||
Invalid transaction IDs.
|
Invalid transaction IDs.
|
||||||
</div>
|
</div>
|
||||||
|
@ -196,7 +196,7 @@
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="send-raw-tx-tx-as-hex" class="form-label">Tx as hex</label>
|
<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..."
|
<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">
|
<div class="invalid-feedback">
|
||||||
Invalid transaction hex.
|
Invalid transaction hex.
|
||||||
</div>
|
</div>
|
||||||
|
@ -359,7 +359,7 @@
|
||||||
... ,
|
... ,
|
||||||
'tx_hash_n'
|
'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>
|
<small class="text-body-secondary">List of transaction IDs to flush in tx pool</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue