diff --git a/backend/src/api/rbf-cache.ts b/backend/src/api/rbf-cache.ts index 708393083..ad1762485 100644 --- a/backend/src/api/rbf-cache.ts +++ b/backend/src/api/rbf-cache.ts @@ -480,14 +480,15 @@ class RbfCache { }; if (config.MEMPOOL.BACKEND === 'esplora') { + let processedCount = 0; const sliceLength = Math.ceil(config.ESPLORA.BATCH_QUERY_BASE_SIZE / 40); for (let i = 0; i < Math.ceil(txids.length / sliceLength); i++) { const slice = txids.slice(i * sliceLength, (i + 1) * sliceLength); + processedCount += slice.length; try { const txs = await bitcoinApi.$getRawTransactions(slice); - logger.debug(`fetched ${slice.length} cached rbf transactions`); processTxs(txs); - logger.debug(`processed ${slice.length} cached rbf transactions`); + logger.debug(`fetched and processed ${processedCount} of ${txids.length} cached rbf transactions (${(processedCount / txids.length * 100).toFixed(2)}%)`); } catch (err) { logger.err(`failed to fetch or process ${slice.length} cached rbf transactions`); } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e4cfb1fc4..38c143ab7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -31,10 +31,10 @@ "bootstrap": "~4.6.2", "browserify": "^17.0.0", "clipboard": "^2.0.11", + "cypress": "^13.6.0", "domino": "^2.1.6", "echarts": "~5.4.3", "lightweight-charts": "~3.8.0", - "mock-socket": "~9.3.1", "ngx-echarts": "~16.2.0", "ngx-infinite-scroll": "^16.0.0", "qrcode": "1.5.1", @@ -59,7 +59,7 @@ "optionalDependencies": { "@cypress/schematic": "^2.5.0", "@types/cypress": "^1.1.3", - "cypress": "^13.5.0", + "cypress": "^13.6.0", "cypress-fail-on-console-error": "~5.0.0", "cypress-wait-until": "^2.0.1", "mock-socket": "~9.3.1", @@ -7148,9 +7148,9 @@ "peer": true }, "node_modules/cypress": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.5.0.tgz", - "integrity": "sha512-oh6U7h9w8wwHfzNDJQ6wVcAeXu31DlIYlNOBvfd6U4CcB8oe4akawQmH+QJVOMZlM42eBoCne015+svVqdwdRQ==", + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.0.tgz", + "integrity": "sha512-quIsnFmtj4dBUEJYU4OH0H12bABJpSujvWexC24Ju1gTlKMJbeT6tTO0vh7WNfiBPPjoIXLN+OUqVtiKFs6SGw==", "hasInstallScript": true, "optional": true, "dependencies": { @@ -22096,9 +22096,9 @@ "peer": true }, "cypress": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.5.0.tgz", - "integrity": "sha512-oh6U7h9w8wwHfzNDJQ6wVcAeXu31DlIYlNOBvfd6U4CcB8oe4akawQmH+QJVOMZlM42eBoCne015+svVqdwdRQ==", + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.0.tgz", + "integrity": "sha512-quIsnFmtj4dBUEJYU4OH0H12bABJpSujvWexC24Ju1gTlKMJbeT6tTO0vh7WNfiBPPjoIXLN+OUqVtiKFs6SGw==", "optional": true, "requires": { "@cypress/request": "^3.0.0", diff --git a/frontend/package.json b/frontend/package.json index e549eb122..81928669f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -110,7 +110,7 @@ "optionalDependencies": { "@cypress/schematic": "^2.5.0", "@types/cypress": "^1.1.3", - "cypress": "^13.5.0", + "cypress": "^13.6.0", "cypress-fail-on-console-error": "~5.0.0", "cypress-wait-until": "^2.0.1", "mock-socket": "~9.3.1", diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts index ce91019ff..e123a1525 100644 --- a/frontend/src/app/app-routing.module.ts +++ b/frontend/src/app/app-routing.module.ts @@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { AppPreloadingStrategy } from './app.preloading-strategy' import { BlockViewComponent } from './components/block-view/block-view.component'; +import { EightBlocksComponent } from './components/eight-blocks/eight-blocks.component'; import { MempoolBlockViewComponent } from './components/mempool-block-view/mempool-block-view.component'; import { ClockComponent } from './components/clock/clock.component'; import { StatusViewComponent } from './components/status-view/status-view.component'; @@ -124,6 +125,10 @@ let routes: Routes = [ path: 'view/mempool-block/:index', component: MempoolBlockViewComponent, }, + { + path: 'view/blocks', + component: EightBlocksComponent, + }, { path: 'status', data: { networks: ['bitcoin', 'liquid'] }, diff --git a/frontend/src/app/components/about/about.component.html b/frontend/src/app/components/about/about.component.html index 48ee85c62..a56e172c8 100644 --- a/frontend/src/app/components/about/about.component.html +++ b/frontend/src/app/components/about/about.component.html @@ -32,11 +32,22 @@ - -

Sponsor the project

-
- Community - Enterprise + +
+
+

If you're an individual...

+ Become a Community Sponsor + + + +
+
+

If you're a business...

+ Become an Enterprise Sponsor + + + +
@@ -193,7 +204,7 @@ - + @@ -205,7 +216,7 @@ diff --git a/frontend/src/app/components/about/about.component.scss b/frontend/src/app/components/about/about.component.scss index f7aa0b965..54dc38a27 100644 --- a/frontend/src/app/components/about/about.component.scss +++ b/frontend/src/app/components/about/about.component.scss @@ -246,3 +246,48 @@ width: 64px; height: 64px; } + +#become-sponsor-container { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + gap: 20px; + margin: 68px auto; +} + +.become-sponsor { + background-color: #1d1f31; + border-radius: 16px; + padding: 12px 20px; + width: 400px; + padding: 40px 20px; +} + +.become-sponsor a { + margin-top: 10px; +} + +#become-sponsor-container .btn { + margin-bottom: 24px; +} + +#become-sponsor-container .ng-fa-icon { + color: #2ecc71; + margin-right: 5px; +} + +#become-sponsor-container .sponsor-feature { + text-align: left; + width: 250px; + margin: 12px auto; +} + +@media (max-width: 992px) { + + #become-sponsor-container { + flex-wrap: wrap; + } + +} diff --git a/frontend/src/app/components/accelerate-preview/accelerate-fee-graph.component.scss b/frontend/src/app/components/accelerate-preview/accelerate-fee-graph.component.scss index 795d11df6..8d36387f3 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-fee-graph.component.scss +++ b/frontend/src/app/components/accelerate-preview/accelerate-fee-graph.component.scss @@ -2,7 +2,6 @@ height: 100%; min-width: 120px; width: 120px; - max-height: 90vh; margin-left: 4em; margin-right: 1.5em; padding-bottom: 63px; diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html index 9bb66eda1..2869d02ae 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.html @@ -1,7 +1,7 @@
- Transaction has now been submitted to mining pools for acceleration. You can track the progress here. + Transaction has now been submitted to mining pools for acceleration.
@@ -74,8 +74,8 @@
@@ -87,18 +87,10 @@
Acceleration summary
-
-
- Estimated cost -
-
- Maximum cost -
-
- + - - - - - - - - - - - - - @@ -166,7 +132,7 @@ - + @@ -180,8 +146,8 @@ - - + + @@ -195,7 +161,7 @@ - + @@ -203,7 +169,7 @@ - + + + + + + + + + +
Next block market rate @@ -121,32 +113,6 @@
- Your maximum - - ~{{ ((estimate.txSummary.effectiveFee + userBid) / estimate.txSummary.effectiveVsize) | number : '1.0-0' }} - sat/vB
- The maximum extra transaction fee you could pay - - - {{ userBid | number }} - - - sats - -
Transaction vsize fee
Estimated acceleration cost
If your tx is accelerated to {{ estimate.targetFeeRate | number : '1.0-0' }} sat/vB
Maximum acceleration cost @@ -228,7 +194,7 @@ - +
Available balance @@ -244,6 +210,17 @@
+ Login +
diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss index 433c05520..814b37e7a 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.scss @@ -28,7 +28,10 @@ .feerate.active { background-color: #105fb0 !important; opacity: 1; - border: 1px solid white !important; + border: 1px solid #007fff !important; +} +.feerate:focus { + box-shadow: none !important; } .estimateDisabled { @@ -41,6 +44,24 @@ margin-top: 0.5em; } +.tab { + &:first-child { + margin-right: 1px; + } + border: solid 1px black; + border-bottom: none; + background-color: #323655; + border-top-left-radius: 10px !important; + border-top-right-radius: 10px !important; +} +.tab.active { + background-color: #5d659d !important; + opacity: 1; +} +.tab:focus { + box-shadow: none !important; +} + .table-accelerator { tr { text-wrap: wrap; diff --git a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts index 1c356a80b..7215f9bfb 100644 --- a/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts +++ b/frontend/src/app/components/accelerate-preview/accelerate-preview.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit, Input, OnDestroy, OnChanges, SimpleChanges, HostListener } from '@angular/core'; +import { Router } from '@angular/router'; import { ApiService } from '../../services/api.service'; import { Subscription, catchError, of, tap } from 'rxjs'; import { StorageService } from '../../services/storage.service'; @@ -55,14 +56,14 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges maxCost = 0; userBid = 0; selectFeeRateIndex = 1; - showTable: 'estimated' | 'maximum' = 'maximum'; isMobile: boolean = window.innerWidth <= 767.98; maxRateOptions: RateOption[] = []; constructor( private apiService: ApiService, - private storageService: StorageService + private storageService: StorageService, + private router: Router, ) { } ngOnDestroy(): void { @@ -73,7 +74,7 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges ngOnChanges(changes: SimpleChanges): void { if (changes.scrollEvent) { - this.scrollToPreview('acceleratePreviewAnchor', 'center'); + this.scrollToPreview('acceleratePreviewAnchor', 'start'); } } @@ -126,7 +127,7 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges this.maxCost = this.userBid + this.estimate.mempoolBaseFee + this.estimate.vsizeFee; if (!this.error) { - this.scrollToPreview('acceleratePreviewAnchor', 'center'); + this.scrollToPreview('acceleratePreviewAnchor', 'start'); } } }), @@ -187,7 +188,11 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges this.estimateSubscription.unsubscribe(); }, error: (response) => { - this.error = response.error; + if (response.status === 403 && response.error === 'not_available') { + this.error = 'waitlisted'; + } else { + this.error = response.error; + } this.scrollToPreviewWithTimeout('mempoolError', 'center'); } }); diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html index 61597a2ed..19c5ab715 100644 --- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html +++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html @@ -1,4 +1,4 @@ -
+