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" >
2020-06-08 18:55:53 +07:00
< div * ngIf = "rbfTransaction" class = "alert alert-mempool" role = "alert" >
This transaction has been replaced by:
< a class = "alert-link" [ routerLink ] = " [ ' / tx / ' | relativeUrl , rbfTransaction . txid ] " [ state ] = " { data: rbfTransaction } " >
< span class = "d-inline d-lg-none" > {{ rbfTransaction.txid | shortenString : 24 }}< / span >
< span class = "d-none d-lg-inline" > {{ rbfTransaction.txid }}< / span >
< / a >
< / div >
2020-03-25 02:55:26 +07:00
< h1 class = "float-left mr-3 mb-md-3" > Transaction< / h1 >
2020-03-10 14:46:12 +07:00
< ng-template [ ngIf ] = " tx ? . status ? . confirmed " >
2020-03-25 02:55:26 +07:00
< button * ngIf = "latestBlock" type = "button" class = "btn btn-sm btn-success float-right mr-2 mt-1 mt-md-3" > {{ latestBlock.height - tx.status.block_height + 1 }} confirmation< ng-container * ngIf = "latestBlock.height - tx.status.block_height + 1 > 1" > s< / ng-container > < / button >
2020-02-23 05:23:24 +07:00
< / ng-template >
2020-03-10 14:46:12 +07:00
< ng-template [ ngIf ] = " tx & & ! tx ? . status . confirmed " >
2020-03-25 02:55:26 +07:00
< button type = "button" class = "btn btn-sm btn-danger float-right mr-2 mt-1 mt-md-3" > Unconfirmed< / button >
2020-02-23 05:23:24 +07:00
< / ng-template >
2020-03-10 14:46:12 +07:00
< div >
2020-05-09 20:37:50 +07:00
< a [ routerLink ] = " [ ' / tx / ' | relativeUrl , txId ] " style = "line-height: 56px;" >
2020-03-10 14:46:12 +07:00
< span class = "d-inline d-lg-none" > {{ txId | shortenString : 24 }}< / span >
< span class = "d-none d-lg-inline" > {{ txId }}< / span >
< / a >
< app-clipboard [ text ] = " txId " > < / app-clipboard >
< / div >
2020-03-23 04:07:31 +07:00
< div class = "clearfix" > < / div >
2020-02-19 23:50:23 +07:00
< / div >
2020-03-25 02:55:26 +07:00
< div class = "clearfix" > < / div >
2020-02-16 22:15:07 +07:00
< ng-template [ ngIf ] = " ! isLoadingTx & & ! error " >
< ng-template [ ngIf ] = " tx . status . confirmed " [ ngIfElse ] = " unconfirmedTemplate " >
< div class = "box" >
2020-03-23 04:07:31 +07:00
< div class = "row" >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td class = "td-width" > Included in block< / td >
< td >
2020-05-09 20:37:50 +07:00
< a [ routerLink ] = " [ ' / block / ' | relativeUrl , tx . status . block_hash ] " [ state ] = " { data: { blockHeight: tx . status . block_height } } " > {{ tx.status.block_height }}< / a >
2020-03-23 04:07:31 +07:00
< i > (< app-time-since [ time ] = " tx . status . block_time " [ fastRender ] = " true " > < / app-time-since > ago)< / i >
< / td >
< / tr >
< ng-template [ ngIf ] = " transactionTime > 0">
< tr >
< td > Confirmed< / td >
< td > After < app-timespan [ time ] = " tx . status . block_time - transactionTime " > < / app-timespan > < / td >
< / tr >
< / ng-template >
2020-05-28 18:39:45 +07:00
< ng-container * ngTemplateOutlet = "features" > < / ng-container >
2020-03-23 04:07:31 +07:00
< / tbody >
< / table >
< / div >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< ng-template [ ngIf ] = " tx . fee " >
< tr >
< td class = "td-width" > Fee< / td >
2020-04-11 23:23:39 +07:00
< td > {{ tx.fee | number }} sat (< app-fiat [ value ] = " tx . fee " > < / app-fiat > )< / td >
2020-03-23 04:07:31 +07:00
< / tr >
< tr >
< td > Fee per vByte< / td >
< td >
2020-04-11 23:23:39 +07:00
{{ tx.fee / (tx.weight / 4) | number : '1.1-1' }} sat/vB
2020-03-23 04:07:31 +07:00
< span * ngIf = "feeRating === 1" class = "badge badge-success" > Optimal< / span >
< span * ngIf = "feeRating === 2" class = "badge badge-warning" title = "Only ~{{ medianFeeNeeded }} sat/vB was needed to get into this block" > Overpaid {{ overpaidTimes }}x< / span >
< span * ngIf = "feeRating === 3" class = "badge badge-danger" title = "Only ~{{ medianFeeNeeded }} sat/vB was needed to get into this block" > Overpaid {{ overpaidTimes }}x< / span >
< / td >
< / tr >
< / ng-template >
< / tbody >
< / table >
< / div >
< / div >
2020-02-16 22:15:07 +07:00
< / div >
< / ng-template >
< ng-template # unconfirmedTemplate >
< div class = "box" >
2020-03-23 04:07:31 +07:00
< div class = "row" >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< ng-template [ ngIf ] = " transactionTime ! = = 0 " >
< tr * ngIf = "transactionTime === -1; else firstSeenTmpl" >
< td > < span class = "skeleton-loader" > < / span > < / td >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< ng-template # firstSeenTmpl >
< tr >
< td > First seen< / td >
< td > < i > < app-time-since [ time ] = " transactionTime " [ fastRender ] = " true " > < / app-time-since > ago< / i > < / td >
< / tr >
< / ng-template >
< / ng-template >
2020-02-28 01:09:07 +07:00
< tr >
2020-03-23 04:07:31 +07:00
< td class = "td-width" > ETA< / td >
< td >
< ng-template [ ngIf ] = " txInBlockIndex = == undefined " [ ngIfElse ] = " estimationTmpl " >
< span class = "skeleton-loader" > < / span >
< / ng-template >
< ng-template # estimationTmpl >
2020-05-24 00:25:04 +07:00
< ng-template [ ngIf ] = " txInBlockIndex > = 7" [ngIfElse]="belowBlockLimit">
In several hours (or more)
2020-03-25 21:29:40 +07:00
< / ng-template >
2020-05-24 00:25:04 +07:00
< ng-template # belowBlockLimit >
< ng-template [ ngIf ] = " network = == ' liquid ' " [ ngIfElse ] = " timeEstimateDefault " >
< {{ 1 * txInBlockIndex + 1 }} minutes < i > ({{ txInBlockIndex + 1 }} block{{ txInBlockIndex > 0 ? 's' : '' }})< / i >
< / ng-template >
< ng-template # timeEstimateDefault >
~{{ 10 * txInBlockIndex + 10 }} minutes < i > ({{ txInBlockIndex + 1 }} block{{ txInBlockIndex > 0 ? 's' : '' }})< / i >
< / ng-template >
2020-03-25 21:29:40 +07:00
< / ng-template >
2020-03-23 04:07:31 +07:00
< / ng-template >
< / td >
2020-02-28 01:09:07 +07:00
< / tr >
2020-05-28 18:39:45 +07:00
< ng-container * ngTemplateOutlet = "features" > < / ng-container >
2020-03-23 04:07:31 +07:00
< / tbody >
< / table >
< / div >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td class = "td-width" > Fee< / td >
2020-04-11 23:23:39 +07:00
< td > {{ tx.fee | number }} sat (< app-fiat [ value ] = " tx . fee " > < / app-fiat > )< / td >
2020-03-23 04:07:31 +07:00
< / tr >
< tr >
< td > Fee per vByte< / td >
2020-04-11 23:23:39 +07:00
< td > {{ tx.fee / (tx.weight / 4) | number : '1.1-1' }} sat/vB< / td >
2020-03-23 04:07:31 +07:00
< / tr >
< / tbody >
< / table >
< / div >
< / div >
2020-02-16 22:15:07 +07:00
< / div >
< / ng-template >
2020-04-13 01:26:53 +07:00
< br >
2020-02-16 22:15:07 +07:00
< h2 > Inputs & Outputs< / h2 >
< app-transactions-list [ transactions ] = " [ tx ] " [ transactionPage ] = " true " > < / app-transactions-list >
< h2 > Details< / h2 >
< div class = "box" >
2020-03-11 16:06:11 +07:00
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td > Size< / td >
< td > {{ tx.size | bytes: 2 }}< / td >
< / tr >
< tr >
< td > Weight< / td >
< td > {{ tx.weight | wuBytes: 2 }}< / td >
< / tr >
< / tbody >
< / table >
< / div >
2020-02-16 22:15:07 +07:00
< / ng-template >
< ng-template [ ngIf ] = " isLoadingTx & & ! error " >
2020-03-11 16:06:11 +07:00
< div class = "box" >
2020-03-23 04:07:31 +07:00
< div class = "row" >
< div class = "col-sm" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td class = "td-width" > < 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 class = "td-width" > < 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-03-11 16:06:11 +07:00
< / div >
< br >
< h2 > Inputs & Outputs< / h2 >
< div class = "box" >
< div class = "row" >
< table class = "table table-borderless table-striped" >
< tbody >
< tr >
< td > < span class = "skeleton-loader" > < / span > < / td >
< td > < span class = "skeleton-loader" > < / span > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< br >
< h2 > Details< / h2 >
2020-02-16 22:15:07 +07:00
< div class = "box" >
< 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 >
< / tbody >
< / table >
< / div >
< / ng-template >
< ng-template [ ngIf ] = " error " >
2020-04-13 01:26:53 +07:00
< div class = "text-center" * ngIf = "waitingForTransaction" >
< h3 > Transaction not found.< / h3 >
< h5 > Waiting for it to appear in the mempool...< / h5 >
< div class = "spinner-border text-light mt-2" > < / div >
2020-02-16 22:15:07 +07:00
< / div >
2020-04-13 01:26:53 +07:00
< ng-template # errorTemplate >
< div class = "text-center" >
< h3 > {{ error.error }}< / h3 >
< / div >
< / 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
< br >
2020-05-28 18:39:45 +07:00
< ng-template # features >
< tr * ngIf = "network !== 'liquid'" >
< td class = "td-width" > Features< / td >
< td >
< span * ngIf = "segwitGains.realizedGains && !segwitGains.potentialBech32Gains" class = "badge badge-success mr-1" ngbTooltip = "This transaction saved {{ segwitGains.realizedGains * 100 | number: '1.0-0' }}% on fees by using native SegWit-Bech32" placement = "bottom" > SegWit< / span >
< span * ngIf = "segwitGains.realizedGains && segwitGains.potentialBech32Gains" class = "badge badge-warning mr-1" ngbTooltip = "This transaction saved {{ segwitGains.realizedGains * 100 | number: '1.0-0' }}% on fees by using SegWit and could save {{ segwitGains.potentialBech32Gains * 100 | number : '1.0-0' }}% more by fully upgrading to native SegWit-Bech32" placement = "bottom" > SegWit< / span >
< span * ngIf = "segwitGains.potentialP2shGains" class = "badge badge-danger mr-1" ngbTooltip = "This transaction could save {{ segwitGains.potentialBech32Gains * 100 | number : '1.0-0' }}% on fees by upgrading to native SegWit-Bech32 or {{ segwitGains.potentialP2shGains * 100 | number: '1.0-0' }}% by upgrading to SegWit-P2SH" placement = "bottom" > < del > SegWit< / del > < / span >
< span * ngIf = "isRbfTransaction" class = "badge badge-success" ngbTooltip = "This transaction support Replace-By-Fee (RBF) allowing fee bumping" placement = "bottom" > RBF< / span >
< / td >
< / tr >
< / ng-template >