2024-04-13 08:05:45 +00:00
|
|
|
<div class="mobile-wrapper">
|
|
|
|
<div class="mobile-container">
|
|
|
|
<div class="panel">
|
2024-04-30 00:25:19 +00:00
|
|
|
<div class="nav-header">
|
|
|
|
@if (enterpriseInfo?.header_img) {
|
|
|
|
<a class="d-flex" [routerLink]="['/' | relativeUrl]">
|
2024-05-07 23:59:02 +00:00
|
|
|
<img *ngIf="enterpriseInfo.header_img" [src]="enterpriseInfo?.header_img" alt="enterpriseInfo.title" height="42px">
|
2024-04-30 00:25:19 +00:00
|
|
|
</a>
|
|
|
|
} @else if (enterpriseInfo?.img || enterpriseInfo?.imageMd5) {
|
|
|
|
<a [routerLink]="['/' | relativeUrl]">
|
|
|
|
<img [src]="enterpriseInfo.img || '/api/v1/services/enterprise/images/' + enterpriseInfo.name + '/logo?imageMd5=' + enterpriseInfo.imageMd5" class="subdomain_logo" [class]="{'rounded': enterpriseInfo.rounded_corner}">
|
|
|
|
</a>
|
|
|
|
<div class="vertical-line"></div>
|
|
|
|
}
|
|
|
|
@if (!enterpriseInfo?.header_img) {
|
|
|
|
<a [routerLink]="['/' | relativeUrl]">
|
|
|
|
<app-svg-images *ngIf="!officialMempoolSpace" name="mempoolSpace" style="width: 144px; height: 36px" viewBox="0 0 500 126" width="500" height="126" class="mempool-logo"></app-svg-images>
|
|
|
|
<app-svg-images *ngIf="officialMempoolSpace" name="officialMempoolSpace" style="width: 144px; height: 36px" width="500" height="126" viewBox="0 0 500 126"></app-svg-images>
|
|
|
|
</a>
|
|
|
|
}
|
|
|
|
|
|
|
|
@if (enterpriseInfo?.header_img || (!enterpriseInfo?.img && !enterpriseInfo?.imageMd5)) {
|
2024-05-07 23:59:02 +00:00
|
|
|
<div [ngSwitch]="network" class="network-label" [class.hide-name]="enterpriseInfo?.header_img">
|
2024-04-13 14:18:01 +00:00
|
|
|
<span *ngSwitchCase="'signet'" class="network signet"><span class="name">Bitcoin Signet</span><app-svg-images name="signet" width="35" height="35" viewBox="0 0 65 65" style="display: inline-block" class="mainnet ml-2"></app-svg-images></span>
|
2024-05-06 15:40:32 +00:00
|
|
|
<span *ngSwitchCase="'testnet'" class="network testnet"><span class="name">Bitcoin Testnet3</span><app-svg-images name="testnet" width="35" height="35" viewBox="0 0 65 65" style="display: inline-block" class="mainnet ml-2"></app-svg-images></span>
|
|
|
|
<span *ngSwitchCase="'testnet4'" class="network testnet"><span class="name">Bitcoin Testnet4</span><app-svg-images name="testnet4" width="35" height="35" viewBox="0 0 65 65" style="display: inline-block" class="mainnet ml-2"></app-svg-images></span>
|
2024-04-13 14:18:01 +00:00
|
|
|
<span *ngSwitchCase="'liquid'" class="network liquid"><span class="name">Liquid</span><app-svg-images name="liquid" width="35" height="35" viewBox="0 0 125 125" style="display: inline-block" class="mainnet ml-2"></app-svg-images></span>
|
|
|
|
<span *ngSwitchCase="'liquidtestnet'" class="network liquidtestnet"><span class="name">Liquid Testnet</span><app-svg-images name="liquidtestnet" width="35" height="35" viewBox="0 0 125 125" style="display: inline-block" class="mainnet ml-2"></app-svg-images></span>
|
|
|
|
<span *ngSwitchDefault class="network mainnet"><span class="name">Bitcoin</span><app-svg-images name="bitcoin" width="35" height="35" viewBox="0 0 65 65" style="display: inline-block" class="mainnet ml-2"></app-svg-images></span>
|
|
|
|
</div>
|
2024-04-30 00:25:19 +00:00
|
|
|
}
|
2024-04-13 12:26:30 +00:00
|
|
|
</div>
|
2024-04-13 08:05:45 +00:00
|
|
|
<div class="field">
|
|
|
|
<div class="label" i18n="shared.transaction">Transaction</div>
|
|
|
|
<div class="value">
|
|
|
|
<app-truncate [text]="txId" [lastChars]="12" [link]="['/tx/' | relativeUrl, txId]">
|
|
|
|
<app-clipboard [text]="txId"></app-clipboard>
|
|
|
|
</app-truncate>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="blockchain-wrapper" [style]="{ height: blockchainHeight * 1.16 + 'px' }">
|
|
|
|
<app-clockchain [height]="blockchainHeight" [width]="blockchainWidth" mode="none"></app-clockchain>
|
|
|
|
</div>
|
|
|
|
<div class="panel">
|
2024-06-04 22:45:43 +00:00
|
|
|
@if (replaced) {
|
|
|
|
<div class="alert-replaced" role="alert">
|
|
|
|
<span i18n="transaction.rbf.replacement|RBF replacement">This transaction has been replaced by:</span>
|
|
|
|
<app-truncate [text]="latestReplacement" [lastChars]="12" [link]="['/tracker/' | relativeUrl, latestReplacement]"></app-truncate>
|
|
|
|
</div>
|
|
|
|
} @else {
|
|
|
|
<div class="tracker-bar">
|
|
|
|
<app-tracker-bar [stage]="trackerStage"></app-tracker-bar>
|
|
|
|
</div>
|
|
|
|
}
|
2024-04-13 13:56:29 +00:00
|
|
|
<div class="data">
|
2024-05-30 21:27:10 +00:00
|
|
|
@if (tx && !tx.status?.confirmed) {
|
2024-04-16 16:01:52 +09:00
|
|
|
<div class="field narrower mt-2">
|
2024-04-13 13:14:26 +00:00
|
|
|
<div class="label" i18n="transaction.first-seen|Transaction first seen">First seen</div>
|
|
|
|
<div class="value">
|
2024-04-14 03:49:26 +00:00
|
|
|
@if (transactionTime > 0) {
|
2024-06-08 23:28:44 +00:00
|
|
|
<i><app-time kind="since" [time]="transactionTime" [fastRender]="true" [showTooltip]="true"></app-time></i>
|
2024-04-13 13:14:26 +00:00
|
|
|
} @else {
|
2024-04-14 03:49:26 +00:00
|
|
|
<span class="skeleton-loader" style="max-width: 50%;"></span>
|
2024-04-13 13:14:26 +00:00
|
|
|
}
|
|
|
|
</div>
|
|
|
|
</div>
|
2024-04-16 16:01:52 +09:00
|
|
|
<div class="field narrower">
|
2024-04-13 08:05:45 +00:00
|
|
|
<div class="label" i18n="transaction.eta|Transaction ETA">ETA</div>
|
|
|
|
<div class="value">
|
2024-05-30 21:27:10 +00:00
|
|
|
<ng-container *ngIf="(ETA$ | async) as eta; else etaSkeleton">
|
|
|
|
<span class="justify-content-end d-flex align-items-center">
|
|
|
|
@if (eta.blocks >= 7) {
|
|
|
|
<span i18n="transaction.eta.in-several-hours|Transaction ETA in several hours or more">In several hours (or more)</span>
|
|
|
|
} @else {
|
|
|
|
<app-time kind="until" [time]="eta.time" [fastRender]="false" [fixedRender]="true"></app-time>
|
|
|
|
}
|
2024-06-26 18:35:36 +09:00
|
|
|
@if (!showAccelerationSummary && isMobile && !tx.acceleration && acceleratorAvailable && accelerateCtaType === 'button' && !tx?.acceleration) {
|
2024-05-30 21:27:10 +00:00
|
|
|
<a class="btn btn-sm accelerate btn-small-height" i18n="transaction.accelerate|Accelerate button label" (click)="onAccelerateClicked()">Accelerate</a>
|
|
|
|
}
|
|
|
|
</span>
|
|
|
|
</ng-container>
|
|
|
|
<ng-template #etaSkeleton>
|
|
|
|
<span class="skeleton-loader"></span>
|
|
|
|
</ng-template>
|
2024-04-13 08:05:45 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
} @else if (tx && tx.status?.confirmed) {
|
2024-04-16 16:01:52 +09:00
|
|
|
<div class="field narrower mt-2">
|
2024-04-13 13:14:26 +00:00
|
|
|
<div class="label" i18n="transaction.confirmed-at">Confirmed at</div>
|
|
|
|
<div class="value">
|
|
|
|
‎{{ tx.status.block_time * 1000 | date:'yyyy-MM-dd HH:mm' }}
|
|
|
|
<div class="lg-inline">
|
2024-06-08 23:28:44 +00:00
|
|
|
<i class="symbol">(<app-time kind="since" [time]="tx.status.block_time" [fastRender]="true" [showTooltip]="true"></app-time>)</i>
|
2024-04-13 13:14:26 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2024-04-16 16:01:52 +09:00
|
|
|
<div class="field narrower">
|
2024-04-13 08:05:45 +00:00
|
|
|
<div class="label" i18n="transaction.block-height">Block height</div>
|
|
|
|
<div class="value">
|
|
|
|
<span class="justify-content-end d-flex align-items-center">
|
|
|
|
<a [routerLink]="['/block/' | relativeUrl, tx.status?.block_height]" class="block-link">{{ tx.status?.block_height }}</a>
|
|
|
|
<div class="confirmations">
|
|
|
|
<app-confirmations
|
|
|
|
*ngIf="tx"
|
|
|
|
[chainTip]="latestBlock?.height"
|
|
|
|
[height]="tx?.status?.block_height"
|
|
|
|
></app-confirmations>
|
|
|
|
</div>
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
}
|
|
|
|
</div>
|
|
|
|
</div>
|
2024-04-13 09:05:50 +00:00
|
|
|
|
|
|
|
<div class="bottom-panel">
|
2024-04-16 16:56:37 +09:00
|
|
|
@if (showAccelerationSummary && !accelerationFlowCompleted) {
|
2024-06-26 18:35:36 +09:00
|
|
|
<app-accelerate-checkout *ngIf="(da$ | async) as da;" [cashappEnabled]="accelerationEligible" [txid]="tx.txid" [eta]="mempoolPosition?.block >= 7 ? null : da.adjustedTimeAvg * (mempoolPosition.block + 1) + now + da.timeOffset" (close)="accelerationFlowCompleted = true" [scrollEvent]="scrollIntoAccelPreview" class="h-100 w-100"></app-accelerate-checkout>
|
2024-04-13 09:05:50 +00:00
|
|
|
} @else {
|
2024-04-13 13:56:29 +00:00
|
|
|
@if (tx?.acceleration && !tx.status?.confirmed) {
|
|
|
|
<div class="progress-icon">
|
2024-04-13 13:14:26 +00:00
|
|
|
<fa-icon [icon]="['fas', 'wand-magic-sparkles']" [fixedWidth]="true"></fa-icon>
|
2024-04-13 13:56:29 +00:00
|
|
|
</div>
|
|
|
|
<span class="explainer" i18n="tracker.explain.accelerated">Your transaction has been accelerated</span>
|
|
|
|
} @else {
|
|
|
|
@switch (trackerStage) {
|
|
|
|
@case ('waiting') {
|
|
|
|
<div class="progress-icon">
|
2024-04-13 13:14:26 +00:00
|
|
|
<div class="spinner-border text-light" style="width: 1em; height: 1em"></div>
|
2024-04-13 13:56:29 +00:00
|
|
|
</div>
|
|
|
|
<span class="explainer" i18n="tracker.explain.waiting">Waiting for your transaction to appear in the mempool</span>
|
|
|
|
}
|
|
|
|
@case ('pending') {
|
|
|
|
<div class="progress-icon">
|
2024-04-13 13:14:26 +00:00
|
|
|
<fa-icon [icon]="['fas', 'hourglass-start']" [fixedWidth]="true"></fa-icon>
|
2024-04-13 13:56:29 +00:00
|
|
|
</div>
|
|
|
|
<span class="explainer" i18n="tracker.explain.pending">Your transaction is in the mempool, but it will not be confirmed for some time.</span>
|
|
|
|
}
|
|
|
|
@case ('soon') {
|
|
|
|
<div class="progress-icon">
|
2024-04-13 13:14:26 +00:00
|
|
|
<fa-icon [icon]="['fas', 'hourglass-half']" [fixedWidth]="true"></fa-icon>
|
2024-04-13 13:56:29 +00:00
|
|
|
</div>
|
|
|
|
<span class="explainer" i18n="tracker.explain.soon">Your transaction is near the top of the mempool, and is expected to confirm soon.</span>
|
|
|
|
}
|
|
|
|
@case ('next') {
|
|
|
|
<div class="progress-icon">
|
2024-04-13 13:14:26 +00:00
|
|
|
<fa-icon [icon]="['fas', 'hourglass-end']" [fixedWidth]="true"></fa-icon>
|
2024-04-13 13:56:29 +00:00
|
|
|
</div>
|
|
|
|
<span class="explainer" i18n="tracker.explain.next-block">Your transaction is expected to confirm in the next block</span>
|
|
|
|
}
|
|
|
|
@case ('confirmed') {
|
|
|
|
<div class="progress-icon">
|
2024-04-13 13:14:26 +00:00
|
|
|
<fa-icon [icon]="['fas', 'circle-check']" [fixedWidth]="true"></fa-icon>
|
2024-04-13 13:56:29 +00:00
|
|
|
</div>
|
|
|
|
<span class="explainer" i18n="tracker.explain.confirmed">Your transaction is confirmed!</span>
|
2024-04-13 09:05:50 +00:00
|
|
|
}
|
2024-06-04 22:45:43 +00:00
|
|
|
@case ('replaced') {
|
|
|
|
<div class="progress-icon">
|
|
|
|
<fa-icon [icon]="['fas', 'timeline']" [fixedWidth]="true"></fa-icon>
|
|
|
|
</div>
|
|
|
|
<span class="explainer" i18n="tracker.explain.replaced">Your transaction has been replaced by a newer version!</span>
|
|
|
|
}
|
2024-04-13 09:05:50 +00:00
|
|
|
}
|
2024-04-13 13:56:29 +00:00
|
|
|
}
|
2024-04-13 09:05:50 +00:00
|
|
|
}
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="footer-link" [routerLink]="['/tx' | relativeUrl, tx?.txid]">
|
|
|
|
<span>See more details <fa-icon [icon]="['fas', 'arrow-alt-circle-right']"></fa-icon></span>
|
|
|
|
</div>
|
2024-04-13 08:05:45 +00:00
|
|
|
</div>
|
2024-04-08 04:27:49 +00:00
|
|
|
</div>
|