Merge branch 'master' into natsoni/high-contrast-theme

This commit is contained in:
natsoni 2024-04-09 12:13:11 +09:00
commit 527589ac04
No known key found for this signature in database
GPG Key ID: C65917583181743B
26 changed files with 721 additions and 412 deletions

View File

@ -1,12 +1,14 @@
import { Application, Request, Response } from "express"; import { Application, Request, Response } from 'express';
import config from "../../config"; import config from '../../config';
import axios from "axios"; import axios from 'axios';
import logger from "../../logger"; import logger from '../../logger';
import mempool from '../mempool';
import AccelerationRepository from '../../repositories/AccelerationRepository';
class AccelerationRoutes { class AccelerationRoutes {
private tag = 'Accelerator'; private tag = 'Accelerator';
public initRoutes(app: Application) { public initRoutes(app: Application): void {
app app
.get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations', this.$getAcceleratorAccelerations.bind(this)) .get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations', this.$getAcceleratorAccelerations.bind(this))
.get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations/history', this.$getAcceleratorAccelerationsHistory.bind(this)) .get(config.MEMPOOL.API_URL_PREFIX + 'services/accelerator/accelerations/history', this.$getAcceleratorAccelerationsHistory.bind(this))
@ -15,41 +17,33 @@ class AccelerationRoutes {
; ;
} }
private async $getAcceleratorAccelerations(req: Request, res: Response) { private async $getAcceleratorAccelerations(req: Request, res: Response): Promise<void> {
const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; const accelerations = mempool.getAccelerations();
try { res.status(200).send(Object.values(accelerations));
const response = await axios.get(url, { responseType: 'stream', timeout: 10000 });
for (const key in response.headers) {
res.setHeader(key, response.headers[key]);
}
response.data.pipe(res);
} catch (e) {
logger.err(`Unable to get current accelerations from ${url} in $getAcceleratorAccelerations(), ${e}`, this.tag);
res.status(500).end();
}
} }
private async $getAcceleratorAccelerationsHistory(req: Request, res: Response) { private async $getAcceleratorAccelerationsHistory(req: Request, res: Response): Promise<void> {
const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; const history = await AccelerationRepository.$getAccelerationInfo(null, req.query.blockHeight ? parseInt(req.query.blockHeight as string, 10) : null);
try { res.status(200).send(history.map(accel => ({
const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); txid: accel.txid,
for (const key in response.headers) { added: accel.added,
res.setHeader(key, response.headers[key]); status: 'completed',
} effectiveFee: accel.effective_fee,
response.data.pipe(res); effectiveVsize: accel.effective_vsize,
} catch (e) { boostRate: accel.boost_rate,
logger.err(`Unable to get acceleration history from ${url} in $getAcceleratorAccelerationsHistory(), ${e}`, this.tag); boostCost: accel.boost_cost,
res.status(500).end(); blockHeight: accel.height,
} pools: [accel.pool],
})));
} }
private async $getAcceleratorAccelerationsHistoryAggregated(req: Request, res: Response) { private async $getAcceleratorAccelerationsHistoryAggregated(req: Request, res: Response): Promise<void> {
const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`;
try { try {
const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); const response = await axios.get(url, { responseType: 'stream', timeout: 10000 });
for (const key in response.headers) { for (const key in response.headers) {
res.setHeader(key, response.headers[key]); res.setHeader(key, response.headers[key]);
} }
response.data.pipe(res); response.data.pipe(res);
} catch (e) { } catch (e) {
logger.err(`Unable to get aggregated acceleration history from ${url} in $getAcceleratorAccelerationsHistoryAggregated(), ${e}`, this.tag); logger.err(`Unable to get aggregated acceleration history from ${url} in $getAcceleratorAccelerationsHistoryAggregated(), ${e}`, this.tag);
@ -57,13 +51,13 @@ class AccelerationRoutes {
} }
} }
private async $getAcceleratorAccelerationsStats(req: Request, res: Response) { private async $getAcceleratorAccelerationsStats(req: Request, res: Response): Promise<void> {
const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`; const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`;
try { try {
const response = await axios.get(url, { responseType: 'stream', timeout: 10000 }); const response = await axios.get(url, { responseType: 'stream', timeout: 10000 });
for (const key in response.headers) { for (const key in response.headers) {
res.setHeader(key, response.headers[key]); res.setHeader(key, response.headers[key]);
} }
response.data.pipe(res); response.data.pipe(res);
} catch (e) { } catch (e) {
logger.err(`Unable to get acceleration stats from ${url} in $getAcceleratorAccelerationsStats(), ${e}`, this.tag); logger.err(`Unable to get acceleration stats from ${url} in $getAcceleratorAccelerationsStats(), ${e}`, this.tag);

View File

@ -29,6 +29,7 @@ import websocketHandler from './websocket-handler';
import redisCache from './redis-cache'; import redisCache from './redis-cache';
import rbfCache from './rbf-cache'; import rbfCache from './rbf-cache';
import { calcBitsDifference } from './difficulty-adjustment'; import { calcBitsDifference } from './difficulty-adjustment';
import AccelerationRepository from '../repositories/AccelerationRepository';
class Blocks { class Blocks {
private blocks: BlockExtended[] = []; private blocks: BlockExtended[] = [];
@ -872,6 +873,7 @@ class Blocks {
await BlocksRepository.$deleteBlocksFrom(lastBlock.height - 10); await BlocksRepository.$deleteBlocksFrom(lastBlock.height - 10);
await HashratesRepository.$deleteLastEntries(); await HashratesRepository.$deleteLastEntries();
await cpfpRepository.$deleteClustersFrom(lastBlock.height - 10); await cpfpRepository.$deleteClustersFrom(lastBlock.height - 10);
await AccelerationRepository.$deleteAccelerationsFrom(lastBlock.height - 10);
this.blocks = this.blocks.slice(0, -10); this.blocks = this.blocks.slice(0, -10);
this.updateTimerProgress(timer, `rolled back chain divergence from ${this.currentBlockHeight}`); this.updateTimerProgress(timer, `rolled back chain divergence from ${this.currentBlockHeight}`);
for (let i = 10; i >= 0; --i) { for (let i = 10; i >= 0; --i) {
@ -974,6 +976,9 @@ class Blocks {
if (this.blocks.length > config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4) { if (this.blocks.length > config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4) {
this.blocks = this.blocks.slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4); this.blocks = this.blocks.slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4);
} }
blockSummary.transactions.forEach(tx => {
delete tx.acc;
});
this.blockSummaries.push(blockSummary); this.blockSummaries.push(blockSummary);
if (this.blockSummaries.length > config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4) { if (this.blockSummaries.length > config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4) {
this.blockSummaries = this.blockSummaries.slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4); this.blockSummaries = this.blockSummaries.slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4);
@ -1117,6 +1122,7 @@ class Blocks {
} }
return { return {
txid: tx.txid, txid: tx.txid,
time: tx.firstSeen,
fee: tx.fee || 0, fee: tx.fee || 0,
vsize: tx.vsize, vsize: tx.vsize,
value: Math.round(tx.vout.reduce((acc, vout) => acc + (vout.value ? vout.value : 0), 0)), value: Math.round(tx.vout.reduce((acc, vout) => acc + (vout.value ? vout.value : 0), 0)),

View File

@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository';
import { RowDataPacket } from 'mysql2'; import { RowDataPacket } from 'mysql2';
class DatabaseMigration { class DatabaseMigration {
private static currentVersion = 76; private static currentVersion = 77;
private queryTimeout = 3600_000; private queryTimeout = 3600_000;
private statisticsAddedIndexed = false; private statisticsAddedIndexed = false;
private uniqueLogs: string[] = []; private uniqueLogs: string[] = [];
@ -664,6 +664,11 @@ class DatabaseMigration {
await this.$executeQuery('ALTER TABLE `blocks_audits` ADD prioritized_txs JSON DEFAULT "[]"'); await this.$executeQuery('ALTER TABLE `blocks_audits` ADD prioritized_txs JSON DEFAULT "[]"');
await this.updateToSchemaVersion(76); await this.updateToSchemaVersion(76);
} }
if (databaseSchemaVersion < 77 && config.MEMPOOL.NETWORK === 'mainnet') {
await this.$executeQuery('ALTER TABLE `accelerations` ADD requested datetime DEFAULT NULL');
await this.updateToSchemaVersion(77);
}
} }
/** /**

View File

@ -5,6 +5,9 @@ import axios from 'axios';
export interface Acceleration { export interface Acceleration {
txid: string, txid: string,
added: number,
effectiveVsize: number,
effectiveFee: number,
feeDelta: number, feeDelta: number,
pools: number[], pools: number[],
}; };

View File

@ -6,7 +6,7 @@ import { IEsploraApi } from '../api/bitcoin/esplora-api.interface';
import { Common } from '../api/common'; import { Common } from '../api/common';
import config from '../config'; import config from '../config';
import blocks from '../api/blocks'; import blocks from '../api/blocks';
import accelerationApi, { Acceleration } from '../api/services/acceleration'; import accelerationApi, { Acceleration, AccelerationHistory } from '../api/services/acceleration';
import accelerationCosts from '../api/acceleration/acceleration'; import accelerationCosts from '../api/acceleration/acceleration';
import bitcoinApi from '../api/bitcoin/bitcoin-api-factory'; import bitcoinApi from '../api/bitcoin/bitcoin-api-factory';
import transactionUtils from '../api/transaction-utils'; import transactionUtils from '../api/transaction-utils';
@ -15,6 +15,7 @@ import { BlockExtended, MempoolTransactionExtended } from '../mempool.interfaces
export interface PublicAcceleration { export interface PublicAcceleration {
txid: string, txid: string,
height: number, height: number,
added: number,
pool: { pool: {
id: number, id: number,
slug: string, slug: string,
@ -29,15 +30,20 @@ export interface PublicAcceleration {
class AccelerationRepository { class AccelerationRepository {
private bidBoostV2Activated = 831580; private bidBoostV2Activated = 831580;
public async $saveAcceleration(acceleration: AccelerationInfo, block: IEsploraApi.Block, pool_id: number): Promise<void> { public async $saveAcceleration(acceleration: AccelerationInfo, block: IEsploraApi.Block, pool_id: number, accelerationData: Acceleration[]): Promise<void> {
const accelerationMap: { [txid: string]: Acceleration } = {};
for (const acc of accelerationData) {
accelerationMap[acc.txid] = acc;
}
try { try {
await DB.query(` await DB.query(`
INSERT INTO accelerations(txid, added, height, pool, effective_vsize, effective_fee, boost_rate, boost_cost) INSERT INTO accelerations(txid, requested, added, height, pool, effective_vsize, effective_fee, boost_rate, boost_cost)
VALUE (?, FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?) VALUE (?, FROM_UNIXTIME(?), FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
height = ? height = ?
`, [ `, [
acceleration.txSummary.txid, acceleration.txSummary.txid,
accelerationMap[acceleration.txSummary.txid].added,
block.timestamp, block.timestamp,
block.height, block.height,
pool_id, pool_id,
@ -64,7 +70,7 @@ class AccelerationRepository {
} }
let query = ` let query = `
SELECT * FROM accelerations SELECT *, UNIX_TIMESTAMP(requested) as requested_timestamp, UNIX_TIMESTAMP(added) as block_timestamp FROM accelerations
JOIN pools on pools.unique_id = accelerations.pool JOIN pools on pools.unique_id = accelerations.pool
`; `;
let params: any[] = []; let params: any[] = [];
@ -99,6 +105,7 @@ class AccelerationRepository {
return rows.map(row => ({ return rows.map(row => ({
txid: row.txid, txid: row.txid,
height: row.height, height: row.height,
added: row.requested_timestamp || row.block_timestamp,
pool: { pool: {
id: row.id, id: row.id,
slug: row.slug, slug: row.slug,
@ -202,7 +209,7 @@ class AccelerationRepository {
const tx = blockTxs[acc.txid]; const tx = blockTxs[acc.txid];
const accelerationInfo = accelerationCosts.getAccelerationInfo(tx, boostRate, transactions); const accelerationInfo = accelerationCosts.getAccelerationInfo(tx, boostRate, transactions);
accelerationInfo.cost = Math.max(0, Math.min(acc.feeDelta, accelerationInfo.cost)); accelerationInfo.cost = Math.max(0, Math.min(acc.feeDelta, accelerationInfo.cost));
this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id); this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id, successfulAccelerations);
} }
} }
const lastSyncedHeight = await this.$getLastSyncedHeight(); const lastSyncedHeight = await this.$getLastSyncedHeight();
@ -230,7 +237,7 @@ class AccelerationRepository {
logger.debug(`Fetching accelerations between block ${lastSyncedHeight} and ${currentHeight}`); logger.debug(`Fetching accelerations between block ${lastSyncedHeight} and ${currentHeight}`);
// Fetch accelerations from mempool.space since the last synced block; // Fetch accelerations from mempool.space since the last synced block;
const accelerationsByBlock = {}; const accelerationsByBlock: {[height: number]: AccelerationHistory[]} = {};
const blockHashes = {}; const blockHashes = {};
let done = false; let done = false;
let page = 1; let page = 1;
@ -297,12 +304,16 @@ class AccelerationRepository {
const feeStats = Common.calcEffectiveFeeStatistics(template); const feeStats = Common.calcEffectiveFeeStatistics(template);
boostRate = feeStats.medianFee; boostRate = feeStats.medianFee;
} }
const accelerationSummaries = accelerations.map(acc => ({
...acc,
pools: acc.pools.map(pool => pool.pool_unique_id),
}))
for (const acc of accelerations) { for (const acc of accelerations) {
if (blockTxs[acc.txid]) { if (blockTxs[acc.txid]) {
const tx = blockTxs[acc.txid]; const tx = blockTxs[acc.txid];
const accelerationInfo = accelerationCosts.getAccelerationInfo(tx, boostRate, transactions); const accelerationInfo = accelerationCosts.getAccelerationInfo(tx, boostRate, transactions);
accelerationInfo.cost = Math.max(0, Math.min(acc.feeDelta, accelerationInfo.cost)); accelerationInfo.cost = Math.max(0, Math.min(acc.feeDelta, accelerationInfo.cost));
await this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id); await this.$saveAcceleration(accelerationInfo, block, block.extras.pool.id, accelerationSummaries);
} }
} }
await this.$setLastSyncedHeight(height); await this.$setLastSyncedHeight(height);
@ -317,6 +328,26 @@ class AccelerationRepository {
logger.debug(`Indexing accelerations completed`); logger.debug(`Indexing accelerations completed`);
} }
/**
* Delete accelerations from the database above blockHeight
*/
public async $deleteAccelerationsFrom(blockHeight: number): Promise<void> {
logger.info(`Delete newer accelerations from height ${blockHeight} from the database`);
try {
const currentSyncedHeight = await this.$getLastSyncedHeight();
if (currentSyncedHeight >= blockHeight) {
await DB.query(`
UPDATE state
SET number = ?
WHERE name = 'last_acceleration_block'
`, [blockHeight - 1]);
}
await DB.query(`DELETE FROM accelerations where height >= ${blockHeight}`);
} catch (e) {
logger.err('Cannot delete indexed accelerations. Reason: ' + (e instanceof Error ? e.message : e));
}
}
} }
export default new AccelerationRepository(); export default new AccelerationRepository();

View File

@ -65,24 +65,26 @@
</div> </div>
</div> </div>
<br> <br>
<h5 i18n="accelerator.pay-how-much">How much more are you willing to pay?</h5> @if (paymentType !== 'cashapp') {
<div class="row"> <h5 i18n="accelerator.pay-how-much">How much more are you willing to pay?</h5>
<div class="col"> <div class="row">
<small class="form-text text-muted mb-2" i18n="accelerator.transaction-fee-description">Choose the maximum extra transaction fee you're willing to pay to get into the next block.</small> <div class="col">
<div class="form-group"> <small class="form-text text-muted mb-2" i18n="accelerator.transaction-fee-description">Choose the maximum extra transaction fee you're willing to pay to get into the next block.</small>
<div class="fee-card"> <div class="form-group">
<div class="d-flex mb-0"> <div class="fee-card">
<ng-container *ngFor="let option of maxRateOptions"> <div class="d-flex mb-0">
<button type="button" class="btn btn-primary flex-grow-1 btn-border btn-sm feerate" [class]="{active: selectFeeRateIndex === option.index}" (click)="setUserBid(option)"> <ng-container *ngFor="let option of maxRateOptions">
<span class="fee">{{ option.fee + estimate.mempoolBaseFee + estimate.vsizeFee | number }} <span class="symbol" i18n="shared.sats">sats</span></span> <button type="button" class="btn btn-primary flex-grow-1 btn-border btn-sm feerate" [class]="{active: selectFeeRateIndex === option.index}" (click)="setUserBid(option)">
<span class="rate">~<app-fee-rate [fee]="option.rate" rounding="1.0-0"></app-fee-rate></span> <span class="fee">{{ option.fee + estimate.mempoolBaseFee + estimate.vsizeFee | number }} <span class="symbol" i18n="shared.sats">sats</span></span>
</button> <span class="rate">~<app-fee-rate [fee]="option.rate" rounding="1.0-0"></app-fee-rate></span>
</ng-container> </button>
</ng-container>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> }
<h5>Acceleration summary</h5> <h5>Acceleration summary</h5>
<div class="row mb-3"> <div class="row mb-3">
@ -90,27 +92,51 @@
<table class="table table-borderless table-border table-dark table-accelerator"> <table class="table table-borderless table-border table-dark table-accelerator">
<tbody> <tbody>
<!-- ESTIMATED FEE --> <!-- ESTIMATED FEE -->
<ng-container> @if (paymentType === 'cashapp') {
<tr class="group-first"> <ng-container>
<td class="item" i18n="accelerator.next-block-rate">Next block market rate</td> <tr class="group-first">
<td class="amt" style="font-size: 16px"> <td class="item" i18n="accelerator.boost-rate">Boost rate</td>
{{ estimate.targetFeeRate | number : '1.0-0' }} <td class="amt" style="font-size: 16px">
</td> {{ maxRateOptions[selectFeeRateIndex].rate | number : '1.0-0' }}
<td class="units"><span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span></td> </td>
</tr> <td class="units"><span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span></td>
<tr class="info"> </tr>
<td class="info"> <tr class="info">
<i><small i18n="accelerator.estimated-extra-fee-required">Estimated extra fee required</small></i> <td class="info">
</td> <i><small i18n="accelerator.estimated-extra-fee-required">Boost fee</small></i>
<td class="amt"> </td>
{{ math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee) | number }} <td class="amt">
</td> {{ maxRateOptions[selectFeeRateIndex].fee | number }}
<td class="units"> </td>
<span class="symbol" i18n="shared.sats">sats</span> <td class="units">
<span class="fiat ml-1"><app-fiat [value]="math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee)"></app-fiat></span> <span class="symbol" i18n="shared.sats">sats</span>
</td> <span class="fiat ml-1"><app-fiat [value]="maxRateOptions[selectFeeRateIndex].fee"></app-fiat></span>
</tr> </td>
</ng-container> </tr>
</ng-container>
} @else {
<ng-container>
<tr class="group-first">
<td class="item" i18n="accelerator.next-block-rate">Next block market rate</td>
<td class="amt" style="font-size: 16px">
{{ estimate.targetFeeRate | number : '1.0-0' }}
</td>
<td class="units"><span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span></td>
</tr>
<tr class="info">
<td class="info">
<i><small i18n="accelerator.estimated-extra-fee-required">Estimated extra fee required</small></i>
</td>
<td class="amt">
{{ math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee) | number }}
</td>
<td class="units">
<span class="symbol" i18n="shared.sats">sats</span>
<span class="fiat ml-1"><app-fiat [value]="math.max(0, estimate.nextBlockFee - estimate.txSummary.effectiveFee)"></app-fiat></span>
</td>
</tr>
</ng-container>
}
<!-- MEMPOOL BASE FEE --> <!-- MEMPOOL BASE FEE -->
<tr> <tr>
@ -141,53 +167,76 @@
</td> </td>
</tr> </tr>
<!-- NEXT BLOCK ESTIMATE -->
<ng-container> @if (paymentType === 'cashapp') {
<tr class="group-first" style="border-top: 1px dashed grey; border-collapse: collapse;"> <!-- FIXED COST -->
<td class="item"> <ng-container>
<b style="background-color: #5E35B1" class="p-1 pl-0" i18n="accelerator.estimated-cost">Estimated acceleration cost</b> <tr class="group-first group-last" style="border-top: 1px solid lightgrey; border-collapse: collapse;">
</td> <td class="item">
<td class="amt"> <b style="background-color: #105fb0;" class="p-1 pl-0" i18n="accelerator.total-cost">Total cost</b>
<span style="background-color: #5E35B1" class="p-1 pl-0"> </td>
{{ estimate.cost + estimate.mempoolBaseFee + estimate.vsizeFee | number }} <td class="amt">
</span> <span style="background-color: #105fb0" class="p-1 pl-0">
</td> {{ maxCost | number }}
<td class="units"> </span>
<span class="symbol" i18n="shared.sats">sats</span> </td>
<span class="fiat ml-1"><app-fiat [value]="estimate.cost + estimate.mempoolBaseFee + estimate.vsizeFee"></app-fiat></span> <td class="units">
</td> <span class="symbol" i18n="shared.sats">sats</span>
</tr> <span class="fiat ml-1">
<tr class="info group-last" style="border-bottom: 1px solid lightgrey"> <app-fiat [value]="maxCost" [colorClass]="'green-color'"></app-fiat>
<td class="info" colspan=3> </span>
<i><small><ng-container *ngTemplateOutlet="acceleratedTo; context: {$implicit: estimate.targetFeeRate }"></ng-container></small></i> </td>
</td> </tr>
</tr> </ng-container>
</ng-container> } @else {
<!-- NEXT BLOCK ESTIMATE -->
<ng-container>
<tr class="group-first" style="border-top: 1px dashed grey; border-collapse: collapse;">
<td class="item">
<b style="background-color: #5E35B1" class="p-1 pl-0" i18n="accelerator.estimated-cost">Estimated acceleration cost</b>
</td>
<td class="amt">
<span style="background-color: #5E35B1" class="p-1 pl-0">
{{ estimate.cost + estimate.mempoolBaseFee + estimate.vsizeFee | number }}
</span>
</td>
<td class="units">
<span class="symbol" i18n="shared.sats">sats</span>
<span class="fiat ml-1"><app-fiat [value]="estimate.cost + estimate.mempoolBaseFee + estimate.vsizeFee"></app-fiat></span>
</td>
</tr>
<tr class="info group-last" style="border-bottom: 1px solid lightgrey">
<td class="info" colspan=3>
<i><small><ng-container *ngTemplateOutlet="acceleratedTo; context: {$implicit: estimate.targetFeeRate }"></ng-container></small></i>
</td>
</tr>
</ng-container>
<!-- MAX COST --> <!-- MAX COST -->
<ng-container> <ng-container>
<tr class="group-first"> <tr class="group-first">
<td class="item"> <td class="item">
<b style="background-color: var(--primary);" class="p-1 pl-0" i18n="accelerator.maximum-cost">Maximum acceleration cost</b> <b style="background-color: var(--primary);" class="p-1 pl-0" i18n="accelerator.maximum-cost">Maximum acceleration cost</b>
</td> </td>
<td class="amt"> <td class="amt">
<span style="background-color: var(--primary)" class="p-1 pl-0"> <span style="background-color: var(--primary)" class="p-1 pl-0">
{{ maxCost | number }} {{ maxCost | number }}
</span> </span>
</td> </td>
<td class="units"> <td class="units">
<span class="symbol" i18n="shared.sats">sats</span> <span class="symbol" i18n="shared.sats">sats</span>
<span class="fiat ml-1"> <span class="fiat ml-1">
<app-fiat [value]="maxCost" [colorClass]="estimate.userBalance < maxCost ? 'red-color' : 'green-color'"></app-fiat> <app-fiat [value]="maxCost" [colorClass]="estimate.userBalance < maxCost ? 'red-color' : 'green-color'"></app-fiat>
</span> </span>
</td> </td>
</tr> </tr>
<tr class="info group-last"> <tr class="info group-last">
<td class="info" colspan=3> <td class="info" colspan=3>
<i><small><ng-container *ngTemplateOutlet="acceleratedTo; context: {$implicit: (estimate.txSummary.effectiveFee + userBid) / estimate.txSummary.effectiveVsize }"></ng-container></small></i> <i><small><ng-container *ngTemplateOutlet="acceleratedTo; context: {$implicit: (estimate.txSummary.effectiveFee + userBid) / estimate.txSummary.effectiveVsize }"></ng-container></small></i>
</td> </td>
</tr> </tr>
</ng-container> </ng-container>
}
<!-- USER BALANCE --> <!-- USER BALANCE -->
<ng-container *ngIf="isLoggedIn() && estimate.userBalance < maxCost"> <ng-container *ngIf="isLoggedIn() && estimate.userBalance < maxCost">
@ -237,14 +286,17 @@
</div> </div>
</div> </div>
<div class="row d-flex justify-content-end align-items-center mr-1" style="height: 48px" *ngIf="!hideCashApp && paymentType === 'cashapp'"> @if (!hideCashApp && paymentType === 'cashapp') {
<div [style]="showSpinner ? 'opacity: 0' : 'opacity: 1'" class="p-2">Accelerate with</div> <div #cashappCTA class="cashapp-placeholder {{ stickyCTA }}"></div>
<div id="cash-app-pay" style="max-width: 320px" [style]="showSpinner ? 'opacity: 0' : 'opacity: 1'"></div> <div class="d-flex justify-content-center align-items-center cashapp-cta {{ stickyCTA }}" (click)="submitCashappPay()">
<div *ngIf="showSpinner" class="d-flex align-items-center"> <div [style]="showSpinner ? 'opacity: 0' : 'opacity: 1'" class="p-2">Accelerate for <app-fiat [value]="maxCost" [colorClass]="estimate.userBalance < maxCost ? 'red-color' : 'green-color'"></app-fiat> with</div>
<span class="mr-2">Loading</span> <div id="cash-app-pay" style="max-width: 320px" [style]="showSpinner ? 'opacity: 0' : 'opacity: 1'"></div>
<div class="spinner-border text-light" style="width: 25px; height: 25px"></div> <div *ngIf="showSpinner" class="d-flex align-items-center">
<span class="mr-2">Loading</span>
<div class="spinner-border text-light" style="width: 25px; height: 25px"></div>
</div>
</div> </div>
</div> }
</div> </div>
</ng-container> </ng-container>

View File

@ -109,4 +109,61 @@
.item { .item {
white-space: initial; white-space: initial;
}
.cashapp-cta {
width: 100%;
height: 54px;
background: #653b9c;
position: relative;
bottom: initial;
top: initial;
border-radius: 3px;
font-size: 14px;
line-height: 16px;
text-align: center;
padding: 4px 6px;
cursor: pointer;
box-shadow: 0px 0px 15px 0px #000;
&.sticky-top {
position: fixed;
width: calc(100vw - 30px - 1.5rem);
margin: auto;
z-index: 50;
left: 0;
right: 0;
top: 102px;
@media (min-width: 573px) {
top: 62px;
}
}
&.sticky-bottom {
position: fixed;
width: calc(100vw - 30px - 1.5rem);
margin: auto;
z-index: 50;
left: 0;
right: 0;
bottom: 50px;
@media (min-width: 430px) {
bottom: 56px;
}
}
@media (max-width: 400px) {
width: calc(100% + 1.5rem);
margin: 0 -0.75rem;
&.sticky-top, &.sticky-bottom {
width: calc(100vw - 30px);
}
}
}
.cashapp-placeholder {
height: 54px;
&.non-stick {
height: 0px;
}
} }

View File

@ -1,4 +1,4 @@
import { Component, OnInit, Input, OnDestroy, OnChanges, SimpleChanges, HostListener, ChangeDetectorRef } from '@angular/core'; import { Component, OnInit, Input, OnDestroy, OnChanges, SimpleChanges, HostListener, ChangeDetectorRef, ViewChild, ElementRef } from '@angular/core';
import { Subscription, catchError, of, tap } from 'rxjs'; import { Subscription, catchError, of, tap } from 'rxjs';
import { StorageService } from '../../services/storage.service'; import { StorageService } from '../../services/storage.service';
import { Transaction } from '../../interfaces/electrs.interface'; import { Transaction } from '../../interfaces/electrs.interface';
@ -43,6 +43,9 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
@Input() tx: Transaction | undefined; @Input() tx: Transaction | undefined;
@Input() scrollEvent: boolean; @Input() scrollEvent: boolean;
@ViewChild('cashappCTA')
cashappCTA: ElementRef;
math = Math; math = Math;
error = ''; error = '';
showSuccess = false; showSuccess = false;
@ -56,9 +59,11 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
defaultBid = 0; defaultBid = 0;
maxCost = 0; maxCost = 0;
userBid = 0; userBid = 0;
accelerationUUID: string;
selectFeeRateIndex = 1; selectFeeRateIndex = 1;
isMobile: boolean = window.innerWidth <= 767.98; isMobile: boolean = window.innerWidth <= 767.98;
user: any = undefined; user: any = undefined;
stickyCTA: string = 'non-stick';
maxRateOptions: RateOption[] = []; maxRateOptions: RateOption[] = [];
@ -66,6 +71,7 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
paymentType: 'bitcoin' | 'cashapp' = 'bitcoin'; paymentType: 'bitcoin' | 'cashapp' = 'bitcoin';
cashAppSubscription: Subscription; cashAppSubscription: Subscription;
conversionsSubscription: Subscription; conversionsSubscription: Subscription;
cashappSubmit: any;
payments: any; payments: any;
showSpinner = false; showSpinner = false;
square: any; square: any;
@ -80,7 +86,10 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
private cd: ChangeDetectorRef private cd: ChangeDetectorRef
) { ) {
if (this.stateService.ref === 'https://cash.app/') { if (this.stateService.ref === 'https://cash.app/') {
this.paymentType = 'cashapp';
this.insertSquare(); this.insertSquare();
} else {
this.paymentType = 'bitcoin';
} }
} }
@ -94,21 +103,23 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
} }
ngOnInit() { ngOnInit() {
this.accelerationUUID = window.crypto.randomUUID();
if (this.stateService.ref === 'https://cash.app/') { if (this.stateService.ref === 'https://cash.app/') {
this.paymentType = 'cashapp'; this.paymentType = 'cashapp';
this.stateService.ref = '';
} else { } else {
this.paymentType = 'bitcoin'; this.paymentType = 'bitcoin';
} }
} }
ngOnChanges(changes: SimpleChanges): void { ngOnChanges(changes: SimpleChanges): void {
if (changes.scrollEvent) { if (changes.scrollEvent && this.paymentType !== 'cashapp' && this.stateService.ref !== 'https://cash.app/') {
this.scrollToPreview('acceleratePreviewAnchor', 'start'); this.scrollToPreview('acceleratePreviewAnchor', 'start');
} }
} }
ngAfterViewInit() { ngAfterViewInit() {
this.onScroll();
if (this.paymentType === 'cashapp') { if (this.paymentType === 'cashapp') {
this.showSpinner = true; this.showSpinner = true;
} }
@ -173,10 +184,15 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
this.maxCost = this.userBid + this.estimate.mempoolBaseFee + this.estimate.vsizeFee; this.maxCost = this.userBid + this.estimate.mempoolBaseFee + this.estimate.vsizeFee;
if (!this.error) { if (!this.error) {
this.scrollToPreview('acceleratePreviewAnchor', 'start');
if (this.paymentType === 'cashapp') { if (this.paymentType === 'cashapp') {
this.setupSquare(); this.setupSquare();
} } else {
this.scrollToPreview('acceleratePreviewAnchor', 'start');
}
setTimeout(() => {
this.onScroll();
}, 100);
} }
} }
}), }),
@ -231,7 +247,8 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
} }
this.accelerationSubscription = this.servicesApiService.accelerate$( this.accelerationSubscription = this.servicesApiService.accelerate$(
this.tx.txid, this.tx.txid,
this.userBid this.userBid,
this.accelerationUUID
).subscribe({ ).subscribe({
next: () => { next: () => {
this.audioService.playSound('ascend-chime-cartoon'); this.audioService.playSound('ascend-chime-cartoon');
@ -301,6 +318,10 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
this.conversionsSubscription = this.stateService.conversions$.subscribe( this.conversionsSubscription = this.stateService.conversions$.subscribe(
async (conversions) => { async (conversions) => {
if (this.cashAppPay) {
this.cashAppPay.destroy();
}
const maxCostUsd = this.maxCost / 100_000_000 * conversions.USD; const maxCostUsd = this.maxCost / 100_000_000 * conversions.USD;
const paymentRequest = this.payments.paymentRequest({ const paymentRequest = this.payments.paymentRequest({
countryCode: 'US', countryCode: 'US',
@ -310,13 +331,15 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
label: 'Total', label: 'Total',
pending: true, pending: true,
productUrl: `https://mempool.space/tx/${this.tx.txid}`, productUrl: `https://mempool.space/tx/${this.tx.txid}`,
} },
button: { shape: 'semiround', size: 'small', theme: 'light'}
}); });
this.cashAppPay = await this.payments.cashAppPay(paymentRequest, { this.cashAppPay = await this.payments.cashAppPay(paymentRequest, {
redirectURL: `https://mempool.space/tx/${this.tx.txid}`, redirectURL: `https://mempool.space/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)}`,
button: { shape: 'semiround', size: 'small', theme: 'light'}
}); });
await this.cashAppPay.attach('#cash-app-pay'); const renderPromise = this.cashAppPay.CashAppPayInstance.render('#cash-app-pay', { button: { theme: 'light', size: 'small', shape: 'semiround' }, manage: false });
this.showSpinner = false; this.showSpinner = false;
const that = this; const that = this;
@ -332,7 +355,8 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
that.userBid, that.userBid,
tokenResult.token, tokenResult.token,
tokenResult.details.cashAppPay.cashtag, tokenResult.details.cashAppPay.cashtag,
tokenResult.details.cashAppPay.referenceId tokenResult.details.cashAppPay.referenceId,
that.accelerationUUID
).subscribe({ ).subscribe({
next: () => { next: () => {
that.audioService.playSound('ascend-chime-cartoon'); that.audioService.playSound('ascend-chime-cartoon');
@ -351,13 +375,19 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
}); });
} }
}); });
this.cashappSubmit = await renderPromise;
} }
); );
} }
insertSquare(): void { insertSquare(): void {
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.tk7.mempool.space' || document.location.hostname === 'mempool.space') { if (document.location.hostname === 'mempool-staging.fmt.mempool.space' ||
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 = 'https://web.squarecdn.com/v1/square.js'; statsUrl = 'https://web.squarecdn.com/v1/square.js';
} }
@ -367,4 +397,34 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
g.type='text/javascript'; g.src=statsUrl; s.parentNode.insertBefore(g, s); g.type='text/javascript'; g.src=statsUrl; s.parentNode.insertBefore(g, s);
})(); })();
} }
submitCashappPay(): void {
if (this.cashappSubmit) {
this.cashappSubmit?.begin();
}
}
@HostListener('window:scroll', ['$event']) // for window scroll events
onScroll() {
if (this.estimate && !this.cashappCTA?.nativeElement) {
setTimeout(() => {
this.onScroll();
}, 200);
return;
}
if (!this.cashappCTA?.nativeElement || this.paymentType !== 'cashapp' || !this.isMobile) {
return;
}
const cta = this.cashappCTA.nativeElement;
const rect = cta.getBoundingClientRect();
const topOffset = window.innerWidth <= 572 ? 102 : 62;
const bottomOffset = window.innerWidth < 430 ? 50 : 56;
if (rect.top < topOffset) {
this.stickyCTA = 'sticky-top';
} else if (rect.top > window.innerHeight - (bottomOffset + 54)) {
this.stickyCTA = 'sticky-bottom';
} else {
this.stickyCTA = 'non-stick';
}
}
} }

View File

@ -39,10 +39,10 @@
</td> </td>
</ng-container> </ng-container>
<ng-container *ngIf="!pending"> <ng-container *ngIf="!pending">
<td *ngIf="acceleration.feePaid" class="fee text-right"> <td *ngIf="acceleration.boost != null" class="fee text-right">
{{ (acceleration.boost) | number }} <span class="symbol" i18n="shared.sat|sat">sat</span> {{ acceleration.boost | number }} <span class="symbol" i18n="shared.sat|sat">sat</span>
</td> </td>
<td *ngIf="!acceleration.feePaid" class="fee text-right"> <td *ngIf="acceleration.boost == null" class="fee text-right">
~ ~
</td> </td>
<td class="block text-right"> <td class="block text-right">

View File

@ -58,7 +58,7 @@ export class AccelerationsListComponent implements OnInit {
} }
} }
for (const acc of accelerations) { for (const acc of accelerations) {
acc.boost = acc.feePaid - acc.baseFee - acc.vsizeFee; acc.boost = acc.boostCost != null ? acc.boostCost : (acc.feePaid - acc.baseFee - acc.vsizeFee);
} }
if (this.widget) { if (this.widget) {
return of(accelerations.slice(0, 6)); return of(accelerations.slice(0, 6));

View File

@ -119,15 +119,15 @@ export class AcceleratorDashboardComponent implements OnInit {
switchMap(([accelerations, blocks]) => { switchMap(([accelerations, blocks]) => {
const blockMap = {}; const blockMap = {};
for (const block of blocks) { for (const block of blocks) {
blockMap[block.id] = block; blockMap[block.height] = block;
} }
const accelerationsByBlock: { [ hash: string ]: Acceleration[] } = {}; const accelerationsByBlock: { [ height: number ]: Acceleration[] } = {};
for (const acceleration of accelerations) { for (const acceleration of accelerations) {
if (['completed_provisional', 'failed_provisional', 'completed'].includes(acceleration.status) && acceleration.pools.includes(blockMap[acceleration.blockHash]?.extras.pool.id)) { if (['completed_provisional', 'failed_provisional', 'completed'].includes(acceleration.status) && acceleration.pools.includes(blockMap[acceleration.blockHeight]?.extras.pool.id)) {
if (!accelerationsByBlock[acceleration.blockHash]) { if (!accelerationsByBlock[acceleration.blockHeight]) {
accelerationsByBlock[acceleration.blockHash] = []; accelerationsByBlock[acceleration.blockHeight] = [];
} }
accelerationsByBlock[acceleration.blockHash].push(acceleration); accelerationsByBlock[acceleration.blockHeight].push(acceleration);
} }
} }
return of(blocks.slice(0, 6).map(block => { return of(blocks.slice(0, 6).map(block => {

View File

@ -161,7 +161,7 @@ export class AddressGraphComponent implements OnChanges {
], ],
series: [ series: [
{ {
name: $localize`Balance:Balance`, name: $localize`:@@7e69426bd97a606d8ae6026762858e6e7c86a1fd:Balance`,
showSymbol: false, showSymbol: false,
symbol: 'circle', symbol: 'circle',
symbolSize: 8, symbolSize: 8,

View File

@ -199,6 +199,7 @@ export default class BlockScene {
this.txs[tx.txid].feerate = tx.rate || (this.txs[tx.txid].fee / this.txs[tx.txid].vsize); this.txs[tx.txid].feerate = tx.rate || (this.txs[tx.txid].fee / this.txs[tx.txid].vsize);
this.txs[tx.txid].rate = tx.rate; this.txs[tx.txid].rate = tx.rate;
this.txs[tx.txid].dirty = true; this.txs[tx.txid].dirty = true;
this.updateColor(this.txs[tx.txid], startTime, 50, true);
} }
}); });

View File

@ -136,7 +136,7 @@ export class BlockPreviewComponent implements OnInit, OnDestroy {
return of(transactions); return of(transactions);
}) })
), ),
this.stateService.env.ACCELERATOR === true && block.height > 819500 ? this.servicesApiService.getAccelerationHistory$({ blockHash: block.id }) : of([]) this.stateService.env.ACCELERATOR === true && block.height > 819500 ? this.servicesApiService.getAccelerationHistory$({ blockHeight: block.height }) : of([])
]); ]);
} }
), ),

View File

@ -345,7 +345,7 @@ export class BlockComponent implements OnInit, OnDestroy {
return of(null); return of(null);
}) })
), ),
this.stateService.env.ACCELERATOR === true && block.height > 819500 ? this.servicesApiService.getAccelerationHistory$({ blockHash: block.id }) : of([]) this.stateService.env.ACCELERATOR === true && block.height > 819500 ? this.servicesApiService.getAccelerationHistory$({ blockHeight: block.height }) : of([])
]); ]);
}) })
) )

View File

@ -91,6 +91,10 @@ li.nav-item {
} }
} }
.dropdown-container {
margin-top: 5px;
}
nav { nav {
box-shadow: 0px 0px 15px 0px #000; box-shadow: 0px 0px 15px 0px #000;
} }

View File

@ -80,7 +80,9 @@
<div class="title float-left"> <div class="title float-left">
<h2 i18n="transaction.accelerate|Accelerate button label">Accelerate</h2> <h2 i18n="transaction.accelerate|Accelerate button label">Accelerate</h2>
</div> </div>
<button type="button" class="btn btn-outline-info accelerator-toggle btn-sm float-right" (click)="showAccelerationSummary = false" i18n="hide-accelerator">Hide accelerator</button> @if (!(isMobile && paymentType === 'cashapp')) {
<button type="button" class="btn btn-outline-info accelerator-toggle btn-sm float-right" (click)="showAccelerationSummary = false" i18n="hide-accelerator">Hide accelerator</button>
}
<div class="clearfix"></div> <div class="clearfix"></div>
<div class="box"> <div class="box">
@ -456,13 +458,18 @@
</ng-template> </ng-template>
<ng-template #firstSeenRow> <ng-template #firstSeenRow>
@if (!isLoadingTx && transactionTime !== -1) { @if (isLoadingTx) {
<ng-container *ngTemplateOutlet="skeletonDetailsRow"></ng-container>
} @else if (transactionTime === -1) {
<tr>
<td i18n="transaction.first-seen|Transaction first seen">First seen</td>
<td><span class="skeleton-loader"></span></td>
</tr>
} @else {
<tr> <tr>
<td i18n="transaction.first-seen|Transaction first seen">First seen</td> <td i18n="transaction.first-seen|Transaction first seen">First seen</td>
<td><i><app-time kind="since" [time]="transactionTime" [fastRender]="true"></app-time></i></td> <td><i><app-time kind="since" [time]="transactionTime" [fastRender]="true"></app-time></i></td>
</tr> </tr>
} @else {
<ng-container *ngTemplateOutlet="skeletonDetailsRow"></ng-container>
} }
</ng-template> </ng-template>
@ -530,7 +537,7 @@
} @else if (this.mempoolPosition.block >= 7) { } @else if (this.mempoolPosition.block >= 7) {
<span [class]="(acceleratorAvailable && accelerateCtaType === 'button') ? 'etaDeepMempool d-flex justify-content-end align-items-center' : ''"> <span [class]="(acceleratorAvailable && accelerateCtaType === 'button') ? 'etaDeepMempool d-flex justify-content-end align-items-center' : ''">
<span i18n="transaction.eta.in-several-hours|Transaction ETA in several hours or more">In several hours (or more)</span> <span i18n="transaction.eta.in-several-hours|Transaction ETA in several hours or more">In several hours (or more)</span>
@if (!tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { @if (!(isMobile && paymentType === 'cashapp') && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) {
<a [href]="'/services/accelerator/accelerate?txid=' + tx.txid" class="btn btn-sm accelerateDeepMempool btn-small-height" i18n="transaction.accelerate|Accelerate button label" (click)="onAccelerateClicked()">Accelerate</a> <a [href]="'/services/accelerator/accelerate?txid=' + tx.txid" class="btn btn-sm accelerateDeepMempool btn-small-height" i18n="transaction.accelerate|Accelerate button label" (click)="onAccelerateClicked()">Accelerate</a>
} }
</span> </span>
@ -539,7 +546,7 @@
} @else { } @else {
<span class="eta justify-content-end" [class]="(acceleratorAvailable && accelerateCtaType === 'button') ? 'd-flex align-items-center' : ''"> <span class="eta justify-content-end" [class]="(acceleratorAvailable && accelerateCtaType === 'button') ? 'd-flex align-items-center' : ''">
<app-time kind="until" *ngIf="(da$ | async) as da;" [time]="da.adjustedTimeAvg * (this.mempoolPosition.block + 1) + now + da.timeOffset" [fastRender]="false" [fixedRender]="true"></app-time> <app-time kind="until" *ngIf="(da$ | async) as da;" [time]="da.adjustedTimeAvg * (this.mempoolPosition.block + 1) + now + da.timeOffset" [fastRender]="false" [fixedRender]="true"></app-time>
@if (!tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) { @if (!(isMobile && paymentType === 'cashapp') && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) {
<a [href]="'/services/accelerator/accelerate?txid=' + tx.txid" class="btn btn-sm accelerate btn-small-height" i18n="transaction.accelerate|Accelerate button label" (click)="onAccelerateClicked()">Accelerate</a> <a [href]="'/services/accelerator/accelerate?txid=' + tx.txid" class="btn btn-sm accelerate btn-small-height" i18n="transaction.accelerate|Accelerate button label" (click)="onAccelerateClicked()">Accelerate</a>
} }
</span> </span>
@ -554,13 +561,13 @@
<ng-template #gogglesRow> <ng-template #gogglesRow>
@if (!isLoadingTx) { @if (!isLoadingTx) {
@if (((auditStatus && auditStatus.accelerated) || accelerationInfo || (tx && tx.acceleration)) || filters.length) { @if (isAcceleration || filters.length) {
<tr> <tr>
<td class="td-width"> <td class="td-width">
<span class="goggles-icon"><app-svg-images name="goggles" width="100%" height="100%"></app-svg-images></span> <span class="goggles-icon"><app-svg-images name="goggles" width="100%" height="100%"></app-svg-images></span>
</td> </td>
<td class="wrap-cell"> <td class="wrap-cell">
@if ((auditStatus && auditStatus.accelerated) || accelerationInfo || (tx && tx.acceleration)) { @if (isAcceleration) {
<span class="badge badge-accelerated mr-1" i18n="transaction.audit.accelerated">Accelerated</span> <span class="badge badge-accelerated mr-1" i18n="transaction.audit.accelerated">Accelerated</span>
} }
<ng-container *ngFor="let filter of filters;"> <ng-container *ngFor="let filter of filters;">
@ -606,15 +613,15 @@
@if (!isLoadingTx) { @if (!isLoadingTx) {
@if ((cpfpInfo && hasEffectiveFeeRate) || accelerationInfo) { @if ((cpfpInfo && hasEffectiveFeeRate) || accelerationInfo) {
<tr> <tr>
@if (tx.acceleration || accelerationInfo) { @if (isAcceleration) {
<td i18n="transaction.accelerated-fee-rate|Accelerated transaction fee rate">Accelerated fee rate</td> <td i18n="transaction.accelerated-fee-rate|Accelerated transaction fee rate">Accelerated fee rate</td>
} @else { } @else {
<td i18n="transaction.effective-fee-rate|Effective transaction fee rate">Effective fee rate</td> <td i18n="transaction.effective-fee-rate|Effective transaction fee rate">Effective fee rate</td>
} }
<td> <td>
<div class="effective-fee-container"> <div class="effective-fee-container">
@if (accelerationInfo) { @if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) {
<app-fee-rate [fee]="accelerationInfo.acceleratedFee" [weight]="accelerationInfo.effectiveVsize * 4"></app-fee-rate> <app-fee-rate [fee]="accelerationInfo.acceleratedFeeRate"></app-fee-rate>
} @else { } @else {
<app-fee-rate [fee]="tx.effectiveFeePerVsize"></app-fee-rate> <app-fee-rate [fee]="tx.effectiveFeePerVsize"></app-fee-rate>
} }

View File

@ -311,6 +311,13 @@
} }
} }
.accelerateFullSize {
width: 100%;
height: 100%;
padding: 0.5rem 0.25rem;
background-color: #653b9c;
}
.goggles-icon { .goggles-icon {
display: block; display: block;
width: 2.2em; width: 2.2em;

View File

@ -9,7 +9,8 @@ import {
delay, delay,
mergeMap, mergeMap,
tap, tap,
map map,
retry
} from 'rxjs/operators'; } from 'rxjs/operators';
import { Transaction } from '../../interfaces/electrs.interface'; import { Transaction } from '../../interfaces/electrs.interface';
import { of, merge, Subscription, Observable, Subject, from, throwError, combineLatest } from 'rxjs'; import { of, merge, Subscription, Observable, Subject, from, throwError, combineLatest } from 'rxjs';
@ -93,12 +94,13 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
adjustedVsize: number | null; adjustedVsize: number | null;
pool: Pool | null; pool: Pool | null;
auditStatus: AuditStatus | null; auditStatus: AuditStatus | null;
isAcceleration: boolean = false;
filters: Filter[] = []; filters: Filter[] = [];
showCpfpDetails = false; showCpfpDetails = false;
fetchCpfp$ = new Subject<string>(); fetchCpfp$ = new Subject<string>();
fetchRbfHistory$ = new Subject<string>(); fetchRbfHistory$ = new Subject<string>();
fetchCachedTx$ = new Subject<string>(); fetchCachedTx$ = new Subject<string>();
fetchAcceleration$ = new Subject<string>(); fetchAcceleration$ = new Subject<number>();
fetchMiningInfo$ = new Subject<{ hash: string, height: number, txid: string }>(); fetchMiningInfo$ = new Subject<{ hash: string, height: number, txid: string }>();
isCached: boolean = false; isCached: boolean = false;
now = Date.now(); now = Date.now();
@ -117,6 +119,8 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
flowEnabled: boolean; flowEnabled: boolean;
tooltipPosition: { x: number, y: number }; tooltipPosition: { x: number, y: number };
isMobile: boolean; isMobile: boolean;
paymentType: 'bitcoin' | 'cashapp' = 'bitcoin';
firstLoad = true;
featuresEnabled: boolean; featuresEnabled: boolean;
segwitEnabled: boolean; segwitEnabled: boolean;
@ -154,6 +158,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
ngOnInit() { ngOnInit() {
this.acceleratorAvailable = this.stateService.env.OFFICIAL_MEMPOOL_SPACE && this.stateService.env.ACCELERATOR && this.stateService.network === ''; this.acceleratorAvailable = this.stateService.env.OFFICIAL_MEMPOOL_SPACE && this.stateService.env.ACCELERATOR && this.stateService.network === '';
if (this.acceleratorAvailable && this.stateService.ref === 'https://cash.app/') {
this.showAccelerationSummary = true;
this.paymentType = 'cashapp';
}
this.enterpriseService.page(); this.enterpriseService.page();
this.websocketService.want(['blocks', 'mempool-blocks']); this.websocketService.want(['blocks', 'mempool-blocks']);
@ -280,9 +289,10 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
filter(() => this.stateService.env.ACCELERATOR === true), filter(() => this.stateService.env.ACCELERATOR === true),
tap(() => { tap(() => {
this.accelerationInfo = null; this.accelerationInfo = null;
this.setIsAccelerated();
}), }),
switchMap((blockHash: string) => { switchMap((blockHeight: number) => {
return this.servicesApiService.getAccelerationHistory$({ blockHash }); return this.servicesApiService.getAccelerationHistory$({ blockHeight });
}), }),
catchError(() => { catchError(() => {
return of(null); return of(null);
@ -290,8 +300,12 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
).subscribe((accelerationHistory) => { ).subscribe((accelerationHistory) => {
for (const acceleration of accelerationHistory) { for (const acceleration of accelerationHistory) {
if (acceleration.txid === this.txId && (acceleration.status === 'completed' || acceleration.status === 'completed_provisional')) { if (acceleration.txid === this.txId && (acceleration.status === 'completed' || acceleration.status === 'completed_provisional')) {
acceleration.acceleratedFee = Math.max(acceleration.effectiveFee, acceleration.effectiveFee + acceleration.feePaid - acceleration.baseFee - acceleration.vsizeFee); const boostCost = acceleration.boostCost || (acceleration.feePaid - acceleration.baseFee - acceleration.vsizeFee);
acceleration.acceleratedFeeRate = Math.max(acceleration.effectiveFee, acceleration.effectiveFee + boostCost) / acceleration.effectiveVsize;
acceleration.boost = boostCost;
this.accelerationInfo = acceleration; this.accelerationInfo = acceleration;
this.setIsAccelerated();
} }
} }
}); });
@ -312,6 +326,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
map(block => { map(block => {
return block.extras.pool; return block.extras.pool;
}), }),
retry({ count: 3, delay: 2000 }),
catchError(() => { catchError(() => {
return of(null); return of(null);
}) })
@ -332,18 +347,21 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
accelerated: isAccelerated, accelerated: isAccelerated,
}; };
}), }),
retry({ count: 3, delay: 2000 }),
catchError(() => { catchError(() => {
return of(null); return of(null);
}) })
) : of(isCoinbase ? { coinbase: true } : null) ) : of(isCoinbase ? { coinbase: true } : null)
]); ]);
}), }),
catchError(() => { catchError((e) => {
return of(null); return of(null);
}) })
).subscribe(([pool, auditStatus]) => { ).subscribe(([pool, auditStatus]) => {
this.pool = pool; this.pool = pool;
this.auditStatus = auditStatus; this.auditStatus = auditStatus;
this.setIsAccelerated();
}); });
this.mempoolPositionSubscription = this.stateService.mempoolTxPosition$.subscribe(txPosition => { this.mempoolPositionSubscription = this.stateService.mempoolTxPosition$.subscribe(txPosition => {
@ -475,7 +493,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
this.getTransactionTime(); this.getTransactionTime();
} }
} else { } else {
this.fetchAcceleration$.next(tx.status.block_hash); this.fetchAcceleration$.next(tx.status.block_height);
this.fetchMiningInfo$.next({ hash: tx.status.block_hash, height: tx.status.block_height, txid: tx.txid }); this.fetchMiningInfo$.next({ hash: tx.status.block_hash, height: tx.status.block_height, txid: tx.txid });
this.transactionTime = 0; this.transactionTime = 0;
} }
@ -537,7 +555,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
} else { } else {
this.audioService.playSound('magic'); this.audioService.playSound('magic');
} }
this.fetchAcceleration$.next(block.id); this.fetchAcceleration$.next(block.height);
this.fetchMiningInfo$.next({ hash: block.id, height: block.height, txid: this.tx.txid }); this.fetchMiningInfo$.next({ hash: block.id, height: block.height, txid: this.tx.txid });
} }
}); });
@ -666,10 +684,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
relatives.reduce((prev, val) => prev + val.fee, 0); relatives.reduce((prev, val) => prev + val.fee, 0);
this.tx.effectiveFeePerVsize = totalFees / (totalWeight / 4); this.tx.effectiveFeePerVsize = totalFees / (totalWeight / 4);
} else { } else {
this.tx.effectiveFeePerVsize = cpfpInfo.effectiveFeePerVsize; this.tx.effectiveFeePerVsize = cpfpInfo.effectiveFeePerVsize || this.tx.effectiveFeePerVsize || this.tx.feePerVsize || (this.tx.fee / (this.tx.weight / 4));
} }
if (cpfpInfo.acceleration) { if (cpfpInfo.acceleration) {
this.tx.acceleration = cpfpInfo.acceleration; this.tx.acceleration = cpfpInfo.acceleration;
this.setIsAccelerated();
} }
this.cpfpInfo = cpfpInfo; this.cpfpInfo = cpfpInfo;
@ -681,6 +700,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
this.hasEffectiveFeeRate = hasRelatives || (this.tx.effectiveFeePerVsize && (Math.abs(this.tx.effectiveFeePerVsize - this.tx.feePerVsize) > 0.01)); this.hasEffectiveFeeRate = hasRelatives || (this.tx.effectiveFeePerVsize && (Math.abs(this.tx.effectiveFeePerVsize - this.tx.feePerVsize) > 0.01));
} }
setIsAccelerated() {
console.log(this.tx.acceleration, this.accelerationInfo, this.pool, this.accelerationInfo?.pools);
this.isAcceleration = (this.tx.acceleration || (this.accelerationInfo && this.pool && this.accelerationInfo.pools.some(pool => (pool === this.pool.id || pool?.['pool_unique_id'] === this.pool.id))));
}
setFeatures(): void { setFeatures(): void {
if (this.tx) { if (this.tx) {
this.segwitEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'segwit'); this.segwitEnabled = !this.tx.status.confirmed || isFeatureActive(this.stateService.network, this.tx.status.block_height, 'segwit');
@ -720,6 +744,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
} }
resetTransaction() { resetTransaction() {
if (!this.firstLoad) {
this.stateService.ref = '';
} else {
this.firstLoad = false;
}
this.error = undefined; this.error = undefined;
this.tx = null; this.tx = null;
this.setFeatures(); this.setFeatures();
@ -742,6 +771,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
this.pool = null; this.pool = null;
this.auditStatus = null; this.auditStatus = null;
document.body.scrollTo(0, 0); document.body.scrollTo(0, 0);
this.isAcceleration = false;
this.leaveTransaction(); this.leaveTransaction();
} }
@ -814,6 +844,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
} }
ngOnDestroy() { ngOnDestroy() {
this.stateService.ref = '';
this.subscription.unsubscribe(); this.subscription.unsubscribe();
this.fetchCpfpSubscription.unsubscribe(); this.fetchCpfpSubscription.unsubscribe();
this.fetchRbfSubscription.unsubscribe(); this.fetchRbfSubscription.unsubscribe();

View File

@ -190,11 +190,11 @@
</ng-template> </ng-template>
<ng-template type="why-is-transaction-stuck-in-mempool"> <ng-template type="why-is-transaction-stuck-in-mempool">
<p>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 <a [routerLink]="['/docs/faq' | relativeUrl]" fragment="how-to-get-transaction-confirmed-quickly">ways to accelerate the process</a>.</p><p>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.</p><p style='font-weight:700'>This site only provides data about the Bitcoin network—it cannot help you get your transaction confirmed quicker.</p> <p>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 <a [routerLink]="['/docs/faq' | relativeUrl]" fragment="how-to-get-transaction-confirmed-quickly">ways to accelerate the process</a>.</p><p>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.</p><p>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).</p>
</ng-template> </ng-template>
<ng-template type="how-to-get-transaction-confirmed-quickly"> <ng-template type="how-to-get-transaction-confirmed-quickly">
<p>To get your transaction confirmed quicker, you will need to increase its effective feerate.</p><p>If your transaction was created with RBF enabled, your stuck transaction can simply be replaced with a new one that has a higher fee.</p><p>Otherwise, if you control any of the stuck transaction's outputs, you can use CPFP to increase your stuck transaction's effective feerate.</p><p>If you are not sure how to do RBF or CPFP, work with the tool you used to make the transaction (wallet software, exchange company, etc). This website only provides data about the Bitcoin network, so there is nothing it can do to help you get your transaction confirmed quicker.</p> <p>To get your transaction confirmed quicker, you will need to increase its effective feerate.</p><p>If your transaction was created with RBF enabled, your stuck transaction can simply be replaced with a new one that has a higher fee. Otherwise, if you control any of the stuck transaction's outputs, you can use CPFP to increase your stuck transaction's effective feerate.</p><p>If you are not sure how to do RBF or CPFP, work with the tool you used to make the transaction (wallet software, exchange company, etc).</p><p *ngIf="officialMempoolInstance">Another option to get your transaction confirmed more quickly is Mempool Accelerator™. This service is still in development, but you can <a href="https://mempool.space/accelerator">sign up for the waitlist</a> to be notified when it's ready.</p>
</ng-template> </ng-template>
<ng-template type="how-prevent-stuck-transaction"> <ng-template type="how-prevent-stuck-transaction">

View File

@ -394,8 +394,11 @@ export interface Acceleration {
blockHash: string; blockHash: string;
blockHeight: number; blockHeight: number;
acceleratedFee?: number; acceleratedFeeRate?: number;
boost?: number; boost?: number;
boostCost?: number;
boostRate?: number;
} }
export interface AccelerationHistoryParams { export interface AccelerationHistoryParams {

View File

@ -128,12 +128,12 @@ export class ServicesApiServices {
return this.httpClient.post<any>(`${SERVICES_API_PREFIX}/accelerator/estimate`, { txInput: txInput }, { observe: 'response' }); return this.httpClient.post<any>(`${SERVICES_API_PREFIX}/accelerator/estimate`, { txInput: txInput }, { observe: 'response' });
} }
accelerate$(txInput: string, userBid: number) { accelerate$(txInput: string, userBid: number, accelerationUUID: string) {
return this.httpClient.post<any>(`${SERVICES_API_PREFIX}/accelerator/accelerate`, { txInput: txInput, userBid: userBid }); return this.httpClient.post<any>(`${SERVICES_API_PREFIX}/accelerator/accelerate`, { txInput: txInput, userBid: userBid, accelerationUUID: accelerationUUID });
} }
accelerateWithCashApp$(txInput: string, userBid: number, token: string, cashtag: string, referenceId: string) { accelerateWithCashApp$(txInput: string, userBid: number, token: string, cashtag: string, referenceId: string, accelerationUUID: string) {
return this.httpClient.post<any>(`${SERVICES_API_PREFIX}/accelerator/accelerate/cashapp`, { txInput: txInput, userBid: userBid, token: token, cashtag: cashtag, referenceId: referenceId }); return this.httpClient.post<any>(`${SERVICES_API_PREFIX}/accelerator/accelerate/cashapp`, { txInput: txInput, userBid: userBid, token: token, cashtag: cashtag, referenceId: referenceId, accelerationUUID: accelerationUUID });
} }
getAccelerations$(): Observable<Acceleration[]> { getAccelerations$(): Observable<Acceleration[]> {

View File

@ -954,6 +954,7 @@
</trans-unit> </trans-unit>
<trans-unit id="02573b6980a2d611b4361a2595a4447e390058cd" datatype="html"> <trans-unit id="02573b6980a2d611b4361a2595a4447e390058cd" datatype="html">
<source>Accelerations</source> <source>Accelerations</source>
<target>شتاب‌دهی‌ها</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">2</context> <context context-type="linenumber">2</context>
@ -987,6 +988,7 @@
</trans-unit> </trans-unit>
<trans-unit id="91de1b9fba9fbc4b3dd8bda866e948524c3049e5" datatype="html"> <trans-unit id="91de1b9fba9fbc4b3dd8bda866e948524c3049e5" datatype="html">
<source>Fee Rate</source> <source>Fee Rate</source>
<target>نرخ کارمزد</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">12</context> <context context-type="linenumber">12</context>
@ -996,6 +998,7 @@
</trans-unit> </trans-unit>
<trans-unit id="90345169b9d6df90f3545aa45fc56146cf9f6b68" datatype="html"> <trans-unit id="90345169b9d6df90f3545aa45fc56146cf9f6b68" datatype="html">
<source>Acceleration Bid</source> <source>Acceleration Bid</source>
<target>پیشنهاد شتاب‌دهی</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">13</context> <context context-type="linenumber">13</context>
@ -1005,6 +1008,7 @@
</trans-unit> </trans-unit>
<trans-unit id="dac1da772be9797ce39c7364d0e01373e4955ed1" datatype="html"> <trans-unit id="dac1da772be9797ce39c7364d0e01373e4955ed1" datatype="html">
<source>Requested</source> <source>Requested</source>
<target>درخواست‌شده</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">14</context> <context context-type="linenumber">14</context>
@ -1017,6 +1021,7 @@
</trans-unit> </trans-unit>
<trans-unit id="57cde27765d527a0d9195212fa5a7ce06408c827" datatype="html"> <trans-unit id="57cde27765d527a0d9195212fa5a7ce06408c827" datatype="html">
<source>Bid Boost</source> <source>Bid Boost</source>
<target>افزایش ناشی از پیشنهاد</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">17</context> <context context-type="linenumber">17</context>
@ -1065,6 +1070,7 @@
</trans-unit> </trans-unit>
<trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506" datatype="html"> <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506" datatype="html">
<source>Pending</source> <source>Pending</source>
<target>در حال انتظار</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">53</context> <context context-type="linenumber">53</context>
@ -1073,6 +1079,7 @@
</trans-unit> </trans-unit>
<trans-unit id="9362dc86738f282259d3ef3789b7824dbfd19202" datatype="html"> <trans-unit id="9362dc86738f282259d3ef3789b7824dbfd19202" datatype="html">
<source>Completed <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span *ngIf=&quot;acceleration.status === 'completed_provisional'&quot;&gt;"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></source> <source>Completed <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span *ngIf=&quot;acceleration.status === 'completed_provisional'&quot;&gt;"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></source>
<target>کامل‌شده <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span *ngIf=&quot;acceleration.status === 'completed_provisional'&quot;&gt;"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></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">54,55</context> <context context-type="linenumber">54,55</context>
@ -1080,6 +1087,7 @@
</trans-unit> </trans-unit>
<trans-unit id="7131ba3d0dee65d36dc5de582917a4fc826e73d0" datatype="html"> <trans-unit id="7131ba3d0dee65d36dc5de582917a4fc826e73d0" datatype="html">
<source>Failed <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span *ngIf=&quot;acceleration.status === 'failed_provisional'&quot;&gt;"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></source> <source>Failed <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span *ngIf=&quot;acceleration.status === 'failed_provisional'&quot;&gt;"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></source>
<target>ناموفق <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span *ngIf=&quot;acceleration.status === 'failed_provisional'&quot;&gt;"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></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">55,56</context> <context context-type="linenumber">55,56</context>
@ -1088,6 +1096,7 @@
</trans-unit> </trans-unit>
<trans-unit id="805f27b06c3c2b919234b3bcf3d0f5abe445d922" datatype="html"> <trans-unit id="805f27b06c3c2b919234b3bcf3d0f5abe445d922" datatype="html">
<source>There are no active accelerations</source> <source>There are no active accelerations</source>
<target>هیچ شتاب‌دهی فعالی وجود ندارد</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">96</context> <context context-type="linenumber">96</context>
@ -1096,6 +1105,7 @@
</trans-unit> </trans-unit>
<trans-unit id="0c2d0d4986aed63c43d3d39a37d5039a55ddf9d0" datatype="html"> <trans-unit id="0c2d0d4986aed63c43d3d39a37d5039a55ddf9d0" datatype="html">
<source>There are no recent accelerations</source> <source>There are no recent accelerations</source>
<target>هیچ شتاب‌دهی اخیری وجود ندارد</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">97</context> <context context-type="linenumber">97</context>
@ -1104,6 +1114,7 @@
</trans-unit> </trans-unit>
<trans-unit id="e51c45c636401f8bb3bd8cfd1ed5a3c9810c5fa8" datatype="html"> <trans-unit id="e51c45c636401f8bb3bd8cfd1ed5a3c9810c5fa8" datatype="html">
<source>Active Accelerations</source> <source>Active Accelerations</source>
<target>شتاب‌دهی‌های فعال</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context>
<context context-type="linenumber">10</context> <context context-type="linenumber">10</context>
@ -1116,6 +1127,7 @@
</trans-unit> </trans-unit>
<trans-unit id="41a9456b7e195dfc4df3d67b09940bda160882af" datatype="html"> <trans-unit id="41a9456b7e195dfc4df3d67b09940bda160882af" datatype="html">
<source>Acceleration stats</source> <source>Acceleration stats</source>
<target>وضعیت شتاب‌دهی</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context>
<context context-type="linenumber">24</context> <context context-type="linenumber">24</context>
@ -1124,6 +1136,7 @@
</trans-unit> </trans-unit>
<trans-unit id="12ad90f635ec3df50b367b133c213b27912325cc" datatype="html"> <trans-unit id="12ad90f635ec3df50b367b133c213b27912325cc" datatype="html">
<source>(3 months)</source> <source>(3 months)</source>
<target>(3 ماه)</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context>
<context context-type="linenumber">25</context> <context context-type="linenumber">25</context>
@ -1157,6 +1170,7 @@
</trans-unit> </trans-unit>
<trans-unit id="f0ae1220633178276128371f3965fb53d63581d4" datatype="html"> <trans-unit id="f0ae1220633178276128371f3965fb53d63581d4" datatype="html">
<source>Recent Accelerations</source> <source>Recent Accelerations</source>
<target>شتاب‌دهی‌های اخیر</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context>
<context context-type="linenumber">86</context> <context context-type="linenumber">86</context>
@ -1165,6 +1179,7 @@
</trans-unit> </trans-unit>
<trans-unit id="6b867dc61c6a92f3229f1950f9f2d414790cce95" datatype="html"> <trans-unit id="6b867dc61c6a92f3229f1950f9f2d414790cce95" datatype="html">
<source>Accelerator Dashboard</source> <source>Accelerator Dashboard</source>
<target>داشبورد شتاب‌دهی</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts</context> <context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts</context>
<context context-type="linenumber">47</context> <context context-type="linenumber">47</context>
@ -1176,6 +1191,7 @@
</trans-unit> </trans-unit>
<trans-unit id="3590f5c3ef2810f637316edb8aaa86b8e907f152" datatype="html"> <trans-unit id="3590f5c3ef2810f637316edb8aaa86b8e907f152" datatype="html">
<source>pending</source> <source>pending</source>
<target>در حال انتظار</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context>
<context context-type="linenumber">7</context> <context context-type="linenumber">7</context>
@ -1184,6 +1200,7 @@
</trans-unit> </trans-unit>
<trans-unit id="841f2a74ae5095e6e37f5749f3cc1851cf36a420" datatype="html"> <trans-unit id="841f2a74ae5095e6e37f5749f3cc1851cf36a420" datatype="html">
<source>Avg Max Bid</source> <source>Avg Max Bid</source>
<target>متوسط بیشینه پیشنهاد</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context>
<context context-type="linenumber">11</context> <context context-type="linenumber">11</context>
@ -1196,6 +1213,7 @@
</trans-unit> </trans-unit>
<trans-unit id="16fedee43f919b6a0992f32aeec5d6938e8d6b76" datatype="html"> <trans-unit id="16fedee43f919b6a0992f32aeec5d6938e8d6b76" datatype="html">
<source>Total Vsize</source> <source>Total Vsize</source>
<target>مجموع اندازه مجازی</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context>
<context context-type="linenumber">20</context> <context context-type="linenumber">20</context>
@ -1208,6 +1226,7 @@
</trans-unit> </trans-unit>
<trans-unit id="b5439bbae31f512a4ef3c3e2aa41f013f1dc120a" datatype="html"> <trans-unit id="b5439bbae31f512a4ef3c3e2aa41f013f1dc120a" datatype="html">
<source> of next block</source> <source> of next block</source>
<target>از بلاک بعدی</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context> <context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context>
<context context-type="linenumber">23</context> <context context-type="linenumber">23</context>
@ -1216,6 +1235,7 @@
</trans-unit> </trans-unit>
<trans-unit id="7b2e0a6bafe35c5cd10e55846d89397df0bff128" datatype="html"> <trans-unit id="7b2e0a6bafe35c5cd10e55846d89397df0bff128" datatype="html">
<source>Balance History</source> <source>Balance History</source>
<target>تاریخچه موجودی</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/address-graph/address-graph.component.html</context> <context context-type="sourcefile">src/app/components/address-graph/address-graph.component.html</context>
<context context-type="linenumber">6</context> <context context-type="linenumber">6</context>
@ -1224,6 +1244,7 @@
</trans-unit> </trans-unit>
<trans-unit id="4411783297407595814" datatype="html"> <trans-unit id="4411783297407595814" datatype="html">
<source>Balance:Balance</source> <source>Balance:Balance</source>
<target>Balance:Balance</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/address-graph/address-graph.component.ts</context> <context context-type="sourcefile">src/app/components/address-graph/address-graph.component.ts</context>
<context context-type="linenumber">162</context> <context context-type="linenumber">162</context>
@ -1231,6 +1252,7 @@
</trans-unit> </trans-unit>
<trans-unit id="b45214d1bf328d07f0aea939dfc197f5c59f421b" datatype="html"> <trans-unit id="b45214d1bf328d07f0aea939dfc197f5c59f421b" datatype="html">
<source>Balances</source> <source>Balances</source>
<target>موجودی‌ها</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/address-group/address-group.component.html</context> <context context-type="sourcefile">src/app/components/address-group/address-group.component.html</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">4</context>
@ -1239,6 +1261,7 @@
</trans-unit> </trans-unit>
<trans-unit id="d04d5b5d13ac9acf9750f1807f0227eeee98b247" datatype="html"> <trans-unit id="d04d5b5d13ac9acf9750f1807f0227eeee98b247" datatype="html">
<source>Total</source> <source>Total</source>
<target>مجموع</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/address-group/address-group.component.html</context> <context context-type="sourcefile">src/app/components/address-group/address-group.component.html</context>
<context context-type="linenumber">9</context> <context context-type="linenumber">9</context>
@ -6565,6 +6588,7 @@
</trans-unit> </trans-unit>
<trans-unit id="4136162380400286378" datatype="html"> <trans-unit id="4136162380400286378" datatype="html">
<source>Consolidation</source> <source>Consolidation</source>
<target>تجمیع</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context>
<context context-type="linenumber">79</context> <context context-type="linenumber">79</context>
@ -6576,6 +6600,7 @@
</trans-unit> </trans-unit>
<trans-unit id="7816493330657272952" datatype="html"> <trans-unit id="7816493330657272952" datatype="html">
<source>Coinjoin</source> <source>Coinjoin</source>
<target>هم‌بازضرب</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context>
<context context-type="linenumber">80</context> <context context-type="linenumber">80</context>
@ -6587,6 +6612,7 @@
</trans-unit> </trans-unit>
<trans-unit id="146442697456175258" datatype="html"> <trans-unit id="146442697456175258" datatype="html">
<source>Data</source> <source>Data</source>
<target>داده</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context>
<context context-type="linenumber">81</context> <context context-type="linenumber">81</context>

View File

@ -397,7 +397,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">534</context> <context context-type="linenumber">581</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context> <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
@ -464,11 +464,11 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">189</context> <context context-type="linenumber">101</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">317</context> <context context-type="linenumber">229</context>
</context-group> </context-group>
<note priority="1" from="description">Transaction Virtual Size</note> <note priority="1" from="description">Transaction Virtual Size</note>
<note priority="1" from="meaning">transaction.vsize</note> <note priority="1" from="meaning">transaction.vsize</note>
@ -710,15 +710,15 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">106</context> <context context-type="linenumber">81</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">145</context> <context context-type="linenumber">534</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">155</context> <context context-type="linenumber">543</context>
</context-group> </context-group>
<note priority="1" from="description">Accelerate button label</note> <note priority="1" from="description">Accelerate button label</note>
<note priority="1" from="meaning">transaction.accelerate</note> <note priority="1" from="meaning">transaction.accelerate</note>
@ -727,7 +727,7 @@
<source>If your tx is accelerated to ~<x id="INTERPOLATION" equiv-text="{{ i | number : &apos;1.0-0&apos; }}"/> sat/vB</source> <source>If your tx is accelerated to ~<x id="INTERPOLATION" equiv-text="{{ i | number : &apos;1.0-0&apos; }}"/> sat/vB</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/accelerate-preview/accelerate-preview.component.html</context> <context context-type="sourcefile">src/app/components/accelerate-preview/accelerate-preview.component.html</context>
<context context-type="linenumber">249</context> <context context-type="linenumber">258</context>
</context-group> </context-group>
<note priority="1" from="description">accelerator.accelerated-to-description</note> <note priority="1" from="description">accelerator.accelerated-to-description</note>
</trans-unit> </trans-unit>
@ -893,7 +893,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">188</context> <context context-type="linenumber">100</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
@ -1084,7 +1084,7 @@
<source>Accelerator Dashboard</source> <source>Accelerator Dashboard</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts</context> <context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts</context>
<context context-type="linenumber">47</context> <context context-type="linenumber">51</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/master-page/master-page.component.html</context> <context context-type="sourcefile">src/app/components/master-page/master-page.component.html</context>
@ -1139,11 +1139,23 @@
</context-group> </context-group>
<note priority="1" from="description">address.balance-history</note> <note priority="1" from="description">address.balance-history</note>
</trans-unit> </trans-unit>
<trans-unit id="4411783297407595814" datatype="html"> <trans-unit id="7e69426bd97a606d8ae6026762858e6e7c86a1fd" datatype="html">
<source>Balance:Balance</source> <source>Balance</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/address-graph/address-graph.component.ts</context> <context context-type="sourcefile">src/app/components/address-graph/address-graph.component.ts</context>
<context context-type="linenumber">162</context> <context context-type="linenumber">164</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/address/address-preview.component.html</context>
<context context-type="linenumber">31</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/address/address.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component.html</context>
<context context-type="linenumber">9</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="b45214d1bf328d07f0aea939dfc197f5c59f421b" datatype="html"> <trans-unit id="b45214d1bf328d07f0aea939dfc197f5c59f421b" datatype="html">
@ -1225,22 +1237,6 @@
</context-group> </context-group>
<note priority="1" from="description">address.total-sent</note> <note priority="1" from="description">address.total-sent</note>
</trans-unit> </trans-unit>
<trans-unit id="7e69426bd97a606d8ae6026762858e6e7c86a1fd" datatype="html">
<source>Balance</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/address/address-preview.component.html</context>
<context context-type="linenumber">31</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/address/address.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/liquid-reserves-audit/federation-addresses-list/federation-addresses-list.component.html</context>
<context context-type="linenumber">9</context>
</context-group>
<note priority="1" from="description">address.balance</note>
</trans-unit>
<trans-unit id="add4cd82e3e38a3110fe67b3c7df56e9602644ee" datatype="html"> <trans-unit id="add4cd82e3e38a3110fe67b3c7df56e9602644ee" datatype="html">
<source>Transactions</source> <source>Transactions</source>
<context-group purpose="location"> <context-group purpose="location">
@ -1991,7 +1987,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">130</context> <context context-type="linenumber">461</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context> <context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
@ -2028,7 +2024,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">449</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/confirmations/confirmations.component.html</context> <context context-type="sourcefile">src/app/shared/components/confirmations/confirmations.component.html</context>
@ -2073,7 +2069,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">533</context> <context context-type="linenumber">580</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context> <context context-type="sourcefile">src/app/components/tx-bowtie-graph-tooltip/tx-bowtie-graph-tooltip.component.html</context>
@ -2094,11 +2090,11 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">191</context> <context context-type="linenumber">103</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">537</context> <context context-type="linenumber">591</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context> <context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
@ -2123,7 +2119,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">548</context> <context context-type="linenumber">612</context>
</context-group> </context-group>
<note priority="1" from="description">Effective transaction fee rate</note> <note priority="1" from="description">Effective transaction fee rate</note>
<note priority="1" from="meaning">transaction.effective-fee-rate</note> <note priority="1" from="meaning">transaction.effective-fee-rate</note>
@ -2149,7 +2145,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">190</context> <context context-type="linenumber">102</context>
</context-group> </context-group>
<note priority="1" from="description">Transaction Weight</note> <note priority="1" from="description">Transaction Weight</note>
<note priority="1" from="meaning">transaction.weight</note> <note priority="1" from="meaning">transaction.weight</note>
@ -2219,7 +2215,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">81</context> <context context-type="linenumber">504</context>
</context-group> </context-group>
<note priority="1" from="description">Added</note> <note priority="1" from="description">Added</note>
<note priority="1" from="meaning">tx-features.tag.added</note> <note priority="1" from="meaning">tx-features.tag.added</note>
@ -2232,7 +2228,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">82</context> <context context-type="linenumber">507</context>
</context-group> </context-group>
<note priority="1" from="description">Prioritized</note> <note priority="1" from="description">Prioritized</note>
<note priority="1" from="meaning">tx-features.tag.prioritized</note> <note priority="1" from="meaning">tx-features.tag.prioritized</note>
@ -2245,7 +2241,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">83</context> <context context-type="linenumber">510</context>
</context-group> </context-group>
<note priority="1" from="description">Conflict</note> <note priority="1" from="description">Conflict</note>
<note priority="1" from="meaning">tx-features.tag.conflict</note> <note priority="1" from="meaning">tx-features.tag.conflict</note>
@ -2262,7 +2258,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">583</context> <context context-type="linenumber">564</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/filters.utils.ts</context> <context context-type="sourcefile">src/app/shared/filters.utils.ts</context>
@ -2356,7 +2352,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">313</context> <context context-type="linenumber">225</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
@ -2395,7 +2391,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">241</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4786852746659896870" datatype="html"> <trans-unit id="4786852746659896870" datatype="html">
@ -2493,7 +2489,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">53</context> <context context-type="linenumber">432</context>
</context-group> </context-group>
<note priority="1" from="description">block.timestamp</note> <note priority="1" from="description">block.timestamp</note>
</trans-unit> </trans-unit>
@ -2558,7 +2554,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">562</context> <context context-type="linenumber">641</context>
</context-group> </context-group>
<note priority="1" from="description">block.miner</note> <note priority="1" from="description">block.miner</note>
</trans-unit> </trans-unit>
@ -2745,7 +2741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">339</context> <context context-type="linenumber">251</context>
</context-group> </context-group>
<note priority="1" from="description">transaction.version</note> <note priority="1" from="description">transaction.version</note>
</trans-unit> </trans-unit>
@ -2846,7 +2842,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">74</context> <context context-type="linenumber">491</context>
</context-group> </context-group>
<note priority="1" from="description">Toggle Audit</note> <note priority="1" from="description">Toggle Audit</note>
<note priority="1" from="meaning">block.toggle-audit</note> <note priority="1" from="meaning">block.toggle-audit</note>
@ -2859,15 +2855,15 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">297</context> <context context-type="linenumber">209</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">305</context> <context context-type="linenumber">217</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">465</context> <context context-type="linenumber">342</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context> <context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
@ -4812,7 +4808,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">355</context> <context context-type="linenumber">267</context>
</context-group> </context-group>
<note priority="1" from="description">transaction.hex</note> <note priority="1" from="description">transaction.hex</note>
</trans-unit> </trans-unit>
@ -4906,7 +4902,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">276</context> <context context-type="linenumber">188</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context> <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
@ -5440,7 +5436,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">77</context> <context context-type="linenumber">495</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context> <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
@ -5460,7 +5456,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">398</context> <context context-type="linenumber">399</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">
@ -5471,7 +5467,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">402</context> <context context-type="linenumber">403</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="0094b97dd052620710f173e7aedf6807a1eba1f5" datatype="html"> <trans-unit id="0094b97dd052620710f173e7aedf6807a1eba1f5" datatype="html">
@ -5483,15 +5479,170 @@
<note priority="1" from="description">RBF replacement</note> <note priority="1" from="description">RBF replacement</note>
<note priority="1" from="meaning">transaction.rbf.replacement</note> <note priority="1" from="meaning">transaction.rbf.replacement</note>
</trans-unit> </trans-unit>
<trans-unit id="ec972116b4da9e2c5bc0e6e6586061d60cd13e56" datatype="html">
<source>Hide accelerator</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">83</context>
</context-group>
<note priority="1" from="description">hide-accelerator</note>
</trans-unit>
<trans-unit id="f61c6867295f3b53d23557021f2f4e0aa1d0b8fc" datatype="html">
<source>Type</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">99</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
<context context-type="linenumber">276</context>
</context-group>
<note priority="1" from="description">transactions-list.vout.scriptpubkey-type</note>
</trans-unit>
<trans-unit id="dd230222e3ae689913445ce93b6ae3f7cce7458b" datatype="html">
<source>Descendant</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">110</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">122</context>
</context-group>
<note priority="1" from="description">Descendant</note>
<note priority="1" from="meaning">transaction.descendant</note>
</trans-unit>
<trans-unit id="8c16167a5d7c96d14ff280b09de312d18d5e2511" datatype="html">
<source>Ancestor</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">134</context>
</context-group>
<note priority="1" from="description">Transaction Ancestor</note>
<note priority="1" from="meaning">transaction.ancestor</note>
</trans-unit>
<trans-unit id="03721a62015a76e794be64ba2b7e053e801215ea" datatype="html">
<source>RBF History</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">153</context>
</context-group>
<note priority="1" from="description">RBF History</note>
<note priority="1" from="meaning">transaction.rbf-history</note>
</trans-unit>
<trans-unit id="53fbdc20554c4e68ae509f652b38ab80021c0739" datatype="html">
<source>Flow</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">162</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">282</context>
</context-group>
<note priority="1" from="description">Transaction flow</note>
<note priority="1" from="meaning">transaction.flow</note>
</trans-unit>
<trans-unit id="d0fd8887b50687cfc0fc1f6569f6fd6c5db4ffc0" datatype="html">
<source>Hide diagram</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">165</context>
</context-group>
<note priority="1" from="description">hide-diagram</note>
</trans-unit>
<trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b" datatype="html">
<source>Show more</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">186</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
<context context-type="linenumber">171</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
<context context-type="linenumber">289</context>
</context-group>
<note priority="1" from="description">show-more</note>
</trans-unit>
<trans-unit id="31d8d7f29ddbd3f64d374a132ddacd5e4a0835a2" datatype="html">
<source>Inputs &amp; Outputs</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">204</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">313</context>
</context-group>
<note priority="1" from="description">Transaction inputs and outputs</note>
<note priority="1" from="meaning">transaction.inputs-and-outputs</note>
</trans-unit>
<trans-unit id="e7aa6db8df12d0158df972b6abfc65a8478b2b7d" datatype="html">
<source>Show diagram</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">208</context>
</context-group>
<note priority="1" from="description">show-diagram</note>
</trans-unit>
<trans-unit id="a8a4dd861f790141e19f773153cf42b5d0b0e6b6" datatype="html">
<source>Adjusted vsize</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">233</context>
</context-group>
<note priority="1" from="description">Transaction Adjusted VSize</note>
<note priority="1" from="meaning">transaction.adjusted-vsize</note>
</trans-unit>
<trans-unit id="516a786e59a57efaf80e11370b4bade400f19445" datatype="html">
<source>Locktime</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">255</context>
</context-group>
<note priority="1" from="description">transaction.locktime</note>
</trans-unit>
<trans-unit id="3dd65e8fa7035988a691aadcb583862c2a9e336a" datatype="html">
<source>Sigops</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">259</context>
</context-group>
<note priority="1" from="description">Transaction Sigops</note>
<note priority="1" from="meaning">transaction.sigops</note>
</trans-unit>
<trans-unit id="c9d9612bcd520103486b5fc84d84c9476a1b7f78" datatype="html">
<source>Transaction not found.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">391</context>
</context-group>
<note priority="1" from="description">transaction.error.transaction-not-found</note>
</trans-unit>
<trans-unit id="66b65556acb90d8764fe166a260af0309671698c" datatype="html">
<source>Waiting for it to appear in the mempool...</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">392</context>
</context-group>
<note priority="1" from="description">transaction.error.waiting-for-it-to-appear</note>
</trans-unit>
<trans-unit id="8a736bd53341b2dedaf9cdcfd9d1093cc16cb12c" datatype="html">
<source>Error loading transaction data.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">398</context>
</context-group>
<note priority="1" from="description">transaction.error.loading-transaction-data</note>
</trans-unit>
<trans-unit id="885666551418fd59011ceb09d5c481095940193b" datatype="html"> <trans-unit id="885666551418fd59011ceb09d5c481095940193b" datatype="html">
<source>Features</source> <source>Features</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">68</context> <context context-type="linenumber">474</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">163</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context> <context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
@ -5508,7 +5659,7 @@
<source>This transaction was projected to be included in the block</source> <source>This transaction was projected to be included in the block</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">78</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<note priority="1" from="description">Expected in block tooltip</note> <note priority="1" from="description">Expected in block tooltip</note>
</trans-unit> </trans-unit>
@ -5516,7 +5667,7 @@
<source>Expected in Block</source> <source>Expected in Block</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">78</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<note priority="1" from="description">Expected in Block</note> <note priority="1" from="description">Expected in Block</note>
<note priority="1" from="meaning">tx-features.tag.expected</note> <note priority="1" from="meaning">tx-features.tag.expected</note>
@ -5525,7 +5676,7 @@
<source>This transaction was seen in the mempool prior to mining</source> <source>This transaction was seen in the mempool prior to mining</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">79</context> <context context-type="linenumber">499</context>
</context-group> </context-group>
<note priority="1" from="description">Seen in mempool tooltip</note> <note priority="1" from="description">Seen in mempool tooltip</note>
</trans-unit> </trans-unit>
@ -5533,7 +5684,7 @@
<source>Seen in Mempool</source> <source>Seen in Mempool</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">79</context> <context context-type="linenumber">499</context>
</context-group> </context-group>
<note priority="1" from="description">Seen in Mempool</note> <note priority="1" from="description">Seen in Mempool</note>
<note priority="1" from="meaning">tx-features.tag.seen</note> <note priority="1" from="meaning">tx-features.tag.seen</note>
@ -5542,7 +5693,7 @@
<source>This transaction was missing from our mempool prior to mining</source> <source>This transaction was missing from our mempool prior to mining</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">80</context> <context context-type="linenumber">501</context>
</context-group> </context-group>
<note priority="1" from="description">Not seen in mempool tooltip</note> <note priority="1" from="description">Not seen in mempool tooltip</note>
</trans-unit> </trans-unit>
@ -5550,7 +5701,7 @@
<source>Not seen in Mempool</source> <source>Not seen in Mempool</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">80</context> <context context-type="linenumber">501</context>
</context-group> </context-group>
<note priority="1" from="description">Not seen in Mempool</note> <note priority="1" from="description">Not seen in Mempool</note>
<note priority="1" from="meaning">tx-features.tag.not-seen</note> <note priority="1" from="meaning">tx-features.tag.not-seen</note>
@ -5559,7 +5710,7 @@
<source>This transaction may have been added out-of-band</source> <source>This transaction may have been added out-of-band</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">81</context> <context context-type="linenumber">504</context>
</context-group> </context-group>
<note priority="1" from="description">Added transaction tooltip</note> <note priority="1" from="description">Added transaction tooltip</note>
</trans-unit> </trans-unit>
@ -5567,7 +5718,7 @@
<source>This transaction may have been prioritized out-of-band</source> <source>This transaction may have been prioritized out-of-band</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">82</context> <context context-type="linenumber">507</context>
</context-group> </context-group>
<note priority="1" from="description">Prioritized transaction tooltip</note> <note priority="1" from="description">Prioritized transaction tooltip</note>
</trans-unit> </trans-unit>
@ -5575,23 +5726,15 @@
<source>This transaction conflicted with another version in our mempool</source> <source>This transaction conflicted with another version in our mempool</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">83</context> <context context-type="linenumber">510</context>
</context-group> </context-group>
<note priority="1" from="description">Conflict in mempool tooltip</note> <note priority="1" from="description">Conflict in mempool tooltip</note>
</trans-unit> </trans-unit>
<trans-unit id="ec972116b4da9e2c5bc0e6e6586061d60cd13e56" datatype="html">
<source>Hide accelerator</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">108</context>
</context-group>
<note priority="1" from="description">hide-accelerator</note>
</trans-unit>
<trans-unit id="4e738ef3d2b4878f17f43002204f7b31aabb8e87" datatype="html"> <trans-unit id="4e738ef3d2b4878f17f43002204f7b31aabb8e87" datatype="html">
<source>ETA</source> <source>ETA</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">136</context> <context context-type="linenumber">526</context>
</context-group> </context-group>
<note priority="1" from="description">Transaction ETA</note> <note priority="1" from="description">Transaction ETA</note>
<note priority="1" from="meaning">transaction.eta</note> <note priority="1" from="meaning">transaction.eta</note>
@ -5600,167 +5743,16 @@
<source>In several hours (or more)</source> <source>In several hours (or more)</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">144</context> <context context-type="linenumber">532</context>
</context-group> </context-group>
<note priority="1" from="description">Transaction ETA in several hours or more</note> <note priority="1" from="description">Transaction ETA in several hours or more</note>
<note priority="1" from="meaning">transaction.eta.in-several-hours</note> <note priority="1" from="meaning">transaction.eta.in-several-hours</note>
</trans-unit> </trans-unit>
<trans-unit id="f61c6867295f3b53d23557021f2f4e0aa1d0b8fc" datatype="html">
<source>Type</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">187</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
<context context-type="linenumber">276</context>
</context-group>
<note priority="1" from="description">transactions-list.vout.scriptpubkey-type</note>
</trans-unit>
<trans-unit id="dd230222e3ae689913445ce93b6ae3f7cce7458b" datatype="html">
<source>Descendant</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">198</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">210</context>
</context-group>
<note priority="1" from="description">Descendant</note>
<note priority="1" from="meaning">transaction.descendant</note>
</trans-unit>
<trans-unit id="8c16167a5d7c96d14ff280b09de312d18d5e2511" datatype="html">
<source>Ancestor</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">222</context>
</context-group>
<note priority="1" from="description">Transaction Ancestor</note>
<note priority="1" from="meaning">transaction.ancestor</note>
</trans-unit>
<trans-unit id="03721a62015a76e794be64ba2b7e053e801215ea" datatype="html">
<source>RBF History</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">241</context>
</context-group>
<note priority="1" from="description">RBF History</note>
<note priority="1" from="meaning">transaction.rbf-history</note>
</trans-unit>
<trans-unit id="53fbdc20554c4e68ae509f652b38ab80021c0739" datatype="html">
<source>Flow</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">250</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">405</context>
</context-group>
<note priority="1" from="description">Transaction flow</note>
<note priority="1" from="meaning">transaction.flow</note>
</trans-unit>
<trans-unit id="d0fd8887b50687cfc0fc1f6569f6fd6c5db4ffc0" datatype="html">
<source>Hide diagram</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">253</context>
</context-group>
<note priority="1" from="description">hide-diagram</note>
</trans-unit>
<trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b" datatype="html">
<source>Show more</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">274</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
<context context-type="linenumber">171</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
<context context-type="linenumber">289</context>
</context-group>
<note priority="1" from="description">show-more</note>
</trans-unit>
<trans-unit id="31d8d7f29ddbd3f64d374a132ddacd5e4a0835a2" datatype="html">
<source>Inputs &amp; Outputs</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">292</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">436</context>
</context-group>
<note priority="1" from="description">Transaction inputs and outputs</note>
<note priority="1" from="meaning">transaction.inputs-and-outputs</note>
</trans-unit>
<trans-unit id="e7aa6db8df12d0158df972b6abfc65a8478b2b7d" datatype="html">
<source>Show diagram</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">296</context>
</context-group>
<note priority="1" from="description">show-diagram</note>
</trans-unit>
<trans-unit id="a8a4dd861f790141e19f773153cf42b5d0b0e6b6" datatype="html">
<source>Adjusted vsize</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">321</context>
</context-group>
<note priority="1" from="description">Transaction Adjusted VSize</note>
<note priority="1" from="meaning">transaction.adjusted-vsize</note>
</trans-unit>
<trans-unit id="516a786e59a57efaf80e11370b4bade400f19445" datatype="html">
<source>Locktime</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">343</context>
</context-group>
<note priority="1" from="description">transaction.locktime</note>
</trans-unit>
<trans-unit id="3dd65e8fa7035988a691aadcb583862c2a9e336a" datatype="html">
<source>Sigops</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">347</context>
</context-group>
<note priority="1" from="description">Transaction Sigops</note>
<note priority="1" from="meaning">transaction.sigops</note>
</trans-unit>
<trans-unit id="c9d9612bcd520103486b5fc84d84c9476a1b7f78" datatype="html">
<source>Transaction not found.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">514</context>
</context-group>
<note priority="1" from="description">transaction.error.transaction-not-found</note>
</trans-unit>
<trans-unit id="66b65556acb90d8764fe166a260af0309671698c" datatype="html">
<source>Waiting for it to appear in the mempool...</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">515</context>
</context-group>
<note priority="1" from="description">transaction.error.waiting-for-it-to-appear</note>
</trans-unit>
<trans-unit id="8a736bd53341b2dedaf9cdcfd9d1093cc16cb12c" datatype="html">
<source>Error loading transaction data.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">521</context>
</context-group>
<note priority="1" from="description">transaction.error.loading-transaction-data</note>
</trans-unit>
<trans-unit id="8b01e0411c7160bfee109e504c84ecee5079c326" datatype="html"> <trans-unit id="8b01e0411c7160bfee109e504c84ecee5079c326" datatype="html">
<source>Accelerated fee rate</source> <source>Accelerated fee rate</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">547</context> <context context-type="linenumber">610</context>
</context-group> </context-group>
<note priority="1" from="description">Accelerated transaction fee rate</note> <note priority="1" from="description">Accelerated transaction fee rate</note>
<note priority="1" from="meaning">transaction.accelerated-fee-rate</note> <note priority="1" from="meaning">transaction.accelerated-fee-rate</note>

View File

@ -721,6 +721,7 @@
</trans-unit> </trans-unit>
<trans-unit id="ba4f24bf9bf3dc4db3d6bc1b8b63339295f0b806" datatype="html"> <trans-unit id="ba4f24bf9bf3dc4db3d6bc1b8b63339295f0b806" datatype="html">
<source>Sign In</source> <source>Sign In</source>
<target>登录</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/accelerate-preview/accelerate-preview.component.html</context> <context context-type="sourcefile">src/app/components/accelerate-preview/accelerate-preview.component.html</context>
<context context-type="linenumber">214</context> <context context-type="linenumber">214</context>
@ -1201,6 +1202,7 @@
</trans-unit> </trans-unit>
<trans-unit id="b45214d1bf328d07f0aea939dfc197f5c59f421b" datatype="html"> <trans-unit id="b45214d1bf328d07f0aea939dfc197f5c59f421b" datatype="html">
<source>Balances</source> <source>Balances</source>
<target>余额</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/address-group/address-group.component.html</context> <context context-type="sourcefile">src/app/components/address-group/address-group.component.html</context>
<context context-type="linenumber">4</context> <context context-type="linenumber">4</context>
@ -3592,6 +3594,7 @@
</trans-unit> </trans-unit>
<trans-unit id="b9161223dda21fe34200a720dcb36830ca568104" datatype="html"> <trans-unit id="b9161223dda21fe34200a720dcb36830ca568104" datatype="html">
<source>halving</source> <source>halving</source>
<target>减半</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/difficulty/difficulty.component.html</context> <context context-type="sourcefile">src/app/components/difficulty/difficulty.component.html</context>
<context context-type="linenumber">10</context> <context context-type="linenumber">10</context>
@ -4241,6 +4244,7 @@
</trans-unit> </trans-unit>
<trans-unit id="1c6520aeea2eb946269acab0a2863162b8311e7d" datatype="html"> <trans-unit id="1c6520aeea2eb946269acab0a2863162b8311e7d" datatype="html">
<source>Dust</source> <source>Dust</source>
<target>粉尘</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.html</context> <context context-type="sourcefile">src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.html</context>
<context context-type="linenumber">15</context> <context context-type="linenumber">15</context>
@ -4785,6 +4789,7 @@
</trans-unit> </trans-unit>
<trans-unit id="3666195172774554282" datatype="html"> <trans-unit id="3666195172774554282" datatype="html">
<source>Other (<x id="PH" equiv-text="percentage"/>)</source> <source>Other (<x id="PH" equiv-text="percentage"/>)</source>
<target>其他(<x id="PH" equiv-text="percentage"/></target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/pool-ranking/pool-ranking.component.ts</context> <context context-type="sourcefile">src/app/components/pool-ranking/pool-ranking.component.ts</context>
<context context-type="linenumber">186</context> <context context-type="linenumber">186</context>
@ -5057,6 +5062,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.title.push-tx" datatype="html"> <trans-unit id="meta.title.push-tx" datatype="html">
<source>Broadcast Transaction</source> <source>Broadcast Transaction</source>
<target>广播交易</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/push-transaction/push-transaction.component.ts</context> <context context-type="sourcefile">src/app/components/push-transaction/push-transaction.component.ts</context>
<context context-type="linenumber">33</context> <context context-type="linenumber">33</context>
@ -5064,6 +5070,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.description.push-tx" datatype="html"> <trans-unit id="meta.description.push-tx" datatype="html">
<source>Broadcast a transaction to the <x id="PH" equiv-text="this.stateService.network==='liquid'||this.stateService.network==='liquidtestnet'?'Liquid':'Bitcoin'"/><x id="PH_1" equiv-text="seoDescriptionNetwork(this.stateService.network)"/> network using the transaction's hash.</source> <source>Broadcast a transaction to the <x id="PH" equiv-text="this.stateService.network==='liquid'||this.stateService.network==='liquidtestnet'?'Liquid':'Bitcoin'"/><x id="PH_1" equiv-text="seoDescriptionNetwork(this.stateService.network)"/> network using the transaction's hash.</source>
<target>使用交易的哈希值将交易广播到 <x id="PH" equiv-text="this.stateService.network==='liquid'||this.stateService.network==='liquidtestnet'?'Liquid':'Bitcoin'"/><x id="PH_1" equiv-text="seoDescriptionNetwork(this.stateService.network)"/> 网络。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/push-transaction/push-transaction.component.ts</context> <context context-type="sourcefile">src/app/components/push-transaction/push-transaction.component.ts</context>
<context context-type="linenumber">34</context> <context context-type="linenumber">34</context>
@ -5276,6 +5283,7 @@
</trans-unit> </trans-unit>
<trans-unit id="920339d7b35b44632c8ec42aa2bd2cf5929e7619" datatype="html"> <trans-unit id="920339d7b35b44632c8ec42aa2bd2cf5929e7619" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Block Height</source> <source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Block Height</source>
<target><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> 区块高度</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context> <context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context>
<context context-type="linenumber">3</context> <context context-type="linenumber">3</context>
@ -5284,6 +5292,7 @@
</trans-unit> </trans-unit>
<trans-unit id="c6a48e5ee096fba914fb4927d16a5d2e0941e0fe" datatype="html"> <trans-unit id="c6a48e5ee096fba914fb4927d16a5d2e0941e0fe" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Transaction</source> <source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Transaction</source>
<target><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> 交易</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context> <context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context>
<context context-type="linenumber">21</context> <context context-type="linenumber">21</context>
@ -5292,6 +5301,7 @@
</trans-unit> </trans-unit>
<trans-unit id="1f8b2a9743e513d1e645f6986bae2130e914c34b" datatype="html"> <trans-unit id="1f8b2a9743e513d1e645f6986bae2130e914c34b" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Address</source> <source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Address</source>
<target><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> 地址</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context> <context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context>
<context context-type="linenumber">27</context> <context context-type="linenumber">27</context>
@ -5300,6 +5310,7 @@
</trans-unit> </trans-unit>
<trans-unit id="ba18d02396f5998bb46cd5d771de107bfab6e177" datatype="html"> <trans-unit id="ba18d02396f5998bb46cd5d771de107bfab6e177" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Block</source> <source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Block</source>
<target><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> 块</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context> <context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context>
<context context-type="linenumber">33</context> <context context-type="linenumber">33</context>
@ -5442,6 +5453,8 @@
</trans-unit> </trans-unit>
<trans-unit id="date-base.immediately" datatype="html"> <trans-unit id="date-base.immediately" datatype="html">
<source>Immediately</source> <source>Immediately</source>
<target>立刻
</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/time/time.component.ts</context> <context context-type="sourcefile">src/app/components/time/time.component.ts</context>
<context context-type="linenumber">90</context> <context context-type="linenumber">90</context>
@ -5637,6 +5650,7 @@
</trans-unit> </trans-unit>
<trans-unit id="time-before" datatype="html"> <trans-unit id="time-before" datatype="html">
<source><x id="DATE" equiv-text="dateStrings.i18nYear"/> before</source> <source><x id="DATE" equiv-text="dateStrings.i18nYear"/> before</source>
<target><x id="DATE" equiv-text="dateStrings.i18nYear"/> 之前</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/time/time.component.ts</context> <context context-type="sourcefile">src/app/components/time/time.component.ts</context>
<context context-type="linenumber">214</context> <context context-type="linenumber">214</context>
@ -5729,6 +5743,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.description.bitcoin.transaction" datatype="html"> <trans-unit id="meta.description.bitcoin.transaction" datatype="html">
<source>Get real-time status, addresses, fees, script info, and more for <x id="PH" equiv-text="network"/><x id="PH_1" equiv-text="seoDescription"/> transaction with txid <x id="PH_2" equiv-text="this.txId"/>.</source> <source>Get real-time status, addresses, fees, script info, and more for <x id="PH" equiv-text="network"/><x id="PH_1" equiv-text="seoDescription"/> transaction with txid <x id="PH_2" equiv-text="this.txId"/>.</source>
<target>获取 <x id="PH" equiv-text="network"/><x id="PH_1" equiv-text="seoDescription"/> 交易的实时状态、地址、费用、脚本信息等,交易 ID 为 <x id="PH_2" equiv-text="this.txId"/>。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction-preview.component.ts</context> <context context-type="sourcefile">src/app/components/transaction/transaction-preview.component.ts</context>
<context context-type="linenumber">93</context> <context context-type="linenumber">93</context>
@ -5797,6 +5812,7 @@
</trans-unit> </trans-unit>
<trans-unit id="08c516e1fe345b4ae1fcae5fd4e5a0cd22e646dd" datatype="html"> <trans-unit id="08c516e1fe345b4ae1fcae5fd4e5a0cd22e646dd" datatype="html">
<source>Seen in Mempool</source> <source>Seen in Mempool</source>
<target>在Mempool中查看</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context> <context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
<context context-type="linenumber">79</context> <context context-type="linenumber">79</context>
@ -6534,6 +6550,7 @@
</trans-unit> </trans-unit>
<trans-unit id="7816493330657272952" datatype="html"> <trans-unit id="7816493330657272952" datatype="html">
<source>Coinjoin</source> <source>Coinjoin</source>
<target>代币混合</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context> <context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context>
<context context-type="linenumber">80</context> <context context-type="linenumber">80</context>
@ -6556,6 +6573,7 @@
</trans-unit> </trans-unit>
<trans-unit id="999bb1a0150c2815a6b4dd64a1850e763603e525" datatype="html"> <trans-unit id="999bb1a0150c2815a6b4dd64a1850e763603e525" datatype="html">
<source><x id="START_PARAGRAPH" ctype="x-p" equiv-text="For any such requ"/><x id="START_BOLD_TEXT" ctype="x-b" equiv-text="mempool.space mer"/>mempool.space merely provides data about the Bitcoin network.<x id="CLOSE_BOLD_TEXT" ctype="x-b" equiv-text="&lt;/b&gt;"/> It cannot help you with retrieving funds, wallet issues, etc.<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="&lt;/p&gt;"/><x id="START_PARAGRAPH" ctype="x-p" equiv-text="For any such requ"/>For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="&lt;/p&gt;"/></source> <source><x id="START_PARAGRAPH" ctype="x-p" equiv-text="For any such requ"/><x id="START_BOLD_TEXT" ctype="x-b" equiv-text="mempool.space mer"/>mempool.space merely provides data about the Bitcoin network.<x id="CLOSE_BOLD_TEXT" ctype="x-b" equiv-text="&lt;/b&gt;"/> It cannot help you with retrieving funds, wallet issues, etc.<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="&lt;/p&gt;"/><x id="START_PARAGRAPH" ctype="x-p" equiv-text="For any such requ"/>For any such requests, you need to get in touch with the entity that helped make the transaction (wallet software, exchange company, etc).<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="&lt;/p&gt;"/></source>
<target><x id="START_PARAGRAPH" ctype="x-p" equiv-text="For any such requ"/><x id="START_BOLD_TEXT" ctype="x-b" equiv-text="mempool.space mer"/>mempool.space 仅提供有关比特币网络的数据。<x id="CLOSE_BOLD_TEXT" ctype="x-b" equiv-text="&lt;/b&gt;"/>它无法帮助您检索资金、解决钱包问题等。<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="&lt;/p&gt;"/><x id="START_PARAGRAPH" ctype="x-p" equiv-text="For any such requ"/>对于任何此类请求,您都需要联系帮助进行交易的实体(钱包软件、交易所等)。<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="&lt;/p&gt;"/></target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/docs/api-docs/api-docs.component.html</context> <context context-type="sourcefile">src/app/docs/api-docs/api-docs.component.html</context>
<context context-type="linenumber">15,16</context> <context context-type="linenumber">15,16</context>
@ -6657,6 +6675,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.description.docs.faq" datatype="html"> <trans-unit id="meta.description.docs.faq" datatype="html">
<source>Get answers to common questions like: What is a mempool? Why isn't my transaction confirming? How can I run my own instance of The Mempool Open Source Project? And more.</source> <source>Get answers to common questions like: What is a mempool? Why isn't my transaction confirming? How can I run my own instance of The Mempool Open Source Project? And more.</source>
<target>获取常见问题的答案例如什么是Mempool为什么我的交易未被确认如何运行自己的Mempool开源项目实例等等。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/docs/docs/docs.component.ts</context> <context context-type="sourcefile">src/app/docs/docs/docs.component.ts</context>
<context context-type="linenumber">47</context> <context context-type="linenumber">47</context>
@ -6685,6 +6704,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.title.docs.websocket" datatype="html"> <trans-unit id="meta.title.docs.websocket" datatype="html">
<source>WebSocket API</source> <source>WebSocket API</source>
<target>Websocket API</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/docs/docs/docs.component.ts</context> <context context-type="sourcefile">src/app/docs/docs/docs.component.ts</context>
<context context-type="linenumber">59</context> <context context-type="linenumber">59</context>
@ -7764,6 +7784,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.description.lightning.node" datatype="html"> <trans-unit id="meta.description.lightning.node" datatype="html">
<source>Overview for the Lightning network node named <x id="PH" equiv-text="node.alias"/>. See channels, capacity, location, fee stats, and more.</source> <source>Overview for the Lightning network node named <x id="PH" equiv-text="node.alias"/>. See channels, capacity, location, fee stats, and more.</source>
<target>闪电网络节点 <x id="PH" equiv-text="node.alias"/> 的概览。查看通道、容量、位置、费用统计等。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.ts</context> <context context-type="sourcefile">src/app/lightning/node/node-preview.component.ts</context>
<context context-type="linenumber">52</context> <context context-type="linenumber">52</context>
@ -7962,6 +7983,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.description.lightning.node-map" datatype="html"> <trans-unit id="meta.description.lightning.node-map" datatype="html">
<source>See the channels of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details.</source> <source>See the channels of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details.</source>
<target>在世界地图上查看非Tor的闪电网络节点的通道。将鼠标悬停/点击地图上的点可查看节点名称和详细信息。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts</context> <context context-type="sourcefile">src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts</context>
<context context-type="linenumber">74</context> <context context-type="linenumber">74</context>
@ -7986,6 +8008,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.description.lightning.node-channel-map" datatype="html"> <trans-unit id="meta.description.lightning.node-channel-map" datatype="html">
<source>See the locations of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details.</source> <source>See the locations of non-Tor Lightning network nodes visualized on a world map. Hover/tap on points on the map for node names and details.</source>
<target>在世界地图上查看非 Tor的闪电网络节点的通道。将鼠标悬停/点击地图上的点可查看节点名称和详细信息。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-map/nodes-map.component.ts</context> <context context-type="sourcefile">src/app/lightning/nodes-map/nodes-map.component.ts</context>
<context context-type="linenumber">52</context> <context context-type="linenumber">52</context>
@ -8061,6 +8084,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.description.lightning.nodes-country-overview" datatype="html"> <trans-unit id="meta.description.lightning.nodes-country-overview" datatype="html">
<source>See a geographical breakdown of the Lightning network: how many Lightning nodes are hosted in countries around the world, aggregate BTC capacity for each country, and more.</source> <source>See a geographical breakdown of the Lightning network: how many Lightning nodes are hosted in countries around the world, aggregate BTC capacity for each country, and more.</source>
<target>查看闪电网络的地理分布:世界各国托管着多少个闪电节点、每个国家的总 BTC 容量等等。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts</context> <context context-type="sourcefile">src/app/lightning/nodes-per-country-chart/nodes-per-country-chart.component.ts</context>
<context context-type="linenumber">47</context> <context context-type="linenumber">47</context>
@ -8131,6 +8155,7 @@
</trans-unit> </trans-unit>
<trans-unit id="meta.description.lightning.nodes-country" datatype="html"> <trans-unit id="meta.description.lightning.nodes-country" datatype="html">
<source>Explore all the Lightning nodes hosted in <x id="PH" equiv-text="response.country.en"/> and see an overview of each node's capacity, number of open channels, and more.</source> <source>Explore all the Lightning nodes hosted in <x id="PH" equiv-text="response.country.en"/> and see an overview of each node's capacity, number of open channels, and more.</source>
<target>探索 <x id="PH" equiv-text="response.country.en"/> 中托管的所有 Lightning 节点,并查看每个节点的容量、开放通道数量等概览。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.ts</context> <context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.ts</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">44</context>
@ -8480,6 +8505,7 @@
</trans-unit> </trans-unit>
<trans-unit id="14f76d294f3ae892e8033d60bb960701cafca66f" datatype="html"> <trans-unit id="14f76d294f3ae892e8033d60bb960701cafca66f" datatype="html">
<source>What is a mempool?</source> <source>What is a mempool?</source>
<target>什么是mempool</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context> <context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">51</context> <context context-type="linenumber">51</context>
@ -8488,6 +8514,7 @@
</trans-unit> </trans-unit>
<trans-unit id="8ac787087e3eec254d15a4e16492f8877107087b" datatype="html"> <trans-unit id="8ac787087e3eec254d15a4e16492f8877107087b" datatype="html">
<source>What is a block explorer?</source> <source>What is a block explorer?</source>
<target>什么是区块浏览器?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context> <context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">52</context> <context context-type="linenumber">52</context>
@ -8496,6 +8523,7 @@
</trans-unit> </trans-unit>
<trans-unit id="0ab3729578bb613995fc5c90c4d7aa45588dd2a1" datatype="html"> <trans-unit id="0ab3729578bb613995fc5c90c4d7aa45588dd2a1" datatype="html">
<source>What is a mempool explorer?</source> <source>What is a mempool explorer?</source>
<target>什么是内存池浏览器?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context> <context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">53</context> <context context-type="linenumber">53</context>
@ -8528,6 +8556,7 @@
</trans-unit> </trans-unit>
<trans-unit id="f96488094a57809ea9bfe4a2f2bf91af66a0d0a3" datatype="html"> <trans-unit id="f96488094a57809ea9bfe4a2f2bf91af66a0d0a3" datatype="html">
<source>Mainnet Explorer</source> <source>Mainnet Explorer</source>
<target>主网浏览器</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context> <context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">60</context> <context context-type="linenumber">60</context>
@ -8536,6 +8565,7 @@
</trans-unit> </trans-unit>
<trans-unit id="a31347c0f3ec966c373229584cfb7bd6725a0e64" datatype="html"> <trans-unit id="a31347c0f3ec966c373229584cfb7bd6725a0e64" datatype="html">
<source>Testnet Explorer</source> <source>Testnet Explorer</source>
<target>测试网浏览器</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context> <context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">61</context> <context context-type="linenumber">61</context>
@ -8568,6 +8598,7 @@
</trans-unit> </trans-unit>
<trans-unit id="fefee13017c2b85143cd131ee253e327a14053a0" datatype="html"> <trans-unit id="fefee13017c2b85143cd131ee253e327a14053a0" datatype="html">
<source>Tools</source> <source>Tools</source>
<target>工具</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context> <context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
<context context-type="linenumber">68</context> <context context-type="linenumber">68</context>

View File

@ -108,7 +108,6 @@ html, body {
body { body {
background-color: var(--active-bg); background-color: var(--active-bg);
min-width: 375px;
padding-bottom: 60px; padding-bottom: 60px;
} }