diff --git a/backend/src/api/bisq.ts b/backend/src/api/bisq.ts index 19e911319..e28974f8d 100644 --- a/backend/src/api/bisq.ts +++ b/backend/src/api/bisq.ts @@ -59,27 +59,25 @@ class Bisq { } private buildIndex() { - this.transactions = []; - this.transactionsIndex = {}; - this.blocksIndex = {}; this.blocks.forEach((block) => { + if (this.blocksIndex[block.hash]) { + return; + } this.blocksIndex[block.hash] = block; block.txs.forEach((tx) => { - this.transactions.push(tx); + this.transactions.unshift(tx); this.transactionsIndex[tx.id] = tx; }); }); - this.blocks.reverse(); - this.transactions.reverse(); console.log('Bisq data index rebuilt'); } - private async loadBisqBlocksDump(cacheData: string) { + private async loadBisqBlocksDump(cacheData: string): Promise { const start = new Date().getTime(); if (cacheData && cacheData.length !== 0) { console.log('Parsing Bisq data from dump file'); const data: BisqBlocks = JSON.parse(cacheData); - if (data.blocks) { + if (data.blocks && data.blocks.length !== this.blocks.length) { this.blocks = data.blocks; this.latestBlockHeight = data.chainHeight; const end = new Date().getTime(); diff --git a/frontend/proxy.conf.json b/frontend/proxy.conf.json index 7de229905..fb1384804 100644 --- a/frontend/proxy.conf.json +++ b/frontend/proxy.conf.json @@ -1,18 +1,18 @@ { - "/api": { + "/api/v1": { "target": "http://localhost:8999/", "secure": false }, - "/ws": { + "/api/v1/ws": { "target": "http://localhost:8999/", "secure": false, "ws": true }, - "/electrs": { - "target": "https://www.blockstream.info/testnet/api/", + "/api": { + "target": "http://localhost:50001/", "secure": false, "pathRewrite": { - "^/electrs": "" + "^/api": "" } } } \ No newline at end of file diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index ef8a9eafe..480bd6802 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -20,7 +20,6 @@ import { AddressComponent } from './components/address/address.component'; import { SearchFormComponent } from './components/search-form/search-form.component'; import { LatestBlocksComponent } from './components/latest-blocks/latest-blocks.component'; import { WebsocketService } from './services/websocket.service'; -import { TimeSinceComponent } from './components/time-since/time-since.component'; import { AddressLabelsComponent } from './components/address-labels/address-labels.component'; import { MempoolBlocksComponent } from './components/mempool-blocks/mempool-blocks.component'; import { QrcodeComponent } from './components/qrcode/qrcode.component'; @@ -45,8 +44,6 @@ import { AssetsComponent } from './assets/assets.component'; import { StatusViewComponent } from './components/status-view/status-view.component'; import { MinerComponent } from './components/miner/miner.component'; import { SharedModule } from './shared/shared.module'; -import { BisqTransfersComponent } from './components/bisq-transfers/bisq-transfers.component'; -import { BisqTransactionDetailsComponent } from './components/bisq-transaction-details/bisq-transaction-details.component'; @NgModule({ declarations: [ @@ -65,7 +62,6 @@ import { BisqTransactionDetailsComponent } from './components/bisq-transaction-d AmountComponent, SearchFormComponent, LatestBlocksComponent, - TimeSinceComponent, TimespanComponent, AddressLabelsComponent, MempoolBlocksComponent, @@ -81,8 +77,6 @@ import { BisqTransactionDetailsComponent } from './components/bisq-transaction-d AssetsComponent, MinerComponent, StatusViewComponent, - BisqTransfersComponent, - BisqTransactionDetailsComponent, ], imports: [ BrowserModule, diff --git a/frontend/src/app/bisq/bisq-block/bisq-block.component.html b/frontend/src/app/bisq/bisq-block/bisq-block.component.html new file mode 100644 index 000000000..de8253b8b --- /dev/null +++ b/frontend/src/app/bisq/bisq-block/bisq-block.component.html @@ -0,0 +1,28 @@ +
+ +
+

Block {{ blockHeight }}

+
+ +
+ + + +
+ + {{ tx.id | shortenString : 16 }} + {{ tx.id }} + +
+ {{ tx.time | date:'yyyy-MM-dd HH:mm' }} +
+
+
+ + + +
+ +
+ +
\ No newline at end of file diff --git a/frontend/src/app/components/bisq-icon/bisq-icon.component.scss b/frontend/src/app/bisq/bisq-block/bisq-block.component.scss similarity index 100% rename from frontend/src/app/components/bisq-icon/bisq-icon.component.scss rename to frontend/src/app/bisq/bisq-block/bisq-block.component.scss diff --git a/frontend/src/app/bisq/bisq-block/bisq-block.component.spec.ts b/frontend/src/app/bisq/bisq-block/bisq-block.component.spec.ts new file mode 100644 index 000000000..f015a36fe --- /dev/null +++ b/frontend/src/app/bisq/bisq-block/bisq-block.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BisqBlockComponent } from './bisq-block.component'; + +describe('BisqBlockComponent', () => { + let component: BisqBlockComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BisqBlockComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BisqBlockComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/bisq/bisq-block/bisq-block.component.ts b/frontend/src/app/bisq/bisq-block/bisq-block.component.ts new file mode 100644 index 000000000..c0568e9b5 --- /dev/null +++ b/frontend/src/app/bisq/bisq-block/bisq-block.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from '@angular/core'; +import { BisqTransaction } from 'src/app/interfaces/bisq.interfaces'; +import { ApiService } from 'src/app/services/api.service'; + +@Component({ + selector: 'app-bisq-block', + templateUrl: './bisq-block.component.html', + styleUrls: ['./bisq-block.component.scss'] +}) +export class BisqBlockComponent implements OnInit { + bisqTransactions: BisqTransaction[]; + bisqTransactionsCount: number; + + blockHash = ''; + blockHeight = 0; + + constructor( + private apiService: ApiService, + ) { } + + ngOnInit(): void { + this.apiService.listBisqBlockTransactions$(this.blockHash, 0, 10) + .subscribe((response) => { + this.bisqTransactionsCount = parseInt(response.headers.get('x-total-count'), 10); + this.bisqTransactions = response.body; + }); + + } + + + +} diff --git a/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.html b/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.html new file mode 100644 index 000000000..b2f4f2693 --- /dev/null +++ b/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.html @@ -0,0 +1,5 @@ +
+

Blocks

+
+ +
\ No newline at end of file diff --git a/frontend/src/app/components/bisq-transaction-details/bisq-transaction-details.component.scss b/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss similarity index 100% rename from frontend/src/app/components/bisq-transaction-details/bisq-transaction-details.component.scss rename to frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.scss diff --git a/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.ts b/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.ts new file mode 100644 index 000000000..076a57140 --- /dev/null +++ b/frontend/src/app/bisq/bisq-blocks/bisq-blocks.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-bisq-blocks', + templateUrl: './bisq-blocks.component.html', + styleUrls: ['./bisq-blocks.component.scss'] +}) +export class BisqBlocksComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/frontend/src/app/bisq/bisq-explorer/bisq-explorer.component.html b/frontend/src/app/bisq/bisq-explorer/bisq-explorer.component.html new file mode 100644 index 000000000..0680b43f9 --- /dev/null +++ b/frontend/src/app/bisq/bisq-explorer/bisq-explorer.component.html @@ -0,0 +1 @@ + diff --git a/frontend/src/app/bisq/bisq-explorer/bisq-explorer.component.scss b/frontend/src/app/bisq/bisq-explorer/bisq-explorer.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/bisq/bisq-explorer/bisq-explorer.component.ts b/frontend/src/app/bisq/bisq-explorer/bisq-explorer.component.ts new file mode 100644 index 000000000..bb9a37809 --- /dev/null +++ b/frontend/src/app/bisq/bisq-explorer/bisq-explorer.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; +import { WebsocketService } from 'src/app/services/websocket.service'; + +@Component({ + selector: 'app-bisq-explorer', + templateUrl: './bisq-explorer.component.html', + styleUrls: ['./bisq-explorer.component.scss'] +}) +export class BisqExplorerComponent implements OnInit { + + constructor( + private websocketService: WebsocketService, + ) { } + + ngOnInit(): void { + this.websocketService.want(['blocks']); + } +} diff --git a/frontend/src/app/components/bisq-icon/bisq-icon.component.html b/frontend/src/app/bisq/bisq-icon/bisq-icon.component.html similarity index 100% rename from frontend/src/app/components/bisq-icon/bisq-icon.component.html rename to frontend/src/app/bisq/bisq-icon/bisq-icon.component.html diff --git a/frontend/src/app/bisq/bisq-icon/bisq-icon.component.scss b/frontend/src/app/bisq/bisq-icon/bisq-icon.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/bisq-icon/bisq-icon.component.ts b/frontend/src/app/bisq/bisq-icon/bisq-icon.component.ts similarity index 100% rename from frontend/src/app/components/bisq-icon/bisq-icon.component.ts rename to frontend/src/app/bisq/bisq-icon/bisq-icon.component.ts diff --git a/frontend/src/app/components/bisq-transaction-details/bisq-transaction-details.component.html b/frontend/src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.html similarity index 100% rename from frontend/src/app/components/bisq-transaction-details/bisq-transaction-details.component.html rename to frontend/src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.html diff --git a/frontend/src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.scss b/frontend/src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/components/bisq-transaction-details/bisq-transaction-details.component.ts b/frontend/src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.ts similarity index 100% rename from frontend/src/app/components/bisq-transaction-details/bisq-transaction-details.component.ts rename to frontend/src/app/bisq/bisq-transaction-details/bisq-transaction-details.component.ts diff --git a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html new file mode 100644 index 000000000..96532620b --- /dev/null +++ b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.html @@ -0,0 +1,65 @@ +
+ +

Transaction

+ + + +
+ + {{ bisqTx.blockHash | shortenString : 24 }} + {{ bisqTx.blockHash }} + +
+
+ +
+
+
+ + + + + + + +
Included in block + {{ bisqTx.blockHeight }} + ( ago) +
+
+
+ + + + + + + + + + + +
Fee15,436 sat ($1.40)
Fee per vByte 68.2 sat/vB +
+
+ +
+
+ + +
+ +

Details

+ + + + +
+ +

Inputs & Outputs

+ + + +
+ +
\ No newline at end of file diff --git a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.scss b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.spec.ts b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.spec.ts new file mode 100644 index 000000000..23ed00bbe --- /dev/null +++ b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BisqTransactionComponent } from './bisq-transaction.component'; + +describe('BisqTransactionComponent', () => { + let component: BisqTransactionComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BisqTransactionComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BisqTransactionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.ts b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.ts new file mode 100644 index 000000000..1e4ef7410 --- /dev/null +++ b/frontend/src/app/bisq/bisq-transaction/bisq-transaction.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, ParamMap } from '@angular/router'; +import { BisqTransaction } from 'src/app/interfaces/bisq.interfaces'; +import { switchMap } from 'rxjs/operators'; +import { ApiService } from 'src/app/services/api.service'; +import { of } from 'rxjs'; + +@Component({ + selector: 'app-bisq-transaction', + templateUrl: './bisq-transaction.component.html', + styleUrls: ['./bisq-transaction.component.scss'] +}) +export class BisqTransactionComponent implements OnInit { + bisqTx: BisqTransaction; + txId: string; + + constructor( + private route: ActivatedRoute, + private apiService: ApiService, + ) { } + + ngOnInit(): void { + this.route.paramMap.pipe( + switchMap((params: ParamMap) => { + this.txId = params.get('id') || ''; + if (history.state.bsqTx) { + return of(history.state.bsqTx); + } + return this.apiService.getBisqTransaction$(this.txId); + }) + ) + .subscribe((tx) => { + this.bisqTx = tx; + }); + } +} diff --git a/frontend/src/app/components/bisq-transfers/bisq-transfers.component.html b/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.html similarity index 100% rename from frontend/src/app/components/bisq-transfers/bisq-transfers.component.html rename to frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.html diff --git a/frontend/src/app/components/bisq-transfers/bisq-transfers.component.scss b/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.scss similarity index 100% rename from frontend/src/app/components/bisq-transfers/bisq-transfers.component.scss rename to frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.scss diff --git a/frontend/src/app/components/bisq-transfers/bisq-transfers.component.ts b/frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.ts similarity index 100% rename from frontend/src/app/components/bisq-transfers/bisq-transfers.component.ts rename to frontend/src/app/bisq/bisq-transfers/bisq-transfers.component.ts diff --git a/frontend/src/app/bisq/bisq.module.ts b/frontend/src/app/bisq/bisq.module.ts index 1b8f1295a..dc3432a65 100644 --- a/frontend/src/app/bisq/bisq.module.ts +++ b/frontend/src/app/bisq/bisq.module.ts @@ -4,16 +4,49 @@ import { BisqRoutingModule } from './bisq.routing.module'; import { SharedModule } from '../shared/shared.module'; import { BisqTransactionsComponent } from './bisq-transactions/bisq-transactions.component'; import { NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'; +import { BisqTransactionComponent } from './bisq-transaction/bisq-transaction.component'; +import { BisqBlockComponent } from './bisq-block/bisq-block.component'; +import { BisqIconComponent } from './bisq-icon/bisq-icon.component'; +import { BisqTransactionDetailsComponent } from './bisq-transaction-details/bisq-transaction-details.component'; +import { BisqTransfersComponent } from './bisq-transfers/bisq-transfers.component'; +import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome'; +import { faLeaf, faQuestion, faExclamationTriangle, faRocket, faRetweet, faFileAlt, faMoneyBill, + faEye, faEyeSlash, faLock, faLockOpen } from '@fortawesome/free-solid-svg-icons'; +import { BisqBlocksComponent } from './bisq-blocks/bisq-blocks.component'; +import { BisqExplorerComponent } from './bisq-explorer/bisq-explorer.component'; @NgModule({ declarations: [ BisqTransactionsComponent, + BisqTransactionComponent, + BisqBlockComponent, + BisqTransactionComponent, + BisqIconComponent, + BisqTransactionDetailsComponent, + BisqTransfersComponent, + BisqBlocksComponent, + BisqExplorerComponent, ], imports: [ CommonModule, BisqRoutingModule, SharedModule, NgbPaginationModule, + FontAwesomeModule, ], }) -export class BisqModule { } +export class BisqModule { + constructor(library: FaIconLibrary) { + library.addIcons(faQuestion); + library.addIcons(faExclamationTriangle); + library.addIcons(faRocket); + library.addIcons(faRetweet); + library.addIcons(faLeaf); + library.addIcons(faFileAlt); + library.addIcons(faMoneyBill); + library.addIcons(faEye); + library.addIcons(faEyeSlash); + library.addIcons(faLock); + library.addIcons(faLockOpen); + } +} diff --git a/frontend/src/app/bisq/bisq.routing.module.ts b/frontend/src/app/bisq/bisq.routing.module.ts index e1d45004a..f4166c066 100644 --- a/frontend/src/app/bisq/bisq.routing.module.ts +++ b/frontend/src/app/bisq/bisq.routing.module.ts @@ -1,18 +1,17 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { StartComponent } from '../components/start/start.component'; -import { TransactionComponent } from '../components/transaction/transaction.component'; -import { BlockComponent } from '../components/block/block.component'; -import { MempoolBlockComponent } from '../components/mempool-block/mempool-block.component'; import { AboutComponent } from '../components/about/about.component'; import { AddressComponent } from '../components/address/address.component'; import { BisqTransactionsComponent } from './bisq-transactions/bisq-transactions.component'; -import { StatisticsComponent } from '../components/statistics/statistics.component'; +import { BisqTransactionComponent } from './bisq-transaction/bisq-transaction.component'; +import { BisqBlockComponent } from './bisq-block/bisq-block.component'; +import { BisqBlocksComponent } from './bisq-blocks/bisq-blocks.component'; +import { BisqExplorerComponent } from './bisq-explorer/bisq-explorer.component'; const routes: Routes = [ { path: '', - component: StartComponent, + component: BisqExplorerComponent, children: [ { path: '', @@ -20,34 +19,30 @@ const routes: Routes = [ }, { path: 'tx/:id', - component: TransactionComponent + component: BisqTransactionComponent + }, + { + path: 'blocks', + children: [], + component: BisqBlocksComponent }, { path: 'block/:id', - component: BlockComponent + component: BisqBlockComponent, }, { - path: 'mempool-block/:id', - component: MempoolBlockComponent + path: 'address/:id', + component: AddressComponent }, - ], - }, - { - path: 'graphs', - component: StatisticsComponent, - }, - { - path: 'about', - component: AboutComponent, - }, - { - path: 'address/:id', - children: [], - component: AddressComponent - }, - { - path: '**', - redirectTo: '' + { + path: 'about', + component: AboutComponent, + }, + { + path: '**', + redirectTo: '' + } + ] } ]; diff --git a/frontend/src/app/components/master-page/master-page.component.html b/frontend/src/app/components/master-page/master-page.component.html index 1373da184..9b37de6c9 100644 --- a/frontend/src/app/components/master-page/master-page.component.html +++ b/frontend/src/app/components/master-page/master-page.component.html @@ -24,14 +24,22 @@