2020-03-05 16:13:46 +07:00
< div class = "container-xl" >
2020-02-16 22:15:07 +07:00
2020-02-19 23:50:23 +07:00
< div class = "title-block" >
2023-04-05 07:11:13 +09:00
< div * ngIf = "rbfTransaction && !tx?.status?.confirmed" class = "alert alert-mempool" role = "alert" >
2021-05-18 11:56:42 -03:00
< span i18n = "transaction.rbf.replacement|RBF replacement" > This transaction has been replaced by:< / span >
2023-01-16 16:47:05 -06:00
< app-truncate [ text ] = " rbfTransaction . txid " [ lastChars ] = " 12 " [ link ] = " [ ' / tx / ' | relativeUrl , rbfTransaction . txid ] " > < / app-truncate >
2020-06-08 18:55:53 +07:00
< / div >
2021-09-28 21:09:36 -03:00
2023-11-18 18:36:17 +09:00
<!-- <div *ngIf="tx && acceleratorAvailable && accelerateCtaType === 'alert' && !tx.status.confirmed && !tx.acceleration" class="alert alert - dismissible alert - purple" role="alert">
2023-09-03 16:05:12 +03:00
< div >
< a class = "btn btn-sm blink-bg" ( click ) = " onAccelerateClicked ( ) " > Accelerate< / a >
< span class = "align-middle" > this transaction using Mempool Accelerator ™ < / span >
< / div >
2023-08-24 14:17:31 +02:00
< button type = "button" class = "close" aria-label = "Close" ( click ) = " dismissAccelAlert ( ) " >
< span aria-hidden = "true" > × < / span >
< / button >
2023-11-18 18:36:17 +09:00
< / div > -->
2023-08-24 14:17:31 +02:00
2022-12-09 10:32:58 -06:00
< ng-container * ngIf = "!rbfTransaction || rbfTransaction?.size || tx" >
2021-10-11 22:33:20 -03:00
< h1 i18n = "shared.transaction" > Transaction< / h1 >
2020-03-10 14:46:12 +07:00
2023-01-05 11:01:46 -06:00
< span class = "tx-link" >
2023-01-16 16:47:05 -06:00
< span class = "txid" >
< app-truncate [ text ] = " txId " [ lastChars ] = " 12 " [ link ] = " [ ' / tx / ' | relativeUrl , txId ] " >
2023-01-05 11:01:46 -06:00
< app-clipboard [ text ] = " txId " > < / app-clipboard >
< / app-truncate >
2023-01-16 16:47:05 -06:00
< / span >
2021-10-11 22:33:20 -03:00
< / span >
2021-09-28 21:09:36 -03:00
< div class = "container-buttons" >
2023-06-16 13:47:09 -04:00
< app-confirmations
2023-07-17 18:37:46 +09:00
*ngIf="tx"
2023-06-16 13:47:09 -04:00
[chainTip]="latestBlock?.height"
[height]="tx?.status?.block_height"
[replaced]="replaced"
[removed]="this.rbfInfo?.mined & & !this.tx?.status?.confirmed"
>< / app-confirmations >
2021-07-06 13:56:32 -03:00
< / div >
2021-10-11 22:33:20 -03:00
< / ng-container >
2021-05-18 11:56:42 -03:00
< / div >
2020-03-25 02:55:26 +07:00
< div class = "clearfix" > < / div >
2020-02-16 22:15:07 +07:00
2024-04-05 06:27:12 +00:00
@if (!error) {
< div class = "box" >
< div class = "row" >
@if (isMobile) {
2020-03-23 04:07:31 +07:00
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
2024-04-05 06:27:12 +00:00
< ng-container * ngTemplateOutlet = "detailsLeft" > < / ng-container >
< ng-container * ngTemplateOutlet = "detailsRight" > < / ng-container >
< / tbody >
< / table >
< / div >
} @else {
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< ng-container * ngTemplateOutlet = "detailsLeft" > < / ng-container >
2020-03-23 04:07:31 +07:00
< / tbody >
< / table >
< / div >
< div class = "col-sm" >
2024-04-05 06:27:12 +00:00
< table class = "table table-borderless table-striped" >
< tbody >
< ng-container * ngTemplateOutlet = "detailsRight" > < / ng-container >
< / tbody >
< / table >
2020-03-23 04:07:31 +07:00
< / div >
2024-04-05 06:27:12 +00:00
}
2020-02-16 22:15:07 +07:00
< / div >
2024-04-05 06:27:12 +00:00
< / div >
}
2020-02-16 22:15:07 +07:00
2024-04-05 06:27:12 +00:00
< ng-template [ ngIf ] = " ! isLoadingTx & & ! error " >
2020-02-16 22:15:07 +07:00
2024-07-01 05:24:21 +00:00
<!-- CPFP Details -->
2021-03-22 18:04:50 +07:00
< ng-template [ ngIf ] = " showCpfpDetails " >
< br >
< h2 class = "text-left" > CPFP < fa-icon [ icon ] = " [ ' fas ' , ' info-circle ' ] " [ fixedWidth ] = " true " size = "xs" > < / fa-icon > < / h2 >
2023-01-05 11:01:46 -06:00
< div class = "box cpfp-details" >
< table class = "table table-fixed table-borderless table-striped" >
2021-03-22 18:04:50 +07:00
< thead >
< tr >
< th i18n = "transactions-list.vout.scriptpubkey-type" > Type< / th >
2023-01-05 11:01:46 -06:00
< th class = "txids" i18n = "dashboard.latest-transactions.txid" > TXID< / th >
2023-06-15 18:56:34 -04:00
< th * only-vsize class = "d-none d-lg-table-cell" i18n = "transaction.vsize|Transaction Virtual Size" > Virtual size< / th >
< th * only-weight class = "d-none d-lg-table-cell" i18n = "transaction.weight|Transaction Weight" > Weight< / th >
2021-03-22 18:04:50 +07:00
< th i18n = "transaction.fee-rate|Transaction fee rate" > Fee rate< / th >
< th class = "d-none d-lg-table-cell" > < / th >
< / tr >
< / thead >
< tbody >
2022-11-27 13:46:54 +09:00
< ng-template [ ngIf ] = " cpfpInfo ? . descendants ? . length " >
< tr * ngFor = "let cpfpTx of cpfpInfo.descendants" >
< td > < span class = "badge badge-primary" i18n = "transaction.descendant|Descendant" > Descendant< / span > < / td >
2023-01-16 16:47:05 -06:00
< td >
< app-truncate [ text ] = " cpfpTx . txid " [ link ] = " [ ' / tx ' | relativeUrl , cpfpTx . txid ] " > < / app-truncate >
2022-11-27 13:46:54 +09:00
< / td >
2023-06-15 18:56:34 -04:00
< td * only-vsize class = "d-none d-lg-table-cell" [ innerHTML ] = " cpfpTx . weight / 4 | vbytes: 2 " > < / td >
< td * only-weight class = "d-none d-lg-table-cell" [ innerHTML ] = " cpfpTx . weight | wuBytes: 2 " > < / td >
2023-06-15 15:17:32 -04:00
< td > < app-fee-rate [ fee ] = " cpfpTx . fee " [ weight ] = " cpfpTx . weight " > < / app-fee-rate > < / td >
2022-11-27 13:46:54 +09:00
< td class = "d-none d-lg-table-cell" > < fa-icon * ngIf = "roundToOneDecimal(cpfpTx) > roundToOneDecimal(tx)" class = "arrow-green" [ icon ] = " [ ' fas ' , ' angle-double-up ' ] " [ fixedWidth ] = " true " > < / fa-icon > < / td >
< / tr >
< / ng-template >
< ng-template [ ngIf ] = " cpfpInfo ? . bestDescendant " >
2021-03-22 18:04:50 +07:00
< tr >
< td > < span class = "badge badge-success" i18n = "transaction.descendant|Descendant" > Descendant< / span > < / td >
2023-01-05 11:01:46 -06:00
< td class = "txids" >
2023-01-16 16:47:05 -06:00
< app-truncate [ text ] = " cpfpInfo . bestDescendant . txid " [ link ] = " [ ' / tx ' | relativeUrl , cpfpInfo . bestDescendant . txid ] " > < / app-truncate >
2021-03-22 18:04:50 +07:00
< / td >
2023-06-15 18:56:34 -04:00
< td * only-vsize class = "d-none d-lg-table-cell" [ innerHTML ] = " cpfpInfo . bestDescendant . weight / 4 | vbytes: 2 " > < / td >
< td * only-weight class = "d-none d-lg-table-cell" [ innerHTML ] = " cpfpInfo . bestDescendant . weight | wuBytes: 2 " > < / td >
2023-06-15 15:17:32 -04:00
< td > < app-fee-rate [ fee ] = " cpfpInfo . bestDescendant . fee " [ weight ] = " cpfpInfo . bestDescendant . weight " > < / app-fee-rate > < / td >
2021-03-22 18:04:50 +07:00
< td class = "d-none d-lg-table-cell" > < fa-icon class = "arrow-green" [ icon ] = " [ ' fas ' , ' angle-double-up ' ] " [ fixedWidth ] = " true " > < / fa-icon > < / td >
< / tr >
< / ng-template >
2022-11-27 13:46:54 +09:00
< ng-template [ ngIf ] = " cpfpInfo ? . ancestors ? . length " >
2021-03-22 18:04:50 +07:00
< tr * ngFor = "let cpfpTx of cpfpInfo.ancestors" >
< td > < span class = "badge badge-primary" i18n = "transaction.ancestor|Transaction Ancestor" > Ancestor< / span > < / td >
2023-01-05 11:01:46 -06:00
< td class = "txids" >
2023-01-16 16:47:05 -06:00
< app-truncate [ text ] = " cpfpTx . txid " [ link ] = " [ ' / tx ' | relativeUrl , cpfpTx . txid ] " > < / app-truncate >
2021-03-22 18:04:50 +07:00
< / td >
2023-06-15 18:56:34 -04:00
< td * only-vsize class = "d-none d-lg-table-cell" [ innerHTML ] = " cpfpTx . weight / 4 | vbytes: 2 " > < / td >
< td * only-weight class = "d-none d-lg-table-cell" [ innerHTML ] = " cpfpTx . weight | wuBytes: 2 " > < / td >
2023-06-15 15:17:32 -04:00
< td > < app-fee-rate [ fee ] = " cpfpTx . fee " [ weight ] = " cpfpTx . weight " > < / app-fee-rate > < / td >
2021-04-10 23:23:05 +04:00
< td class = "d-none d-lg-table-cell" > < fa-icon * ngIf = "roundToOneDecimal(cpfpTx) < roundToOneDecimal(tx)" class = "arrow-red" [ icon ] = " [ ' fas ' , ' angle-double-down ' ] " [ fixedWidth ] = " true " > < / fa-icon > < / td >
2021-03-22 18:04:50 +07:00
< / tr >
< / ng-template >
< / tbody >
< / table >
< / div >
< / ng-template >
2024-07-01 05:24:21 +00:00
<!-- Accelerator -->
< ng-container * ngIf = "!tx?.status?.confirmed && showAccelerationSummary" >
< br >
< div class = "title float-left" >
< h2 i18n = "transaction.accelerate|Accelerate button label" > Accelerate< / h2 >
< / div >
2024-07-01 22:54:24 +09:00
< button type = "button" class = "btn btn-outline-info accelerator-toggle btn-sm float-right" ( click ) = " closeAccelerator ( ) " i18n = "accelerator.hide" > Hide accelerator< / button >
< button * ngIf = "hasAccelerationDetails" class = "btn btn-sm btn-outline-info details-button float-right ml-2" ( click ) = " showAccelerationDetails = !showAccelerationDetails" i18n = "transaction.details|Transaction Details" > Details< / button >
2024-07-01 05:24:21 +00:00
< div class = "clearfix" > < / div >
< ng-container * ngIf = "(ETA$ | async) as eta;" >
< app-accelerate-checkout
*ngIf="(da$ | async) as da;"
2024-07-01 07:28:25 +00:00
[cashappEnabled]="cashappEligible"
2024-07-01 05:24:21 +00:00
[advancedEnabled]="true"
[tx]="tx"
[eta]="eta"
[miningStats]="miningStats"
[scrollEvent]="scrollIntoAccelPreview"
[showDetails]="showAccelerationDetails"
[noCTA]="true"
(hasDetails)="setHasAccelerationDetails($event)"
class="h-100 w-100"
>< / app-accelerate-checkout >
< / ng-container >
< / ng-container >
2020-04-13 01:26:53 +07:00
< br >
2022-12-17 09:39:06 -06:00
< ng-container * ngIf = "rbfInfo" >
2022-12-13 17:11:37 -06:00
< div class = "title float-left" >
2023-03-05 19:51:49 -06:00
< h2 id = "rbf" i18n = "transaction.rbf-history|RBF History" > RBF History< / h2 >
2022-12-13 17:11:37 -06:00
< / div >
< div class = "clearfix" > < / div >
< app-rbf-timeline [ txid ] = " txId " [ replacements ] = " rbfInfo " > < / app-rbf-timeline >
< br >
< / ng-container >
2022-10-11 17:01:23 +00:00
< ng-container * ngIf = "flowEnabled; else flowPlaceholder" >
2022-09-29 15:41:14 +00:00
< div class = "title float-left" >
< h2 id = "flow" i18n = "transaction.flow|Transaction flow" > Flow< / h2 >
< / div >
2022-09-16 20:50:12 +00:00
2022-10-04 21:08:54 +00:00
< button type = "button" class = "btn btn-outline-info flow-toggle btn-sm float-right" ( click ) = " toggleGraph ( ) " i18n = "hide-diagram" > Hide diagram< / button >
2022-09-29 15:41:14 +00:00
< div class = "clearfix" > < / div >
< div class = "box" >
< div class = "graph-container" # graphContainer >
< tx-bowtie-graph
[tx]="tx"
2023-03-06 00:02:21 -06:00
[cached]="isCached"
2022-09-29 15:41:14 +00:00
[width]="graphWidth"
2022-11-22 16:30:04 +09:00
[height]="graphHeight"
2022-09-29 15:41:14 +00:00
[lineLimit]="inOutLimit"
[maxStrands]="graphExpanded ? maxInOut : 24"
[network]="network"
2022-10-04 21:00:46 +00:00
[tooltip]="true"
2022-11-21 12:28:26 +09:00
[connectors]="true"
2022-10-04 23:30:14 +00:00
[inputIndex]="inputIndex" [outputIndex]="outputIndex"
2022-10-04 21:00:46 +00:00
>
2022-09-29 15:41:14 +00:00
< / tx-bowtie-graph >
< / div >
< div class = "toggle-wrapper" * ngIf = "maxInOut > 24" >
< button class = "btn btn-sm btn-primary graph-toggle" ( click ) = " expandGraph ( ) ; " * ngIf = "!graphExpanded; else collapseBtn" > < span i18n = "show-more" > Show more< / span > < / button >
< ng-template # collapseBtn >
< button class = "btn btn-sm btn-primary graph-toggle" ( click ) = " collapseGraph ( ) ; " > < span i18n = "show-less" > Show less< / span > < / button >
< / ng-template >
< / div >
2022-09-16 20:50:12 +00:00
< / div >
2022-09-29 15:41:14 +00:00
< br >
< / ng-container >
< ng-template # flowPlaceholder >
< div class = "box hidden" >
< div class = "graph-container" # graphContainer >
< / div >
2022-09-16 20:50:12 +00:00
< / div >
2022-09-29 15:41:14 +00:00
< / ng-template >
2022-09-16 20:50:12 +00:00
2022-09-29 15:41:14 +00:00
< div class = "subtitle-block" >
< div class = "title" >
< h2 i18n = "transaction.inputs-and-outputs|Transaction inputs and outputs" > Inputs & Outputs< / h2 >
< / div >
2022-09-16 20:50:12 +00:00
2022-09-29 15:41:14 +00:00
< div class = "title-buttons" >
2022-10-11 17:01:23 +00:00
< button * ngIf = "!flowEnabled" type = "button" class = "btn btn-outline-info flow-toggle btn-sm" ( click ) = " toggleGraph ( ) " i18n = "show-diagram" > Show diagram< / button >
2022-09-29 15:41:14 +00:00
< button type = "button" class = "btn btn-outline-info btn-sm" ( click ) = " txList . toggleDetails ( ) " i18n = "transaction.details|Transaction Details" > Details< / button >
< / div >
2021-10-26 21:47:17 -03:00
< / div >
2020-02-16 22:15:07 +07:00
2020-11-15 17:58:38 +07:00
2023-03-06 00:02:21 -06:00
< app-transactions-list # txList [ transactions ] = " [ tx ] " [ cached ] = " isCached " [ errorUnblinded ] = " errorUnblinded " [ inputIndex ] = " inputIndex " [ outputIndex ] = " outputIndex " [ transactionPage ] = " true " > < / app-transactions-list >
2020-02-16 22:15:07 +07:00
2022-04-05 20:37:18 +02:00
< div class = "title text-left" >
2024-04-03 18:13:42 +09:00
< h2 i18n = "transaction.details|Transaction Details" > Details< / h2 >
2021-10-26 21:47:17 -03:00
< / div >
2020-02-16 22:15:07 +07:00
< div class = "box" >
2021-11-15 12:00:41 +04:00
< div class = "row" >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
2022-05-10 17:05:07 +04:00
< td i18n = "block.size" > Size< / td >
2021-11-15 12:00:41 +04:00
< td [ innerHTML ] = " ' & lrm ; ' + ( tx . size | bytes: 2 ) " > < / td >
< / tr >
< tr >
< td i18n = "transaction.vsize|Transaction Virtual Size" > Virtual size< / td >
< td [ innerHTML ] = " ' & lrm ; ' + ( tx . weight / 4 | vbytes: 2 ) " > < / td >
< / tr >
2023-09-19 00:18:52 +00:00
< tr * ngIf = "adjustedVsize != null" >
2024-01-24 00:15:10 +07:00
< td > < ng-container i18n = "transaction.adjusted-vsize|Transaction Adjusted VSize" > Adjusted vsize< / ng-container >
2024-01-12 09:50:33 +07:00
< a class = "info-link" [ routerLink ] = " [ ' / docs / faq / ' | relativeUrl ] " fragment = "what-is-adjusted-vsize" >
< fa-icon [ icon ] = " [ ' fas ' , ' info-circle ' ] " [ fixedWidth ] = " true " > < / fa-icon >
< / a >
< / td >
2023-09-19 00:18:52 +00:00
< td [ innerHTML ] = " ' & lrm ; ' + ( adjustedVsize | vbytes: 2 ) " > < / td >
2023-05-29 17:19:22 -04:00
< / tr >
2021-11-15 12:00:41 +04:00
< tr >
2022-05-10 17:05:07 +04:00
< td i18n = "block.weight" > Weight< / td >
2021-11-15 12:00:41 +04:00
< td [ innerHTML ] = " ' & lrm ; ' + ( tx . weight | wuBytes: 2 ) " > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td i18n = "transaction.version" > Version< / td >
< td [ innerHTML ] = " ' & lrm ; ' + ( tx . version | number ) " > < / td >
< / tr >
< tr >
< td i18n = "transaction.locktime" > Locktime< / td >
< td [ innerHTML ] = " ' & lrm ; ' + ( tx . locktime | number ) " > < / td >
< / tr >
2023-09-19 00:18:52 +00:00
< tr * ngIf = "sigops != null" >
2024-01-24 00:15:10 +07:00
< td > < ng-container i18n = "transaction.sigops|Transaction Sigops" > Sigops< / ng-container >
2024-01-12 09:50:33 +07:00
< a class = "info-link" [ routerLink ] = " [ ' / docs / faq / ' | relativeUrl ] " fragment = "what-are-sigops" >
< fa-icon [ icon ] = " [ ' fas ' , ' info-circle ' ] " [ fixedWidth ] = " true " > < / fa-icon >
< / a >
< / td >
2023-09-19 00:18:52 +00:00
< td [ innerHTML ] = " ' & lrm ; ' + ( sigops | number ) " > < / td >
2023-05-29 17:19:22 -04:00
< / tr >
2021-11-15 12:00:41 +04:00
< tr >
2022-05-10 17:05:07 +04:00
< td i18n = "transaction.hex" > Transaction hex< / td >
2021-11-15 12:00:41 +04:00
< td > < a target = "_blank" href = "{{ network === '' ? '' : '/' + network }}/api/tx/{{ txId }}/hex" > < fa-icon [ icon ] = " [ ' fas ' , ' external-link-alt ' ] " [ fixedWidth ] = " true " > < / fa-icon > < / a > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2020-03-11 16:06:11 +07:00
< / div >
2020-02-16 22:15:07 +07:00
< / ng-template >
2023-07-12 17:43:48 +09:00
< ng-template [ ngIf ] = " ( isLoadingTx & & ! error ) | | loadingCachedTx " >
2020-03-11 16:06:11 +07:00
< br >
2022-10-11 17:01:23 +00:00
< ng-container * ngIf = "flowEnabled" >
2022-09-29 15:41:14 +00:00
< div class = "title" >
< h2 i18n = "transaction.flow|Transaction flow" > Flow< / h2 >
< / div >
2022-09-16 20:50:12 +00:00
2022-09-29 15:41:14 +00:00
< div class = "box" >
< div class = "graph-container" # graphContainer style = "visibility: hidden;" > < / div >
< div class = "row" >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< / tbody >
< / table >
< / div >
2022-09-16 20:50:12 +00:00
< / div >
< / div >
2022-09-29 15:41:14 +00:00
< br >
< / ng-container >
2022-09-16 20:50:12 +00:00
2021-11-27 13:06:57 +04:00
< div class = "title" >
< h2 i18n = "transaction.inputs-and-outputs|Transaction inputs and outputs" > Inputs & Outputs< / h2 >
< / div >
2020-03-11 16:06:11 +07:00
< div class = "box" >
< div class = "row" >
2021-11-27 13:06:57 +04:00
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< / tbody >
< / table >
< / div >
2020-03-11 16:06:11 +07:00
< / div >
< / div >
< br >
2021-11-27 13:06:57 +04:00
< div class = "title" >
2024-04-03 18:13:42 +09:00
< h2 i18n = "transaction.details|Transaction Details" > Details< / h2 >
2021-11-27 13:06:57 +04:00
< / div >
2020-02-16 22:15:07 +07:00
< div class = "box" >
2021-11-15 12:00:41 +04:00
< div class = "row" >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2020-02-16 22:15:07 +07:00
< / div >
< / ng-template >
2023-07-12 17:43:48 +09:00
< ng-template [ ngIf ] = " error & & ! loadingCachedTx " >
2020-04-13 01:26:53 +07:00
2023-07-12 17:43:48 +09:00
< div class = "text-center" * ngIf = "waitingForTransaction; else errorTemplate" >
< h3 i18n = "transaction.error.transaction-not-found" > Transaction not found.< / h3 >
< h5 i18n = "transaction.error.waiting-for-it-to-appear" > Waiting for it to appear in the mempool...< / h5 >
2020-04-13 01:26:53 +07:00
< div class = "spinner-border text-light mt-2" > < / div >
2020-02-16 22:15:07 +07:00
< / div >
2021-09-28 21:09:36 -03:00
2020-04-13 01:26:53 +07:00
< ng-template # errorTemplate >
2024-03-21 07:57:13 +00:00
< app-http-error [ error ] = " error " >
< span i18n = "transaction.error.loading-transaction-data" > Error loading transaction data.< / span >
< / app-http-error >
2020-04-13 01:26:53 +07:00
< / ng-template >
2020-02-16 22:15:07 +07:00
< / ng-template >
2020-03-05 16:13:46 +07:00
< / div >
2020-02-16 22:15:07 +07:00
2024-04-05 06:27:12 +00:00
< ng-template # detailsLeft >
@if (tx?.status?.confirmed) {
< ng-container * ngTemplateOutlet = "timestampRow" > < / ng-container >
< ng-container * ngTemplateOutlet = "confirmedAfterRow" > < / ng-container >
} @else {
< ng-container * ngTemplateOutlet = "firstSeenRow" > < / ng-container >
< ng-container * ngTemplateOutlet = "etaRow" > < / ng-container >
}
< ng-container * ngTemplateOutlet = "featuresRow" > < / ng-container >
@if (tx?.status?.confirmed) {
< ng-container * ngTemplateOutlet = "auditRow" > < / ng-container >
}
< ng-container * ngTemplateOutlet = "gogglesRow" > < / ng-container >
< / ng-template >
< ng-template # detailsRight >
< ng-container * ngTemplateOutlet = "feeRow" > < / ng-container >
< ng-container * ngTemplateOutlet = "feeRateRow" > < / ng-container >
2024-05-28 03:35:41 +00:00
@if (!isLoadingTx & & !tx?.status?.confirmed & & isAcceleration & & ((cpfpInfo & & hasEffectiveFeeRate) || accelerationInfo)) {
2024-05-26 20:38:28 +00:00
< ng-container * ngTemplateOutlet = "acceleratingRow" > < / ng-container >
} @else {
< ng-container * ngTemplateOutlet = "effectiveRateRow" > < / ng-container >
}
2024-04-05 06:27:12 +00:00
@if (tx?.status?.confirmed) {
< ng-container * ngTemplateOutlet = "minerRow" > < / ng-container >
}
< / ng-template >
< ng-template # timestampRow >
@if (!isLoadingTx) {
< tr >
< td i18n = "block.timestamp" > Timestamp< / td >
< td >
‎ {{ tx.status.block_time * 1000 | date:'yyyy-MM-dd HH:mm' }}
< div class = "lg-inline" >
< i class = "symbol" > (< app-time kind = "since" [ time ] = " tx . status . block_time " [ fastRender ] = " true " > < / app-time > )< / i >
< / div >
< / td >
< / tr >
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
< / ng-template >
< ng-template # confirmedAfterRow >
@if (!isLoadingTx) {
@if (transactionTime > 0) {
2021-03-18 23:47:40 +07:00
< tr >
2024-04-05 06:27:12 +00:00
< td i18n = "transaction.confirmed|Transaction Confirmed state" > Confirmed< / td >
2024-06-24 11:06:33 +09:00
< td > < app-time kind = "span" [ time ] = " tx . status . block_time - transactionTime " [ fastRender ] = " true " [ showTooltip ] = " true " > < / app-time > < / td >
2021-03-18 23:47:40 +07:00
< / tr >
2024-04-05 06:27:12 +00:00
}
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
< / ng-template >
< ng-template # firstSeenRow >
2024-04-08 21:44:29 +09:00
@if (isLoadingTx) {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
2024-04-11 03:56:05 +00:00
} @else if (transactionTime > 0) {
2024-04-05 06:27:12 +00:00
< tr >
< td i18n = "transaction.first-seen|Transaction first seen" > First seen< / td >
2024-06-08 23:28:44 +00:00
< td > < i > < app-time kind = "since" [ time ] = " transactionTime " [ fastRender ] = " true " [ showTooltip ] = " true " > < / app-time > < / i > < / td >
2024-04-05 06:27:12 +00:00
< / tr >
2024-04-11 06:03:14 +00:00
} @else {
2024-04-08 21:44:29 +09:00
< tr >
< td i18n = "transaction.first-seen|Transaction first seen" > First seen< / td >
2024-04-11 03:56:05 +00:00
< td > < span class = "skeleton-loader" > < / span > < / td >
2024-04-08 21:44:29 +09:00
< / tr >
2024-04-05 06:27:12 +00:00
}
< / ng-template >
< ng-template # featuresRow >
@if (network !== 'liquid' & & network !== 'liquidtestnet') {
@if (!isLoadingTx) {
@if (featuresEnabled) {
< tr >
2024-04-05 20:59:15 +09:00
< td class = "td-width" i18n = "transaction.features|Transaction features" id = "acceleratePreviewAnchor" > Features< / td >
2024-04-05 06:27:12 +00:00
< td >
< app-tx-features [ tx ] = " tx " > < / app-tx-features >
< / td >
< / tr >
}
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
}
< / ng-template >
< ng-template # auditRow >
@if (network === '') {
@if (!isLoadingTx) {
@if (auditStatus) {
< tr >
< td class = "td-width" i18n = "block.toggle-audit|Toggle Audit" > Audit< / td >
< td class = "wrap-cell" >
< ng-container >
@if (auditStatus.coinbase) {
< span class = "badge badge-primary mr-1" i18n = "transactions-list.coinbase" > Coinbase< / span >
} @else if (auditStatus.expected) {
< span class = "badge badge-success mr-1" i18n-ngbTooltip = "Expected in block tooltip" ngbTooltip = "This transaction was projected to be included in the block" placement = "bottom" i18n = "tx-features.tag.expected|Expected in Block" > Expected in Block< / span >
} @else if (auditStatus.seen) {
< span class = "badge badge-success mr-1" i18n-ngbTooltip = "Seen in mempool tooltip" ngbTooltip = "This transaction was seen in the mempool prior to mining" placement = "bottom" i18n = "tx-features.tag.seen|Seen in Mempool" > Seen in Mempool< / span >
} @else if (!auditStatus.conflict) {
< span class = "badge badge-warning mr-1" i18n-ngbTooltip = "Not seen in mempool tooltip" ngbTooltip = "This transaction was missing from our mempool prior to mining" placement = "bottom" i18n = "tx-features.tag.not-seen|Not seen in Mempool" > Not seen in Mempool< / span >
}
@if (auditStatus.added) {
< span class = "badge badge-warning mr-1" i18n-ngbTooltip = "Added transaction tooltip" ngbTooltip = "This transaction may have been added out-of-band" placement = "bottom" i18n = "tx-features.tag.added|Added" > Added< / span >
}
@if (auditStatus.prioritized) {
< span class = "badge badge-warning mr-1" i18n-ngbTooltip = "Prioritized transaction tooltip" ngbTooltip = "This transaction may have been prioritized out-of-band" placement = "bottom" i18n = "tx-features.tag.prioritized|Prioritized" > Prioritized< / span >
}
@if (auditStatus.conflict) {
< span class = "badge badge-warning mr-1" i18n-ngbTooltip = "Conflict in mempool tooltip" ngbTooltip = "This transaction conflicted with another version in our mempool" placement = "bottom" i18n = "tx-features.tag.conflict|Conflict" > Conflict< / span >
}
< / ng-container >
< / td >
< / tr >
}
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
}
< / ng-template >
< ng-template # etaRow >
@if (!isLoadingTx) {
@if (!replaced & & !isCached) {
2021-03-18 23:47:40 +07:00
< tr >
2024-04-05 06:27:12 +00:00
< td class = "td-width align-items-center align-middle" i18n = "transaction.eta|Transaction ETA" > ETA< / td >
2021-03-18 23:47:40 +07:00
< td >
2024-05-30 21:26:10 +00:00
< ng-container * ngIf = "(ETA$ | async) as eta; else etaSkeleton" >
@if (eta.blocks >= 7) {
2024-07-01 07:42:57 +00:00
< span [ class ] = " ( ! tx ? . acceleration & & acceleratorAvailable & & accelerateCtaType = == ' button ' & & ! showAccelerationSummary & & eligibleForAcceleration ) ? ' etaDeepMempool d-flex justify-content-end align-items-center ' : ' ' " >
2024-05-30 21:26:10 +00:00
< span i18n = "transaction.eta.in-several-hours|Transaction ETA in several hours or more" > In several hours (or more)< / span >
2024-07-01 07:42:57 +00:00
@if (!tx?.acceleration & & acceleratorAvailable & & accelerateCtaType === 'button' & & !showAccelerationSummary & & eligibleForAcceleration) {
2024-05-30 21:26:10 +00:00
< a class = "btn btn-sm accelerateDeepMempool btn-small-height" i18n = "transaction.accelerate|Accelerate button label" ( click ) = " onAccelerateClicked ( ) " > Accelerate< / a >
2024-06-30 03:20:33 +00:00
}
2024-05-30 21:26:10 +00:00
< / span >
} @else if (network === 'liquid' || network === 'liquidtestnet') {
< app-time kind = "until" [ time ] = " eta . time " [ fastRender ] = " false " [ fixedRender ] = " true " > < / app-time >
} @else {
2024-07-01 07:42:57 +00:00
< span [ class ] = " ( ! tx ? . acceleration & & acceleratorAvailable & & accelerateCtaType = == ' button ' & & ! showAccelerationSummary & & eligibleForAcceleration ) ? ' etaDeepMempool d-flex justify-content-end align-items-center ' : ' ' " >
2024-05-30 21:26:10 +00:00
< app-time kind = "until" [ time ] = " eta . time " [ fastRender ] = " false " [ fixedRender ] = " true " > < / app-time >
2024-07-01 07:42:57 +00:00
@if (!tx?.acceleration & & acceleratorAvailable & & accelerateCtaType === 'button' & & !showAccelerationSummary & & eligibleForAcceleration) {
2024-06-30 04:57:00 +00:00
< a class = "btn btn-sm accelerateDeepMempool btn-small-height" i18n = "transaction.accelerate|Accelerate button label" ( click ) = " onAccelerateClicked ( ) " > Accelerate< / a >
}
< / span >
< span class = "eta justify-content-end" >
2024-05-30 21:26:10 +00:00
< / span >
}
< / ng-container >
< ng-template # etaSkeleton >
2024-04-05 06:27:12 +00:00
< span class = "skeleton-loader" > < / span >
2024-05-30 21:26:10 +00:00
< / ng-template >
2021-03-18 23:47:40 +07:00
< / td >
< / tr >
2024-04-05 06:27:12 +00:00
}
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
< / ng-template >
< ng-template # gogglesRow >
@if (!isLoadingTx) {
2024-04-08 14:08:11 +00:00
@if (isAcceleration || filters.length) {
2024-04-05 06:27:12 +00:00
< 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" >
2024-04-08 14:08:11 +00:00
@if (isAcceleration) {
2024-04-05 06:27:12 +00:00
< span class = "badge badge-accelerated mr-1" i18n = "transaction.audit.accelerated" > Accelerated< / span >
}
< ng-container * ngFor = "let filter of filters;" >
< span class = "badge badge-primary filter-tag mr-1" > {{ filter.label }}< / span >
< / ng-container >
< / td >
< / tr >
}
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
< / ng-template >
< ng-template # feeRow >
@if (!isLoadingTx) {
< tr >
< td class = "td-width" i18n = "transaction.fee|Transaction fee" > Fee< / td >
< td > {{ tx.fee | number }} < span class = "symbol" i18n = "shared.sat|sat" > sat< / span > < span class = "fiat" > < app-fiat [ blockConversion ] = " tx . price " [ value ] = " tx . fee " > < / app-fiat > < / span > < / td >
< / tr >
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
< / ng-template >
< ng-template # feeRateRow >
@if (!isLoadingTx) {
< tr >
< td i18n = "transaction.fee-rate|Transaction fee rate" > Fee rate< / td >
< td >
< app-fee-rate [ fee ] = " tx . feePerVsize " > < / app-fee-rate >
@if (tx?.status?.confirmed & & tx.fee & & !hasEffectiveFeeRate & & !accelerationInfo) {
< app-tx-fee-rating [ tx ] = " tx " > < / app-tx-fee-rating >
}
< / td >
< / tr >
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
< / ng-template >
< ng-template # effectiveRateRow >
@if (!isLoadingTx) {
@if ((cpfpInfo & & hasEffectiveFeeRate) || accelerationInfo) {
< tr >
2024-04-08 13:45:05 +00:00
@if (isAcceleration) {
2024-04-05 06:27:12 +00:00
< 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 >
}
2021-03-18 23:47:40 +07:00
< td >
2021-05-18 11:20:17 -03:00
< div class = "effective-fee-container" >
2024-04-08 11:36:22 +00:00
@if (accelerationInfo?.acceleratedFeeRate & & (!tx.effectiveFeePerVsize || accelerationInfo.acceleratedFeeRate >= tx.effectiveFeePerVsize)) {
2024-04-08 02:59:40 +00:00
< app-fee-rate [ fee ] = " accelerationInfo . acceleratedFeeRate " > < / app-fee-rate >
2024-04-05 06:27:12 +00:00
} @else {
< app-fee-rate [ fee ] = " tx . effectiveFeePerVsize " > < / app-fee-rate >
}
@if (tx?.status?.confirmed & & !tx.acceleration & & !accelerationInfo & & tx.fee & & tx.effectiveFeePerVsize) {
< app-tx-fee-rating class = "ml-2 mr-2 effective-fee-rating" [ tx ] = " tx " > < / app-tx-fee-rating >
}
2021-05-18 11:20:17 -03:00
< / div >
2024-04-05 06:27:12 +00:00
@if (hasCpfp) {
< button type = "button" class = "btn btn-outline-info btn-sm btn-small-height float-right" ( click ) = " showCpfpDetails = !showCpfpDetails" > CPFP < fa-icon [ icon ] = " [ ' fas ' , ' info-circle ' ] " [ fixedWidth ] = " true " > < / fa-icon > < / button >
}
2021-03-18 23:47:40 +07:00
< / td >
< / tr >
2024-04-05 06:27:12 +00:00
}
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
< / ng-template >
2024-05-26 20:38:28 +00:00
< ng-template # acceleratingRow >
< tr >
< td rowspan = "2" colspan = "2" style = "padding: 0;" >
2024-06-27 17:50:45 +09:00
< app-active-acceleration-box [ tx ] = " tx " [ accelerationInfo ] = " accelerationInfo " [ miningStats ] = " miningStats " [ chartPositionLeft ] = " isMobile " > < / app-active-acceleration-box >
2024-05-26 20:38:28 +00:00
< / td >
< / tr >
< tr > < / tr >
< / ng-template >
2024-04-05 06:27:12 +00:00
< ng-template # minerRow >
@if (network === '') {
@if (!isLoadingTx) {
< tr >
2024-03-23 06:40:46 +00:00
< td class = "td-width" i18n = "block.miner" > Miner< / td >
2024-04-05 06:27:12 +00:00
@if (pool) {
< td class = "wrap-cell" >
< a placement = "bottom" [ routerLink ] = " [ ' / mining / pool ' | relativeUrl , pool . slug ] " class = "badge mr-1"
[class]="pool.slug === 'unknown' ? 'badge-secondary' : 'badge-primary'">
{{ pool.name }}
< / a >
< / td >
} @else {
< td >
< span class = "skeleton-loader" > < / span >
< / td >
}
2024-03-23 06:40:46 +00:00
< / tr >
2024-04-05 06:27:12 +00:00
} @else {
< ng-container * ngTemplateOutlet = "skeletonDetailsRow" > < / ng-container >
}
}
2021-03-22 18:04:50 +07:00
< / ng-template >
2024-03-22 09:52:27 +00:00
2024-04-05 06:27:12 +00:00
< ng-template # skeletonDetailsRow >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
2024-03-22 09:52:27 +00:00
< / tr >
2024-04-05 06:27:12 +00:00
< / ng-template >