diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 9f7f6caeb..e0aee68c5 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -7,7 +7,8 @@ updates:
open-pull-requests-limit: 10
ignore:
- dependency-name: "*"
- update-types: ["version-update:semver-major"]
+ update-types:
+ ["version-update:semver-major", "version-update:semver-patch"]
allow:
- dependency-type: "production"
@@ -18,7 +19,8 @@ updates:
open-pull-requests-limit: 10
ignore:
- dependency-name: "*"
- update-types: ["version-update:semver-major"]
+ update-types:
+ ["version-update:semver-major", "version-update:semver-patch"]
allow:
- dependency-type: "production"
@@ -28,7 +30,8 @@ updates:
interval: weekly
ignore:
- dependency-name: "*"
- update-types: ["version-update:semver-major"]
+ update-types:
+ ["version-update:semver-major", "version-update:semver-patch"]
- package-ecosystem: docker
directory: "/docker/frontend"
@@ -36,7 +39,8 @@ updates:
interval: weekly
ignore:
- dependency-name: "*"
- update-types: ["version-update:semver-major"]
+ update-types:
+ ["version-update:semver-major", "version-update:semver-patch"]
- package-ecosystem: "github-actions"
directory: "/"
@@ -44,4 +48,5 @@ updates:
interval: weekly
ignore:
- dependency-name: "*"
- update-types: ["version-update:semver-major"]
+ update-types:
+ ["version-update:semver-major", "version-update:semver-patch"]
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index b3c072689..e6bd3941d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -9,7 +9,7 @@ jobs:
if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')"
strategy:
matrix:
- node: ["16", "17", "18"]
+ node: ["16", "17", "18", "20"]
flavor: ["dev", "prod"]
fail-fast: false
runs-on: "ubuntu-latest"
@@ -60,7 +60,7 @@ jobs:
if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')"
strategy:
matrix:
- node: ["16", "17", "18"]
+ node: ["16", "17", "18", "20"]
flavor: ["dev", "prod"]
fail-fast: false
runs-on: "ubuntu-latest"
diff --git a/backend/.dockerignore b/backend/.dockerignore
new file mode 100644
index 000000000..94143827e
--- /dev/null
+++ b/backend/.dockerignore
@@ -0,0 +1 @@
+Dockerfile
diff --git a/backend/README.md b/backend/README.md
index ddea54422..6a0cb821c 100644
--- a/backend/README.md
+++ b/backend/README.md
@@ -2,7 +2,7 @@
These instructions are mostly intended for developers.
-If you choose to use these instructions for a production setup, be aware that you will still probably need to do additional configuration for your specific OS, environment, use-case, etc. We do our best here to provide a good starting point, but only proceed if you know what you're doing. Mempool does not provide support for custom setups.
+If you choose to use these instructions for a production setup, be aware that you will still probably need to do additional configuration for your specific OS, environment, use-case, etc. We do our best here to provide a good starting point, but only proceed if you know what you're doing. Mempool only provides support for custom setups to [enterprise sponsors](https://mempool.space/enterprise).
See other ways to set up Mempool on [the main README](/../../#installation-methods).
diff --git a/docker/backend/Dockerfile b/docker/backend/Dockerfile
index 386e0d59d..bbe4df3d2 100644
--- a/docker/backend/Dockerfile
+++ b/docker/backend/Dockerfile
@@ -7,9 +7,10 @@ WORKDIR /build
COPY . .
RUN apt-get update
-RUN apt-get install -y build-essential python3 pkg-config curl
+RUN apt-get install -y build-essential python3 pkg-config curl ca-certificates
# Install Rust via rustup
+RUN CPU_ARCH=$(uname -m); if [ "$CPU_ARCH" = "armv7l" ]; then c_rehash; fi
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable
ENV PATH="/root/.cargo/bin:$PATH"
diff --git a/frontend/src/app/components/master-page/master-page.component.scss b/frontend/src/app/components/master-page/master-page.component.scss
index fc8b4eb5a..95b9474b9 100644
--- a/frontend/src/app/components/master-page/master-page.component.scss
+++ b/frontend/src/app/components/master-page/master-page.component.scss
@@ -64,7 +64,9 @@ li.nav-item {
.navbar-collapse {
- flex-basis: auto;
+ @media (min-width: 564px) {
+ flex-basis: auto;
+ }
justify-content: flex-end;
}
diff --git a/frontend/src/app/components/pool-ranking/pool-ranking.component.html b/frontend/src/app/components/pool-ranking/pool-ranking.component.html
index 6ffcbf485..d5cf08aa5 100644
--- a/frontend/src/app/components/pool-ranking/pool-ranking.component.html
+++ b/frontend/src/app/components/pool-ranking/pool-ranking.component.html
@@ -139,6 +139,8 @@
{{ miningStats.lastEstimatedHashrate}} {{
miningStats.miningUnits.hashrateUnit }} |
{{ miningStats.blockCount }} |
+ |
+ |
{{ miningStats.totalEmptyBlock }} ({{ miningStats.totalEmptyBlockRatio
}}%) |
diff --git a/frontend/src/app/components/pool/pool.component.html b/frontend/src/app/components/pool/pool.component.html
index 898e50fc2..e1806086e 100644
--- a/frontend/src/app/components/pool/pool.component.html
+++ b/frontend/src/app/components/pool/pool.component.html
@@ -92,9 +92,9 @@
- Reward |
- Hashrate (24h) |
- Avg Health |
+ Reward |
+ Hashrate (24h) |
+ Avg Health |
@@ -117,9 +117,9 @@
- Reward |
- Hashrate (24h) |
- Avg Health |
+ Reward |
+ Hashrate (24h) |
+ Avg Health |
@@ -143,9 +143,9 @@
- Blocks 24h |
- 1w |
- All |
+ Blocks 24h |
+ 1w |
+ All |
@@ -165,9 +165,9 @@
- Blocks 24h |
- 1w |
- All |
+ Blocks 24h |
+ 1w |
+ All |
@@ -382,9 +382,9 @@
- Reward |
- Hashrate (24h) |
- Avg Health |
+ Reward |
+ Hashrate (24h) |
+ Avg Health |
@@ -407,9 +407,9 @@
- Reward |
- Hashrate (24h) |
- Avg Health |
+ Reward |
+ Hashrate (24h) |
+ Avg Health |
@@ -433,9 +433,9 @@
- Blocks 24h |
- 1w |
- All |
+ Blocks 24h |
+ 1w |
+ All |
@@ -458,9 +458,9 @@
- Blocks 24h |
- 1w |
- All |
+ Blocks 24h |
+ 1w |
+ All |
diff --git a/frontend/src/app/components/pool/pool.component.scss b/frontend/src/app/components/pool/pool.component.scss
index 21468773f..92fdc2ef3 100644
--- a/frontend/src/app/components/pool/pool.component.scss
+++ b/frontend/src/app/components/pool/pool.component.scss
@@ -188,11 +188,19 @@ div.scrollable {
}
}
-.block-count-title {
+.data-title {
color: #4a68b9;
font-size: 14px;
}
+.clip {
+ @media (max-width: 576px) {
+ max-width: 85px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+}
+
.table-data tr {
background-color: transparent;
}
diff --git a/frontend/src/app/components/search-form/search-form.component.scss b/frontend/src/app/components/search-form/search-form.component.scss
index f3d2ee234..534bf0698 100644
--- a/frontend/src/app/components/search-form/search-form.component.scss
+++ b/frontend/src/app/components/search-form/search-form.component.scss
@@ -18,9 +18,10 @@
form {
margin-top: 5px;
- @media (min-width: 576px) {
+ @media (min-width: 564px) {
margin-top: 0px;
- margin-left: 8px;
+ margin-left: 5px;
+ margin-right: -5px;
}
@media (min-width: 992px) {
width: 100%;
diff --git a/frontend/src/app/dashboard/dashboard.component.html b/frontend/src/app/dashboard/dashboard.component.html
index 7175f767a..a9f6e3994 100644
--- a/frontend/src/app/dashboard/dashboard.component.html
+++ b/frontend/src/app/dashboard/dashboard.component.html
@@ -73,7 +73,7 @@
+
+
+
diff --git a/frontend/src/app/dashboard/dashboard.component.scss b/frontend/src/app/dashboard/dashboard.component.scss
index f1e835d9c..884ba1027 100644
--- a/frontend/src/app/dashboard/dashboard.component.scss
+++ b/frontend/src/app/dashboard/dashboard.component.scss
@@ -175,6 +175,43 @@
height: 18px;
}
+.lastest-blocks-table {
+ width: 100%;
+ text-align: left;
+ tr, td, th {
+ border: 0px;
+ padding-top: 0.65rem !important;
+ padding-bottom: 0.7rem !important;
+ }
+ .table-cell-height {
+ width: 15%;
+ }
+ .table-cell-mined {
+ width: 35%;
+ text-align: left;
+ }
+ .table-cell-transaction-count {
+ display: none;
+ text-align: right;
+ width: 20%;
+ display: table-cell;
+ }
+ .table-cell-size {
+ display: none;
+ text-align: center;
+ width: 30%;
+ @media (min-width: 485px) {
+ display: table-cell;
+ }
+ @media (min-width: 768px) {
+ display: none;
+ }
+ @media (min-width: 992px) {
+ display: table-cell;
+ }
+ }
+}
+
.lastest-replacements-table {
width: 100%;
text-align: left;
diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts
index bf9816a69..aca3593d7 100644
--- a/frontend/src/app/dashboard/dashboard.component.ts
+++ b/frontend/src/app/dashboard/dashboard.component.ts
@@ -1,6 +1,6 @@
import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';
import { combineLatest, merge, Observable, of, Subscription } from 'rxjs';
-import { filter, map, scan, share, switchMap } from 'rxjs/operators';
+import { filter, map, scan, share, switchMap, tap } from 'rxjs/operators';
import { BlockExtended, OptimizedMempoolStats, RbfTree } from '../interfaces/node-api.interface';
import { MempoolInfo, TransactionStripped, ReplacementInfo } from '../interfaces/websocket.interface';
import { ApiService } from '../services/api.service';
@@ -39,6 +39,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
mempoolLoadingStatus$: Observable
;
vBytesPerSecondLimit = 1667;
transactions$: Observable;
+ blocks$: Observable;
replacements$: Observable;
latestBlockHeight: number;
mempoolTransactionsWeightPerSecondData: any;
@@ -144,6 +145,23 @@ export class DashboardComponent implements OnInit, OnDestroy {
}, []),
);
+ this.blocks$ = this.stateService.blocks$
+ .pipe(
+ tap((blocks) => {
+ this.latestBlockHeight = blocks[0].height;
+ }),
+ switchMap((blocks) => {
+ if (this.stateService.env.MINING_DASHBOARD === true) {
+ for (const block of blocks) {
+ // @ts-ignore: Need to add an extra field for the template
+ block.extras.pool.logo = `/resources/mining-pools/` +
+ block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg';
+ }
+ }
+ return of(blocks.slice(0, 6));
+ })
+ );
+
this.replacements$ = this.stateService.rbfLatestSummary$;
this.mempoolStats$ = this.stateService.connectionState$
diff --git a/frontend/src/app/docs/api-docs/api-docs-data.ts b/frontend/src/app/docs/api-docs/api-docs-data.ts
index 53e6bbdec..3a857fe6a 100644
--- a/frontend/src/app/docs/api-docs/api-docs-data.ts
+++ b/frontend/src/app/docs/api-docs/api-docs-data.ts
@@ -8936,8 +8936,8 @@ export const faqData = [
type: "endpoint",
category: "self-hosting",
showConditions: bitcoinNetworks,
- fragment: "host-my-own-instance-linux-server",
- title: "How can I host my own instance on a Linux server?",
+ fragment: "host-my-own-instance-server",
+ title: "How can I host a Mempool instance on my own server?",
},
{
type: "endpoint",
diff --git a/frontend/src/app/docs/api-docs/api-docs.component.html b/frontend/src/app/docs/api-docs/api-docs.component.html
index 392cda19e..9945a3f05 100644
--- a/frontend/src/app/docs/api-docs/api-docs.component.html
+++ b/frontend/src/app/docs/api-docs/api-docs.component.html
@@ -40,7 +40,7 @@
Below is a reference for the {{ network.val === '' ? 'Bitcoin' : network.val.charAt(0).toUpperCase() + network.val.slice(1) }} REST API service.
-
Note that we enforce rate limits. If you exceed these limits, you will get an HTTP 429 error. If you repeatedly exceed the limits, you may be banned from accessing the service altogether. Consider an enterprise sponsorship if you need higher API limits.
+
Note that we enforce rate limits. If you exceed these limits, you will get an HTTP 429 error. If you repeatedly exceed the limits, you may be banned from accessing the service altogether. Consider an enterprise sponsorship if you need higher API limits.
-1 )">{{ item.title }}
@@ -279,8 +279,9 @@
We support one-click installation on a number of Raspberry Pi full-node distros including Umbrel, RaspiBlitz, MyNode, RoninDojo, and Start9's Embassy.
-
- You can manually install Mempool on your own Linux server, but this requires advanced sysadmin skills since you will be manually configuring everything. We do not provide support for manual deployments.
+
+ You can manually install Mempool on your own server, but this requires advanced sysadmin skills since you will be manually configuring everything. You could also use our Docker images.
In any case, we only provide support for manual deployments to enterprise sponsors.
+ For casual users, we strongly suggest installing Mempool using one of the 1-click install methods.
diff --git a/production/README.md b/production/README.md
index 91b087ffa..87b8bb0a1 100644
--- a/production/README.md
+++ b/production/README.md
@@ -2,7 +2,7 @@
These instructions are for setting up a serious production Mempool website for Bitcoin (mainnet, testnet, signet), Liquid (mainnet, testnet), and Bisq.
-Again, this setup is no joke—home users should use [one of the other installation methods](../#installation-methods).
+Again, this setup is no joke—home users should use [one of the other installation methods](../#installation-methods). Support is only provided to [enterprise sponsors](https://mempool.space/enterprise).
### Server Hardware