Compare commits

...

15 Commits

Author SHA1 Message Date
softsimon
4547a2757c Merge pull request #5351 from mempool/natsoni/fix-recursion-search
Fix recursion loop in search bar
2024-07-24 15:42:51 -05:00
softsimon
bc498733fc Merge pull request #5355 from mempool/natsoni/fix-blockchain-scroll
Fix unwanted blockchain scroll on screen resize
2024-07-24 11:44:36 -07:00
wiz
dc09e75783 Merge pull request #5361 from mempool/mononaut/fosscelerator
On-demand acceleration polling
2024-07-24 13:44:04 -05:00
wiz
544261eafe ops: Add /api/v1/accelerations to nginx hot cache 2024-07-24 13:31:56 -05:00
softsimon
58c0c060d5 Merge pull request #5358 from mempool/natsoni/fix-miner-loading
Fix miner loading forever
2024-07-24 11:25:48 -07:00
Mononaut
af7a962a0b [accelerator] accelerator_button config 2024-07-24 17:32:44 +00:00
Mononaut
7b3cc6372b [accelerator] frontend on-demand polling support 2024-07-24 17:32:44 +00:00
Mononaut
b49a6c4cac [accelerator] on-demand polling support 2024-07-24 17:32:43 +00:00
wiz
b0db348605 Merge pull request #5357 from mempool/nymkappa/update-api-key-header
[doc] update api key header
2024-07-24 12:27:03 -05:00
wiz
b1aa4f50bd Change X-Mempool-Authorization to X-Mempool-Auth 2024-07-24 12:25:35 -05:00
natsoni
b9a053387f Add txConfirmed subscription variable to fix miner loading forever 2024-07-23 11:44:50 +02:00
softsimon
82c271267a extracting i18n's 2024-07-23 00:28:32 +08:00
nymkappa
4ef4e5b98a [doc] update api key header 2024-07-22 15:17:56 +02:00
natsoni
a7be59df3e Fix buggy blockchain scroll on resize 2024-07-22 13:36:36 +02:00
natsoni
8c07e3c31a Fix recursion loop in search bar 2024-07-19 16:12:54 +02:00
19 changed files with 231 additions and 108 deletions

View File

@@ -396,10 +396,6 @@ class Mempool {
} }
public $updateAccelerations(newAccelerations: Acceleration[]): string[] { public $updateAccelerations(newAccelerations: Acceleration[]): string[] {
if (!config.MEMPOOL_SERVICES.ACCELERATIONS) {
return [];
}
try { try {
const changed: string[] = []; const changed: string[] = [];

View File

@@ -9,6 +9,7 @@ import bitcoinClient from '../bitcoin/bitcoin-client';
import mining from "./mining"; import mining from "./mining";
import PricesRepository from '../../repositories/PricesRepository'; import PricesRepository from '../../repositories/PricesRepository';
import AccelerationRepository from '../../repositories/AccelerationRepository'; import AccelerationRepository from '../../repositories/AccelerationRepository';
import accelerationApi from '../services/acceleration';
class MiningRoutes { class MiningRoutes {
public initRoutes(app: Application) { public initRoutes(app: Application) {
@@ -41,6 +42,8 @@ class MiningRoutes {
.get(config.MEMPOOL.API_URL_PREFIX + 'accelerations/block/:height', this.$getAccelerationsByHeight) .get(config.MEMPOOL.API_URL_PREFIX + 'accelerations/block/:height', this.$getAccelerationsByHeight)
.get(config.MEMPOOL.API_URL_PREFIX + 'accelerations/recent/:interval', this.$getRecentAccelerations) .get(config.MEMPOOL.API_URL_PREFIX + 'accelerations/recent/:interval', this.$getRecentAccelerations)
.get(config.MEMPOOL.API_URL_PREFIX + 'accelerations/total', this.$getAccelerationTotals) .get(config.MEMPOOL.API_URL_PREFIX + 'accelerations/total', this.$getAccelerationTotals)
.get(config.MEMPOOL.API_URL_PREFIX + 'accelerations', this.$getActiveAccelerations)
.post(config.MEMPOOL.API_URL_PREFIX + 'acceleration/request/:txid', this.$requestAcceleration)
; ;
} }
@@ -445,6 +448,37 @@ class MiningRoutes {
res.status(500).send(e instanceof Error ? e.message : e); res.status(500).send(e instanceof Error ? e.message : e);
} }
} }
private async $getActiveAccelerations(req: Request, res: Response): Promise<void> {
try {
res.header('Pragma', 'public');
res.header('Cache-control', 'public');
res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString());
if (!config.MEMPOOL_SERVICES.ACCELERATIONS || ['testnet', 'signet', 'liquidtestnet', 'liquid'].includes(config.MEMPOOL.NETWORK)) {
res.status(400).send('Acceleration data is not available.');
return;
}
res.status(200).send(accelerationApi.accelerations || []);
} catch (e) {
res.status(500).send(e instanceof Error ? e.message : e);
}
}
private async $requestAcceleration(req: Request, res: Response): Promise<void> {
if (config.MEMPOOL_SERVICES.ACCELERATIONS || config.MEMPOOL.OFFICIAL) {
res.status(405).send('not available.');
return;
}
res.setHeader('Pragma', 'no-cache');
res.setHeader('Cache-control', 'private, no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0');
res.setHeader('expires', -1);
try {
accelerationApi.accelerationRequested(req.params.txid);
res.status(200).send('ok');
} catch (e) {
res.status(500).send(e instanceof Error ? e.message : e);
}
}
} }
export default new MiningRoutes(); export default new MiningRoutes();

View File

@@ -1,8 +1,10 @@
import config from '../../config'; import config from '../../config';
import logger from '../../logger'; import logger from '../../logger';
import { BlockExtended, PoolTag } from '../../mempool.interfaces'; import { BlockExtended } from '../../mempool.interfaces';
import axios from 'axios'; import axios from 'axios';
type MyAccelerationStatus = 'requested' | 'accelerating' | 'done';
export interface Acceleration { export interface Acceleration {
txid: string, txid: string,
added: number, added: number,
@@ -35,18 +37,88 @@ export interface AccelerationHistory {
}; };
class AccelerationApi { class AccelerationApi {
public async $fetchAccelerations(): Promise<Acceleration[] | null> { private apiPath = config.MEMPOOL.OFFICIAL ? (config.MEMPOOL_SERVICES.API + '/accelerator/accelerations') : (config.EXTERNAL_DATA_SERVER.MEMPOOL_API + '/accelerations');
private _accelerations: Acceleration[] | null = null;
private lastPoll = 0;
private forcePoll = false;
private myAccelerations: Record<string, { status: MyAccelerationStatus, added: number, acceleration?: Acceleration }> = {};
public get accelerations(): Acceleration[] | null {
return this._accelerations;
}
public countMyAccelerationsWithStatus(filter: MyAccelerationStatus): number {
return Object.values(this.myAccelerations).reduce((count, {status}) => { return count + (status === filter ? 1 : 0); }, 0);
}
public accelerationRequested(txid: string): void {
this.myAccelerations[txid] = { status: 'requested', added: Date.now() };
}
public accelerationConfirmed(): void {
this.forcePoll = true;
}
private async $fetchAccelerations(): Promise<Acceleration[] | null> {
try {
const response = await axios.get(this.apiPath, { responseType: 'json', timeout: 10000 });
return response?.data || [];
} catch (e) {
logger.warn('Failed to fetch current accelerations from the mempool services backend: ' + (e instanceof Error ? e.message : e));
return null;
}
}
public async $updateAccelerations(): Promise<Acceleration[] | null> {
if (config.MEMPOOL_SERVICES.ACCELERATIONS) { if (config.MEMPOOL_SERVICES.ACCELERATIONS) {
try { const accelerations = await this.$fetchAccelerations();
const response = await axios.get(`${config.MEMPOOL_SERVICES.API}/accelerator/accelerations`, { responseType: 'json', timeout: 10000 }); if (accelerations) {
return response.data as Acceleration[]; this._accelerations = accelerations;
} catch (e) { return this._accelerations;
logger.warn('Failed to fetch current accelerations from the mempool services backend: ' + (e instanceof Error ? e.message : e));
return null;
} }
} else { } else {
return []; return this.$updateAccelerationsOnDemand();
} }
return null;
}
private async $updateAccelerationsOnDemand(): Promise<Acceleration[] | null> {
const shouldUpdate = this.forcePoll
|| this.countMyAccelerationsWithStatus('requested') > 0
|| (this.countMyAccelerationsWithStatus('accelerating') > 0 && this.lastPoll < (Date.now() - (10 * 60 * 1000)));
// update accelerations if necessary
if (shouldUpdate) {
const accelerations = await this.$fetchAccelerations();
this.lastPoll = Date.now();
this.forcePoll = false;
if (accelerations) {
const latestAccelerations: Record<string, Acceleration> = {};
// set relevant accelerations to 'accelerating'
for (const acc of accelerations) {
if (this.myAccelerations[acc.txid]) {
latestAccelerations[acc.txid] = acc;
this.myAccelerations[acc.txid] = { status: 'accelerating', added: Date.now(), acceleration: acc };
}
}
// txs that are no longer accelerating are either confirmed or canceled, so mark for expiry
for (const [txid, { status, acceleration }] of Object.entries(this.myAccelerations)) {
if (status === 'accelerating' && !latestAccelerations[txid]) {
this.myAccelerations[txid] = { status: 'done', added: Date.now(), acceleration };
}
}
}
}
// clear expired accelerations (confirmed / failed / not accepted) after 10 minutes
for (const [txid, { status, added }] of Object.entries(this.myAccelerations)) {
if (['requested', 'done'].includes(status) && added < (Date.now() - (1000 * 60 * 10))) {
delete this.myAccelerations[txid];
}
}
this._accelerations = Object.values(this.myAccelerations).map(({ acceleration }) => acceleration).filter(acc => acc) as Acceleration[];
return this._accelerations;
} }
public async $fetchAccelerationHistory(page?: number, status?: string): Promise<AccelerationHistory[] | null> { public async $fetchAccelerationHistory(page?: number, status?: string): Promise<AccelerationHistory[] | null> {

View File

@@ -538,9 +538,9 @@ class WebsocketHandler {
} }
if (config.MEMPOOL.RUST_GBT) { if (config.MEMPOOL.RUST_GBT) {
await mempoolBlocks.$rustUpdateBlockTemplates(transactionIds, newMempool, added, removed, candidates, config.MEMPOOL_SERVICES.ACCELERATIONS); await mempoolBlocks.$rustUpdateBlockTemplates(transactionIds, newMempool, added, removed, candidates, true);
} else { } else {
await mempoolBlocks.$updateBlockTemplates(transactionIds, newMempool, added, removed, candidates, accelerationDelta, true, config.MEMPOOL_SERVICES.ACCELERATIONS); await mempoolBlocks.$updateBlockTemplates(transactionIds, newMempool, added, removed, candidates, accelerationDelta, true, true);
} }
const mBlocks = mempoolBlocks.getMempoolBlocks(); const mBlocks = mempoolBlocks.getMempoolBlocks();
@@ -949,18 +949,14 @@ class WebsocketHandler {
if (config.MEMPOOL.AUDIT && memPool.isInSync()) { if (config.MEMPOOL.AUDIT && memPool.isInSync()) {
let projectedBlocks; let projectedBlocks;
const auditMempool = _memPool; const auditMempool = _memPool;
const isAccelerated = config.MEMPOOL_SERVICES.ACCELERATIONS && accelerationApi.isAcceleratedBlock(block, Object.values(mempool.getAccelerations())); const isAccelerated = accelerationApi.isAcceleratedBlock(block, Object.values(mempool.getAccelerations()));
if ((config.MEMPOOL_SERVICES.ACCELERATIONS)) { if (config.MEMPOOL.RUST_GBT) {
if (config.MEMPOOL.RUST_GBT) { const added = memPool.limitGBT ? (candidates?.added || []) : [];
const added = memPool.limitGBT ? (candidates?.added || []) : []; const removed = memPool.limitGBT ? (candidates?.removed || []) : [];
const removed = memPool.limitGBT ? (candidates?.removed || []) : []; projectedBlocks = await mempoolBlocks.$rustUpdateBlockTemplates(transactionIds, auditMempool, added, removed, candidates, isAccelerated, block.extras.pool.id);
projectedBlocks = await mempoolBlocks.$rustUpdateBlockTemplates(transactionIds, auditMempool, added, removed, candidates, isAccelerated, block.extras.pool.id);
} else {
projectedBlocks = await mempoolBlocks.$makeBlockTemplates(transactionIds, auditMempool, candidates, false, isAccelerated, block.extras.pool.id);
}
} else { } else {
projectedBlocks = mempoolBlocks.getMempoolBlocksWithTransactions(); projectedBlocks = await mempoolBlocks.$makeBlockTemplates(transactionIds, auditMempool, candidates, false, isAccelerated, block.extras.pool.id);
} }
if (Common.indexingEnabled()) { if (Common.indexingEnabled()) {
@@ -1040,7 +1036,7 @@ class WebsocketHandler {
const removed = memPool.limitGBT ? (candidates?.removed || []) : transactions; const removed = memPool.limitGBT ? (candidates?.removed || []) : transactions;
await mempoolBlocks.$rustUpdateBlockTemplates(transactionIds, _memPool, added, removed, candidates, true); await mempoolBlocks.$rustUpdateBlockTemplates(transactionIds, _memPool, added, removed, candidates, true);
} else { } else {
await mempoolBlocks.$makeBlockTemplates(transactionIds, _memPool, candidates, true, config.MEMPOOL_SERVICES.ACCELERATIONS); await mempoolBlocks.$makeBlockTemplates(transactionIds, _memPool, candidates, true, true);
} }
const mBlocks = mempoolBlocks.getMempoolBlocks(); const mBlocks = mempoolBlocks.getMempoolBlocks();
const mBlockDeltas = mempoolBlocks.getMempoolBlockDeltas(); const mBlockDeltas = mempoolBlocks.getMempoolBlockDeltas();

View File

@@ -229,7 +229,7 @@ class Server {
const newMempool = await bitcoinApi.$getRawMempool(); const newMempool = await bitcoinApi.$getRawMempool();
const minFeeMempool = memPool.limitGBT ? await bitcoinSecondClient.getRawMemPool() : null; const minFeeMempool = memPool.limitGBT ? await bitcoinSecondClient.getRawMemPool() : null;
const minFeeTip = memPool.limitGBT ? await bitcoinSecondClient.getBlockCount() : -1; const minFeeTip = memPool.limitGBT ? await bitcoinSecondClient.getBlockCount() : -1;
const newAccelerations = await accelerationApi.$fetchAccelerations(); const newAccelerations = await accelerationApi.$updateAccelerations();
const numHandledBlocks = await blocks.$updateBlocks(); const numHandledBlocks = await blocks.$updateBlocks();
const pollRate = config.MEMPOOL.POLL_RATE_MS * (indexer.indexerIsRunning() ? 10 : 1); const pollRate = config.MEMPOOL.POLL_RATE_MS * (indexer.indexerIsRunning() ? 10 : 1);
if (numHandledBlocks === 0) { if (numHandledBlocks === 0) {

View File

@@ -213,6 +213,15 @@ class AccelerationRepository {
this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id, successfulAccelerations); this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id, successfulAccelerations);
} }
} }
let anyConfirmed = false;
for (const acc of accelerations) {
if (blockTxs[acc.txid]) {
anyConfirmed = true;
}
}
if (anyConfirmed) {
accelerationApi.accelerationConfirmed();
}
const lastSyncedHeight = await this.$getLastSyncedHeight(); const lastSyncedHeight = await this.$getLastSyncedHeight();
// if we've missed any blocks, let the indexer catch up from the last synced height on the next run // if we've missed any blocks, let the indexer catch up from the last synced height on the next run
if (block.height === lastSyncedHeight + 1) { if (block.height === lastSyncedHeight + 1) {

View File

@@ -40,6 +40,7 @@ __MAINNET_BLOCK_AUDIT_START_HEIGHT__=${MAINNET_BLOCK_AUDIT_START_HEIGHT:=0}
__TESTNET_BLOCK_AUDIT_START_HEIGHT__=${TESTNET_BLOCK_AUDIT_START_HEIGHT:=0} __TESTNET_BLOCK_AUDIT_START_HEIGHT__=${TESTNET_BLOCK_AUDIT_START_HEIGHT:=0}
__SIGNET_BLOCK_AUDIT_START_HEIGHT__=${SIGNET_BLOCK_AUDIT_START_HEIGHT:=0} __SIGNET_BLOCK_AUDIT_START_HEIGHT__=${SIGNET_BLOCK_AUDIT_START_HEIGHT:=0}
__ACCELERATOR__=${ACCELERATOR:=false} __ACCELERATOR__=${ACCELERATOR:=false}
__ACCELERATOR_BUTTON__=${ACCELERATOR_BUTTON:=true}
__SERVICES_API__=${SERVICES_API:=false} __SERVICES_API__=${SERVICES_API:=false}
__PUBLIC_ACCELERATIONS__=${PUBLIC_ACCELERATIONS:=false} __PUBLIC_ACCELERATIONS__=${PUBLIC_ACCELERATIONS:=false}
__HISTORICAL_PRICE__=${HISTORICAL_PRICE:=true} __HISTORICAL_PRICE__=${HISTORICAL_PRICE:=true}
@@ -70,6 +71,7 @@ export __MAINNET_BLOCK_AUDIT_START_HEIGHT__
export __TESTNET_BLOCK_AUDIT_START_HEIGHT__ export __TESTNET_BLOCK_AUDIT_START_HEIGHT__
export __SIGNET_BLOCK_AUDIT_START_HEIGHT__ export __SIGNET_BLOCK_AUDIT_START_HEIGHT__
export __ACCELERATOR__ export __ACCELERATOR__
export __ACCELERATOR_BUTTON__
export __SERVICES_API__ export __SERVICES_API__
export __PUBLIC_ACCELERATIONS__ export __PUBLIC_ACCELERATIONS__
export __HISTORICAL_PRICE__ export __HISTORICAL_PRICE__

View File

@@ -9,6 +9,7 @@ import { Transaction } from '../../interfaces/electrs.interface';
import { MiningStats } from '../../services/mining.service'; 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';
export type PaymentMethod = 'balance' | 'bitcoin' | 'cashapp'; export type PaymentMethod = 'balance' | 'bitcoin' | 'cashapp';
@@ -123,6 +124,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
constructor( constructor(
public stateService: StateService, public stateService: StateService,
private apiService: ApiService,
private servicesApiService: ServicesApiServices, private servicesApiService: ServicesApiServices,
private etaService: EtaService, private etaService: EtaService,
private audioService: AudioService, private audioService: AudioService,
@@ -370,10 +372,11 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
this.accelerationUUID this.accelerationUUID
).subscribe({ ).subscribe({
next: () => { next: () => {
this.apiService.logAccelerationRequest$(this.tx.txid).subscribe();
this.audioService.playSound('ascend-chime-cartoon'); this.audioService.playSound('ascend-chime-cartoon');
this.showSuccess = true; this.showSuccess = true;
this.estimateSubscription.unsubscribe(); this.estimateSubscription.unsubscribe();
this.moveToStep('paid') this.moveToStep('paid');
}, },
error: (response) => { error: (response) => {
this.accelerateError = response.error; this.accelerateError = response.error;
@@ -481,6 +484,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
that.accelerationUUID that.accelerationUUID
).subscribe({ ).subscribe({
next: () => { next: () => {
this.apiService.logAccelerationRequest$(this.tx.txid).subscribe();
that.audioService.playSound('ascend-chime-cartoon'); that.audioService.playSound('ascend-chime-cartoon');
if (that.cashAppPay) { if (that.cashAppPay) {
that.cashAppPay.destroy(); that.cashAppPay.destroy();
@@ -530,9 +534,10 @@ export class AccelerateCheckout implements OnInit, OnDestroy {
} }
bitcoinPaymentCompleted(): void { bitcoinPaymentCompleted(): void {
this.apiService.logAccelerationRequest$(this.tx.txid).subscribe();
this.audioService.playSound('ascend-chime-cartoon'); this.audioService.playSound('ascend-chime-cartoon');
this.estimateSubscription.unsubscribe(); this.estimateSubscription.unsubscribe();
this.moveToStep('paid') this.moveToStep('paid');
} }
isLoggedIn(): boolean { isLoggedIn(): boolean {

View File

@@ -303,7 +303,6 @@ export class SearchFormComponent implements OnInit {
(error) => { console.log(error); this.isSearching = false; } (error) => { console.log(error); this.isSearching = false; }
); );
} else { } else {
this.searchResults.searchButtonClick();
this.isSearching = false; this.isSearching = false;
} }
} }

View File

@@ -234,7 +234,7 @@ export class StartComponent implements OnInit, AfterViewChecked, OnDestroy {
this.minScrollWidth = 40 + (8 * this.blockWidth) + (this.pageWidth * 2); this.minScrollWidth = 40 + (8 * this.blockWidth) + (this.pageWidth * 2);
if (firstVisibleBlock != null) { if (firstVisibleBlock != null) {
this.scrollToBlock(firstVisibleBlock, offset); this.scrollToBlock(firstVisibleBlock, offset + (this.isMobile ? this.blockWidth : 0));
} else { } else {
this.updatePages(); this.updatePages();
} }

View File

@@ -88,6 +88,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
blocksSubscription: Subscription; blocksSubscription: Subscription;
miningSubscription: Subscription; miningSubscription: Subscription;
auditSubscription: Subscription; auditSubscription: Subscription;
txConfirmedSubscription: Subscription;
currencyChangeSubscription: Subscription; currencyChangeSubscription: Subscription;
fragmentParams: URLSearchParams; fragmentParams: URLSearchParams;
rbfTransaction: undefined | Transaction; rbfTransaction: undefined | Transaction;
@@ -141,7 +142,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
taprootEnabled: boolean; taprootEnabled: boolean;
hasEffectiveFeeRate: boolean; hasEffectiveFeeRate: boolean;
accelerateCtaType: 'alert' | 'button' = 'button'; accelerateCtaType: 'alert' | 'button' = 'button';
acceleratorAvailable: boolean = this.stateService.env.ACCELERATOR && this.stateService.network === ''; acceleratorAvailable: boolean = this.stateService.env.ACCELERATOR_BUTTON && this.stateService.network === '';
eligibleForAcceleration: boolean = false; eligibleForAcceleration: boolean = false;
forceAccelerationSummary = false; forceAccelerationSummary = false;
hideAccelerationSummary = false; hideAccelerationSummary = false;
@@ -195,7 +196,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
this.stateService.networkChanged$.subscribe( this.stateService.networkChanged$.subscribe(
(network) => { (network) => {
this.network = network; this.network = network;
this.acceleratorAvailable = this.stateService.env.ACCELERATOR && this.stateService.network === ''; this.acceleratorAvailable = this.stateService.env.ACCELERATOR_BUTTON && this.stateService.network === '';
} }
); );
@@ -625,7 +626,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
} }
); );
this.stateService.txConfirmed$.subscribe(([txConfirmed, block]) => { this.txConfirmedSubscription = this.stateService.txConfirmed$.subscribe(([txConfirmed, block]) => {
if (txConfirmed && this.tx && !this.tx.status.confirmed && txConfirmed === this.tx.txid) { if (txConfirmed && this.tx && !this.tx.status.confirmed && txConfirmed === this.tx.txid) {
if (this.tx.acceleration) { if (this.tx.acceleration) {
this.waitingForAccelerationInfo = true; this.waitingForAccelerationInfo = true;
@@ -1070,6 +1071,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
this.blocksSubscription.unsubscribe(); this.blocksSubscription.unsubscribe();
this.miningSubscription?.unsubscribe(); this.miningSubscription?.unsubscribe();
this.auditSubscription?.unsubscribe(); this.auditSubscription?.unsubscribe();
this.txConfirmedSubscription?.unsubscribe();
this.currencyChangeSubscription?.unsubscribe(); this.currencyChangeSubscription?.unsubscribe();
this.leaveTransaction(); this.leaveTransaction();
} }

View File

@@ -8993,7 +8993,7 @@ export const restApiDocsData = [
fragment: "accelerator-estimate", fragment: "accelerator-estimate",
title: "POST Calculate Estimated Costs", title: "POST Calculate Estimated Costs",
description: { description: {
default: "<p>Returns estimated costs to accelerate a transaction. Optionally set the <code>api_key</code> header to get customized estimation.</p>" default: "<p>Returns estimated costs to accelerate a transaction. Optionally set the <code>X-Mempool-Auth</code> header to get customized estimation.</p>"
}, },
urlString: "/v1/services/accelerator/estimate", urlString: "/v1/services/accelerator/estimate",
showConditions: [""], showConditions: [""],
@@ -9009,7 +9009,7 @@ export const restApiDocsData = [
esModule: [], esModule: [],
commonJS: [], commonJS: [],
curl: ["txInput=ee13ebb99632377c15c94980357f674d285ac413452050031ea6dcd3e9b2dc29"], curl: ["txInput=ee13ebb99632377c15c94980357f674d285ac413452050031ea6dcd3e9b2dc29"],
headers: "api_key: stacksats", headers: "X-Mempool-Auth: stacksats",
response: `{ response: `{
"txSummary": { "txSummary": {
"txid": "ee13ebb99632377c15c94980357f674d285ac413452050031ea6dcd3e9b2dc29", "txid": "ee13ebb99632377c15c94980357f674d285ac413452050031ea6dcd3e9b2dc29",
@@ -9240,7 +9240,7 @@ export const restApiDocsData = [
esModule: [], esModule: [],
commonJS: [], commonJS: [],
curl: [], curl: [],
headers: "api_key: stacksats", headers: "X-Mempool-Auth: stacksats",
response: `[ response: `[
{ {
"type": "Bitcoin", "type": "Bitcoin",
@@ -9288,7 +9288,7 @@ export const restApiDocsData = [
esModule: [], esModule: [],
commonJS: [], commonJS: [],
curl: [], curl: [],
headers: "api_key: stacksats", headers: "X-Mempool-Auth: stacksats",
response: `{ response: `{
"balance": 99900000, "balance": 99900000,
"hold": 101829, "hold": 101829,
@@ -9322,7 +9322,7 @@ export const restApiDocsData = [
esModule: [], esModule: [],
commonJS: [], commonJS: [],
curl: ["txInput=ee13ebb99632377c15c94980357f674d285ac413452050031ea6dcd3e9b2dc29&userBid=21000000"], curl: ["txInput=ee13ebb99632377c15c94980357f674d285ac413452050031ea6dcd3e9b2dc29&userBid=21000000"],
headers: "api_key: stacksats", headers: "X-Mempool-Auth: stacksats",
response: `HTTP/1.1 200 OK`, response: `HTTP/1.1 200 OK`,
}, },
} }
@@ -9352,7 +9352,7 @@ export const restApiDocsData = [
esModule: [], esModule: [],
commonJS: [], commonJS: [],
curl: [], curl: [],
headers: "api_key: stacksats", headers: "X-Mempool-Auth: stacksats",
response: `[ response: `[
{ {
"id": 89, "id": 89,

View File

@@ -536,6 +536,10 @@ export class ApiService {
); );
} }
logAccelerationRequest$(txid: string): Observable<any> {
return this.httpClient.post(this.apiBaseUrl + this.apiBasePath + '/api/v1/acceleration/request/' + txid, '');
}
// Cache methods // Cache methods
async setBlockAuditLoaded(hash: string) { async setBlockAuditLoaded(hash: string) {
this.blockAuditLoaded[hash] = true; this.blockAuditLoaded[hash] = true;

View File

@@ -30,6 +30,7 @@ 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();
} }

View File

@@ -71,6 +71,7 @@ export interface Env {
SIGNET_BLOCK_AUDIT_START_HEIGHT: number; SIGNET_BLOCK_AUDIT_START_HEIGHT: number;
HISTORICAL_PRICE: boolean; HISTORICAL_PRICE: boolean;
ACCELERATOR: boolean; ACCELERATOR: boolean;
ACCELERATOR_BUTTON: boolean;
PUBLIC_ACCELERATIONS: boolean; PUBLIC_ACCELERATIONS: boolean;
ADDITIONAL_CURRENCIES: boolean; ADDITIONAL_CURRENCIES: boolean;
GIT_COMMIT_HASH_MEMPOOL_SPACE?: string; GIT_COMMIT_HASH_MEMPOOL_SPACE?: string;
@@ -108,6 +109,7 @@ const defaultEnv: Env = {
'SIGNET_BLOCK_AUDIT_START_HEIGHT': 0, 'SIGNET_BLOCK_AUDIT_START_HEIGHT': 0,
'HISTORICAL_PRICE': true, 'HISTORICAL_PRICE': true,
'ACCELERATOR': false, 'ACCELERATOR': false,
'ACCELERATOR_BUTTON': true,
'PUBLIC_ACCELERATIONS': false, 'PUBLIC_ACCELERATIONS': false,
'ADDITIONAL_CURRENCIES': false, 'ADDITIONAL_CURRENCIES': false,
'SERVICES_API': 'https://mempool.space/api/v1/services', 'SERVICES_API': 'https://mempool.space/api/v1/services',

View File

@@ -1056,16 +1056,56 @@
<context context-type="linenumber">91</context> <context context-type="linenumber">91</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1bc4a5de56ea48a832e32294c124009867b478d0" datatype="html"> <trans-unit id="65d447765db0bf3390e9b3ecce142bf34bb602a3" datatype="html">
<source>First seen</source> <source>Mined</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context> <context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context>
<context context-type="linenumber">26</context> <context context-type="linenumber">31</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context> <context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context>
<context context-type="linenumber">120</context> <context context-type="linenumber">120</context>
</context-group> </context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/custom-dashboard/custom-dashboard.component.html</context>
<context context-type="linenumber">121</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/custom-dashboard/custom-dashboard.component.html</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/pool/pool.component.html</context>
<context context-type="linenumber">183</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/pool/pool.component.html</context>
<context context-type="linenumber">245</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context>
<context context-type="linenumber">23</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context>
<context context-type="linenumber">38</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">86</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">106</context>
</context-group>
<note priority="1" from="description">transaction.rbf.mined</note>
</trans-unit>
<trans-unit id="1bc4a5de56ea48a832e32294c124009867b478d0" datatype="html">
<source>First seen</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context>
<context context-type="linenumber">64</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-overview-tooltip/block-overview-tooltip.component.html</context> <context context-type="sourcefile">src/app/components/block-overview-tooltip/block-overview-tooltip.component.html</context>
<context context-type="linenumber">20</context> <context context-type="linenumber">20</context>
@@ -1125,11 +1165,11 @@
<source>Accelerated</source> <source>Accelerated</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context> <context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context>
<context context-type="linenumber">40</context> <context context-type="linenumber">90</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context> <context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context>
<context context-type="linenumber">136</context> <context context-type="linenumber">94</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-overview-tooltip/block-overview-tooltip.component.html</context> <context context-type="sourcefile">src/app/components/block-overview-tooltip/block-overview-tooltip.component.html</context>
@@ -1149,50 +1189,6 @@
</context-group> </context-group>
<note priority="1" from="description">transaction.audit.accelerated</note> <note priority="1" from="description">transaction.audit.accelerated</note>
</trans-unit> </trans-unit>
<trans-unit id="65d447765db0bf3390e9b3ecce142bf34bb602a3" datatype="html">
<source>Mined</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context>
<context context-type="linenumber">53</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration-timeline/acceleration-timeline.component.html</context>
<context context-type="linenumber">93</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/custom-dashboard/custom-dashboard.component.html</context>
<context context-type="linenumber">121</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/custom-dashboard/custom-dashboard.component.html</context>
<context context-type="linenumber">154</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/pool/pool.component.html</context>
<context context-type="linenumber">183</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/pool/pool.component.html</context>
<context context-type="linenumber">245</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-list/rbf-list.component.html</context>
<context context-type="linenumber">23</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/rbf-timeline/rbf-timeline-tooltip.component.html</context>
<context context-type="linenumber">38</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">86</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
<context context-type="linenumber">106</context>
</context-group>
<note priority="1" from="description">transaction.rbf.mined</note>
</trans-unit>
<trans-unit id="bcf34abc2d9ed8f45a2f65dd464c46694e9a181e" datatype="html"> <trans-unit id="bcf34abc2d9ed8f45a2f65dd464c46694e9a181e" datatype="html">
<source>Acceleration Fees</source> <source>Acceleration Fees</source>
<context-group purpose="location"> <context-group purpose="location">
@@ -1201,7 +1197,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.ts</context> <context context-type="sourcefile">src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.ts</context>
<context context-type="linenumber">74</context> <context context-type="linenumber">77</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context> <context context-type="sourcefile">src/app/components/graphs/graphs.component.html</context>
@@ -1213,14 +1209,14 @@
<source>No accelerated transaction for this timeframe</source> <source>No accelerated transaction for this timeframe</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.ts</context> <context context-type="sourcefile">src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.ts</context>
<context context-type="linenumber">130</context> <context context-type="linenumber">133</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4793828002882320882" datatype="html"> <trans-unit id="4793828002882320882" datatype="html">
<source>At block: <x id="PH" equiv-text="ticks[0].data[2]"/></source> <source>At block: <x id="PH" equiv-text="ticks[0].data[2]"/></source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.ts</context> <context context-type="sourcefile">src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.ts</context>
<context context-type="linenumber">174</context> <context context-type="linenumber">177</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts</context> <context context-type="sourcefile">src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts</context>
@@ -1239,7 +1235,7 @@
<source>Around block: <x id="PH" equiv-text="ticks[0].data[2]"/></source> <source>Around block: <x id="PH" equiv-text="ticks[0].data[2]"/></source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.ts</context> <context context-type="sourcefile">src/app/components/acceleration/acceleration-fees-graph/acceleration-fees-graph.component.ts</context>
<context context-type="linenumber">176</context> <context context-type="linenumber">179</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts</context> <context context-type="sourcefile">src/app/components/block-fee-rates-graph/block-fee-rates-graph.component.ts</context>
@@ -1669,7 +1665,7 @@
<source>Accelerated by</source> <source>Accelerated by</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.html</context>
<context context-type="linenumber">25</context> <context context-type="linenumber">30</context>
</context-group> </context-group>
<note priority="1" from="description">Accelerated to hashrate</note> <note priority="1" from="description">Accelerated to hashrate</note>
<note priority="1" from="meaning">transaction.accelerated-by-hashrate</note> <note priority="1" from="meaning">transaction.accelerated-by-hashrate</note>
@@ -1678,7 +1674,7 @@
<source><x id="INTERPOLATION" equiv-text="{{ acceleratedByPercentage }}"/> <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;symbol hashrate-label&quot;&gt;"/>of hashrate<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></source> <source><x id="INTERPOLATION" equiv-text="{{ acceleratedByPercentage }}"/> <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;symbol hashrate-label&quot;&gt;"/>of hashrate<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.html</context>
<context context-type="linenumber">27</context> <context context-type="linenumber">32</context>
</context-group> </context-group>
<note priority="1" from="description">accelerator.x-of-hash-rate</note> <note priority="1" from="description">accelerator.x-of-hash-rate</note>
</trans-unit> </trans-unit>
@@ -1686,7 +1682,7 @@
<source>not accelerating</source> <source>not accelerating</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.ts</context> <context context-type="sourcefile">src/app/components/acceleration/active-acceleration-box/active-acceleration-box.component.ts</context>
<context context-type="linenumber">83</context> <context context-type="linenumber">85</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3590f5c3ef2810f637316edb8aaa86b8e907f152" datatype="html"> <trans-unit id="3590f5c3ef2810f637316edb8aaa86b8e907f152" datatype="html">
@@ -2030,8 +2026,8 @@
</context-group> </context-group>
<note priority="1" from="description">address.error.loading-address-data</note> <note priority="1" from="description">address.error.loading-address-data</note>
</trans-unit> </trans-unit>
<trans-unit id="49cef95661d86f4341788ce40068d58801adc6e6" datatype="html"> <trans-unit id="9eb81e2576ffe4e8fb0a303e203040b6ab23cc22" datatype="html">
<source><x id="START_ITALIC_TEXT" ctype="x-i" equiv-text="There many transactions on this address, more than your backend can handle. See more on &lt;a href=&quot;/d"/>There many transactions on this address, more than your backend can handle. See more on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;/docs/faq#address-lookup-issues&quot;&gt;"/>setting up a stronger backend<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.<x id="CLOSE_ITALIC_TEXT" ctype="x-i" equiv-text="&lt;/i&gt;"/><x id="LINE_BREAK" ctype="lb"/><x id="LINE_BREAK" ctype="lb"/> Consider viewing this address on the official Mempool website instead: </source> <source><x id="START_ITALIC_TEXT" ctype="x-i" equiv-text="There are too many transactions on this address, more than your backend can handle. See more on &lt;"/>There are too many transactions on this address, more than your backend can handle. See more on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;/docs/faq#address-lookup-issues&quot;&gt;"/>setting up a stronger backend<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.<x id="CLOSE_ITALIC_TEXT" ctype="x-i" equiv-text="&lt;/i&gt;"/><x id="LINE_BREAK" ctype="lb"/><x id="LINE_BREAK" ctype="lb"/> Consider viewing this address on the official Mempool website instead: </source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/address/address.component.html</context> <context context-type="sourcefile">src/app/components/address/address.component.html</context>
<context context-type="linenumber">204,207</context> <context context-type="linenumber">204,207</context>
@@ -6572,7 +6568,7 @@
<source>Your transaction has been accelerated</source> <source>Your transaction has been accelerated</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context> <context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context>
<context context-type="linenumber">141</context> <context context-type="linenumber">143</context>
</context-group> </context-group>
<note priority="1" from="description">tracker.explain.accelerated</note> <note priority="1" from="description">tracker.explain.accelerated</note>
</trans-unit> </trans-unit>
@@ -6580,7 +6576,7 @@
<source>Waiting for your transaction to appear in the mempool</source> <source>Waiting for your transaction to appear in the mempool</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context> <context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context>
<context context-type="linenumber">148</context> <context context-type="linenumber">150</context>
</context-group> </context-group>
<note priority="1" from="description">tracker.explain.waiting</note> <note priority="1" from="description">tracker.explain.waiting</note>
</trans-unit> </trans-unit>
@@ -6588,7 +6584,7 @@
<source>Your transaction is in the mempool, but it will not be confirmed for some time.</source> <source>Your transaction is in the mempool, but it will not be confirmed for some time.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context> <context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context>
<context context-type="linenumber">154</context> <context context-type="linenumber">156</context>
</context-group> </context-group>
<note priority="1" from="description">tracker.explain.pending</note> <note priority="1" from="description">tracker.explain.pending</note>
</trans-unit> </trans-unit>
@@ -6596,7 +6592,7 @@
<source>Your transaction is near the top of the mempool, and is expected to confirm soon.</source> <source>Your transaction is near the top of the mempool, and is expected to confirm soon.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context> <context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context>
<context context-type="linenumber">160</context> <context context-type="linenumber">162</context>
</context-group> </context-group>
<note priority="1" from="description">tracker.explain.soon</note> <note priority="1" from="description">tracker.explain.soon</note>
</trans-unit> </trans-unit>
@@ -6604,7 +6600,7 @@
<source>Your transaction is expected to confirm in the next block</source> <source>Your transaction is expected to confirm in the next block</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context> <context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context>
<context context-type="linenumber">166</context> <context context-type="linenumber">168</context>
</context-group> </context-group>
<note priority="1" from="description">tracker.explain.next-block</note> <note priority="1" from="description">tracker.explain.next-block</note>
</trans-unit> </trans-unit>
@@ -6612,7 +6608,7 @@
<source>Your transaction is confirmed!</source> <source>Your transaction is confirmed!</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context> <context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context>
<context context-type="linenumber">172</context> <context context-type="linenumber">174</context>
</context-group> </context-group>
<note priority="1" from="description">tracker.explain.confirmed</note> <note priority="1" from="description">tracker.explain.confirmed</note>
</trans-unit> </trans-unit>
@@ -6620,7 +6616,7 @@
<source>Your transaction has been replaced by a newer version!</source> <source>Your transaction has been replaced by a newer version!</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context> <context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context>
<context context-type="linenumber">178</context> <context context-type="linenumber">180</context>
</context-group> </context-group>
<note priority="1" from="description">tracker.explain.replaced</note> <note priority="1" from="description">tracker.explain.replaced</note>
</trans-unit> </trans-unit>
@@ -6628,7 +6624,7 @@
<source>See more details</source> <source>See more details</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context> <context context-type="sourcefile">src/app/components/tracker/tracker.component.html</context>
<context context-type="linenumber">186</context> <context context-type="linenumber">189</context>
</context-group> </context-group>
<note priority="1" from="description">accelerator.show-more-details</note> <note priority="1" from="description">accelerator.show-more-details</note>
</trans-unit> </trans-unit>
@@ -6644,7 +6640,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.ts</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.ts</context>
<context context-type="linenumber">497</context> <context context-type="linenumber">498</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="meta.description.bitcoin.transaction" datatype="html"> <trans-unit id="meta.description.bitcoin.transaction" datatype="html">
@@ -6659,7 +6655,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.ts</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.ts</context>
<context context-type="linenumber">501</context> <context context-type="linenumber">502</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7e06b8dd9f29261827018351cd71efe1c87839de" datatype="html"> <trans-unit id="7e06b8dd9f29261827018351cd71efe1c87839de" datatype="html">

View File

@@ -13,6 +13,7 @@
"ITEMS_PER_PAGE": 25, "ITEMS_PER_PAGE": 25,
"LIGHTNING": true, "LIGHTNING": true,
"ACCELERATOR": true, "ACCELERATOR": true,
"ACCELERATOR_BUTTON": true,
"PUBLIC_ACCELERATIONS": true, "PUBLIC_ACCELERATIONS": true,
"AUDIT": true "AUDIT": true
} }

View File

@@ -9,6 +9,7 @@ heat()
heatURLs=( heatURLs=(
'/api/v1/fees/recommended' '/api/v1/fees/recommended'
'/api/v1/accelerations'
) )
while true while true

View File

@@ -2,6 +2,9 @@
# routing # # routing #
########### ###########
location /api/v1/accelerations {
try_files /dev/null @mempool-api-v1-services-cache-short;
}
location /api/v1/assets { location /api/v1/assets {
try_files /dev/null @mempool-api-v1-services-cache-short; try_files /dev/null @mempool-api-v1-services-cache-short;
} }