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® [![mempool](https://img.shields.io/endpoint?url=https://dashboard.cypress.io/badge/simple/ry4br7/master&style=flat-square)](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 += `
- ${btcSymbol} ${formatBTC(btcVal, 4)} BTC + ${btcSymbol} ${formatBTC(btcVal, 4)} ECX ${fiatSymbol} ${formatFiat(fiatVal)}
- ${formatBTC(btcData[0].data[1], 4)} BTC + ${formatBTC(btcData[0].data[1], 4)} ECX ${formatFiat(fiatData[0].data[1])}
`; } else if (btcData.length) { - tooltip += `${btcSymbol} ${formatBTC(btcVal, 8)} BTC
- ${formatBTC(data[0].data[1], 8)} BTC`; + tooltip += `${btcSymbol} ${formatBTC(btcVal, 8)} ECX
+ ${formatBTC(data[0].data[1], 8)} ECX`; } else { if (this.selected[$localize`:@@7e69426bd97a606d8ae6026762858e6e7c86a1fd:Balance`]) { tooltip += `
- ${formatBTC(data[0].data[3], 4)} BTC + ${formatBTC(data[0].data[3], 4)} ECX ${formatFiat(data[0].data[1])}
`; } else { @@ -326,21 +326,21 @@ export class AddressGraphComponent implements OnChanges, OnDestroy { formatter: (val): string => { const valSpan = maxValue - (this.period === 'all' ? 0 : minValue); if (valSpan > 100_000_000_000) { - return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 0, undefined, true)} BTC`; + return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 0, undefined, true)} ECX`; } else if (valSpan > 1_000_000_000) { - return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 2, undefined, true)} BTC`; + return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 2, undefined, true)} ECX`; } else if (valSpan > 100_000_000) { - return `${(val / 100_000_000).toFixed(1)} BTC`; + return `${(val / 100_000_000).toFixed(1)} ECX`; } else if (valSpan > 10_000_000) { - return `${(val / 100_000_000).toFixed(2)} BTC`; + return `${(val / 100_000_000).toFixed(2)} ECX`; } else if (valSpan > 1_000_000) { if (maxValue > 100_000_000_000) { - return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 3, undefined, true)} BTC`; + return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 3, undefined, true)} ECX`; } - return `${(val / 100_000_000).toFixed(3)} BTC`; + return `${(val / 100_000_000).toFixed(3)} ECX`; } else { - return `${this.amountShortenerPipe.transform(val, 0, undefined, true)} sats`; + return `${this.amountShortenerPipe.transform(val, 0, undefined, true)} szats`; } } }, diff --git a/frontend/src/app/components/addresses-treemap/addresses-treemap.component.ts b/frontend/src/app/components/addresses-treemap/addresses-treemap.component.ts index 0ae1c9bcb6b..a6585ef1392 100644 --- a/frontend/src/app/components/addresses-treemap/addresses-treemap.component.ts +++ b/frontend/src/app/components/addresses-treemap/addresses-treemap.component.ts @@ -127,9 +127,9 @@ export class AddressesTreemap implements OnChanges { formatValue(sats: number): string { if (sats > 100000000) { - return formatNumber(sats / 100000000, this.locale, '1.2-2') + ' BTC'; + return formatNumber(sats / 100000000, this.locale, '1.2-2') + ' ECX'; } else { - return this.amountShortenerPipe.transform(sats, 2) + ' sats'; + return this.amountShortenerPipe.transform(sats, 2) + ' szats'; } } diff --git a/frontend/src/app/components/amount-selector/amount-selector.component.html b/frontend/src/app/components/amount-selector/amount-selector.component.html index a16a24d4f87..1d3ba7b7760 100644 --- a/frontend/src/app/components/amount-selector/amount-selector.component.html +++ b/frontend/src/app/components/amount-selector/amount-selector.component.html @@ -1,7 +1,7 @@
diff --git a/frontend/src/app/components/amount/amount.component.html b/frontend/src/app/components/amount/amount.component.html index ac469939f18..dc94af25bf0 100644 --- a/frontend/src/app/components/amount/amount.component.html +++ b/frontend/src/app/components/amount/amount.component.html @@ -24,7 +24,7 @@ @if ((viewAmountMode$ | async) === 'btc' || (viewAmountMode$ | async) === 'fiat' || ignoreViewMode === true) { ‎{{ addPlus && satoshis >= 0 ? '+' : '' }}{{ satoshis / 100000000 | number : digitsInfo }} - BTC + ECX } @else { @if (digitsInfo === '1.8-8') { @@ -33,7 +33,7 @@ ‎{{ addPlus && satoshis >= 0 ? '+' : '' }}{{ satoshis | amountShortener : (satoshis < 1000 && satoshis > -1000 ? 0 : 1) : undefined : true }} } - sats + szats } diff --git a/frontend/src/app/components/balance-widget/balance-widget.component.html b/frontend/src/app/components/balance-widget/balance-widget.component.html index 87f14de5393..37294d532fd 100644 --- a/frontend/src/app/components/balance-widget/balance-widget.component.html +++ b/frontend/src/app/components/balance-widget/balance-widget.component.html @@ -2,9 +2,9 @@
-
BTC Holdings
+
ECX Holdings
- {{ ((total) / 100_000_000) | number: '1.2-2' }} BTC + {{ ((total) / 100_000_000) | number: '1.2-2' }} ECX
@@ -13,7 +13,7 @@
BTC Holdings
Change (7d)
- {{ delta7d > 0 ? '+' : ''}}{{ ((delta7d) / 100_000_000) | number: '1.2-2' }} BTC + {{ delta7d > 0 ? '+' : ''}}{{ ((delta7d) / 100_000_000) | number: '1.2-2' }} ECX
@@ -22,7 +22,7 @@
Change (7d)
Change (30d)
- {{ delta30d > 0 ? '+' : ''}}{{ ((delta30d) / 100_000_000) | number: '1.2-2' }} BTC + {{ delta30d > 0 ? '+' : ''}}{{ ((delta30d) / 100_000_000) | number: '1.2-2' }} ECX
@@ -35,7 +35,7 @@
Change (30d)
-
BTC Holdings
+
ECX Holdings
diff --git a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts index 8394ce608ba..2ed31885e7d 100644 --- a/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts +++ b/frontend/src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts @@ -246,9 +246,9 @@ export class BlockFeeRatesGraphComponent implements OnInit { for (const rate of data.reverse()) { if (weightMode) { - tooltip += `${rate.marker} ${rate.seriesName}: ${(rate.data[1] / 4).toFixed(2)} sats/WU
`; + tooltip += `${rate.marker} ${rate.seriesName}: ${(rate.data[1] / 4).toFixed(2)} szats/WU
`; } else { - tooltip += `${rate.marker} ${rate.seriesName}: ${rate.data[1].toFixed(2)} sats/vByte
`; + tooltip += `${rate.marker} ${rate.seriesName}: ${rate.data[1].toFixed(2)} szats/vByte
`; } } diff --git a/frontend/src/app/components/block-fees-graph/block-fees-graph.component.ts b/frontend/src/app/components/block-fees-graph/block-fees-graph.component.ts index 23ff2faef98..0337b330e08 100644 --- a/frontend/src/app/components/block-fees-graph/block-fees-graph.component.ts +++ b/frontend/src/app/components/block-fees-graph/block-fees-graph.component.ts @@ -68,7 +68,7 @@ export class BlockFeesGraphComponent implements OnInit { ngOnInit(): void { this.seoService.setTitle($localize`:@@6c453b11fd7bd159ae30bc381f367bc736d86909:Block Fees`); - this.seoService.setDescription($localize`:@@meta.description.bitcoin.graphs.block-fees:See the average mining fees earned per Bitcoin block visualized in BTC and USD over time.`); + this.seoService.setDescription($localize`:@@meta.description.bitcoin.graphs.block-fees:See the average mining fees earned per Bitcoin block visualized in ECX and USD over time.`); this.miningWindowPreference = this.miningService.getDefaultTimespan('1m'); this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference }); this.radioGroupForm.controls.dateSpan.setValue(this.miningWindowPreference); @@ -165,7 +165,7 @@ export class BlockFeesGraphComponent implements OnInit { for (const tick of data) { if (tick.seriesIndex === 0) { - tooltip += `${tick.marker} ${tick.seriesName}: ${formatNumber(tick.data[1], this.locale, '1.3-3')} BTC
`; + tooltip += `${tick.marker} ${tick.seriesName}: ${formatNumber(tick.data[1], this.locale, '1.3-3')} ECX
`; } else if (tick.seriesIndex === 1) { tooltip += `${tick.marker} ${tick.seriesName}: ${this.fiatCurrencyPipe.transform(tick.data[1], null, this.currency) }
`; } @@ -186,7 +186,7 @@ export class BlockFeesGraphComponent implements OnInit { legend: data.blockFees.length === 0 ? undefined : { data: [ { - name: 'Fees BTC', + name: 'Fees ECX', inactiveColor: 'rgb(110, 112, 121)', textStyle: { color: 'white', @@ -209,7 +209,7 @@ export class BlockFeesGraphComponent implements OnInit { axisLabel: { color: 'rgb(110, 112, 121)', formatter: (val) => { - return `${val} BTC`; + return `${val} ECX`; } }, splitLine: { @@ -239,7 +239,7 @@ export class BlockFeesGraphComponent implements OnInit { legendHoverLink: false, zlevel: 0, yAxisIndex: 0, - name: 'Fees BTC', + name: 'Fees ECX', data: data.blockFees, type: 'line', smooth: 0.25, diff --git a/frontend/src/app/components/block-fees-subsidy-graph/block-fees-subsidy-graph.component.ts b/frontend/src/app/components/block-fees-subsidy-graph/block-fees-subsidy-graph.component.ts index 998245dfcb6..d5f68ae4a71 100644 --- a/frontend/src/app/components/block-fees-subsidy-graph/block-fees-subsidy-graph.component.ts +++ b/frontend/src/app/components/block-fees-subsidy-graph/block-fees-subsidy-graph.component.ts @@ -78,7 +78,7 @@ export class BlockFeesSubsidyGraphComponent implements OnInit { ngOnInit(): void { this.seoService.setTitle($localize`:@@41545303ec98792b738d6237adbd1f3b54a22196:Block Fees Vs Subsidy`); - this.seoService.setDescription($localize`:@@meta.description.bitcoin.graphs.block-fees-subsidy:See the mining fees earned per Bitcoin block compared to the Bitcoin block subsidy, visualized in BTC and USD over time.`); + this.seoService.setDescription($localize`:@@meta.description.bitcoin.graphs.block-fees-subsidy:See the mining fees earned per Bitcoin block compared to the Bitcoin block subsidy, visualized in ECX and USD over time.`); this.miningWindowPreference = this.miningService.getDefaultTimespan('24h'); this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference }); @@ -187,11 +187,11 @@ export class BlockFeesSubsidyGraphComponent implements OnInit { for (let i = data.length - 1; i >= 0; i--) { const tick = data[i]; tooltip += `${tick.marker} ${tick.seriesName.split(' ')[0]}: `; - if (this.displayMode === 'normal') {tooltip += `${formatNumber(tick.data, this.locale, '1.0-3')} BTC
`;} + if (this.displayMode === 'normal') {tooltip += `${formatNumber(tick.data, this.locale, '1.0-3')} ECX
`;} else if (this.displayMode === 'fiat') {tooltip += `${this.fiatCurrencyPipe.transform(tick.data, null, 'USD') }
`;} else {tooltip += `${formatNumber(tick.data, this.locale, '1.0-2')}%
`;} } - if (this.displayMode === 'normal') {tooltip += `
${formatNumber(data.reduce((acc, val) => acc + val.data, 0), this.locale, '1.0-3')} BTC
`;} + if (this.displayMode === 'normal') {tooltip += `
${formatNumber(data.reduce((acc, val) => acc + val.data, 0), this.locale, '1.0-3')} ECX
`;} else if (this.displayMode === 'fiat') {tooltip += `
${this.fiatCurrencyPipe.transform(data.reduce((acc, val) => acc + val.data, 0), null, 'USD')}
`;} if (['24h', '3d'].includes(this.zoomTimeSpan)) { tooltip += `` + $localize`At block ${'' + data[0].axisValue}` + ``; @@ -298,7 +298,7 @@ export class BlockFeesSubsidyGraphComponent implements OnInit { axisLabel: { color: 'var(--grey)', formatter: (val) => { - return `${val}${this.displayMode === 'percentage' ? '%' : ' BTC'}`; + return `${val}${this.displayMode === 'percentage' ? '%' : ' ECX'}`; } }, min: 0, diff --git a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html index d97e3d02ca2..232b6b3a56d 100644 --- a/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html +++ b/frontend/src/app/components/block-overview-tooltip/block-overview-tooltip.component.html @@ -40,7 +40,7 @@ Fee - {{ fee | number }} sats   + {{ fee | number }} szats   Fee rate diff --git a/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.ts b/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.ts index 3f27865048d..8934b82a844 100644 --- a/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.ts +++ b/frontend/src/app/components/block-rewards-graph/block-rewards-graph.component.ts @@ -66,7 +66,7 @@ export class BlockRewardsGraphComponent implements OnInit { ngOnInit(): void { this.seoService.setTitle($localize`:@@8ba8fe810458280a83df7fdf4c614dfc1a826445:Block Rewards`); - this.seoService.setDescription($localize`:@@meta.description.bitcoin.graphs.block-rewards:See Bitcoin block rewards in BTC and USD visualized over time. Block rewards are the total funds miners earn from the block subsidy and fees.`); + this.seoService.setDescription($localize`:@@meta.description.bitcoin.graphs.block-rewards:See Bitcoin block rewards in ECX and USD visualized over time. Block rewards are the total funds miners earn from the block subsidy and fees.`); this.miningWindowPreference = this.miningService.getDefaultTimespan('3m'); this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference }); this.radioGroupForm.controls.dateSpan.setValue(this.miningWindowPreference); @@ -164,7 +164,7 @@ export class BlockRewardsGraphComponent implements OnInit { for (const tick of data) { if (tick.seriesIndex === 0) { - tooltip += `${tick.marker} ${tick.seriesName}: ${formatNumber(tick.data[1], this.locale, '1.3-3')} BTC
`; + tooltip += `${tick.marker} ${tick.seriesName}: ${formatNumber(tick.data[1], this.locale, '1.3-3')} ECX
`; } else if (tick.seriesIndex === 1) { tooltip += `${tick.marker} ${tick.seriesName}: ${this.fiatCurrencyPipe.transform(tick.data[1], null, this.currency)}
`; } @@ -185,7 +185,7 @@ export class BlockRewardsGraphComponent implements OnInit { legend: data.blockRewards.length === 0 ? undefined : { data: [ { - name: 'Rewards BTC', + name: 'Rewards ECX', inactiveColor: 'rgb(110, 112, 121)', textStyle: { color: 'white', @@ -208,7 +208,7 @@ export class BlockRewardsGraphComponent implements OnInit { axisLabel: { color: 'rgb(110, 112, 121)', formatter: (val) => { - return `${val} BTC`; + return `${val} ECX`; } }, min: (value) => { @@ -250,7 +250,7 @@ export class BlockRewardsGraphComponent implements OnInit { legendHoverLink: false, zlevel: 0, yAxisIndex: 0, - name: 'Rewards BTC', + name: 'Rewards ECX', data: data.blockRewards, type: 'line', smooth: 0.25, diff --git a/frontend/src/app/components/block/block.component.html b/frontend/src/app/components/block/block.component.html index 0c78081edb9..1fa5cc981fe 100644 --- a/frontend/src/app/components/block/block.component.html +++ b/frontend/src/app/components/block/block.component.html @@ -31,6 +31,14 @@

+ + + + diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index b1b0559575e..755e6312701 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -18,6 +18,7 @@ import { CacheService } from '@app/services/cache.service'; import { ServicesApiServices } from '@app/services/services-api.service'; import { PreloadService } from '@app/services/preload.service'; import { identifyPrioritizedTransactions } from '@app/shared/transaction.utils'; +import { specialBlocks, ALPHANET_FORK_HEIGHT } from '@app/app.constants'; interface ComparisonStats { totalFees: number; @@ -949,6 +950,16 @@ export class BlockComponent implements OnInit, OnDestroy { this.showAudit = this.auditAvailable && this.auditModeEnabled && this.auditSupported; } + specialEvent(height: number): { labelEvent: string; labelEventCompleted: string; networks: string[] } | null { + const event = specialBlocks[height]; + return event?.networks.includes(this.stateService.network || 'mainnet') ? event : null; + } + + // Pre-fork amounts deliberately keep the ECX unit; this badge carries the context. + isPreFork(height: number): boolean { + return height != null && height < ALPHANET_FORK_HEIGHT; + } + toggleAuditMode(): void { this.stateService.hideAudit.next(this.auditModeEnabled); diff --git a/frontend/src/app/components/calculator/calculator.component.html b/frontend/src/app/components/calculator/calculator.component.html index 8c5387b5793..ff653af6176 100644 --- a/frontend/src/app/components/calculator/calculator.component.html +++ b/frontend/src/app/components/calculator/calculator.component.html @@ -18,7 +18,7 @@

Calculator

- BTC + ECX
@@ -26,7 +26,7 @@

Calculator

- sats + szats
@@ -37,7 +37,7 @@

Calculator

@@ -47,7 +47,7 @@

Calculator

₿ - sats + szats
diff --git a/frontend/src/app/components/calculator/calculator.component.ts b/frontend/src/app/components/calculator/calculator.component.ts index d38039d376a..5811e172d3f 100644 --- a/frontend/src/app/components/calculator/calculator.component.ts +++ b/frontend/src/app/components/calculator/calculator.component.ts @@ -115,7 +115,7 @@ export class CalculatorComponent implements OnInit { this.form.get('bitcoin').setValue(bitcoinRate, { emitEvent: false }); }); - // Default form with 1 BTC + // Default form with 1 ECX this.form.get('bitcoin').setValue(1, { emitEvent: true }); } diff --git a/frontend/src/app/components/faucet/faucet.component.html b/frontend/src/app/components/faucet/faucet.component.html index dbe0f25ea07..5178e128ecd 100644 --- a/frontend/src/app/components/faucet/faucet.component.html +++ b/frontend/src/app/components/faucet/faucet.component.html @@ -61,7 +61,7 @@

Testnet4 Faucet

- Amount (sats) + Amount (szats)
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 52092274a09..c79c761390c 100644 --- a/frontend/src/app/components/master-page/master-page.component.html +++ b/frontend/src/app/components/master-page/master-page.component.html @@ -120,8 +120,8 @@
- diff --git a/frontend/src/app/components/push-transaction/push-transaction.component.html b/frontend/src/app/components/push-transaction/push-transaction.component.html index 8d8402fd360..1183f766259 100644 --- a/frontend/src/app/components/push-transaction/push-transaction.component.html +++ b/frontend/src/app/components/push-transaction/push-transaction.component.html @@ -17,10 +17,10 @@

- + - +
diff --git a/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.ts b/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.ts index b17fc34ab39..3713880346b 100644 --- a/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.ts +++ b/frontend/src/app/components/rate-unit-selector/rate-unit-selector.component.ts @@ -15,8 +15,8 @@ export class RateUnitSelectorComponent implements OnInit, OnDestroy { rateUnitForm: UntypedFormGroup; rateUnitSub: Subscription; units = [ - { name: 'vb', label: 'sat/vB' }, - { name: 'wu', label: 'sat/WU' }, + { name: 'vb', label: 'szat/vB' }, + { name: 'wu', label: 'szat/WU' }, ]; constructor( diff --git a/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html b/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html index 19c08bad930..96472981579 100644 --- a/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html +++ b/frontend/src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html @@ -19,7 +19,7 @@ Fee - {{ rbfInfo.tx.fee | number }} sats + {{ rbfInfo.tx.fee | number }} szats Virtual size diff --git a/frontend/src/app/components/reward-stats/reward-stats.component.html b/frontend/src/app/components/reward-stats/reward-stats.component.html index c437ac9e2a1..fcd6f448aad 100644 --- a/frontend/src/app/components/reward-stats/reward-stats.component.html +++ b/frontend/src/app/components/reward-stats/reward-stats.component.html @@ -18,7 +18,7 @@
{{ (rewardStats.feePerBlock / 100000000) | amountShortener: 4 }} - BTC/block + ECX/block
@@ -30,7 +30,7 @@ ngbTooltip="Avg Tx Fee" placement="bottom" #averagefee [disableTooltip]="!isEllipsisActive(averagefee)">Avg Tx Fee
{{ rewardStats.feePerTx | amountShortener: 2 }} - sats/tx + szats/tx
diff --git a/frontend/src/app/components/search-form/search-form.component.html b/frontend/src/app/components/search-form/search-form.component.html index 73e9d05014d..c9893c6985c 100644 --- a/frontend/src/app/components/search-form/search-form.component.html +++ b/frontend/src/app/components/search-form/search-form.component.html @@ -1,7 +1,7 @@
- +
diff --git a/frontend/src/app/components/statistics/statistics.component.html b/frontend/src/app/components/statistics/statistics.component.html index eb37cc8588b..8c7d2f3b12d 100644 --- a/frontend/src/app/components/statistics/statistics.component.html +++ b/frontend/src/app/components/statistics/statistics.component.html @@ -4,7 +4,7 @@
- Mempool by vBytes (sat/vByte) + Mempool by vBytes (szat/vByte) diff --git a/frontend/src/app/components/test-transactions/test-transactions.component.html b/frontend/src/app/components/test-transactions/test-transactions.component.html index 181db8b01e3..b9c40a9d023 100644 --- a/frontend/src/app/components/test-transactions/test-transactions.component.html +++ b/frontend/src/app/components/test-transactions/test-transactions.component.html @@ -9,7 +9,7 @@

Test Tra
- +
diff --git a/frontend/src/app/components/transaction/transaction-details/transaction-details.component.html b/frontend/src/app/components/transaction/transaction-details/transaction-details.component.html index 4ae01e01a9e..804936e94c5 100644 --- a/frontend/src/app/components/transaction/transaction-details/transaction-details.component.html +++ b/frontend/src/app/components/transaction/transaction-details/transaction-details.component.html @@ -213,9 +213,9 @@ @if (!isLoadingTx) { Fee - {{ (tx.fee | number) ?? '-' }} sats + {{ (tx.fee | number) ?? '-' }} szats @if (isAcceleration && (accelerationInfo?.bidBoost ?? tx.feeDelta > 0)) { - +{{ accelerationInfo?.bidBoost ?? tx.feeDelta | number }} sats + +{{ accelerationInfo?.bidBoost ?? tx.feeDelta | number }} szats } diff --git a/frontend/src/app/components/transaction/transaction-preview.component.html b/frontend/src/app/components/transaction/transaction-preview.component.html index 066e0d44282..e6fff9dcf66 100644 --- a/frontend/src/app/components/transaction/transaction-preview.component.html +++ b/frontend/src/app/components/transaction/transaction-preview.component.html @@ -21,7 +21,7 @@

‎{{ transactionTime * 1000 | date:'yyyy-MM-dd HH:mm' }} - Fee {{ tx.fee | number }} sats + Fee {{ tx.fee | number }} szats
diff --git a/frontend/src/app/components/transactions-list/transactions-list.component.html b/frontend/src/app/components/transactions-list/transactions-list.component.html index 56ba6c2b15b..17aa86bb42e 100644 --- a/frontend/src/app/components/transactions-list/transactions-list.component.html +++ b/frontend/src/app/components/transactions-list/transactions-list.component.html @@ -515,7 +515,7 @@
 – {{ tx.fee | number }} sats + i18n="shared.sats">szats
Show more inputs to reveal fee data
diff --git a/frontend/src/app/components/treasuries/treasuries-graph/treasuries-graph.component.ts b/frontend/src/app/components/treasuries/treasuries-graph/treasuries-graph.component.ts index f62bbd2f0b2..37bf006c3a1 100644 --- a/frontend/src/app/components/treasuries/treasuries-graph/treasuries-graph.component.ts +++ b/frontend/src/app/components/treasuries/treasuries-graph/treasuries-graph.component.ts @@ -341,18 +341,18 @@ export class TreasuriesGraphComponent implements OnInit, OnChanges, OnDestroy { formatter: (val): string => { const valSpan = maxValue - (this.period === 'all' ? 0 : minValue); if (valSpan > 100_000_000_000) { - return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 0, undefined, true)} BTC`; + return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 0, undefined, true)} ECX`; } else if (valSpan > 1_000_000_000) { - return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 2, undefined, true)} BTC`; + return `${this.amountShortenerPipe.transform(Math.round(val / 100_000_000), 2, undefined, true)} ECX`; } else if (valSpan > 100_000_000) { - return `${(val / 100_000_000).toFixed(1)} BTC`; + return `${(val / 100_000_000).toFixed(1)} ECX`; } else if (valSpan > 10_000_000) { - return `${(val / 100_000_000).toFixed(2)} BTC`; + return `${(val / 100_000_000).toFixed(2)} ECX`; } else if (valSpan > 1_000_000) { - return `${(val / 100_000_000).toFixed(3)} BTC`; + return `${(val / 100_000_000).toFixed(3)} ECX`; } else { - return `${this.amountShortenerPipe.transform(val, 0, undefined, true)} sats`; + return `${this.amountShortenerPipe.transform(val, 0, undefined, true)} szats`; } } }, @@ -389,7 +389,7 @@ export class TreasuriesGraphComponent implements OnInit, OnChanges, OnDestroy { } formatBTC(val: number): string { - return `${(val / 100_000_000).toFixed(4)} BTC`; + return `${(val / 100_000_000).toFixed(4)} ECX`; } onChartInit(ec) { diff --git a/frontend/src/app/components/treasuries/treasuries-pie/treasuries-pie.component.ts b/frontend/src/app/components/treasuries/treasuries-pie/treasuries-pie.component.ts index 917272758c2..f5e1f8db7dd 100644 --- a/frontend/src/app/components/treasuries/treasuries-pie/treasuries-pie.component.ts +++ b/frontend/src/app/components/treasuries/treasuries-pie/treasuries-pie.component.ts @@ -165,7 +165,7 @@ export class TreasuriesPieComponent implements OnChanges { borderColor: '#000', formatter: () => { return `${entry.label} (${entry.share.toFixed(2)}%)
- ${formatNumber(entry.balance / 100_000_000, this.locale, '1.3-3')} BTC
`; + ${formatNumber(entry.balance / 100_000_000, this.locale, '1.3-3')} ECX
`; } }, data: entry.treasury, @@ -197,7 +197,7 @@ export class TreasuriesPieComponent implements OnChanges { borderColor: '#000', formatter: () => { return `${otherEntry.label} (${otherEntry.share.toFixed(2)}%)
- ${formatNumber(otherEntry.balance / 100_000_000, this.locale, '1.3-3')} BTC
`; + ${formatNumber(otherEntry.balance / 100_000_000, this.locale, '1.3-3')} ECX
`; } }, } as PieSeriesOption); diff --git a/frontend/src/app/components/treasuries/treasuries.component.html b/frontend/src/app/components/treasuries/treasuries.component.html index 122e771838a..959713dba7a 100644 --- a/frontend/src/app/components/treasuries/treasuries.component.html +++ b/frontend/src/app/components/treasuries/treasuries.component.html @@ -16,7 +16,7 @@
Treasury Leaderboar Treasury - BTC Balance + ECX Balance USD Value diff --git a/frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.html b/frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.html index 09062ed7926..dfea43b678a 100644 --- a/frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.html +++ b/frontend/src/app/components/tx-fee-rating/tx-fee-rating.component.html @@ -1,3 +1,3 @@ Optimal -Overpaid {{ overpaidTimes }}x -Overpaid {{ overpaidTimes }}x +Overpaid {{ overpaidTimes }}x +Overpaid {{ overpaidTimes }}x diff --git a/frontend/src/app/components/wallet/wallet-preview.component.html b/frontend/src/app/components/wallet/wallet-preview.component.html index b2ce376141a..48059f65df2 100644 --- a/frontend/src/app/components/wallet/wallet-preview.component.html +++ b/frontend/src/app/components/wallet/wallet-preview.component.html @@ -14,7 +14,7 @@ {{ walletStats.utxos }} - Balance (BTC) + Balance (ECX) Balance (USD) 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 f78ad27c445..afa9ca51a0d 100644 --- a/frontend/src/app/docs/api-docs/api-docs.component.html +++ b/frontend/src/app/docs/api-docs/api-docs.component.html @@ -12,7 +12,7 @@
-

mempool.space merely provides data about the Bitcoin network. It cannot help you with retrieving funds, wallet issues, etc.

For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).

+

This explorer merely provides data about the eCash alphanet. It cannot help you with retrieving funds, wallet issues, etc.

For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).

@@ -47,7 +47,7 @@

{{ item.title }}

-

Below is a reference for the {{ network.val === '' ? 'Bitcoin' : network.val.charAt(0).toUpperCase() + network.val.slice(1) }} REST API service.

+

Below is a reference for the {{ network.val === '' ? 'ECX' : 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.

@@ -124,7 +124,7 @@

Below is a reference for the {{ network.val === '' ? 'Bitcoin' : network.val.charAt(0).toUpperCase() + network.val.slice(1) }} Websocket service running at {{ websocketUrl(network.val) }}.

+

Below is a reference for the {{ network.val === '' ? 'ECX' : network.val.charAt(0).toUpperCase() + network.val.slice(1) }} Websocket service running at {{ websocketUrl(network.val) }}.

Note that usage limits apply to our WebSocket API. Consider an enterprise sponsorship if you need higher API limits, such as higher tracking limits.

@@ -158,7 +158,7 @@

-

Below is a reference for the {{ network.val === '' ? 'Bitcoin' : network.val.charAt(0).toUpperCase() + network.val.slice(1) }} Electrum JSON-RPC v2.0 API.

+

Below is a reference for the {{ network.val === '' ? 'ECX' : network.val.charAt(0).toUpperCase() + network.val.slice(1) }} Electrum JSON-RPC v2.0 API.

Connection Information

@@ -234,7 +234,7 @@

-

A mempool explorer is a tool that enables you to view real-time and historical information about a node's mempool, visualize its transactions, and search and view those transactions.

The mempool.space website invented the concept of visualizing a Bitcoin node's mempool as projected blocks. These blocks are the inspiration for our half-filled block logo.

Projected blocks are on the left of the dotted white line, and confirmed blocks are on the right.

+

A mempool explorer is a tool that enables you to view real-time and historical information about a node's mempool, visualize its transactions, and search and view those transactions.

The mempool.space website invented the concept of visualizing an eCash node's mempool as projected blocks. These blocks are the inspiration for our half-filled block logo.

Projected blocks are on the left of the dotted white line, and confirmed blocks are on the right.

@@ -265,20 +265,20 @@

-

Virtual bytes (vB) and weight units (WU) are used to measure the size of transactions and blocks on the Bitcoin network.

-

A Bitcoin transaction's size in the blockchain is not determined how much bitcoin it transfers—instead, a transaction's size is determined by technical factors such as how many inputs and outputs it has, how many signatures it has, and the format it uses (legacy, SegWit, etc). Since space in the Bitcoin blockchain is limited, bigger transactions pay more in mining fees than smaller transactions.

+

Virtual bytes (vB) and weight units (WU) are used to measure the size of transactions and blocks on the eCash network.

+

An eCash transaction's size in the blockchain is not determined how much eCash it transfers—instead, a transaction's size is determined by technical factors such as how many inputs and outputs it has, how many signatures it has, and the format it uses (legacy, SegWit, etc). Since space in the eCash blockchain is limited, bigger transactions pay more in mining fees than smaller transactions.

Block sizes are limited to 4,000,000 WU (or 1,000,000 vB since 1 vB = 4 WU).

Transaction sizes and block sizes used to be measured in plain bytes, but virtual bytes and weight units were devised to maintain backward compatibility after the SegWit upgrade in 2017. See this post for more details.

-

The priority of a pending Bitcoin transaction is determined by its feerate. Feerates are measured in sat/vB.

-

Using a higher sat/vB feerate for a Bitcoin transaction will generally result in quicker confirmation than using a lower feerate. But feerates change all the time, so it's important to check suggested feerates right before making a transaction to avoid it from getting stuck.

+

The priority of a pending ECX transaction is determined by its feerate. Feerates are measured in szat/vB.

+

Using a higher szat/vB feerate for an ECX transaction will generally result in quicker confirmation than using a lower feerate. But feerates change all the time, so it's important to check suggested feerates right before making a transaction to avoid it from getting stuck.

There are feerate estimates on the top of the main dashboard you can use as a guide. See this FAQ for more on picking the right feerate.

-

If it's been a while and your transaction hasn't confirmed, your transaction is probably using a lower feerate relative to other transactions currently in the mempool. Depending on how you made your transaction, there may be ways to accelerate the process.

There's no need to panic—a Bitcoin transaction will always either confirm completely (or not at all) at some point. As long as you have your transaction's ID, you can always see where your funds are.

This site only provides data about the Bitcoin network. To get help with a transaction, get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).

+

If it's been a while and your transaction hasn't confirmed, your transaction is probably using a lower feerate relative to other transactions currently in the mempool. Depending on how you made your transaction, there may be ways to accelerate the process.

There's no need to panic—an eCash transaction will always either confirm completely (or not at all) at some point. As long as you have your transaction's ID, you can always see where your funds are.

This site only provides data about the eCash network. To get help with a transaction, get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).

@@ -302,7 +302,7 @@

-

See real-time fee estimates on the main dashboard.

Here is an overview of Mempool's feerate suggestions:

  • High Priority. This figure is the median feerate of transactions in the first mempool block. Consider using this feerate if you want confirmation as soon as possible.
  • Medium Priority. This figure is the average of the median feerate of the first mempool block and the median feerate of the second mempool block.
  • Low Priority. This figure is the average of the Medium Priority feerate and the median feerate of the third mempool block. Consider using this feerate if you want confirmation soon but don't need it particularly quickly.
  • No Priority. This figure is either 2x the minimum feerate, or the Low Priority feerate (whichever is lower). Consider using this feerate if you are in no rush and don't mind if confirmation takes a while.

In all cases, the suggested feerate is adjusted lower if any of the mempool blocks involved in the calculation are not full (example: if there is only 1 mempool block that's less than half-full, Mempool will suggest a feerate of 1 sat/vB—not the median feerate of transactions in the block).

Mempool blocks use feerates, transaction sizes, and other metrics to forecast which transactions will be in future blocks. Actual blocks will turn out to be different: miners have their own views of the mempool, their own algorithms for determining which transactions to include in a block, etc.

Ultimately, the Bitcoin network is not perfectly predictable, so fee estimation cannot be perfectly precise.

Use Mempool's feerate suggestions as a guide, and understand that they do not guarantee transaction confirmation in any period of time.

+

See real-time fee estimates on the main dashboard.

Here is an overview of this explorer's feerate suggestions:

  • High Priority. This figure is the median feerate of transactions in the first mempool block. Consider using this feerate if you want confirmation as soon as possible.
  • Medium Priority. This figure is the average of the median feerate of the first mempool block and the median feerate of the second mempool block.
  • Low Priority. This figure is the average of the Medium Priority feerate and the median feerate of the third mempool block. Consider using this feerate if you want confirmation soon but don't need it particularly quickly.
  • No Priority. This figure is either 2x the minimum feerate, or the Low Priority feerate (whichever is lower). Consider using this feerate if you are in no rush and don't mind if confirmation takes a while.

In all cases, the suggested feerate is adjusted lower if any of the mempool blocks involved in the calculation are not full (example: if there is only 1 mempool block that's less than half-full, this explorer will suggest a feerate of 1 szat/vB—not the median feerate of transactions in the block).

Mempool blocks use feerates, transaction sizes, and other metrics to forecast which transactions will be in future blocks. Actual blocks will turn out to be different: miners have their own views of the mempool, their own algorithms for determining which transactions to include in a block, etc.

Ultimately, the network is not perfectly predictable, so fee estimation cannot be perfectly precise.

Use this explorer's feerate suggestions as a guide, and understand that they do not guarantee transaction confirmation in any period of time.

@@ -310,19 +310,19 @@

-

When a Bitcoin transaction is made, it is stored in a Bitcoin node's mempool before it is confirmed into a block. When the rate of incoming transactions exceeds the rate transactions are confirmed, the mempool grows in size.

By default, Bitcoin Core allocates 300MB of memory for its mempool, so when a node's mempool grows big enough to use all 300MB of allocated memory, we say it's "full".

Once a node's mempool is using all of its allocated memory, it will start rejecting new transactions below a certain feerate threshold—so when this is the case, be extra sure to set a feerate that (at a minimum) exceeds that threshold. The current threshold feerate (and memory usage) are displayed right on Mempool's front page.

+

When an eCash transaction is made, it is stored in an eCash node's mempool before it is confirmed into a block. When the rate of incoming transactions exceeds the rate transactions are confirmed, the mempool grows in size.

By default, Bitcoin Core allocates 300MB of memory for its mempool, so when a node's mempool grows big enough to use all 300MB of allocated memory, we say it's "full".

Once a node's mempool is using all of its allocated memory, it will start rejecting new transactions below a certain feerate threshold—so when this is the case, be extra sure to set a feerate that (at a minimum) exceeds that threshold. The current threshold feerate (and memory usage) are displayed right on Mempool's front page.

-

mempool.space uses multiple Bitcoin nodes to obtain data: some with the default 300MB mempool memory limit (call these Small Nodes) and others with a much larger mempool memory limit (call these Big Nodes).

-

Many nodes on the Bitcoin network are configured to run with the default 300MB mempool memory setting. When all 300MB of memory are used up, such nodes will reject transactions below a certain threshold feerate. Running Small Nodes allows mempool.space to tell you what this threshold feerate is—this is the "Purging" feerate that shows on the front page when mempools are full, which you can use to be reasonably sure that your transaction will be widely propagated.

+

mempool.space uses multiple eCash nodes to obtain data: some with the default 300MB mempool memory limit (call these Small Nodes) and others with a much larger mempool memory limit (call these Big Nodes).

+

Many nodes on the eCash network are configured to run with the default 300MB mempool memory setting. When all 300MB of memory are used up, such nodes will reject transactions below a certain threshold feerate. Running Small Nodes allows mempool.space to tell you what this threshold feerate is—this is the "Purging" feerate that shows on the front page when mempools are full, which you can use to be reasonably sure that your transaction will be widely propagated.

Big Node mempools are so big that they don't need to reject (or purge) transactions. Such nodes allow for mempool.space to provide you with information on any pending transaction it has received—no matter how congested the mempool is, and no matter how low-feerate or low-priority the transaction is.

-

Memory usage on the front page refers to the real-time amount of system memory used by a Bitcoin node's mempool. This memory usage number is always higher than the total size of all pending transactions in the mempool due to indexes, pointers, and other overhead used by Bitcoin Core for storage and processing.

-

mempool.space shows the memory usage of a Bitcoin node that has a very high mempool memory limit. As a result, when mempools fill up, you may notice memory usage on mempool.space go beyond 300MB. This is not a mistake—this memory usage figure is high because it's for a Bitcoin node that isn't rejecting (or evicting) transactions. Consider it to be another data point to give you an idea of how congested the mempool is relative to the default memory limit of 300MB.

-

A Bitcoin node running the default 300MB mempool memory limit, like most Raspberry Pi nodes, will never go past 300MB of memory usage.

+

Memory usage on the front page refers to the real-time amount of system memory used by an eCash node's mempool. This memory usage number is always higher than the total size of all pending transactions in the mempool due to indexes, pointers, and other overhead used by Bitcoin Core for storage and processing.

+

mempool.space shows the memory usage of an eCash node that has a very high mempool memory limit. As a result, when mempools fill up, you may notice memory usage on mempool.space go beyond 300MB. This is not a mistake—this memory usage figure is high because it's for an eCash node that isn't rejecting (or evicting) transactions. Consider it to be another data point to give you an idea of how congested the mempool is relative to the default memory limit of 300MB.

+

An eCash node running the default 300MB mempool memory limit, like most Raspberry Pi nodes, will never go past 300MB of memory usage.

@@ -330,7 +330,7 @@

-

Block validation rules do not strictly require that a block's timestamp be more recent than the timestamp of the block preceding it. Without a central authority, it's impossible to know what the exact correct time is. Instead, the Bitcoin protocol requires that a block's timestamp meet certain requirements. One of those requirements is that a block's timestamp cannot be older than the median timestamp of the 12 blocks that came before it. See more details here.

As a result, timestamps are only accurate to within an hour or so, which sometimes results in blocks with timestamps that appear out of order.

+

Block validation rules do not strictly require that a block's timestamp be more recent than the timestamp of the block preceding it. Without a central authority, it's impossible to know what the exact correct time is. Instead, the eCash protocol requires that a block's timestamp meet certain requirements. One of those requirements is that a block's timestamp cannot be older than the median timestamp of the 12 blocks that came before it. See more details here.

As a result, timestamps are only accurate to within an hour or so, which sometimes results in blocks with timestamps that appear out of order.

@@ -352,7 +352,7 @@

block health.

-
  • ■Recently broadcasted

    A transaction is highlighted dark pink if it is present in the expected block, not present in the actual block, and was first seen by Mempool's Bitcoin node within 3 minutes of the block being mined.

    Due to network latency and other factors, it can take time for a miner's Bitcoin nodes to receive a transaction, so we do not assume a miner has intentionally excluded such a transaction from a block.

    Recently-broadcasted transactions do not negatively affect block health.

  • +
  • ■Recently broadcasted

    A transaction is highlighted dark pink if it is present in the expected block, not present in the actual block, and was first seen by Mempool's eCash node within 3 minutes of the block being mined.

    Due to network latency and other factors, it can take time for a miner's eCash nodes to receive a transaction, so we do not assume a miner has intentionally excluded such a transaction from a block.

    Recently-broadcasted transactions do not negatively affect block health.

  • ■Marginal fee

    A transaction is darkened if it is in the low end of the expected feerate range and missing in either the expected block or the actual block.

    Such a transaction may have been displaced by an added transaction, or it may have been displaced by another transaction from the mempool that was also at the low end of the expected feerate range for the block. In either case, the deviation is not considered notable.

    Marginal fee transactions do not negatively affect block health.

  • @@ -429,7 +429,7 @@

    Sighash Flags
    - Different ways of signing inputs to Bitcoin transactions. Note that selecting multiple sighash filters will highlight transactions in which each sighash flag is used, but not necessarily in the same input. + Different ways of signing inputs to eCash transactions. Note that selecting multiple sighash filters will highlight transactions in which each sighash flag is used, but not necessarily in the same input.
    sighash_all
    sighash_none
    @@ -467,13 +467,13 @@

    -

    A "sigop" is a way of accounting for the cost of "signature operations" in Bitcoin script, like OP_CHECKSIG, OP_CHECKSIGVERIFY, OP_CHECKMULTISIG and OP_CHECKMULTISIGVERIFY

    -

    These signature operations incur different costs depending on whether they are single or multi-sig operations, and on where they appear in a Bitcoin transaction.

    -

    By consensus, each Bitcoin block is permitted to include a maximum of 80,000 sigops.

    +

    A "sigop" is a way of accounting for the cost of "signature operations" in eCash script, like OP_CHECKSIG, OP_CHECKSIGVERIFY, OP_CHECKMULTISIG and OP_CHECKMULTISIGVERIFY

    +

    These signature operations incur different costs depending on whether they are single or multi-sig operations, and on where they appear in an eCash transaction.

    +

    By consensus, each eCash block is permitted to include a maximum of 80,000 sigops.

    -

    Bitcoin blocks have two independent consensus-enforced resource constraints - a 4MWU weight limit, and the 80,000 sigop limit.

    +

    eCash blocks have two independent consensus-enforced resource constraints - a 4MWU weight limit, and the 80,000 sigop limit.

    Most transactions use more of the weight limit than the sigop limit. However, some transactions use a disproportionate number of sigops compared to their weight.

    To account for this, Bitcoin Core calculates and uses an "adjusted vsize" equal 5 times the number of sigops, or the unadjusted vsize, whichever is larger.

    Then, during block template construction, Bitcoin Core selects transactions in descending order of fee rate measured in satoshis per adjusted vsize

    @@ -489,7 +489,7 @@

    - The official mempool.space website is operated by The Mempool Open Source Project. See more information on our About page. There are also many unofficial instances of this website operated by individual members of the Bitcoin community. + This explorer is operated by L2L Labs for the eCash alphanet. It runs a fork of The Mempool Open Source Project, which is not affiliated with it and does not endorse it. diff --git a/frontend/src/app/master-page.module.ts b/frontend/src/app/master-page.module.ts index 8525a7bf4bf..2c776b99477 100644 --- a/frontend/src/app/master-page.module.ts +++ b/frontend/src/app/master-page.module.ts @@ -44,10 +44,6 @@ const routes: Routes = [ path: 'tx/test', component: TestTransactionsComponent, }, - { - path: 'about', - loadChildren: () => import('@components/about/about.module').then(m => m.AboutModule), - }, { path: 'blocks/stale', component: StaleList, @@ -74,18 +70,6 @@ const routes: Routes = [ } ] }] : []), - { - path: 'terms-of-service', - loadChildren: () => import('@components/terms-of-service/terms-of-service.module').then(m => m.TermsOfServiceModule), - }, - { - path: 'privacy-policy', - loadChildren: () => import('@components/privacy-policy/privacy-policy.module').then(m => m.PrivacyPolicyModule), - }, - { - path: 'trademark-policy', - loadChildren: () => import('@components/trademark-policy/trademark-policy.module').then(m => m.TrademarkModule), - }, { path: 'tx', component: StartComponent, diff --git a/frontend/src/app/services/seo.service.ts b/frontend/src/app/services/seo.service.ts index 55ea1bf9c43..f1dcba7099e 100644 --- a/frontend/src/app/services/seo.service.ts +++ b/frontend/src/app/services/seo.service.ts @@ -9,9 +9,9 @@ import { StateService } from '@app/services/state.service'; }) export class SeoService { network = ''; - baseTitle = 'mempool'; - baseDescription = 'Explore the full Bitcoin ecosystem® with The Mempool Open Source Project®.'; - baseDomain = 'mempool.space'; + baseTitle = 'eCash Alphanet Explorer'; + baseDescription = 'Blocks, transactions, mempool and mining pools for the eCash alphanet.'; + baseDomain = 'explorer.alpha.ecash.ninja'; canonicalLink: HTMLLinkElement = document.getElementById('canonical') as HTMLLinkElement; @@ -97,7 +97,7 @@ export class SeoService { {return this.baseTitle + ' - Liquid Network';} if (this.network === 'liquidtestnet') {return this.baseTitle + ' - Liquid Testnet';} - return this.baseTitle + ' - ' + (this.network ? this.ucfirst(this.network) : 'Bitcoin') + ' Explorer'; + return this.baseTitle; } getDescription(): string { diff --git a/frontend/src/app/shared/common.utils.ts b/frontend/src/app/shared/common.utils.ts index 30a81cb0f46..435071f907e 100644 --- a/frontend/src/app/shared/common.utils.ts +++ b/frontend/src/app/shared/common.utils.ts @@ -205,12 +205,12 @@ export function renderSats(value: number, network: string, mode: 'sats' | 'btc' break; } if (mode === 'btc' || (mode === 'auto' && value >= 1000000)) { - return `${amountShortenerPipe.transform(value / 100000000, 2)} ${prefix}BTC`; + return `${amountShortenerPipe.transform(value / 100000000, 2)} ${prefix}ECX`; } else { if (prefix.length) { prefix += '-'; } - return `${amountShortenerPipe.transform(value, 2)} ${prefix}sats`; + return `${amountShortenerPipe.transform(value, 2)} ${prefix}szats`; } } diff --git a/frontend/src/app/shared/components/btc/btc.component.ts b/frontend/src/app/shared/components/btc/btc.component.ts index 038502b6712..d027eadc276 100644 --- a/frontend/src/app/shared/components/btc/btc.component.ts +++ b/frontend/src/app/shared/components/btc/btc.component.ts @@ -36,10 +36,10 @@ export class BtcComponent implements OnInit, OnChanges { ngOnChanges(changes: SimpleChanges): void { if (this.satoshis >= 1_000_000) { this.value = (this.satoshis / 100_000_000); - this.unit = 'BTC'; + this.unit = 'ECX'; } else { this.value = Math.round(this.satoshis); - this.unit = 'sats'; + this.unit = 'szats'; } } } diff --git a/frontend/src/app/shared/components/fee-rate/fee-rate.component.html b/frontend/src/app/shared/components/fee-rate/fee-rate.component.html index 0f4491dd17c..0efd7c9dc81 100644 --- a/frontend/src/app/shared/components/fee-rate/fee-rate.component.html +++ b/frontend/src/app/shared/components/fee-rate/fee-rate.component.html @@ -1,10 +1,10 @@ - {{ fee / (weight / 4) | feeRounding:rounding:dp }} sat/vB - {{ fee / weight | feeRounding:rounding:dp }} sat/WU + {{ fee / (weight / 4) | feeRounding:rounding:dp }} szat/vB + {{ fee / weight | feeRounding:rounding:dp }} szat/WU - - sat/vB - - sat/WU + - szat/vB + - szat/WU \ No newline at end of file diff --git a/frontend/src/app/shared/components/global-footer/global-footer.component.html b/frontend/src/app/shared/components/global-footer/global-footer.component.html index 026c0ab47da..9a1efbb6883 100644 --- a/frontend/src/app/shared/components/global-footer/global-footer.component.html +++ b/frontend/src/app/shared/components/global-footer/global-footer.component.html @@ -86,7 +86,7 @@

    What is a block explorer?

    What is a mempool explorer?

    Why isn't my transaction confirming?

    -

    Be your own explorer™

    +

    Run your own node

    More FAQs »

    Research

    @@ -109,23 +109,16 @@

    Calculator

    +

    @@ -134,7 +127,7 @@ {{ (backendInfo$ | async)?.hostname }} (v{{ (backendInfo$ | async )?.version }}) [{{ (backendInfo$ | async )?.gitCommit | slice:0:8 }}] [{{ (servicesBackendInfo$ | async )?.gitCommit | slice:0:8 }}]

    -

    v{{ packetJsonVersion }} [{{ frontendGitCommitHash }}]

    +

    v{{ packetJsonVersion }} [{{ frontendGitCommitHash }}]

    diff --git a/frontend/src/app/shared/components/sats/sats.component.html b/frontend/src/app/shared/components/sats/sats.component.html index bdd718e9f56..9add7f520ce 100644 --- a/frontend/src/app/shared/components/sats/sats.component.html +++ b/frontend/src/app/shared/components/sats/sats.component.html @@ -5,5 +5,5 @@ tL- t- t- - s-sats + s-szats \ No newline at end of file diff --git a/frontend/src/index.mempool.html b/frontend/src/index.mempool.html index cde210665ca..951989121d5 100644 --- a/frontend/src/index.mempool.html +++ b/frontend/src/index.mempool.html @@ -6,7 +6,7 @@ - mempool - Bitcoin Explorer + eCash Alphanet Explorer @@ -18,18 +18,22 @@ - - - - - + + + + + + + + + + - - - - - - + + + + + @@ -38,7 +42,8 @@ - + +