Compare commits
44 Commits
v3.0.0-alp
...
v3.0.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
15f10736e2 | ||
|
|
924399df46 | ||
|
|
cddff129b3 | ||
|
|
7c90e8ae06 | ||
|
|
34d996c7cb | ||
|
|
641a2ae3ae | ||
|
|
11a849ef28 | ||
|
|
7b0347e846 | ||
|
|
bb1352ed58 | ||
|
|
fa6456b92c | ||
|
|
bfea19238b | ||
|
|
36b91cfdfd | ||
|
|
7b56212064 | ||
|
|
d4be3c2c4c | ||
|
|
3a9f06f651 | ||
|
|
e652eb339d | ||
|
|
96435c329f | ||
|
|
1c69613d65 | ||
|
|
3707763e30 | ||
|
|
b6ce8229f0 | ||
|
|
b62ae9b6f6 | ||
|
|
f61ace2f92 | ||
|
|
2b572f2494 | ||
|
|
c0e4c1efe1 | ||
|
|
8078caaa89 | ||
|
|
5eb117165f | ||
|
|
a2dcf0d545 | ||
|
|
212d58f917 | ||
|
|
d1eec80afb | ||
|
|
05c6709926 | ||
|
|
f1a48db9ee | ||
|
|
76ce43d289 | ||
|
|
51f5b728f3 | ||
|
|
8fa1863aff | ||
|
|
e3d1d9c1c0 | ||
|
|
f2f8d91e10 | ||
|
|
11ef090846 | ||
|
|
5cacd2635e | ||
|
|
1b4780c25b | ||
|
|
5ea44f2e7d | ||
|
|
261c794817 | ||
|
|
de9fae5cd7 | ||
|
|
439c52af30 | ||
|
|
e378df4158 |
4
backend/package-lock.json
generated
4
backend/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "mempool-backend",
|
"name": "mempool-backend",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "mempool-backend",
|
"name": "mempool-backend",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GNU Affero General Public License v3.0",
|
"license": "GNU Affero General Public License v3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mempool-backend",
|
"name": "mempool-backend",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"description": "Bitcoin mempool visualizer and blockchain explorer backend",
|
"description": "Bitcoin mempool visualizer and blockchain explorer backend",
|
||||||
"license": "GNU Affero General Public License v3.0",
|
"license": "GNU Affero General Public License v3.0",
|
||||||
"homepage": "https://mempool.space",
|
"homepage": "https://mempool.space",
|
||||||
|
|||||||
@@ -653,9 +653,11 @@ class DatabaseMigration {
|
|||||||
await this.$executeQuery('ALTER TABLE `prices` ADD `TRY` float DEFAULT "-1"');
|
await this.$executeQuery('ALTER TABLE `prices` ADD `TRY` float DEFAULT "-1"');
|
||||||
await this.$executeQuery('ALTER TABLE `prices` ADD `ZAR` float DEFAULT "-1"');
|
await this.$executeQuery('ALTER TABLE `prices` ADD `ZAR` float DEFAULT "-1"');
|
||||||
|
|
||||||
|
if (isBitcoin === true) {
|
||||||
await this.$executeQuery('TRUNCATE hashrates');
|
await this.$executeQuery('TRUNCATE hashrates');
|
||||||
await this.$executeQuery('TRUNCATE difficulty_adjustments');
|
await this.$executeQuery('TRUNCATE difficulty_adjustments');
|
||||||
await this.$executeQuery(`UPDATE state SET string = NULL WHERE name = 'pools_json_sha'`);
|
await this.$executeQuery(`UPDATE state SET string = NULL WHERE name = 'pools_json_sha'`);
|
||||||
|
}
|
||||||
|
|
||||||
await this.updateToSchemaVersion(75);
|
await this.updateToSchemaVersion(75);
|
||||||
}
|
}
|
||||||
@@ -692,7 +694,7 @@ class DatabaseMigration {
|
|||||||
await this.updateToSchemaVersion(80);
|
await this.updateToSchemaVersion(80);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (databaseSchemaVersion < 81) {
|
if (databaseSchemaVersion < 81 && isBitcoin === true) {
|
||||||
await this.$executeQuery('ALTER TABLE `blocks_audits` ADD version INT NOT NULL DEFAULT 0');
|
await this.$executeQuery('ALTER TABLE `blocks_audits` ADD version INT NOT NULL DEFAULT 0');
|
||||||
await this.$executeQuery('ALTER TABLE `blocks_audits` ADD INDEX `version` (`version`)');
|
await this.$executeQuery('ALTER TABLE `blocks_audits` ADD INDEX `version` (`version`)');
|
||||||
await this.$executeQuery('ALTER TABLE `blocks_audits` ADD unseen_txs JSON DEFAULT "[]"');
|
await this.$executeQuery('ALTER TABLE `blocks_audits` ADD unseen_txs JSON DEFAULT "[]"');
|
||||||
|
|||||||
@@ -470,7 +470,7 @@ class MiningRoutes {
|
|||||||
res.setHeader('expires', -1);
|
res.setHeader('expires', -1);
|
||||||
try {
|
try {
|
||||||
accelerationApi.accelerationRequested(req.params.txid);
|
accelerationApi.accelerationRequested(req.params.txid);
|
||||||
res.status(200).send('ok');
|
res.status(200).send();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
res.status(500).send(e instanceof Error ? e.message : e);
|
res.status(500).send(e instanceof Error ? e.message : e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -750,7 +750,7 @@
|
|||||||
},
|
},
|
||||||
"backendInfo": {
|
"backendInfo": {
|
||||||
"hostname": "node205.tk7.mempool.space",
|
"hostname": "node205.tk7.mempool.space",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"gitCommit": "abbc8a134",
|
"gitCommit": "abbc8a134",
|
||||||
"lightning": false
|
"lightning": false
|
||||||
},
|
},
|
||||||
|
|||||||
4
frontend/package-lock.json
generated
4
frontend/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "mempool-frontend",
|
"name": "mempool-frontend",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "mempool-frontend",
|
"name": "mempool-frontend",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"license": "GNU Affero General Public License v3.0",
|
"license": "GNU Affero General Public License v3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular-devkit/build-angular": "^17.3.1",
|
"@angular-devkit/build-angular": "^17.3.1",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mempool-frontend",
|
"name": "mempool-frontend",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"description": "Bitcoin mempool visualizer and blockchain explorer backend",
|
"description": "Bitcoin mempool visualizer and blockchain explorer backend",
|
||||||
"license": "GNU Affero General Public License v3.0",
|
"license": "GNU Affero General Public License v3.0",
|
||||||
"homepage": "https://mempool.space",
|
"homepage": "https://mempool.space",
|
||||||
|
|||||||
@@ -403,14 +403,14 @@
|
|||||||
}
|
}
|
||||||
@if (canPayWithApplePay) {
|
@if (canPayWithApplePay) {
|
||||||
@if (canPayWithCashapp) { <span class="mt-1 mb-1"></span> }
|
@if (canPayWithCashapp) { <span class="mt-1 mb-1"></span> }
|
||||||
<div class="paymentMethod mx-2" style="width: 200px; height: 55px">
|
<div class="paymentMethod mx-2" style="width: 200px; height: 55px" (click)="moveToStep('applepay')">
|
||||||
<img src="/resources/apple-pay.png" height=37 (click)="moveToStep('applepay')">
|
<img src="/resources/apple-pay.png" height=37>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if (canPayWithGooglePay) {
|
@if (canPayWithGooglePay) {
|
||||||
@if (canPayWithCashapp || canPayWithApplePay) { <span class="mt-1 mb-1"></span> }
|
@if (canPayWithCashapp || canPayWithApplePay) { <span class="mt-1 mb-1"></span> }
|
||||||
<div class="paymentMethod mx-2" style="width: 200px; height: 55px">
|
<div class="paymentMethod mx-2" style="width: 200px; height: 55px" (click)="moveToStep('googlepay')">
|
||||||
<img src="/resources/google-pay.png" height=37 (click)="moveToStep('googlepay')">
|
<img src="/resources/google-pay.png" height=37>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { MiningStats } from '../../services/mining.service';
|
|||||||
import { IAuth, AuthServiceMempool } from '../../services/auth.service';
|
import { IAuth, AuthServiceMempool } from '../../services/auth.service';
|
||||||
import { EnterpriseService } from '../../services/enterprise.service';
|
import { EnterpriseService } from '../../services/enterprise.service';
|
||||||
import { ApiService } from '../../services/api.service';
|
import { ApiService } from '../../services/api.service';
|
||||||
|
import { isDevMode } from '@angular/core';
|
||||||
|
|
||||||
export type PaymentMethod = 'balance' | 'bitcoin' | 'cashapp' | 'applePay' | 'googlePay';
|
export type PaymentMethod = 'balance' | 'bitcoin' | 'cashapp' | 'applePay' | 'googlePay';
|
||||||
|
|
||||||
@@ -82,6 +83,13 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
timePaid: number = 0; // time acceleration requested
|
timePaid: number = 0; // time acceleration requested
|
||||||
math = Math;
|
math = Math;
|
||||||
isMobile: boolean = window.innerWidth <= 767.98;
|
isMobile: boolean = window.innerWidth <= 767.98;
|
||||||
|
isProdDomain = ['mempool.space',
|
||||||
|
'mempool-staging.va1.mempool.space',
|
||||||
|
'mempool-staging.fmt.mempool.space',
|
||||||
|
'mempool-staging.fra.mempool.space',
|
||||||
|
'mempool-staging.tk7.mempool.space',
|
||||||
|
'mempool-staging.sg1.mempool.space'
|
||||||
|
].indexOf(document.location.hostname) > -1;
|
||||||
|
|
||||||
private _step: CheckoutStep = 'summary';
|
private _step: CheckoutStep = 'summary';
|
||||||
simpleMode: boolean = true;
|
simpleMode: boolean = true;
|
||||||
@@ -398,15 +406,14 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
* Square
|
* Square
|
||||||
*/
|
*/
|
||||||
insertSquare(): void {
|
insertSquare(): void {
|
||||||
|
if (!this.isProdDomain && !isDevMode()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (window['Square']) {
|
if (window['Square']) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let statsUrl = 'https://sandbox.web.squarecdn.com/v1/square.js';
|
let statsUrl = 'https://sandbox.web.squarecdn.com/v1/square.js';
|
||||||
if (document.location.hostname === 'mempool-staging.fmt.mempool.space' ||
|
if (this.isProdDomain) {
|
||||||
document.location.hostname === 'mempool-staging.va1.mempool.space' ||
|
|
||||||
document.location.hostname === 'mempool-staging.fra.mempool.space' ||
|
|
||||||
document.location.hostname === 'mempool-staging.tk7.mempool.space' ||
|
|
||||||
document.location.hostname === 'mempool.space') {
|
|
||||||
statsUrl = '/square/v1/square.js';
|
statsUrl = '/square/v1/square.js';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,6 +423,9 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
setupSquare(): void {
|
setupSquare(): void {
|
||||||
|
if (!this.isProdDomain && !isDevMode()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
const init = (): void => {
|
const init = (): void => {
|
||||||
this.initSquare();
|
this.initSquare();
|
||||||
};
|
};
|
||||||
@@ -654,11 +664,11 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
amount: costUSD.toFixed(2),
|
amount: costUSD.toFixed(2),
|
||||||
label: 'Total',
|
label: 'Total',
|
||||||
pending: true,
|
pending: true,
|
||||||
productUrl: `${redirectHostname}/tracker/${this.tx.txid}`,
|
productUrl: `${redirectHostname}/tx/${this.tx.txid}`,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.cashAppPay = await this.payments.cashAppPay(paymentRequest, {
|
this.cashAppPay = await this.payments.cashAppPay(paymentRequest, {
|
||||||
redirectURL: `${redirectHostname}/tracker/${this.tx.txid}`,
|
redirectURL: `${redirectHostname}/tx/${this.tx.txid}`,
|
||||||
referenceId: `accelerator-${this.tx.txid.substring(0, 15)}-${Math.round(new Date().getTime() / 1000)}`
|
referenceId: `accelerator-${this.tx.txid.substring(0, 15)}-${Math.round(new Date().getTime() / 1000)}`
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -795,7 +805,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get canPayWithCashapp(): boolean {
|
get canPayWithCashapp(): boolean {
|
||||||
if (!this.cashappEnabled || !this.conversions) {
|
if (!this.cashappEnabled || !this.conversions || (!this.isProdDomain && !isDevMode())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -811,7 +821,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get canPayWithApplePay(): boolean {
|
get canPayWithApplePay(): boolean {
|
||||||
if (!this.applePayEnabled || !this.conversions) {
|
if (!this.applePayEnabled || !this.conversions || (!this.isProdDomain && !isDevMode())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -827,7 +837,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get canPayWithGooglePay(): boolean {
|
get canPayWithGooglePay(): boolean {
|
||||||
if (!this.googlePayEnabled || !this.conversions) {
|
if (!this.googlePayEnabled || !this.conversions || (!this.isProdDomain && !isDevMode())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,9 @@
|
|||||||
<td class="field-value" [class]="chartPositionLeft ? 'chart-left' : ''">
|
<td class="field-value" [class]="chartPositionLeft ? 'chart-left' : ''">
|
||||||
<div class="effective-fee-container">
|
<div class="effective-fee-container">
|
||||||
@if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) {
|
@if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) {
|
||||||
<app-fee-rate [fee]="accelerationInfo.acceleratedFeeRate"></app-fee-rate>
|
<app-fee-rate class="oobFees" [fee]="accelerationInfo.acceleratedFeeRate"></app-fee-rate>
|
||||||
} @else {
|
} @else {
|
||||||
<app-fee-rate [fee]="tx.effectiveFeePerVsize"></app-fee-rate>
|
<app-fee-rate class="oobFees" [fee]="tx.effectiveFeePerVsize"></app-fee-rate>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -62,3 +62,7 @@
|
|||||||
overflow: visible !important;
|
overflow: visible !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.oobFees {
|
||||||
|
color: #905cf4;
|
||||||
|
}
|
||||||
@@ -2,10 +2,12 @@
|
|||||||
<div class="graph-alignment" [class.grid-align]="!autofit" [style.gridTemplateColumns]="'repeat(auto-fit, ' + resolution + 'px)'">
|
<div class="graph-alignment" [class.grid-align]="!autofit" [style.gridTemplateColumns]="'repeat(auto-fit, ' + resolution + 'px)'">
|
||||||
<div class="block-overview-graph">
|
<div class="block-overview-graph">
|
||||||
<canvas *browserOnly class="block-overview-canvas" [class.clickable]="!!hoverTx" #blockCanvas></canvas>
|
<canvas *browserOnly class="block-overview-canvas" [class.clickable]="!!hoverTx" #blockCanvas></canvas>
|
||||||
<div class="loader-wrapper" [class.hidden]="(!isLoading || disableSpinner) && !unavailable">
|
@if (!disableSpinner) {
|
||||||
|
<div class="loader-wrapper" [class.hidden]="!isLoading && !unavailable">
|
||||||
<div *ngIf="!unavailable" class="spinner-border ml-3 loading" role="status"></div>
|
<div *ngIf="!unavailable" class="spinner-border ml-3 loading" role="status"></div>
|
||||||
<div *ngIf="!isLoading && unavailable" class="ml-3" i18n="block.not-available">not available</div>
|
<div *ngIf="!isLoading && unavailable" class="ml-3" i18n="block.not-available">not available</div>
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
<app-block-overview-tooltip
|
<app-block-overview-tooltip
|
||||||
[tx]="selectedTx || hoverTx"
|
[tx]="selectedTx || hoverTx"
|
||||||
[cursorPosition]="tooltipPosition"
|
[cursorPosition]="tooltipPosition"
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
@if (replaced) {
|
@if (replaced) {
|
||||||
<div class="alert-replaced" role="alert">
|
<div class="alert-replaced" role="alert">
|
||||||
<span i18n="transaction.rbf.replacement|RBF replacement">This transaction has been replaced by:</span>
|
<span i18n="transaction.rbf.replacement|RBF replacement">This transaction has been replaced by:</span>
|
||||||
<app-truncate [text]="latestReplacement" [lastChars]="12" [link]="['/tracker/' | relativeUrl, latestReplacement]"></app-truncate>
|
<app-truncate [text]="latestReplacement" [lastChars]="12" [link]="['/tx/' | relativeUrl, latestReplacement]" [queryParams]="{mode: 'status'}"></app-truncate>
|
||||||
</div>
|
</div>
|
||||||
} @else {
|
} @else {
|
||||||
<div class="tracker-bar">
|
<div class="tracker-bar">
|
||||||
@@ -118,7 +118,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<span class="explainer"> </span>
|
<span class="explainer"> </span>
|
||||||
} @else {
|
} @else {
|
||||||
@if (!tx.status?.confirmed && showAccelerationSummary) {
|
@if (tx && !tx.status?.confirmed && showAccelerationSummary) {
|
||||||
<ng-container *ngIf="(ETA$ | async) as eta;">
|
<ng-container *ngIf="(ETA$ | async) as eta;">
|
||||||
<app-accelerate-checkout
|
<app-accelerate-checkout
|
||||||
*ngIf="(da$ | async) as da;"
|
*ngIf="(da$ | async) as da;"
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
></app-accelerate-checkout>
|
></app-accelerate-checkout>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
}
|
}
|
||||||
<div class="status-panel d-flex flex-column h-100 w-100 justify-content-center align-items-center" [class.small-status]="!tx.status?.confirmed && showAccelerationSummary">
|
<div class="status-panel d-flex flex-column h-100 w-100 justify-content-center align-items-center" [class.small-status]="tx && !tx.status?.confirmed && showAccelerationSummary">
|
||||||
@if (tx?.acceleration && !tx.status?.confirmed) {
|
@if (tx?.acceleration && !tx.status?.confirmed) {
|
||||||
<div class="progress-icon">
|
<div class="progress-icon">
|
||||||
<fa-icon [icon]="['fas', 'wand-magic-sparkles']" [fixedWidth]="true"></fa-icon>
|
<fa-icon [icon]="['fas', 'wand-magic-sparkles']" [fixedWidth]="true"></fa-icon>
|
||||||
@@ -186,7 +186,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="footer-link"
|
<div class="footer-link"
|
||||||
[routerLink]="['/tx' | relativeUrl, tx?.txid]"
|
[routerLink]="['/tx' | relativeUrl, tx?.txid || txId]"
|
||||||
[queryParams]="{ mode: 'details' }"
|
[queryParams]="{ mode: 'details' }"
|
||||||
queryParamsHandling="merge"
|
queryParamsHandling="merge"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -606,7 +606,14 @@
|
|||||||
@if (!isLoadingTx) {
|
@if (!isLoadingTx) {
|
||||||
<tr>
|
<tr>
|
||||||
<td class="td-width" i18n="transaction.fee|Transaction fee">Fee</td>
|
<td class="td-width" i18n="transaction.fee|Transaction fee">Fee</td>
|
||||||
<td>{{ tx.fee | number }} <span class="symbol" i18n="shared.sat|sat">sat</span> <span class="fiat"><app-fiat [blockConversion]="tx.price" [value]="tx.fee"></app-fiat></span></td>
|
<td class="text-wrap">{{ tx.fee | number }} <span class="symbol" i18n="shared.sat|sat">sat</span>
|
||||||
|
@if (accelerationInfo?.bidBoost) {
|
||||||
|
<span class="oobFees" i18n-ngbTooltip="Acceleration Fees" ngbTooltip="Acceleration fees paid out-of-band"> +{{ accelerationInfo.bidBoost | number }} </span><span class="symbol" i18n="shared.sat|sat">sat</span>
|
||||||
|
} @else if (tx.feeDelta) {
|
||||||
|
<span class="oobFees" i18n-ngbTooltip="Acceleration Fees" ngbTooltip="Acceleration fees paid out-of-band"> +{{ tx.feeDelta | number }} </span><span class="symbol" i18n="shared.sat|sat">sat</span>
|
||||||
|
}
|
||||||
|
<span class="fiat"><app-fiat [blockConversion]="tx.price" [value]="tx.fee + (accelerationInfo?.bidBoost || tx.feeDelta || 0)"></app-fiat></span>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
} @else {
|
} @else {
|
||||||
<ng-container *ngTemplateOutlet="skeletonDetailsRow"></ng-container>
|
<ng-container *ngTemplateOutlet="skeletonDetailsRow"></ng-container>
|
||||||
@@ -642,9 +649,9 @@
|
|||||||
<td>
|
<td>
|
||||||
<div class="effective-fee-container">
|
<div class="effective-fee-container">
|
||||||
@if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize || tx.acceleration)) {
|
@if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize || tx.acceleration)) {
|
||||||
<app-fee-rate [fee]="accelerationInfo.acceleratedFeeRate"></app-fee-rate>
|
<app-fee-rate [class.oobFees]="isAcceleration" [fee]="accelerationInfo.acceleratedFeeRate"></app-fee-rate>
|
||||||
} @else {
|
} @else {
|
||||||
<app-fee-rate [fee]="tx.effectiveFeePerVsize"></app-fee-rate>
|
<app-fee-rate [class.oobFees]="isAcceleration" [fee]="tx.effectiveFeePerVsize"></app-fee-rate>
|
||||||
}
|
}
|
||||||
|
|
||||||
@if (tx?.status?.confirmed && !tx.acceleration && !accelerationInfo && tx.fee && tx.effectiveFeePerVsize) {
|
@if (tx?.status?.confirmed && !tx.acceleration && !accelerationInfo && tx.fee && tx.effectiveFeePerVsize) {
|
||||||
|
|||||||
@@ -332,3 +332,7 @@
|
|||||||
top: -1px;
|
top: -1px;
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.oobFees {
|
||||||
|
color: #905cf4;
|
||||||
|
}
|
||||||
@@ -462,10 +462,24 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
|||||||
if (txPosition.position.acceleratedBy) {
|
if (txPosition.position.acceleratedBy) {
|
||||||
txPosition.cpfp.acceleratedBy = txPosition.position.acceleratedBy;
|
txPosition.cpfp.acceleratedBy = txPosition.position.acceleratedBy;
|
||||||
}
|
}
|
||||||
|
if (txPosition.position.acceleratedAt) {
|
||||||
|
txPosition.cpfp.acceleratedAt = txPosition.position.acceleratedAt;
|
||||||
|
}
|
||||||
|
if (txPosition.position.feeDelta) {
|
||||||
|
txPosition.cpfp.feeDelta = txPosition.position.feeDelta;
|
||||||
|
}
|
||||||
this.setCpfpInfo(txPosition.cpfp);
|
this.setCpfpInfo(txPosition.cpfp);
|
||||||
} else if ((this.tx?.acceleration && txPosition.position.acceleratedBy)) {
|
} else if ((this.tx?.acceleration)) {
|
||||||
|
if (txPosition.position.acceleratedBy) {
|
||||||
this.tx.acceleratedBy = txPosition.position.acceleratedBy;
|
this.tx.acceleratedBy = txPosition.position.acceleratedBy;
|
||||||
}
|
}
|
||||||
|
if (txPosition.position.acceleratedAt) {
|
||||||
|
this.tx.acceleratedAt = txPosition.position.acceleratedAt;
|
||||||
|
}
|
||||||
|
if (txPosition.position.feeDelta) {
|
||||||
|
this.tx.feeDelta = txPosition.position.feeDelta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (this.stateService.network === '') {
|
if (this.stateService.network === '') {
|
||||||
if (!this.mempoolPosition.accelerated) {
|
if (!this.mempoolPosition.accelerated) {
|
||||||
|
|||||||
@@ -253,6 +253,8 @@ export interface MempoolPosition {
|
|||||||
vsize: number,
|
vsize: number,
|
||||||
accelerated?: boolean,
|
accelerated?: boolean,
|
||||||
acceleratedBy?: number[],
|
acceleratedBy?: number[],
|
||||||
|
acceleratedAt?: number,
|
||||||
|
feeDelta?: number,
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AccelerationPosition extends MempoolPosition {
|
export interface AccelerationPosition extends MempoolPosition {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class GuardService {
|
|||||||
|
|
||||||
trackerGuard(route: Route, segments: UrlSegment[]): boolean {
|
trackerGuard(route: Route, segments: UrlSegment[]): boolean {
|
||||||
const preferredRoute = this.router.getCurrentNavigation()?.extractedUrl.queryParams?.mode;
|
const preferredRoute = this.router.getCurrentNavigation()?.extractedUrl.queryParams?.mode;
|
||||||
return preferredRoute !== 'details' && this.navigationService.isInitialLoad() && window.innerWidth <= 767.98;
|
return (preferredRoute === 'status' || (preferredRoute !== 'details' && this.navigationService.isInitialLoad())) && window.innerWidth <= 767.98;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ export class EnterpriseService {
|
|||||||
this.fetchSubdomainInfo();
|
this.fetchSubdomainInfo();
|
||||||
this.disableSubnetworks();
|
this.disableSubnetworks();
|
||||||
this.stateService.env.ACCELERATOR = false;
|
this.stateService.env.ACCELERATOR = false;
|
||||||
this.stateService.env.ACCELERATOR_BUTTON = false;
|
|
||||||
} else {
|
} else {
|
||||||
this.insertMatomo();
|
this.insertMatomo();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,11 @@ export class MiningService {
|
|||||||
private stateService: StateService,
|
private stateService: StateService,
|
||||||
private apiService: ApiService,
|
private apiService: ApiService,
|
||||||
private storageService: StorageService,
|
private storageService: StorageService,
|
||||||
) { }
|
) {
|
||||||
|
this.stateService.networkChanged$.subscribe((network) => {
|
||||||
|
this.clearCache();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate pool ranking stats
|
* Generate pool ranking stats
|
||||||
@@ -141,4 +145,9 @@ export class MiningService {
|
|||||||
totalBlockCount: parseInt(response.headers.get('x-total-count'), 10),
|
totalBlockCount: parseInt(response.headers.get('x-total-count'), 10),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private clearCache(): void {
|
||||||
|
this.cache = {};
|
||||||
|
this.poolsData = [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -210,6 +210,10 @@ export class StateService {
|
|||||||
this.env.MINING_DASHBOARD = false;
|
this.env.MINING_DASHBOARD = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (document.location.hostname.endsWith('.onion')) {
|
||||||
|
this.env.SERVICES_API = 'http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/api/v1/services';
|
||||||
|
}
|
||||||
|
|
||||||
if (this.isBrowser) {
|
if (this.isBrowser) {
|
||||||
this.setNetworkBasedonUrl(window.location.pathname);
|
this.setNetworkBasedonUrl(window.location.pathname);
|
||||||
this.setLightningBasedonUrl(window.location.pathname);
|
this.setLightningBasedonUrl(window.location.pathname);
|
||||||
@@ -227,10 +231,6 @@ export class StateService {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (this.referrer === 'https://cash.app/' && window.innerWidth < 850 && window.location.pathname.startsWith('/tx/')) {
|
|
||||||
this.router.navigate(['/tracker/' + window.location.pathname.slice(4)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.liveMempoolBlockTransactions$ = this.mempoolBlockUpdate$.pipe(scan((transactions: { [txid: string]: TransactionStripped }, change: MempoolBlockUpdate): { [txid: string]: TransactionStripped } => {
|
this.liveMempoolBlockTransactions$ = this.mempoolBlockUpdate$.pipe(scan((transactions: { [txid: string]: TransactionStripped }, change: MempoolBlockUpdate): { [txid: string]: TransactionStripped } => {
|
||||||
if (isMempoolState(change)) {
|
if (isMempoolState(change)) {
|
||||||
const txMap = {};
|
const txMap = {};
|
||||||
|
|||||||
@@ -5,9 +5,6 @@
|
|||||||
@if (stateService.network === 'testnet') {
|
@if (stateService.network === 'testnet') {
|
||||||
<span i18n="testnet3-deprecated">Testnet3 is deprecated, and will soon be replaced by <a href="/testnet4">Testnet4</a></span>
|
<span i18n="testnet3-deprecated">Testnet3 is deprecated, and will soon be replaced by <a href="/testnet4">Testnet4</a></span>
|
||||||
}
|
}
|
||||||
@if (stateService.network === 'testnet4') {
|
|
||||||
<span i18n="testnet4-not-finalized">Testnet4 is not yet finalized, and may be reset at anytime.</span>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
<button type="button" class="close" (click)="dismissWarning()">
|
<button type="button" class="close" (click)="dismissWarning()">
|
||||||
<span aria-hidden="true">×</span>
|
<span aria-hidden="true">×</span>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<span class="truncate" [style.max-width]="maxWidth ? maxWidth + 'px' : null" [style.justify-content]="textAlign" [class.inline]="inline">
|
<span class="truncate" [style.max-width]="maxWidth ? maxWidth + 'px' : null" [style.justify-content]="textAlign" [class.inline]="inline">
|
||||||
<ng-container *ngIf="link">
|
<ng-container *ngIf="link">
|
||||||
<a [routerLink]="link" class="truncate-link" [target]="external ? '_blank' : ''">
|
<a [routerLink]="link" [queryParams]="queryParams" class="truncate-link" [target]="external ? '_blank' : '_self'">
|
||||||
<ng-container *ngIf="rtl; then rtlTruncated; else ltrTruncated;"></ng-container>
|
<ng-container *ngIf="rtl; then rtlTruncated; else ltrTruncated;"></ng-container>
|
||||||
</a>
|
</a>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ export class TruncateComponent {
|
|||||||
@Input() text: string;
|
@Input() text: string;
|
||||||
@Input() link: any = null;
|
@Input() link: any = null;
|
||||||
@Input() external: boolean = false;
|
@Input() external: boolean = false;
|
||||||
|
@Input() queryParams: any = undefined;
|
||||||
@Input() lastChars: number = 4;
|
@Input() lastChars: number = 4;
|
||||||
@Input() maxWidth: number = null;
|
@Input() maxWidth: number = null;
|
||||||
@Input() inline: boolean = false;
|
@Input() inline: boolean = false;
|
||||||
|
|||||||
@@ -1792,6 +1792,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="a7c328c4773db932ff14a1954e15e43dca58e7b7" datatype="html">
|
<trans-unit id="a7c328c4773db932ff14a1954e15e43dca58e7b7" datatype="html">
|
||||||
<source>Completed</source>
|
<source>Completed</source>
|
||||||
|
<target>Fullført</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||||
<context context-type="linenumber">65</context>
|
<context context-type="linenumber">65</context>
|
||||||
@@ -1800,6 +1801,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="64b582e0d8e3a28331a14d2a1017fa5d6ffb8d93" datatype="html">
|
<trans-unit id="64b582e0d8e3a28331a14d2a1017fa5d6ffb8d93" datatype="html">
|
||||||
<source>Failed</source>
|
<source>Failed</source>
|
||||||
|
<target>Mislyktes</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||||
<context context-type="linenumber">67</context>
|
<context context-type="linenumber">67</context>
|
||||||
|
|||||||
@@ -1393,6 +1393,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="c3aaae1073e33c932a5c98f98c3520645c0e3a93" datatype="html">
|
<trans-unit id="c3aaae1073e33c932a5c98f98c3520645c0e3a93" datatype="html">
|
||||||
<source>Out-of-band fees</source>
|
<source>Out-of-band fees</source>
|
||||||
|
<target>Opłaty poza mempoolem</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline-tooltip.component.html</context>
|
<context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline-tooltip.component.html</context>
|
||||||
<context context-type="linenumber">27</context>
|
<context context-type="linenumber">27</context>
|
||||||
@@ -1792,6 +1793,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="a7c328c4773db932ff14a1954e15e43dca58e7b7" datatype="html">
|
<trans-unit id="a7c328c4773db932ff14a1954e15e43dca58e7b7" datatype="html">
|
||||||
<source>Completed</source>
|
<source>Completed</source>
|
||||||
|
<target>Ukończone</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||||
<context context-type="linenumber">65</context>
|
<context context-type="linenumber">65</context>
|
||||||
@@ -1800,6 +1802,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="64b582e0d8e3a28331a14d2a1017fa5d6ffb8d93" datatype="html">
|
<trans-unit id="64b582e0d8e3a28331a14d2a1017fa5d6ffb8d93" datatype="html">
|
||||||
<source>Failed</source>
|
<source>Failed</source>
|
||||||
|
<target>Nieudane</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||||
<context context-type="linenumber">67</context>
|
<context context-type="linenumber">67</context>
|
||||||
|
|||||||
4
unfurler/package-lock.json
generated
4
unfurler/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "mempool-unfurl",
|
"name": "mempool-unfurl",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "mempool-unfurl",
|
"name": "mempool-unfurl",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node": "^16.11.41",
|
"@types/node": "^16.11.41",
|
||||||
"ejs": "^3.1.10",
|
"ejs": "^3.1.10",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mempool-unfurl",
|
"name": "mempool-unfurl",
|
||||||
"version": "3.0.0-dev",
|
"version": "3.0.0-beta",
|
||||||
"description": "Renderer for mempool open graph link preview images",
|
"description": "Renderer for mempool open graph link preview images",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|||||||
Reference in New Issue
Block a user