diff --git a/.github/workflows/backend-integration.yml b/.github/workflows/backend-integration.yml
index f1a7290c43c..99716d24dc6 100644
--- a/.github/workflows/backend-integration.yml
+++ b/.github/workflows/backend-integration.yml
@@ -14,7 +14,7 @@ jobs:
matrix:
node: ["24.13.0"]
fail-fast: false
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
name: Backend Integration Tests - node ${{ matrix.node }}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ef76a6fb574..7fea9bb76c7 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -15,7 +15,7 @@ jobs:
node: ["24.13.0"]
flavor: ["dev", "prod"]
fail-fast: false
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
name: Backend (${{ matrix.flavor }}) - node ${{ matrix.node }}
steps:
@@ -100,7 +100,7 @@ jobs:
strategy:
matrix:
node: ["24.13.0"]
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
@@ -211,7 +211,7 @@ jobs:
node: ["24.13.0"]
flavor: ["dev", "prod"]
fail-fast: false
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
name: Frontend (${{ matrix.flavor }}) - node ${{ matrix.node }}
steps:
@@ -308,13 +308,14 @@ jobs:
e2e:
if: "(github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')) || github.event_name == 'push'"
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
needs: frontend
strategy:
fail-fast: false
matrix:
node: ["24.13.0"]
- module: ["mempool", "liquid", "testnet4"]
+ # liquid disabled for the ECX flavor
+ module: ["mempool", "testnet4"]
name: E2E tests for ${{ matrix.module }}
steps:
@@ -452,7 +453,7 @@ jobs:
CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }}
validate_docker_json:
if: "(github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')) || github.event_name == 'push'"
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
name: Validate generated backend Docker JSON
steps:
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 83a115fe681..212dfa9c387 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -19,7 +19,7 @@ permissions:
jobs:
test-images:
# Always run on tag pushes and all pull requests
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
timeout-minutes: 30
name: Test built Docker images
steps:
@@ -232,7 +232,7 @@ jobs:
service:
- frontend
- backend
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
timeout-minutes: 120
name: Build and push to DockerHub
outputs:
@@ -362,7 +362,7 @@ jobs:
needs: build
# Only for successful tag pushes (not PRs with docker-push label) and only for "plain" versions (no '-')
if: ${{ needs.build.result == 'success' && github.event_name == 'push' && !contains(github.ref_name, '-') }}
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
timeout-minutes: 30
name: Tag release build as latest
strategy:
diff --git a/.github/workflows/e2e_parameterized.yml b/.github/workflows/e2e_parameterized.yml
index ac4bca66d44..9f0cafeb853 100644
--- a/.github/workflows/e2e_parameterized.yml
+++ b/.github/workflows/e2e_parameterized.yml
@@ -22,7 +22,7 @@ on:
jobs:
cache:
name: "Cache assets for builds"
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
steps:
- name: Determine checkout ref
id: determine-ref
@@ -123,7 +123,7 @@ jobs:
key: promo-video-assets-cache
e2e:
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
needs: cache
strategy:
fail-fast: false
diff --git a/.github/workflows/ecx-frontend.yml b/.github/workflows/ecx-frontend.yml
new file mode 100644
index 00000000000..9aa070674a7
--- /dev/null
+++ b/.github/workflows/ecx-frontend.yml
@@ -0,0 +1,56 @@
+# Builds the ECX frontend image and pushes it to GHCR. Kept separate from
+# upstream's docker.yml so rebases never conflict here. Frontend only. The
+# stack runs the upstream backend image.
+name: ECX frontend
+
+on:
+ push:
+ branches: [ecx]
+ tags: ['ecx-v*']
+ pull_request:
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ packages: write
+
+jobs:
+ units:
+ name: Check ECX unit labels
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: No Bitcoin unit labels in rendered code paths
+ run: ./frontend/check-ecx-units.sh
+
+ image:
+ name: Build and push frontend
+ runs-on: ubuntu-latest
+ needs: units
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Add SHORT_SHA env property
+ run: echo "SHORT_SHA=${GITHUB_SHA:0:8}" >> "$GITHUB_ENV"
+
+ - name: Init repo for Dockerization
+ run: docker/init.sh "$SHORT_SHA"
+
+ - uses: docker/setup-buildx-action@v3
+
+ - uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v6
+ with:
+ context: ./frontend
+ push: ${{ github.event_name != 'pull_request' }}
+ platforms: linux/amd64
+ build-args: commitHash=${{ env.SHORT_SHA }}
+ tags: |
+ ghcr.io/${{ github.repository_owner }}/mempool-frontend:sha-${{ env.SHORT_SHA }}
+ ghcr.io/${{ github.repository_owner }}/mempool-frontend:alphanet
diff --git a/.github/workflows/get_backend_block_height.yml b/.github/workflows/get_backend_block_height.yml
index 73db6107ee5..ae30188e544 100644
--- a/.github/workflows/get_backend_block_height.yml
+++ b/.github/workflows/get_backend_block_height.yml
@@ -4,7 +4,7 @@ on: [workflow_dispatch]
jobs:
print-backend-sha:
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
name: Get block height
steps:
- name: Checkout
diff --git a/.github/workflows/get_backend_hash.yml b/.github/workflows/get_backend_hash.yml
index d63860c5e89..0e31735b665 100644
--- a/.github/workflows/get_backend_hash.yml
+++ b/.github/workflows/get_backend_hash.yml
@@ -4,7 +4,7 @@ on: [workflow_dispatch]
jobs:
print-backend-sha:
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
name: Print backend hashes
steps:
- name: Checkout
diff --git a/.github/workflows/get_image_digest.yml b/.github/workflows/get_image_digest.yml
index 3d86c860c18..18ad39fdee4 100644
--- a/.github/workflows/get_image_digest.yml
+++ b/.github/workflows/get_image_digest.yml
@@ -10,7 +10,7 @@ on:
type: string
jobs:
print-images-sha:
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
name: Print digest for images
steps:
- name: Checkout
diff --git a/.github/workflows/project-review-status.yml b/.github/workflows/project-review-status.yml
index 7e85b8eb349..0b12fa563da 100644
--- a/.github/workflows/project-review-status.yml
+++ b/.github/workflows/project-review-status.yml
@@ -12,7 +12,7 @@ on:
jobs:
manage-project-board:
- runs-on: mempool-ci
+ runs-on: ubuntu-latest
steps:
- name: Update Project Board
uses: actions/github-script@v7
diff --git a/README.md b/README.md
index 7e426f1550a..77f097560ce 100644
--- a/README.md
+++ b/README.md
@@ -1,38 +1,22 @@
-# The Mempool Open Source Project® [](https://dashboard.cypress.io/projects/ry4br7/runs)
+# mempool-ecx
-https://user-images.githubusercontent.com/93150691/226236121-375ea64f-b4a1-4cc0-8fad-a6fb33226840.mp4
+A fork of [mempool/mempool](https://github.com/mempool/mempool), the block
+explorer for the eCash alphanet. See the upstream repo for general
+documentation and installation instructions.
-
+The `ecx` branch is a rebasable patch series on top of an upstream release
+tag — currently **v3.3.1** — kept as one commit per change; see
+`git log v3.3.1..ecx` for what and why.
-Mempool is the fully-featured mempool visualizer, explorer, and API service running at [mempool.space](https://mempool.space/).
+## Rebasing onto a new release
-It is an open-source project developed and operated for the benefit of the Bitcoin community, with a focus on the emerging transaction fee market that is evolving Bitcoin into a multi-layer ecosystem.
+```sh
+git fetch upstream --tags
+git rebase --onto v3.4.0 v3.3.1 ecx # old base -> new base
+./frontend/check-ecx-units.sh
+```
-# Installation Methods
-
-Mempool can be self-hosted on a wide variety of your own hardware, ranging from a simple one-click installation on a Raspberry Pi full-node distro all the way to a robust production instance on a powerful FreeBSD server.
-
-Most people should use a one-click install method.
-
-Other install methods are meant for developers and others with experience managing servers. If you want support for your own production instance of Mempool, or if you'd like to have your own instance of Mempool run by the mempool.space team on their own global ISP infrastructure—check out Mempool Enterprise®.
-
-
-## One-Click Installation
-
-Mempool can be conveniently installed on the following full-node distros:
-- [Umbrel](https://github.com/getumbrel/umbrel)
-- [RaspiBlitz](https://github.com/rootzoll/raspiblitz)
-- [RoninDojo](https://code.samourai.io/ronindojo/RoninDojo)
-- [myNode](https://github.com/mynodebtc/mynode)
-- [StartOS](https://github.com/Start9Labs/start-os)
-- [nix-bitcoin](https://github.com/fort-nix/nix-bitcoin/blob/a1eacce6768ca4894f365af8f79be5bbd594e1c3/examples/configuration.nix#L129)
-
-**We highly recommend you deploy your own Mempool instance this way.** No matter which option you pick, you'll be able to get your own fully-sovereign instance of Mempool up quickly without needing to fiddle with any settings.
-
-## Advanced Installation Methods
-
-Mempool can be installed in other ways too, but we only recommend doing so if you're a developer, have experience managing servers, or otherwise know what you're doing.
-
-- See the [`docker/`](./docker/) directory for instructions on deploying Mempool with Docker.
-- See the [`backend/`](./backend/) and [`frontend/`](./frontend/) directories for manual install instructions oriented for developers.
-- See the [`production/`](./production/) directory for guidance on setting up a more serious Mempool instance designed for high performance at scale.
+Then re-verify by hand: the meta tags in `src/index.mempool.html`, the fork
+height in `app/app.constants.ts`, and the removed routes in
+`app/master-page.module.ts` — then `npm run build` and walk a block, tx, and
+address page.
diff --git a/frontend/angular.json b/frontend/angular.json
index 9c15807678e..f12ae14f3ef 100644
--- a/frontend/angular.json
+++ b/frontend/angular.json
@@ -21,140 +21,7 @@
"code": "en-US",
"baseHref": "/"
},
- "locales": {
- "ar": {
- "translation": "src/locale/messages.ar.xlf",
- "baseHref": "/ar/"
- },
- "ca": {
- "translation": "src/locale/messages.ca.xlf",
- "baseHref": "/ca/"
- },
- "cs": {
- "translation": "src/locale/messages.cs.xlf",
- "baseHref": "/cs/"
- },
- "de": {
- "translation": "src/locale/messages.de.xlf",
- "baseHref": "/de/"
- },
- "da": {
- "translation": "src/locale/messages.da.xlf",
- "baseHref": "/da/"
- },
- "es": {
- "translation": "src/locale/messages.es.xlf",
- "baseHref": "/es/"
- },
- "fa": {
- "translation": "src/locale/messages.fa.xlf",
- "baseHref": "/fa/"
- },
- "fr": {
- "translation": "src/locale/messages.fr.xlf",
- "baseHref": "/fr/"
- },
- "hr": {
- "translation": "src/locale/messages.hr.xlf",
- "baseHref": "/hr/"
- },
- "ja": {
- "translation": "src/locale/messages.ja.xlf",
- "baseHref": "/ja/"
- },
- "ka": {
- "translation": "src/locale/messages.ka.xlf",
- "baseHref": "/ka/"
- },
- "ko": {
- "translation": "src/locale/messages.ko.xlf",
- "baseHref": "/ko/"
- },
- "it": {
- "translation": "src/locale/messages.it.xlf",
- "baseHref": "/it/"
- },
- "he": {
- "translation": "src/locale/messages.he.xlf",
- "baseHref": "/he/"
- },
- "nl": {
- "translation": "src/locale/messages.nl.xlf",
- "baseHref": "/nl/"
- },
- "nb": {
- "translation": "src/locale/messages.nb.xlf",
- "baseHref": "/nb/"
- },
- "pl": {
- "translation": "src/locale/messages.pl.xlf",
- "baseHref": "/pl/"
- },
- "pt": {
- "translation": "src/locale/messages.pt.xlf",
- "baseHref": "/pt/"
- },
- "sl": {
- "translation": "src/locale/messages.sl.xlf",
- "baseHref": "/sl/"
- },
- "sv": {
- "translation": "src/locale/messages.sv.xlf",
- "baseHref": "/sv/"
- },
- "th": {
- "translation": "src/locale/messages.th.xlf",
- "baseHref": "/th/"
- },
- "tr": {
- "translation": "src/locale/messages.tr.xlf",
- "baseHref": "/tr/"
- },
- "uk": {
- "translation": "src/locale/messages.uk.xlf",
- "baseHref": "/uk/"
- },
- "fi": {
- "translation": "src/locale/messages.fi.xlf",
- "baseHref": "/fi/"
- },
- "vi": {
- "translation": "src/locale/messages.vi.xlf",
- "baseHref": "/vi/"
- },
- "hu": {
- "translation": "src/locale/messages.hu.xlf",
- "baseHref": "/hu/"
- },
- "mk": {
- "translation": "src/locale/messages.mk.xlf",
- "baseHref": "/mk/"
- },
- "zh": {
- "translation": "src/locale/messages.zh.xlf",
- "baseHref": "/zh/"
- },
- "ro": {
- "translation": "src/locale/messages.ro.xlf",
- "baseHref": "/ro/"
- },
- "ru": {
- "translation": "src/locale/messages.ru.xlf",
- "baseHref": "/ru/"
- },
- "hi": {
- "translation": "src/locale/messages.hi.xlf",
- "baseHref": "/hi/"
- },
- "ne": {
- "translation": "src/locale/messages.ne.xlf",
- "baseHref": "/ne/"
- },
- "lt": {
- "translation": "src/locale/messages.lt.xlf",
- "baseHref": "/lt/"
- }
- }
+ "locales": {}
},
"architect": {
"build": {
diff --git a/frontend/check-ecx-units.sh b/frontend/check-ecx-units.sh
new file mode 100755
index 00000000000..300988f1fc0
--- /dev/null
+++ b/frontend/check-ecx-units.sh
@@ -0,0 +1,55 @@
+#!/usr/bin/env bash
+#
+# Fails if Bitcoin unit labels (BTC / sats / sat/vB) appear in code paths this
+# fork renders. Scope is display text only: identifiers and wire values (the
+# 'btc'|'sats'|'fiat' mode union, ?sats= query params, SatsComponent) keep
+# Bitcoin's spelling.
+set -euo pipefail
+cd "$(dirname "$0")"
+
+# Disabled features, wire formats, upstream data files, and unrouted pages.
+# Filtered from output rather than via grep --exclude, which silently stopped
+# excluding under some shells.
+SKIP_PATHS='src/app/lightning/|liquid-reserves-audit|lbtc-pegs-graph|/acceleration|accelerate-checkout|bitcoin-invoice|price-chart|api-docs-data\.ts|websocket\.interface\.ts'
+SKIP_PATHS="$SKIP_PATHS"'|components/about/|components/terms-of-service/|components/privacy-policy/|components/trademark-policy/'
+
+# Pre-fork halvings happened on Bitcoin, so those four labels keep BTC.
+SKIP_CONTENT='LBTC|halved to (25|12\.5|6\.25|3\.125) BTC per block'
+
+PATTERNS=(
+ '\bBTC\b'
+ '>sats<'
+ '\(sats\)'
+ "' sats'"
+ '} sats`'
+ 'sats/WU'
+ 'sats/vByte'
+ 'sat/vB\b'
+ 'sat/WU'
+ 'sat/vByte'
+)
+
+status=0
+for p in "${PATTERNS[@]}"; do
+ # The description half of i18n="meaning|description" is not rendered, so
+ # strip i18n metadata before re-asserting the match.
+ hits=$(grep -rnE --include='*.ts' --include='*.html' -- "$p" src/app \
+ | grep -vE "$SKIP_PATHS" \
+ | grep -vE "$SKIP_CONTENT" \
+ | sed 's/ i18n[^=]*="[^"]*"//g' \
+ | grep -E -- "$p" || true)
+ if [ -n "$hits" ]; then
+ echo "Bitcoin unit label found: /$p/"
+ echo "$hits" | sed 's/^/ /'
+ status=1
+ fi
+done
+
+if [ "$status" -ne 0 ]; then
+ echo
+ echo "Rename to the ECX equivalent (ECX / szats / szat/vB), or add a"
+ echo "justified exclusion above if it is an identifier or wire value."
+ exit 1
+fi
+
+echo "no Bitcoin unit labels in rendered code paths"
diff --git a/frontend/cypress/e2e/mainnet/calculator.spec.ts b/frontend/cypress/e2e/mainnet/calculator.spec.ts
index b09dff15458..8a18fac653b 100644
--- a/frontend/cypress/e2e/mainnet/calculator.spec.ts
+++ b/frontend/cypress/e2e/mainnet/calculator.spec.ts
@@ -63,9 +63,9 @@ describe('Calculator', () => {
cy.get('.fiat-text').should('be.visible');
});
- it('shows input labels for currency, BTC, and sats', () => {
- cy.get('.input-group-text').contains('BTC').should('be.visible');
- cy.get('.input-group-text').contains('sats').should('be.visible');
+ it('shows input labels for currency, ECX, and szats', () => {
+ cy.get('.input-group-text').contains('ECX').should('be.visible');
+ cy.get('.input-group-text').contains('szats').should('be.visible');
});
});
@@ -158,11 +158,11 @@ describe('Calculator', () => {
});
});
- describe('max supply (21M BTC)', () => {
- it('shows warning when entering 21M BTC', () => {
+ describe('max supply (21M ECX)', () => {
+ it('shows warning when entering 21M ECX', () => {
cy.get('input[formControlName="bitcoin"]').clear().type('21000000');
cy.get('.alert.alert-warning').should('be.visible');
- cy.get('.alert.alert-warning').should('contain', 'Values were capped at the max supply of 21M BTC');
+ cy.get('.alert.alert-warning').should('contain', 'Values were capped at the max supply of 21M ECX');
cy.get('input[formControlName="bitcoin"]').invoke('val').should('equal', '21000000');
cy.get('input[formControlName="satoshis"]').invoke('val').should('equal', '2100000000000000');
});
diff --git a/frontend/src/app/app.constants.ts b/frontend/src/app/app.constants.ts
index 730da5a816c..e1131641bcc 100644
--- a/frontend/src/app/app.constants.ts
+++ b/frontend/src/app/app.constants.ts
@@ -189,6 +189,8 @@ export const languages: Language[] = [
{ code: 'zh', name: '中文' }, // Chinese
];
+export const ALPHANET_FORK_HEIGHT = 963648;
+
export const specialBlocks = {
'0': {
labelEvent: 'Genesis',
@@ -220,59 +222,64 @@ export const specialBlocks = {
labelEventCompleted: 'Block Subsidy has halved to 3.125 BTC per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
+ [ALPHANET_FORK_HEIGHT]: {
+ labelEvent: 'eCash alphanet fork',
+ labelEventCompleted: 'eCash alphanet forked from Bitcoin here',
+ networks: ['mainnet'],
+ },
'1050000': {
- labelEvent: 'Bitcoin\'s 5th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 1.5625 BTC per block',
+ labelEvent: 'eCash\'s 5th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 1.5625 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'1260000': {
- labelEvent: 'Bitcoin\'s 6th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.78125 BTC per block',
+ labelEvent: 'eCash\'s 6th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.78125 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'1470000': {
- labelEvent: 'Bitcoin\'s 7th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.390625 BTC per block',
+ labelEvent: 'eCash\'s 7th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.390625 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'1680000': {
- labelEvent: 'Bitcoin\'s 8th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.1953125 BTC per block',
+ labelEvent: 'eCash\'s 8th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.1953125 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'1890000': {
- labelEvent: 'Bitcoin\'s 9th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.09765625 BTC per block',
+ labelEvent: 'eCash\'s 9th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.09765625 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'2100000': {
- labelEvent: 'Bitcoin\'s 10th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.04882812 BTC per block',
+ labelEvent: 'eCash\'s 10th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.04882812 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'2310000': {
- labelEvent: 'Bitcoin\'s 11th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.02441406 BTC per block',
+ labelEvent: 'eCash\'s 11th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.02441406 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'2520000': {
- labelEvent: 'Bitcoin\'s 12th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.01220703 BTC per block',
+ labelEvent: 'eCash\'s 12th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.01220703 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'2730000': {
- labelEvent: 'Bitcoin\'s 13th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.00610351 BTC per block',
+ labelEvent: 'eCash\'s 13th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.00610351 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'2940000': {
- labelEvent: 'Bitcoin\'s 14th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.00305175 BTC per block',
+ labelEvent: 'eCash\'s 14th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.00305175 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'3150000': {
- labelEvent: 'Bitcoin\'s 15th Halving',
- labelEventCompleted: 'Block Subsidy has halved to 0.00152587 BTC per block',
+ labelEvent: 'eCash\'s 15th Halving',
+ labelEventCompleted: 'Block Subsidy has halved to 0.00152587 ECX per block',
networks: ['mainnet', 'testnet', 'testnet4'],
},
'3477600': {
diff --git a/frontend/src/app/components/address-graph/address-graph.component.ts b/frontend/src/app/components/address-graph/address-graph.component.ts
index c117e8fc026..0e2518d1f76 100644
--- a/frontend/src/app/components/address-graph/address-graph.component.ts
+++ b/frontend/src/app/components/address-graph/address-graph.component.ts
@@ -177,7 +177,7 @@ export class AddressGraphComponent implements OnChanges, OnDestroy {
if (this.period !== 'all') {
const start = now - (periodSeconds[this.period] * 1000);
this.data = this.data.filter(d => d[0] >= start);
- const startFiat = this.data[0]?.[0] ?? start; // Make sure USD data starts at the same time as BTC data
+ const startFiat = this.data[0]?.[0] ?? start; // Make sure USD data starts at the same time as ECX data
this.fiatData = this.fiatData.filter(d => d[0] >= startFiat);
}
this.data.push(
@@ -231,7 +231,7 @@ export class AddressGraphComponent implements OnChanges, OnDestroy {
],
selected: this.selected,
formatter: function (name) {
- return name === 'Fiat' ? 'USD' : 'BTC';
+ return name === 'Fiat' ? 'USD' : 'ECX';
}
} : undefined,
tooltip: {
@@ -283,20 +283,20 @@ export class AddressGraphComponent implements OnChanges, OnDestroy {
if (btcData.length && fiatData.length) {
tooltip += `