Merge branch 'master' into natsoni/high-contrast-theme
This commit is contained in:
commit
527589ac04
@ -1,12 +1,14 @@
|
||||
import { Application, Request, Response } from "express";
|
||||
import config from "../../config";
|
||||
import axios from "axios";
|
||||
import logger from "../../logger";
|
||||
import { Application, Request, Response } from 'express';
|
||||
import config from '../../config';
|
||||
import axios from 'axios';
|
||||
import logger from '../../logger';
|
||||
import mempool from '../mempool';
|
||||
import AccelerationRepository from '../../repositories/AccelerationRepository';
|
||||
|
||||
class AccelerationRoutes {
|
||||
private tag = 'Accelerator';
|
||||
|
||||
public initRoutes(app: Application) {
|
||||
public initRoutes(app: Application): void {
|
||||
app
|
||||
.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))
|
||||
@ -15,41 +17,33 @@ class AccelerationRoutes {
|
||||
;
|
||||
}
|
||||
|
||||
private async $getAcceleratorAccelerations(req: Request, res: Response) {
|
||||
const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`;
|
||||
try {
|
||||
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 $getAcceleratorAccelerations(req: Request, res: Response): Promise<void> {
|
||||
const accelerations = mempool.getAccelerations();
|
||||
res.status(200).send(Object.values(accelerations));
|
||||
}
|
||||
|
||||
private async $getAcceleratorAccelerationsHistory(req: Request, res: Response) {
|
||||
const url = `${config.MEMPOOL_SERVICES.API}/${req.originalUrl.replace('/api/v1/services/', '')}`;
|
||||
try {
|
||||
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 acceleration history from ${url} in $getAcceleratorAccelerationsHistory(), ${e}`, this.tag);
|
||||
res.status(500).end();
|
||||
}
|
||||
private async $getAcceleratorAccelerationsHistory(req: Request, res: Response): Promise<void> {
|
||||
const history = await AccelerationRepository.$getAccelerationInfo(null, req.query.blockHeight ? parseInt(req.query.blockHeight as string, 10) : null);
|
||||
res.status(200).send(history.map(accel => ({
|
||||
txid: accel.txid,
|
||||
added: accel.added,
|
||||
status: 'completed',
|
||||
effectiveFee: accel.effective_fee,
|
||||
effectiveVsize: accel.effective_vsize,
|
||||
boostRate: accel.boost_rate,
|
||||
boostCost: accel.boost_cost,
|
||||
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/', '')}`;
|
||||
try {
|
||||
const response = await axios.get(url, { responseType: 'stream', timeout: 10000 });
|
||||
for (const key in response.headers) {
|
||||
res.setHeader(key, response.headers[key]);
|
||||
}
|
||||
res.setHeader(key, response.headers[key]);
|
||||
}
|
||||
response.data.pipe(res);
|
||||
} catch (e) {
|
||||
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/', '')}`;
|
||||
try {
|
||||
const response = await axios.get(url, { responseType: 'stream', timeout: 10000 });
|
||||
for (const key in response.headers) {
|
||||
res.setHeader(key, response.headers[key]);
|
||||
}
|
||||
res.setHeader(key, response.headers[key]);
|
||||
}
|
||||
response.data.pipe(res);
|
||||
} catch (e) {
|
||||
logger.err(`Unable to get acceleration stats from ${url} in $getAcceleratorAccelerationsStats(), ${e}`, this.tag);
|
||||
|
@ -29,6 +29,7 @@ import websocketHandler from './websocket-handler';
|
||||
import redisCache from './redis-cache';
|
||||
import rbfCache from './rbf-cache';
|
||||
import { calcBitsDifference } from './difficulty-adjustment';
|
||||
import AccelerationRepository from '../repositories/AccelerationRepository';
|
||||
|
||||
class Blocks {
|
||||
private blocks: BlockExtended[] = [];
|
||||
@ -872,6 +873,7 @@ class Blocks {
|
||||
await BlocksRepository.$deleteBlocksFrom(lastBlock.height - 10);
|
||||
await HashratesRepository.$deleteLastEntries();
|
||||
await cpfpRepository.$deleteClustersFrom(lastBlock.height - 10);
|
||||
await AccelerationRepository.$deleteAccelerationsFrom(lastBlock.height - 10);
|
||||
this.blocks = this.blocks.slice(0, -10);
|
||||
this.updateTimerProgress(timer, `rolled back chain divergence from ${this.currentBlockHeight}`);
|
||||
for (let i = 10; i >= 0; --i) {
|
||||
@ -974,6 +976,9 @@ class Blocks {
|
||||
if (this.blocks.length > 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);
|
||||
if (this.blockSummaries.length > config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4) {
|
||||
this.blockSummaries = this.blockSummaries.slice(-config.MEMPOOL.INITIAL_BLOCKS_AMOUNT * 4);
|
||||
@ -1117,6 +1122,7 @@ class Blocks {
|
||||
}
|
||||
return {
|
||||
txid: tx.txid,
|
||||
time: tx.firstSeen,
|
||||
fee: tx.fee || 0,
|
||||
vsize: tx.vsize,
|
||||
value: Math.round(tx.vout.reduce((acc, vout) => acc + (vout.value ? vout.value : 0), 0)),
|
||||
|
@ -7,7 +7,7 @@ import cpfpRepository from '../repositories/CpfpRepository';
|
||||
import { RowDataPacket } from 'mysql2';
|
||||
|
||||
class DatabaseMigration {
|
||||
private static currentVersion = 76;
|
||||
private static currentVersion = 77;
|
||||
private queryTimeout = 3600_000;
|
||||
private statisticsAddedIndexed = false;
|
||||
private uniqueLogs: string[] = [];
|
||||
@ -664,6 +664,11 @@ class DatabaseMigration {
|
||||
await this.$executeQuery('ALTER TABLE `blocks_audits` ADD prioritized_txs JSON DEFAULT "[]"');
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -5,6 +5,9 @@ import axios from 'axios';
|
||||
|
||||
export interface Acceleration {
|
||||
txid: string,
|
||||
added: number,
|
||||
effectiveVsize: number,
|
||||
effectiveFee: number,
|
||||
feeDelta: number,
|
||||
pools: number[],
|
||||
};
|
||||
|
@ -6,7 +6,7 @@ import { IEsploraApi } from '../api/bitcoin/esplora-api.interface';
|
||||
import { Common } from '../api/common';
|
||||
import config from '../config';
|
||||
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 bitcoinApi from '../api/bitcoin/bitcoin-api-factory';
|
||||
import transactionUtils from '../api/transaction-utils';
|
||||
@ -15,6 +15,7 @@ import { BlockExtended, MempoolTransactionExtended } from '../mempool.interfaces
|
||||
export interface PublicAcceleration {
|
||||
txid: string,
|
||||
height: number,
|
||||
added: number,
|
||||
pool: {
|
||||
id: number,
|
||||
slug: string,
|
||||
@ -29,15 +30,20 @@ export interface PublicAcceleration {
|
||||
class AccelerationRepository {
|
||||
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 {
|
||||
await DB.query(`
|
||||
INSERT INTO accelerations(txid, added, height, pool, effective_vsize, effective_fee, boost_rate, boost_cost)
|
||||
VALUE (?, FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?)
|
||||
INSERT INTO accelerations(txid, requested, added, height, pool, effective_vsize, effective_fee, boost_rate, boost_cost)
|
||||
VALUE (?, FROM_UNIXTIME(?), FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
height = ?
|
||||
`, [
|
||||
acceleration.txSummary.txid,
|
||||
accelerationMap[acceleration.txSummary.txid].added,
|
||||
block.timestamp,
|
||||
block.height,
|
||||
pool_id,
|
||||
@ -64,7 +70,7 @@ class AccelerationRepository {
|
||||
}
|
||||
|
||||
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
|
||||
`;
|
||||
let params: any[] = [];
|
||||
@ -99,6 +105,7 @@ class AccelerationRepository {
|
||||
return rows.map(row => ({
|
||||
txid: row.txid,
|
||||
height: row.height,
|
||||
added: row.requested_timestamp || row.block_timestamp,
|
||||
pool: {
|
||||
id: row.id,
|
||||
slug: row.slug,
|
||||
@ -202,7 +209,7 @@ class AccelerationRepository {
|
||||
const tx = blockTxs[acc.txid];
|
||||
const accelerationInfo = accelerationCosts.getAccelerationInfo(tx, boostRate, transactions);
|
||||
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();
|
||||
@ -230,7 +237,7 @@ class AccelerationRepository {
|
||||
logger.debug(`Fetching accelerations between block ${lastSyncedHeight} and ${currentHeight}`);
|
||||
|
||||
// Fetch accelerations from mempool.space since the last synced block;
|
||||
const accelerationsByBlock = {};
|
||||
const accelerationsByBlock: {[height: number]: AccelerationHistory[]} = {};
|
||||
const blockHashes = {};
|
||||
let done = false;
|
||||
let page = 1;
|
||||
@ -297,12 +304,16 @@ class AccelerationRepository {
|
||||
const feeStats = Common.calcEffectiveFeeStatistics(template);
|
||||
boostRate = feeStats.medianFee;
|
||||
}
|
||||
const accelerationSummaries = accelerations.map(acc => ({
|
||||
...acc,
|
||||
pools: acc.pools.map(pool => pool.pool_unique_id),
|
||||
}))
|
||||
for (const acc of accelerations) {
|
||||
if (blockTxs[acc.txid]) {
|
||||
const tx = blockTxs[acc.txid];
|
||||
const accelerationInfo = accelerationCosts.getAccelerationInfo(tx, boostRate, transactions);
|
||||
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);
|
||||
@ -317,6 +328,26 @@ class AccelerationRepository {
|
||||
|
||||
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();
|
||||
|
@ -65,24 +65,26 @@
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<h5 i18n="accelerator.pay-how-much">How much more are you willing to pay?</h5>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<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="form-group">
|
||||
<div class="fee-card">
|
||||
<div class="d-flex mb-0">
|
||||
<ng-container *ngFor="let option of maxRateOptions">
|
||||
<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="fee">{{ option.fee + estimate.mempoolBaseFee + estimate.vsizeFee | number }} <span class="symbol" i18n="shared.sats">sats</span></span>
|
||||
<span class="rate">~<app-fee-rate [fee]="option.rate" rounding="1.0-0"></app-fee-rate></span>
|
||||
</button>
|
||||
</ng-container>
|
||||
@if (paymentType !== 'cashapp') {
|
||||
<h5 i18n="accelerator.pay-how-much">How much more are you willing to pay?</h5>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<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="form-group">
|
||||
<div class="fee-card">
|
||||
<div class="d-flex mb-0">
|
||||
<ng-container *ngFor="let option of maxRateOptions">
|
||||
<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="fee">{{ option.fee + estimate.mempoolBaseFee + estimate.vsizeFee | number }} <span class="symbol" i18n="shared.sats">sats</span></span>
|
||||
<span class="rate">~<app-fee-rate [fee]="option.rate" rounding="1.0-0"></app-fee-rate></span>
|
||||
</button>
|
||||
</ng-container>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
<h5>Acceleration summary</h5>
|
||||
<div class="row mb-3">
|
||||
@ -90,27 +92,51 @@
|
||||
<table class="table table-borderless table-border table-dark table-accelerator">
|
||||
<tbody>
|
||||
<!-- ESTIMATED FEE -->
|
||||
<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>
|
||||
@if (paymentType === 'cashapp') {
|
||||
<ng-container>
|
||||
<tr class="group-first">
|
||||
<td class="item" i18n="accelerator.boost-rate">Boost rate</td>
|
||||
<td class="amt" style="font-size: 16px">
|
||||
{{ maxRateOptions[selectFeeRateIndex].rate | 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">Boost fee</small></i>
|
||||
</td>
|
||||
<td class="amt">
|
||||
{{ maxRateOptions[selectFeeRateIndex].fee | number }}
|
||||
</td>
|
||||
<td class="units">
|
||||
<span class="symbol" i18n="shared.sats">sats</span>
|
||||
<span class="fiat ml-1"><app-fiat [value]="maxRateOptions[selectFeeRateIndex].fee"></app-fiat></span>
|
||||
</td>
|
||||
</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 -->
|
||||
<tr>
|
||||
@ -141,53 +167,76 @@
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- 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>
|
||||
|
||||
@if (paymentType === 'cashapp') {
|
||||
<!-- FIXED COST -->
|
||||
<ng-container>
|
||||
<tr class="group-first group-last" style="border-top: 1px solid lightgrey; border-collapse: collapse;">
|
||||
<td class="item">
|
||||
<b style="background-color: #105fb0;" class="p-1 pl-0" i18n="accelerator.total-cost">Total cost</b>
|
||||
</td>
|
||||
<td class="amt">
|
||||
<span style="background-color: #105fb0" class="p-1 pl-0">
|
||||
{{ maxCost | number }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="units">
|
||||
<span class="symbol" i18n="shared.sats">sats</span>
|
||||
<span class="fiat ml-1">
|
||||
<app-fiat [value]="maxCost" [colorClass]="'green-color'"></app-fiat>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
</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 -->
|
||||
<ng-container>
|
||||
<tr class="group-first">
|
||||
<td class="item">
|
||||
<b style="background-color: var(--primary);" class="p-1 pl-0" i18n="accelerator.maximum-cost">Maximum acceleration cost</b>
|
||||
</td>
|
||||
<td class="amt">
|
||||
<span style="background-color: var(--primary)" class="p-1 pl-0">
|
||||
{{ maxCost | number }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="units">
|
||||
<span class="symbol" i18n="shared.sats">sats</span>
|
||||
<span class="fiat ml-1">
|
||||
<app-fiat [value]="maxCost" [colorClass]="estimate.userBalance < maxCost ? 'red-color' : 'green-color'"></app-fiat>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="info group-last">
|
||||
<td class="info" colspan=3>
|
||||
<i><small><ng-container *ngTemplateOutlet="acceleratedTo; context: {$implicit: (estimate.txSummary.effectiveFee + userBid) / estimate.txSummary.effectiveVsize }"></ng-container></small></i>
|
||||
</td>
|
||||
</tr>
|
||||
</ng-container>
|
||||
<!-- MAX COST -->
|
||||
<ng-container>
|
||||
<tr class="group-first">
|
||||
<td class="item">
|
||||
<b style="background-color: var(--primary);" class="p-1 pl-0" i18n="accelerator.maximum-cost">Maximum acceleration cost</b>
|
||||
</td>
|
||||
<td class="amt">
|
||||
<span style="background-color: var(--primary)" class="p-1 pl-0">
|
||||
{{ maxCost | number }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="units">
|
||||
<span class="symbol" i18n="shared.sats">sats</span>
|
||||
<span class="fiat ml-1">
|
||||
<app-fiat [value]="maxCost" [colorClass]="estimate.userBalance < maxCost ? 'red-color' : 'green-color'"></app-fiat>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="info group-last">
|
||||
<td class="info" colspan=3>
|
||||
<i><small><ng-container *ngTemplateOutlet="acceleratedTo; context: {$implicit: (estimate.txSummary.effectiveFee + userBid) / estimate.txSummary.effectiveVsize }"></ng-container></small></i>
|
||||
</td>
|
||||
</tr>
|
||||
</ng-container>
|
||||
}
|
||||
|
||||
<!-- USER BALANCE -->
|
||||
<ng-container *ngIf="isLoggedIn() && estimate.userBalance < maxCost">
|
||||
@ -237,14 +286,17 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row d-flex justify-content-end align-items-center mr-1" style="height: 48px" *ngIf="!hideCashApp && paymentType === 'cashapp'">
|
||||
<div [style]="showSpinner ? 'opacity: 0' : 'opacity: 1'" class="p-2">Accelerate with</div>
|
||||
<div id="cash-app-pay" style="max-width: 320px" [style]="showSpinner ? 'opacity: 0' : 'opacity: 1'"></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>
|
||||
@if (!hideCashApp && paymentType === 'cashapp') {
|
||||
<div #cashappCTA class="cashapp-placeholder {{ stickyCTA }}"></div>
|
||||
<div class="d-flex justify-content-center align-items-center cashapp-cta {{ stickyCTA }}" (click)="submitCashappPay()">
|
||||
<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>
|
||||
<div id="cash-app-pay" style="max-width: 320px" [style]="showSpinner ? 'opacity: 0' : 'opacity: 1'"></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>
|
||||
</ng-container>
|
||||
|
@ -109,4 +109,61 @@
|
||||
|
||||
.item {
|
||||
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;
|
||||
}
|
||||
}
|
@ -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 { StorageService } from '../../services/storage.service';
|
||||
import { Transaction } from '../../interfaces/electrs.interface';
|
||||
@ -43,6 +43,9 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
@Input() tx: Transaction | undefined;
|
||||
@Input() scrollEvent: boolean;
|
||||
|
||||
@ViewChild('cashappCTA')
|
||||
cashappCTA: ElementRef;
|
||||
|
||||
math = Math;
|
||||
error = '';
|
||||
showSuccess = false;
|
||||
@ -56,9 +59,11 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
defaultBid = 0;
|
||||
maxCost = 0;
|
||||
userBid = 0;
|
||||
accelerationUUID: string;
|
||||
selectFeeRateIndex = 1;
|
||||
isMobile: boolean = window.innerWidth <= 767.98;
|
||||
user: any = undefined;
|
||||
stickyCTA: string = 'non-stick';
|
||||
|
||||
maxRateOptions: RateOption[] = [];
|
||||
|
||||
@ -66,6 +71,7 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
paymentType: 'bitcoin' | 'cashapp' = 'bitcoin';
|
||||
cashAppSubscription: Subscription;
|
||||
conversionsSubscription: Subscription;
|
||||
cashappSubmit: any;
|
||||
payments: any;
|
||||
showSpinner = false;
|
||||
square: any;
|
||||
@ -80,7 +86,10 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
private cd: ChangeDetectorRef
|
||||
) {
|
||||
if (this.stateService.ref === 'https://cash.app/') {
|
||||
this.paymentType = 'cashapp';
|
||||
this.insertSquare();
|
||||
} else {
|
||||
this.paymentType = 'bitcoin';
|
||||
}
|
||||
}
|
||||
|
||||
@ -94,21 +103,23 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.accelerationUUID = window.crypto.randomUUID();
|
||||
if (this.stateService.ref === 'https://cash.app/') {
|
||||
this.paymentType = 'cashapp';
|
||||
this.stateService.ref = '';
|
||||
} else {
|
||||
this.paymentType = 'bitcoin';
|
||||
}
|
||||
}
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
if (changes.scrollEvent) {
|
||||
if (changes.scrollEvent && this.paymentType !== 'cashapp' && this.stateService.ref !== 'https://cash.app/') {
|
||||
this.scrollToPreview('acceleratePreviewAnchor', 'start');
|
||||
}
|
||||
}
|
||||
|
||||
ngAfterViewInit() {
|
||||
this.onScroll();
|
||||
|
||||
if (this.paymentType === 'cashapp') {
|
||||
this.showSpinner = true;
|
||||
}
|
||||
@ -173,10 +184,15 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
this.maxCost = this.userBid + this.estimate.mempoolBaseFee + this.estimate.vsizeFee;
|
||||
|
||||
if (!this.error) {
|
||||
this.scrollToPreview('acceleratePreviewAnchor', 'start');
|
||||
if (this.paymentType === 'cashapp') {
|
||||
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.tx.txid,
|
||||
this.userBid
|
||||
this.userBid,
|
||||
this.accelerationUUID
|
||||
).subscribe({
|
||||
next: () => {
|
||||
this.audioService.playSound('ascend-chime-cartoon');
|
||||
@ -301,6 +318,10 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
|
||||
this.conversionsSubscription = this.stateService.conversions$.subscribe(
|
||||
async (conversions) => {
|
||||
if (this.cashAppPay) {
|
||||
this.cashAppPay.destroy();
|
||||
}
|
||||
|
||||
const maxCostUsd = this.maxCost / 100_000_000 * conversions.USD;
|
||||
const paymentRequest = this.payments.paymentRequest({
|
||||
countryCode: 'US',
|
||||
@ -310,13 +331,15 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
label: 'Total',
|
||||
pending: true,
|
||||
productUrl: `https://mempool.space/tx/${this.tx.txid}`,
|
||||
}
|
||||
},
|
||||
button: { shape: 'semiround', size: 'small', theme: 'light'}
|
||||
});
|
||||
this.cashAppPay = await this.payments.cashAppPay(paymentRequest, {
|
||||
redirectURL: `https://mempool.space/tx/${this.tx.txid}`,
|
||||
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;
|
||||
|
||||
const that = this;
|
||||
@ -332,7 +355,8 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
that.userBid,
|
||||
tokenResult.token,
|
||||
tokenResult.details.cashAppPay.cashtag,
|
||||
tokenResult.details.cashAppPay.referenceId
|
||||
tokenResult.details.cashAppPay.referenceId,
|
||||
that.accelerationUUID
|
||||
).subscribe({
|
||||
next: () => {
|
||||
that.audioService.playSound('ascend-chime-cartoon');
|
||||
@ -351,13 +375,19 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
this.cashappSubmit = await renderPromise;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
insertSquare(): void {
|
||||
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';
|
||||
}
|
||||
|
||||
@ -367,4 +397,34 @@ export class AcceleratePreviewComponent implements OnInit, OnDestroy, OnChanges
|
||||
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';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -39,10 +39,10 @@
|
||||
</td>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="!pending">
|
||||
<td *ngIf="acceleration.feePaid" class="fee text-right">
|
||||
{{ (acceleration.boost) | number }} <span class="symbol" i18n="shared.sat|sat">sat</span>
|
||||
<td *ngIf="acceleration.boost != null" class="fee text-right">
|
||||
{{ acceleration.boost | number }} <span class="symbol" i18n="shared.sat|sat">sat</span>
|
||||
</td>
|
||||
<td *ngIf="!acceleration.feePaid" class="fee text-right">
|
||||
<td *ngIf="acceleration.boost == null" class="fee text-right">
|
||||
~
|
||||
</td>
|
||||
<td class="block text-right">
|
||||
|
@ -58,7 +58,7 @@ export class AccelerationsListComponent implements OnInit {
|
||||
}
|
||||
}
|
||||
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) {
|
||||
return of(accelerations.slice(0, 6));
|
||||
|
@ -119,15 +119,15 @@ export class AcceleratorDashboardComponent implements OnInit {
|
||||
switchMap(([accelerations, blocks]) => {
|
||||
const blockMap = {};
|
||||
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) {
|
||||
if (['completed_provisional', 'failed_provisional', 'completed'].includes(acceleration.status) && acceleration.pools.includes(blockMap[acceleration.blockHash]?.extras.pool.id)) {
|
||||
if (!accelerationsByBlock[acceleration.blockHash]) {
|
||||
accelerationsByBlock[acceleration.blockHash] = [];
|
||||
if (['completed_provisional', 'failed_provisional', 'completed'].includes(acceleration.status) && acceleration.pools.includes(blockMap[acceleration.blockHeight]?.extras.pool.id)) {
|
||||
if (!accelerationsByBlock[acceleration.blockHeight]) {
|
||||
accelerationsByBlock[acceleration.blockHeight] = [];
|
||||
}
|
||||
accelerationsByBlock[acceleration.blockHash].push(acceleration);
|
||||
accelerationsByBlock[acceleration.blockHeight].push(acceleration);
|
||||
}
|
||||
}
|
||||
return of(blocks.slice(0, 6).map(block => {
|
||||
|
@ -161,7 +161,7 @@ export class AddressGraphComponent implements OnChanges {
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: $localize`Balance:Balance`,
|
||||
name: $localize`:@@7e69426bd97a606d8ae6026762858e6e7c86a1fd:Balance`,
|
||||
showSymbol: false,
|
||||
symbol: 'circle',
|
||||
symbolSize: 8,
|
||||
|
@ -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].rate = tx.rate;
|
||||
this.txs[tx.txid].dirty = true;
|
||||
this.updateColor(this.txs[tx.txid], startTime, 50, true);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -136,7 +136,7 @@ export class BlockPreviewComponent implements OnInit, OnDestroy {
|
||||
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([])
|
||||
]);
|
||||
}
|
||||
),
|
||||
|
@ -345,7 +345,7 @@ export class BlockComponent implements OnInit, OnDestroy {
|
||||
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([])
|
||||
]);
|
||||
})
|
||||
)
|
||||
|
@ -91,6 +91,10 @@ li.nav-item {
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-container {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
nav {
|
||||
box-shadow: 0px 0px 15px 0px #000;
|
||||
}
|
||||
|
@ -80,7 +80,9 @@
|
||||
<div class="title float-left">
|
||||
<h2 i18n="transaction.accelerate|Accelerate button label">Accelerate</h2>
|
||||
</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="box">
|
||||
@ -456,13 +458,18 @@
|
||||
</ng-template>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
} @else {
|
||||
<ng-container *ngTemplateOutlet="skeletonDetailsRow"></ng-container>
|
||||
}
|
||||
</ng-template>
|
||||
|
||||
@ -530,7 +537,7 @@
|
||||
} @else if (this.mempoolPosition.block >= 7) {
|
||||
<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>
|
||||
@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>
|
||||
}
|
||||
</span>
|
||||
@ -539,7 +546,7 @@
|
||||
} @else {
|
||||
<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>
|
||||
@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>
|
||||
}
|
||||
</span>
|
||||
@ -554,13 +561,13 @@
|
||||
|
||||
<ng-template #gogglesRow>
|
||||
@if (!isLoadingTx) {
|
||||
@if (((auditStatus && auditStatus.accelerated) || accelerationInfo || (tx && tx.acceleration)) || filters.length) {
|
||||
@if (isAcceleration || filters.length) {
|
||||
<tr>
|
||||
<td class="td-width">
|
||||
<span class="goggles-icon"><app-svg-images name="goggles" width="100%" height="100%"></app-svg-images></span>
|
||||
</td>
|
||||
<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>
|
||||
}
|
||||
<ng-container *ngFor="let filter of filters;">
|
||||
@ -606,15 +613,15 @@
|
||||
@if (!isLoadingTx) {
|
||||
@if ((cpfpInfo && hasEffectiveFeeRate) || accelerationInfo) {
|
||||
<tr>
|
||||
@if (tx.acceleration || accelerationInfo) {
|
||||
@if (isAcceleration) {
|
||||
<td i18n="transaction.accelerated-fee-rate|Accelerated transaction fee rate">Accelerated fee rate</td>
|
||||
} @else {
|
||||
<td i18n="transaction.effective-fee-rate|Effective transaction fee rate">Effective fee rate</td>
|
||||
}
|
||||
<td>
|
||||
<div class="effective-fee-container">
|
||||
@if (accelerationInfo) {
|
||||
<app-fee-rate [fee]="accelerationInfo.acceleratedFee" [weight]="accelerationInfo.effectiveVsize * 4"></app-fee-rate>
|
||||
@if (accelerationInfo?.acceleratedFeeRate && (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) {
|
||||
<app-fee-rate [fee]="accelerationInfo.acceleratedFeeRate"></app-fee-rate>
|
||||
} @else {
|
||||
<app-fee-rate [fee]="tx.effectiveFeePerVsize"></app-fee-rate>
|
||||
}
|
||||
|
@ -311,6 +311,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
.accelerateFullSize {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0.5rem 0.25rem;
|
||||
background-color: #653b9c;
|
||||
}
|
||||
|
||||
.goggles-icon {
|
||||
display: block;
|
||||
width: 2.2em;
|
||||
|
@ -9,7 +9,8 @@ import {
|
||||
delay,
|
||||
mergeMap,
|
||||
tap,
|
||||
map
|
||||
map,
|
||||
retry
|
||||
} from 'rxjs/operators';
|
||||
import { Transaction } from '../../interfaces/electrs.interface';
|
||||
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;
|
||||
pool: Pool | null;
|
||||
auditStatus: AuditStatus | null;
|
||||
isAcceleration: boolean = false;
|
||||
filters: Filter[] = [];
|
||||
showCpfpDetails = false;
|
||||
fetchCpfp$ = new Subject<string>();
|
||||
fetchRbfHistory$ = new Subject<string>();
|
||||
fetchCachedTx$ = new Subject<string>();
|
||||
fetchAcceleration$ = new Subject<string>();
|
||||
fetchAcceleration$ = new Subject<number>();
|
||||
fetchMiningInfo$ = new Subject<{ hash: string, height: number, txid: string }>();
|
||||
isCached: boolean = false;
|
||||
now = Date.now();
|
||||
@ -117,6 +119,8 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
flowEnabled: boolean;
|
||||
tooltipPosition: { x: number, y: number };
|
||||
isMobile: boolean;
|
||||
paymentType: 'bitcoin' | 'cashapp' = 'bitcoin';
|
||||
firstLoad = true;
|
||||
|
||||
featuresEnabled: boolean;
|
||||
segwitEnabled: boolean;
|
||||
@ -154,6 +158,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
ngOnInit() {
|
||||
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.websocketService.want(['blocks', 'mempool-blocks']);
|
||||
@ -280,9 +289,10 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
filter(() => this.stateService.env.ACCELERATOR === true),
|
||||
tap(() => {
|
||||
this.accelerationInfo = null;
|
||||
this.setIsAccelerated();
|
||||
}),
|
||||
switchMap((blockHash: string) => {
|
||||
return this.servicesApiService.getAccelerationHistory$({ blockHash });
|
||||
switchMap((blockHeight: number) => {
|
||||
return this.servicesApiService.getAccelerationHistory$({ blockHeight });
|
||||
}),
|
||||
catchError(() => {
|
||||
return of(null);
|
||||
@ -290,8 +300,12 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
).subscribe((accelerationHistory) => {
|
||||
for (const acceleration of accelerationHistory) {
|
||||
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.setIsAccelerated();
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -312,6 +326,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
map(block => {
|
||||
return block.extras.pool;
|
||||
}),
|
||||
retry({ count: 3, delay: 2000 }),
|
||||
catchError(() => {
|
||||
return of(null);
|
||||
})
|
||||
@ -332,18 +347,21 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
accelerated: isAccelerated,
|
||||
};
|
||||
}),
|
||||
retry({ count: 3, delay: 2000 }),
|
||||
catchError(() => {
|
||||
return of(null);
|
||||
})
|
||||
) : of(isCoinbase ? { coinbase: true } : null)
|
||||
]);
|
||||
}),
|
||||
catchError(() => {
|
||||
catchError((e) => {
|
||||
return of(null);
|
||||
})
|
||||
).subscribe(([pool, auditStatus]) => {
|
||||
this.pool = pool;
|
||||
this.auditStatus = auditStatus;
|
||||
|
||||
this.setIsAccelerated();
|
||||
});
|
||||
|
||||
this.mempoolPositionSubscription = this.stateService.mempoolTxPosition$.subscribe(txPosition => {
|
||||
@ -475,7 +493,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
this.getTransactionTime();
|
||||
}
|
||||
} 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.transactionTime = 0;
|
||||
}
|
||||
@ -537,7 +555,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
} else {
|
||||
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 });
|
||||
}
|
||||
});
|
||||
@ -666,10 +684,11 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
relatives.reduce((prev, val) => prev + val.fee, 0);
|
||||
this.tx.effectiveFeePerVsize = totalFees / (totalWeight / 4);
|
||||
} 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) {
|
||||
this.tx.acceleration = cpfpInfo.acceleration;
|
||||
this.setIsAccelerated();
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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 {
|
||||
if (this.tx) {
|
||||
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() {
|
||||
if (!this.firstLoad) {
|
||||
this.stateService.ref = '';
|
||||
} else {
|
||||
this.firstLoad = false;
|
||||
}
|
||||
this.error = undefined;
|
||||
this.tx = null;
|
||||
this.setFeatures();
|
||||
@ -742,6 +771,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
this.pool = null;
|
||||
this.auditStatus = null;
|
||||
document.body.scrollTo(0, 0);
|
||||
this.isAcceleration = false;
|
||||
this.leaveTransaction();
|
||||
}
|
||||
|
||||
@ -814,6 +844,7 @@ export class TransactionComponent implements OnInit, AfterViewInit, OnDestroy {
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.stateService.ref = '';
|
||||
this.subscription.unsubscribe();
|
||||
this.fetchCpfpSubscription.unsubscribe();
|
||||
this.fetchRbfSubscription.unsubscribe();
|
||||
|
@ -190,11 +190,11 @@
|
||||
</ng-template>
|
||||
|
||||
<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 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 type="how-prevent-stuck-transaction">
|
||||
|
@ -394,8 +394,11 @@ export interface Acceleration {
|
||||
blockHash: string;
|
||||
blockHeight: number;
|
||||
|
||||
acceleratedFee?: number;
|
||||
acceleratedFeeRate?: number;
|
||||
boost?: number;
|
||||
|
||||
boostCost?: number;
|
||||
boostRate?: number;
|
||||
}
|
||||
|
||||
export interface AccelerationHistoryParams {
|
||||
|
@ -128,12 +128,12 @@ export class ServicesApiServices {
|
||||
return this.httpClient.post<any>(`${SERVICES_API_PREFIX}/accelerator/estimate`, { txInput: txInput }, { observe: 'response' });
|
||||
}
|
||||
|
||||
accelerate$(txInput: string, userBid: number) {
|
||||
return this.httpClient.post<any>(`${SERVICES_API_PREFIX}/accelerator/accelerate`, { txInput: txInput, userBid: userBid });
|
||||
accelerate$(txInput: string, userBid: number, accelerationUUID: string) {
|
||||
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) {
|
||||
return this.httpClient.post<any>(`${SERVICES_API_PREFIX}/accelerator/accelerate/cashapp`, { txInput: txInput, userBid: userBid, token: token, cashtag: cashtag, referenceId: referenceId });
|
||||
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, accelerationUUID: accelerationUUID });
|
||||
}
|
||||
|
||||
getAccelerations$(): Observable<Acceleration[]> {
|
||||
|
@ -954,6 +954,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="02573b6980a2d611b4361a2595a4447e390058cd" datatype="html">
|
||||
<source>Accelerations</source>
|
||||
<target>شتابدهیها</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">2</context>
|
||||
@ -987,6 +988,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="91de1b9fba9fbc4b3dd8bda866e948524c3049e5" datatype="html">
|
||||
<source>Fee Rate</source>
|
||||
<target>نرخ کارمزد</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">12</context>
|
||||
@ -996,6 +998,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="90345169b9d6df90f3545aa45fc56146cf9f6b68" datatype="html">
|
||||
<source>Acceleration Bid</source>
|
||||
<target>پیشنهاد شتابدهی</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">13</context>
|
||||
@ -1005,6 +1008,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="dac1da772be9797ce39c7364d0e01373e4955ed1" datatype="html">
|
||||
<source>Requested</source>
|
||||
<target>درخواستشده</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">14</context>
|
||||
@ -1017,6 +1021,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="57cde27765d527a0d9195212fa5a7ce06408c827" datatype="html">
|
||||
<source>Bid Boost</source>
|
||||
<target>افزایش ناشی از پیشنهاد</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">17</context>
|
||||
@ -1065,6 +1070,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506" datatype="html">
|
||||
<source>Pending</source>
|
||||
<target>در حال انتظار</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">53</context>
|
||||
@ -1073,6 +1079,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="9362dc86738f282259d3ef3789b7824dbfd19202" datatype="html">
|
||||
<source>Completed <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span *ngIf="acceleration.status === 'completed_provisional'">"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/></source>
|
||||
<target>کاملشده <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span *ngIf="acceleration.status === 'completed_provisional'">"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/></target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">54,55</context>
|
||||
@ -1080,6 +1087,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="7131ba3d0dee65d36dc5de582917a4fc826e73d0" datatype="html">
|
||||
<source>Failed <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span *ngIf="acceleration.status === 'failed_provisional'">"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/></source>
|
||||
<target>ناموفق <x id="START_TAG_SPAN" ctype="x-span" equiv-text="<span *ngIf="acceleration.status === 'failed_provisional'">"/>🔄<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="</span>"/></target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">55,56</context>
|
||||
@ -1088,6 +1096,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="805f27b06c3c2b919234b3bcf3d0f5abe445d922" datatype="html">
|
||||
<source>There are no active accelerations</source>
|
||||
<target>هیچ شتابدهی فعالی وجود ندارد</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">96</context>
|
||||
@ -1096,6 +1105,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="0c2d0d4986aed63c43d3d39a37d5039a55ddf9d0" datatype="html">
|
||||
<source>There are no recent accelerations</source>
|
||||
<target>هیچ شتابدهی اخیری وجود ندارد</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerations-list/accelerations-list.component.html</context>
|
||||
<context context-type="linenumber">97</context>
|
||||
@ -1104,6 +1114,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="e51c45c636401f8bb3bd8cfd1ed5a3c9810c5fa8" datatype="html">
|
||||
<source>Active Accelerations</source>
|
||||
<target>شتابدهیهای فعال</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context>
|
||||
<context context-type="linenumber">10</context>
|
||||
@ -1116,6 +1127,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="41a9456b7e195dfc4df3d67b09940bda160882af" datatype="html">
|
||||
<source>Acceleration stats</source>
|
||||
<target>وضعیت شتابدهی</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context>
|
||||
<context context-type="linenumber">24</context>
|
||||
@ -1124,6 +1136,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="12ad90f635ec3df50b367b133c213b27912325cc" datatype="html">
|
||||
<source>(3 months)</source>
|
||||
<target>(3 ماه)</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context>
|
||||
<context context-type="linenumber">25</context>
|
||||
@ -1157,6 +1170,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="f0ae1220633178276128371f3965fb53d63581d4" datatype="html">
|
||||
<source>Recent Accelerations</source>
|
||||
<target>شتابدهیهای اخیر</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.html</context>
|
||||
<context context-type="linenumber">86</context>
|
||||
@ -1165,6 +1179,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="6b867dc61c6a92f3229f1950f9f2d414790cce95" datatype="html">
|
||||
<source>Accelerator Dashboard</source>
|
||||
<target>داشبورد شتابدهی</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/accelerator-dashboard/accelerator-dashboard.component.ts</context>
|
||||
<context context-type="linenumber">47</context>
|
||||
@ -1176,6 +1191,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="3590f5c3ef2810f637316edb8aaa86b8e907f152" datatype="html">
|
||||
<source>pending</source>
|
||||
<target>در حال انتظار</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context>
|
||||
<context context-type="linenumber">7</context>
|
||||
@ -1184,6 +1200,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="841f2a74ae5095e6e37f5749f3cc1851cf36a420" datatype="html">
|
||||
<source>Avg Max Bid</source>
|
||||
<target>متوسط بیشینه پیشنهاد</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context>
|
||||
<context context-type="linenumber">11</context>
|
||||
@ -1196,6 +1213,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="16fedee43f919b6a0992f32aeec5d6938e8d6b76" datatype="html">
|
||||
<source>Total Vsize</source>
|
||||
<target>مجموع اندازه مجازی</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context>
|
||||
<context context-type="linenumber">20</context>
|
||||
@ -1208,6 +1226,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="b5439bbae31f512a4ef3c3e2aa41f013f1dc120a" datatype="html">
|
||||
<source> of next block</source>
|
||||
<target>از بلاک بعدی</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/acceleration/pending-stats/pending-stats.component.html</context>
|
||||
<context context-type="linenumber">23</context>
|
||||
@ -1216,6 +1235,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="7b2e0a6bafe35c5cd10e55846d89397df0bff128" datatype="html">
|
||||
<source>Balance History</source>
|
||||
<target>تاریخچه موجودی</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/address-graph/address-graph.component.html</context>
|
||||
<context context-type="linenumber">6</context>
|
||||
@ -1224,6 +1244,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="4411783297407595814" datatype="html">
|
||||
<source>Balance:Balance</source>
|
||||
<target>Balance:Balance</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/address-graph/address-graph.component.ts</context>
|
||||
<context context-type="linenumber">162</context>
|
||||
@ -1231,6 +1252,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="b45214d1bf328d07f0aea939dfc197f5c59f421b" datatype="html">
|
||||
<source>Balances</source>
|
||||
<target>موجودیها</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/address-group/address-group.component.html</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
@ -1239,6 +1261,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="d04d5b5d13ac9acf9750f1807f0227eeee98b247" datatype="html">
|
||||
<source>Total</source>
|
||||
<target>مجموع</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/address-group/address-group.component.html</context>
|
||||
<context context-type="linenumber">9</context>
|
||||
@ -6565,6 +6588,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="4136162380400286378" datatype="html">
|
||||
<source>Consolidation</source>
|
||||
<target>تجمیع</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context>
|
||||
<context context-type="linenumber">79</context>
|
||||
@ -6576,6 +6600,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="7816493330657272952" datatype="html">
|
||||
<source>Coinjoin</source>
|
||||
<target>همبازضرب</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context>
|
||||
<context context-type="linenumber">80</context>
|
||||
@ -6587,6 +6612,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="146442697456175258" datatype="html">
|
||||
<source>Data</source>
|
||||
<target>داده</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context>
|
||||
<context context-type="linenumber">81</context>
|
||||
|
@ -397,7 +397,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
|
||||
@ -464,11 +464,11 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Transaction Virtual Size</note>
|
||||
<note priority="1" from="meaning">transaction.vsize</note>
|
||||
@ -710,15 +710,15 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Accelerate button label</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 : '1.0-0' }}"/> sat/vB</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">accelerator.accelerated-to-description</note>
|
||||
</trans-unit>
|
||||
@ -893,7 +893,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
|
||||
@ -1084,7 +1084,7 @@
|
||||
<source>Accelerator Dashboard</source>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/master-page/master-page.component.html</context>
|
||||
@ -1139,11 +1139,23 @@
|
||||
</context-group>
|
||||
<note priority="1" from="description">address.balance-history</note>
|
||||
</trans-unit>
|
||||
<trans-unit id="4411783297407595814" datatype="html">
|
||||
<source>Balance:Balance</source>
|
||||
<trans-unit id="7e69426bd97a606d8ae6026762858e6e7c86a1fd" datatype="html">
|
||||
<source>Balance</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="b45214d1bf328d07f0aea939dfc197f5c59f421b" datatype="html">
|
||||
@ -1225,22 +1237,6 @@
|
||||
</context-group>
|
||||
<note priority="1" from="description">address.total-sent</note>
|
||||
</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">
|
||||
<source>Transactions</source>
|
||||
<context-group purpose="location">
|
||||
@ -1991,7 +1987,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/lightning/node/node.component.html</context>
|
||||
@ -2028,7 +2024,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/shared/components/confirmations/confirmations.component.html</context>
|
||||
@ -2073,7 +2069,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/lightning/channel/channel-box/channel-box.component.html</context>
|
||||
@ -2123,7 +2119,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Effective transaction fee rate</note>
|
||||
<note priority="1" from="meaning">transaction.effective-fee-rate</note>
|
||||
@ -2149,7 +2145,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Transaction Weight</note>
|
||||
<note priority="1" from="meaning">transaction.weight</note>
|
||||
@ -2219,7 +2215,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Added</note>
|
||||
<note priority="1" from="meaning">tx-features.tag.added</note>
|
||||
@ -2232,7 +2228,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Prioritized</note>
|
||||
<note priority="1" from="meaning">tx-features.tag.prioritized</note>
|
||||
@ -2245,7 +2241,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Conflict</note>
|
||||
<note priority="1" from="meaning">tx-features.tag.conflict</note>
|
||||
@ -2262,7 +2258,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/shared/filters.utils.ts</context>
|
||||
@ -2356,7 +2352,7 @@
|
||||
</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 context-type="linenumber">225</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
|
||||
@ -2395,7 +2391,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="4786852746659896870" datatype="html">
|
||||
@ -2493,7 +2489,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">block.timestamp</note>
|
||||
</trans-unit>
|
||||
@ -2558,7 +2554,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">block.miner</note>
|
||||
</trans-unit>
|
||||
@ -2745,7 +2741,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">transaction.version</note>
|
||||
</trans-unit>
|
||||
@ -2846,7 +2842,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Toggle Audit</note>
|
||||
<note priority="1" from="meaning">block.toggle-audit</note>
|
||||
@ -2859,15 +2855,15 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/lightning/channel/channel.component.html</context>
|
||||
@ -4812,7 +4808,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">transaction.hex</note>
|
||||
</trans-unit>
|
||||
@ -4906,7 +4902,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
|
||||
@ -5440,7 +5436,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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 purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
|
||||
@ -5460,7 +5456,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="meta.description.bitcoin.transaction" datatype="html">
|
||||
@ -5471,7 +5467,7 @@
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
</trans-unit>
|
||||
<trans-unit id="0094b97dd052620710f173e7aedf6807a1eba1f5" datatype="html">
|
||||
@ -5483,15 +5479,170 @@
|
||||
<note priority="1" from="description">RBF replacement</note>
|
||||
<note priority="1" from="meaning">transaction.rbf.replacement</note>
|
||||
</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 & 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">
|
||||
<source>Features</source>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
|
||||
<context context-type="linenumber">68</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 context-type="linenumber">474</context>
|
||||
</context-group>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Expected in block tooltip</note>
|
||||
</trans-unit>
|
||||
@ -5516,7 +5667,7 @@
|
||||
<source>Expected in Block</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Expected in Block</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>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Seen in mempool tooltip</note>
|
||||
</trans-unit>
|
||||
@ -5533,7 +5684,7 @@
|
||||
<source>Seen in Mempool</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Seen in Mempool</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>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Not seen in mempool tooltip</note>
|
||||
</trans-unit>
|
||||
@ -5550,7 +5701,7 @@
|
||||
<source>Not seen in Mempool</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Not seen in Mempool</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>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Added transaction tooltip</note>
|
||||
</trans-unit>
|
||||
@ -5567,7 +5718,7 @@
|
||||
<source>This transaction may have been prioritized out-of-band</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Prioritized transaction tooltip</note>
|
||||
</trans-unit>
|
||||
@ -5575,23 +5726,15 @@
|
||||
<source>This transaction conflicted with another version in our mempool</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Conflict in mempool tooltip</note>
|
||||
</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">
|
||||
<source>ETA</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Transaction ETA</note>
|
||||
<note priority="1" from="meaning">transaction.eta</note>
|
||||
@ -5600,167 +5743,16 @@
|
||||
<source>In several hours (or more)</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Transaction ETA in several hours or more</note>
|
||||
<note priority="1" from="meaning">transaction.eta.in-several-hours</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">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 & 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">
|
||||
<source>Accelerated fee rate</source>
|
||||
<context-group purpose="location">
|
||||
<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>
|
||||
<note priority="1" from="description">Accelerated transaction fee rate</note>
|
||||
<note priority="1" from="meaning">transaction.accelerated-fee-rate</note>
|
||||
|
@ -721,6 +721,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="ba4f24bf9bf3dc4db3d6bc1b8b63339295f0b806" datatype="html">
|
||||
<source>Sign In</source>
|
||||
<target>登录</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/accelerate-preview/accelerate-preview.component.html</context>
|
||||
<context context-type="linenumber">214</context>
|
||||
@ -1201,6 +1202,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="b45214d1bf328d07f0aea939dfc197f5c59f421b" datatype="html">
|
||||
<source>Balances</source>
|
||||
<target>余额</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/address-group/address-group.component.html</context>
|
||||
<context context-type="linenumber">4</context>
|
||||
@ -3592,6 +3594,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="b9161223dda21fe34200a720dcb36830ca568104" datatype="html">
|
||||
<source>halving</source>
|
||||
<target>减半</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/difficulty/difficulty.component.html</context>
|
||||
<context context-type="linenumber">10</context>
|
||||
@ -4241,6 +4244,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="1c6520aeea2eb946269acab0a2863162b8311e7d" datatype="html">
|
||||
<source>Dust</source>
|
||||
<target>粉尘</target>
|
||||
<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="linenumber">15</context>
|
||||
@ -4785,6 +4789,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="3666195172774554282" datatype="html">
|
||||
<source>Other (<x id="PH" equiv-text="percentage"/>)</source>
|
||||
<target>其他(<x id="PH" equiv-text="percentage"/>)</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/pool-ranking/pool-ranking.component.ts</context>
|
||||
<context context-type="linenumber">186</context>
|
||||
@ -5057,6 +5062,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="meta.title.push-tx" datatype="html">
|
||||
<source>Broadcast Transaction</source>
|
||||
<target>广播交易</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/push-transaction/push-transaction.component.ts</context>
|
||||
<context context-type="linenumber">33</context>
|
||||
@ -5064,6 +5070,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<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 context-type="sourcefile">src/app/components/push-transaction/push-transaction.component.ts</context>
|
||||
<context context-type="linenumber">34</context>
|
||||
@ -5276,6 +5283,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="920339d7b35b44632c8ec42aa2bd2cf5929e7619" datatype="html">
|
||||
<source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Block Height</source>
|
||||
<target><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> 区块高度</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context>
|
||||
<context context-type="linenumber">3</context>
|
||||
@ -5284,6 +5292,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="c6a48e5ee096fba914fb4927d16a5d2e0941e0fe" datatype="html">
|
||||
<source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Transaction</source>
|
||||
<target><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> 交易</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context>
|
||||
<context context-type="linenumber">21</context>
|
||||
@ -5292,6 +5301,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="1f8b2a9743e513d1e645f6986bae2130e914c34b" datatype="html">
|
||||
<source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Address</source>
|
||||
<target><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> 地址</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context>
|
||||
<context context-type="linenumber">27</context>
|
||||
@ -5300,6 +5310,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="ba18d02396f5998bb46cd5d771de107bfab6e177" datatype="html">
|
||||
<source><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> Block</source>
|
||||
<target><x id="INTERPOLATION" equiv-text="{{ networkName }}"/> 块</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/search-form/search-results/search-results.component.html</context>
|
||||
<context context-type="linenumber">33</context>
|
||||
@ -5442,6 +5453,8 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="date-base.immediately" datatype="html">
|
||||
<source>Immediately</source>
|
||||
<target>立刻
|
||||
</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/time/time.component.ts</context>
|
||||
<context context-type="linenumber">90</context>
|
||||
@ -5637,6 +5650,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="time-before" datatype="html">
|
||||
<source><x id="DATE" equiv-text="dateStrings.i18nYear"/> before</source>
|
||||
<target><x id="DATE" equiv-text="dateStrings.i18nYear"/> 之前</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/time/time.component.ts</context>
|
||||
<context context-type="linenumber">214</context>
|
||||
@ -5729,6 +5743,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<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 context-type="sourcefile">src/app/components/transaction/transaction-preview.component.ts</context>
|
||||
<context context-type="linenumber">93</context>
|
||||
@ -5797,6 +5812,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="08c516e1fe345b4ae1fcae5fd4e5a0cd22e646dd" datatype="html">
|
||||
<source>Seen in Mempool</source>
|
||||
<target>在Mempool中查看</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/components/transaction/transaction.component.html</context>
|
||||
<context context-type="linenumber">79</context>
|
||||
@ -6534,6 +6550,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="7816493330657272952" datatype="html">
|
||||
<source>Coinjoin</source>
|
||||
<target>代币混合</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/dashboard/dashboard.component.ts</context>
|
||||
<context context-type="linenumber">80</context>
|
||||
@ -6556,6 +6573,7 @@
|
||||
</trans-unit>
|
||||
<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="</b>"/> It cannot help you with retrieving funds, wallet issues, etc.<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="</p>"/><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="</p>"/></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="</b>"/>它无法帮助您检索资金、解决钱包问题等。<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="</p>"/><x id="START_PARAGRAPH" ctype="x-p" equiv-text="For any such requ"/>对于任何此类请求,您都需要联系帮助进行交易的实体(钱包软件、交易所等)。<x id="CLOSE_PARAGRAPH" ctype="x-p" equiv-text="</p>"/></target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/docs/api-docs/api-docs.component.html</context>
|
||||
<context context-type="linenumber">15,16</context>
|
||||
@ -6657,6 +6675,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>获取常见问题的答案,例如:什么是Mempool?为什么我的交易未被确认?如何运行自己的Mempool开源项目实例?等等。</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/docs/docs/docs.component.ts</context>
|
||||
<context context-type="linenumber">47</context>
|
||||
@ -6685,6 +6704,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="meta.title.docs.websocket" datatype="html">
|
||||
<source>WebSocket API</source>
|
||||
<target>Websocket API</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/docs/docs/docs.component.ts</context>
|
||||
<context context-type="linenumber">59</context>
|
||||
@ -7764,6 +7784,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>闪电网络节点 <x id="PH" equiv-text="node.alias"/> 的概览。查看通道、容量、位置、费用统计等。</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/lightning/node/node-preview.component.ts</context>
|
||||
<context context-type="linenumber">52</context>
|
||||
@ -7962,6 +7983,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>在世界地图上查看非Tor的闪电网络节点的通道。将鼠标悬停/点击地图上的点可查看节点名称和详细信息。</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts</context>
|
||||
<context context-type="linenumber">74</context>
|
||||
@ -7986,6 +8008,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>在世界地图上查看非 Tor的闪电网络节点的通道。将鼠标悬停/点击地图上的点可查看节点名称和详细信息。</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/lightning/nodes-map/nodes-map.component.ts</context>
|
||||
<context context-type="linenumber">52</context>
|
||||
@ -8061,6 +8084,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>查看闪电网络的地理分布:世界各国托管着多少个闪电节点、每个国家的总 BTC 容量等等。</target>
|
||||
<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="linenumber">47</context>
|
||||
@ -8131,6 +8155,7 @@
|
||||
</trans-unit>
|
||||
<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>
|
||||
<target>探索 <x id="PH" equiv-text="response.country.en"/> 中托管的所有 Lightning 节点,并查看每个节点的容量、开放通道数量等概览。</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/lightning/nodes-per-country/nodes-per-country.component.ts</context>
|
||||
<context context-type="linenumber">44</context>
|
||||
@ -8480,6 +8505,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="14f76d294f3ae892e8033d60bb960701cafca66f" datatype="html">
|
||||
<source>What is a mempool?</source>
|
||||
<target>什么是mempool?</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
|
||||
<context context-type="linenumber">51</context>
|
||||
@ -8488,6 +8514,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="8ac787087e3eec254d15a4e16492f8877107087b" datatype="html">
|
||||
<source>What is a block explorer?</source>
|
||||
<target>什么是区块浏览器?</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
|
||||
<context context-type="linenumber">52</context>
|
||||
@ -8496,6 +8523,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="0ab3729578bb613995fc5c90c4d7aa45588dd2a1" datatype="html">
|
||||
<source>What is a mempool explorer?</source>
|
||||
<target>什么是内存池浏览器?</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
|
||||
<context context-type="linenumber">53</context>
|
||||
@ -8528,6 +8556,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="f96488094a57809ea9bfe4a2f2bf91af66a0d0a3" datatype="html">
|
||||
<source>Mainnet Explorer</source>
|
||||
<target>主网浏览器</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
|
||||
<context context-type="linenumber">60</context>
|
||||
@ -8536,6 +8565,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="a31347c0f3ec966c373229584cfb7bd6725a0e64" datatype="html">
|
||||
<source>Testnet Explorer</source>
|
||||
<target>测试网浏览器</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
|
||||
<context context-type="linenumber">61</context>
|
||||
@ -8568,6 +8598,7 @@
|
||||
</trans-unit>
|
||||
<trans-unit id="fefee13017c2b85143cd131ee253e327a14053a0" datatype="html">
|
||||
<source>Tools</source>
|
||||
<target>工具</target>
|
||||
<context-group purpose="location">
|
||||
<context context-type="sourcefile">src/app/shared/components/global-footer/global-footer.component.html</context>
|
||||
<context context-type="linenumber">68</context>
|
||||
|
@ -108,7 +108,6 @@ html, body {
|
||||
|
||||
body {
|
||||
background-color: var(--active-bg);
|
||||
min-width: 375px;
|
||||
padding-bottom: 60px;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user