2020-09-21 19:41:12 +07:00
2021-06-06 17:07:04 -03:00
< div class = "container-xl dashboard-container" >
2020-09-22 12:50:12 +07:00
< div class = "row row-cols-1 row-cols-md-2" * ngIf = "{ value: (mempoolInfoData$ | async) } as mempoolInfoData" >
2020-10-27 16:34:27 +07:00
< ng-template [ ngIf ]=" collapseLevel = == ' three '" [ ngIfElse ]=" expanded " >
2021-12-27 22:54:45 +04:00
< div class = "col card-wrapper" * ngIf = "(network$ | async) !== 'liquid' && (network$ | async) !== 'liquidtestnet'" >
2021-07-26 16:00:40 -03:00
< div class = "main-title" i18n = "fees-box.transaction-fees" > Transaction Fees</ div >
2021-06-06 17:07:04 -03:00
< div class = "card" >
2020-10-27 02:58:29 +07:00
< div class = "card-body" >
< app-fees-box class = "d-block" ></ app-fees-box >
</ div >
2020-09-21 19:41:12 +07:00
</ div >
</ div >
2021-12-27 22:54:45 +04:00
< div class = "col" * ngIf = "(network$ | async) !== 'liquid' && (network$ | async) !== 'liquidtestnet'" >
2022-01-17 13:33:07 +09:00
< app-difficulty ></ app-difficulty >
2021-08-06 16:38:44 +05:30
</ div >
2021-06-06 17:07:04 -03:00
< div class = "col" >
< div class = "card" >
2020-10-27 02:58:29 +07:00
< div class = "card-body" >
2022-02-18 00:37:37 +04:00
< ng-container * ngTemplateOutlet = "stateService.network === 'liquid' ? lbtcPegs : mempoolTable; context: { $implicit: mempoolInfoData }" ></ ng-container >
2020-09-21 19:41:12 +07:00
</ div >
</ div >
</ div >
2021-06-06 17:07:04 -03:00
< div class = "col" >
< div class = "card" >
2020-10-27 02:58:29 +07:00
< div class = "card-body" >
2022-02-18 00:37:37 +04:00
< ng-container * ngTemplateOutlet = "stateService.network === 'liquid' ? mempoolTable : txPerSecond; context: { $implicit: mempoolInfoData }" ></ ng-container >
2020-09-27 01:31:20 +07:00
</ div >
2020-10-27 02:58:29 +07:00
</ div >
</ div >
</ ng-template >
< ng-template # expanded >
2022-02-18 00:37:37 +04:00
< ng-container * ngIf = "(network$ | async) !== 'liquid' && (network$ | async) !== 'liquidtestnet'" >
< div class = "col card-wrapper" >
< div class = "main-title" i18n = "fees-box.transaction-fees" > Transaction Fees</ div >
< div class = "card" >
< div class = "card-body" >
< app-fees-box class = "d-block" ></ app-fees-box >
</ div >
2020-09-26 22:46:26 +07:00
</ div >
</ div >
2022-02-18 00:37:37 +04:00
< div class = "col" >
< app-difficulty ></ app-difficulty >
</ div >
</ ng-container >
2021-06-06 17:07:04 -03:00
< div class = "col" >
< div class = "card graph-card" >
2020-10-27 02:58:29 +07:00
< div class = "card-body pl-0" >
< div style = "padding-left: 1.25rem;" >
2022-02-18 00:37:37 +04:00
< ng-container * ngTemplateOutlet = "stateService.network === 'liquid' ? lbtcPegs : mempoolTable; context: { $implicit: mempoolInfoData }" ></ ng-container >
2020-10-27 02:58:29 +07:00
< hr >
</ div >
2022-02-18 00:37:37 +04:00
< ng-template [ ngIf ]="( network $ | async ) !== ' liquid '" [ ngIfElse ]=" liquidPegs " >
2022-02-12 00:15:13 +04:00
< ng-container * ngIf = "{ value: (mempoolStats$ | async) } as mempoolStats" >
< div class = "mempool-graph" >
< app-mempool-graph
[ template ]="' widget '"
[ limitFee ]=" 150 "
[ limitFilterFee ]=" 1 "
[ data ]=" mempoolStats . value ?. mempool "
[ windowPreferenceOverride ]="' 2h '"
></ app-mempool-graph >
</ div >
</ ng-container >
</ ng-template >
2022-02-18 00:37:37 +04:00
< ng-template # liquidPegs >
< app-lbtc-pegs-graph [ data ]=" liquidPegsMonth $ | async " ></ app-lbtc-pegs-graph >
</ ng-template >
</ div >
</ div >
</ div >
< div class = "col" >
< div class = "card graph-card" >
< div class = "card-body" >
< ng-container * ngTemplateOutlet = "stateService.network === 'liquid' ? mempoolTable : txPerSecond; context: { $implicit: mempoolInfoData }" ></ ng-container >
< hr >
< div class = "mempool-graph" * ngIf = "stateService.network === 'liquid'; else mempoolGraph" >
< table class = "table table-borderless table-striped" * ngIf = "(featuredAssets$ | async) as featuredAssets else loadingAssetsTable" >
2022-02-12 00:15:13 +04:00
< tbody >
< tr * ngFor = "let group of featuredAssets" >
< td class = "asset-icon" >
< a [ routerLink ]="['/ assets / asset /' | relativeUrl , group . asset ]" >
< img class = "assetIcon" [ src ]="' https: // liquid . network / api / v1 / asset /' + group . asset + '/ icon '" >
</ a >
</ td >
< td class = "asset-title" >
< a [ routerLink ]="['/ assets / asset /' | relativeUrl , group . asset ]" > {{ group.name }}</ a >
</ td >
2022-02-13 00:46:42 +04:00
< td class = "circulating-amount" >< app-asset-circulation [ assetId ]=" group . asset " ></ app-asset-circulation ></ td >
2022-02-12 00:15:13 +04:00
</ tr >
</ tbody >
</ table >
2020-09-27 01:31:20 +07:00
</ div >
2021-10-05 14:54:54 +04:00
< ng-template # mempoolGraph >
2021-11-19 00:10:12 +04:00
< div class = "mempool-graph" * ngIf = "{ value: (mempoolStats$ | async) } as mempoolStats" >
2021-10-05 14:54:54 +04:00
< app-incoming-transactions-graph
[ left ]=" 50 "
2021-11-19 00:10:12 +04:00
[ data ]=" mempoolStats . value ?. weightPerSecond "
2021-12-11 15:26:59 +09:00
[ windowPreferenceOverride ]="' 2h '"
2021-10-05 14:54:54 +04:00
></ app-incoming-transactions-graph >
</ div >
</ ng-template >
2020-10-27 02:58:29 +07:00
</ div >
2020-09-26 22:46:26 +07:00
</ div >
</ div >
2020-10-27 16:34:27 +07:00
< ng-template [ ngIf ]=" collapseLevel = == ' one '" >
2021-06-06 17:07:04 -03:00
< div class = "col" >
< div class = "card" >
2020-10-27 02:58:29 +07:00
< div class = "card-body" >
2020-12-02 04:19:33 +09:00
< h5 class = "card-title" i18n = "dashboard.latest-blocks" > Latest blocks</ h5 >
2021-05-03 10:11:30 -03:00
< table class = "table lastest-blocks-table" >
2020-10-27 02:58:29 +07:00
< thead >
2021-05-03 10:11:30 -03:00
< th class = "table-cell-height" i18n = "dashboard.latest-blocks.height" > Height</ th >
2022-03-17 18:17:22 +01:00
< th * ngIf = "!stateService.env.MINING_DASHBOARD" class = "table-cell-mined" i18n = "dashboard.latest-blocks.mined" > Mined</ th >
< th * ngIf = "stateService.env.MINING_DASHBOARD" class = "table-cell-mined pl-lg-4" i18n = "mining.pool-name" > Pool</ th >
2021-05-03 10:11:30 -03:00
< th class = "table-cell-transaction-count" i18n = "dashboard.latest-blocks.transaction-count" > TXs</ th >
< th class = "table-cell-size" i18n = "dashboard.latest-blocks.size" > Size</ th >
2020-10-27 02:58:29 +07:00
</ thead >
< tbody >
< tr * ngFor = "let block of blocks$ | async; let i = index; trackBy: trackByBlock" >
2021-05-03 10:11:30 -03:00
< td class = "table-cell-height" >< a [ routerLink ]="['/ block ' | relativeUrl , block . id ]" [ state ]="{ data: { block: block } }" > {{ block.height }}</ a ></ td >
2022-03-17 18:17:22 +01:00
< td * ngIf = "!stateService.env.MINING_DASHBOARD" class = "table-cell-mined" >< app-time-since [ time ]=" block . timestamp " [ fastRender ]=" true " ></ app-time-since ></ td >
< td * ngIf = "stateService.env.MINING_DASHBOARD" class = "table-cell-mined pl-lg-4" >
< a class = "clear-link" [ routerLink ]="[('/ mining / pool /' + block . extras . pool . id ) | relativeUrl ]" >
< img width = "20" height = "20" src = "{{ block.extras.pool['logo'] }}"
onError = "this.src = './resources/mining-pools/default.svg'" >
< span class = "pool-name" > {{ block.extras.pool.name }}</ span >
</ a >
</ td >
2021-05-03 10:11:30 -03:00
< td class = "table-cell-transaction-count" > {{ block.tx_count | number }}</ td >
< td class = "table-cell-size" >
2021-01-12 20:45:41 +07:00
< div class = "progress" >
2021-08-08 04:19:54 +03:00
< div class = "progress-bar progress-mempool {{ network$ | async }}" role = "progressbar" [ ngStyle ]="{' width ' : ( block . weight / stateService . env . BLOCK_WEIGHT_UNITS )* 100 + '%' }" > </ div >
2021-05-18 11:20:17 -03:00
< div class = "progress-text" [ innerHTML ]=" block . size | bytes: 2 " ></ div >
2020-10-27 02:58:29 +07:00
</ div >
</ td >
</ tr >
</ tbody >
</ table >
2022-03-17 17:50:19 +01:00
< div class = "" >< a href = "" [ routerLink ]="[( stateService . env . MINING_DASHBOARD ? '/ mining / blocks ' : '/ blocks ') | relativeUrl ]" i18n = "dashboard.view-all" > View all » </ a ></ div >
2020-10-27 02:58:29 +07:00
</ div >
2020-09-26 02:11:30 +07:00
</ div >
</ div >
2021-06-06 17:07:04 -03:00
< div class = "col" >
< div class = "card" >
2020-10-27 02:58:29 +07:00
< div class = "card-body" >
2020-12-02 04:19:33 +09:00
< h5 class = "card-title" i18n = "dashboard.latest-transactions" > Latest transactions</ h5 >
2021-05-03 10:11:30 -03:00
< table class = "table latest-transactions" >
2020-10-27 02:58:29 +07:00
< thead >
2021-05-03 10:11:30 -03:00
< th class = "table-cell-txid" i18n = "dashboard.latest-transactions.txid" > TXID</ th >
< th class = "table-cell-satoshis" i18n = "dashboard.latest-transactions.amount" > Amount</ th >
< th class = "table-cell-fiat" * ngIf = "(network$ | async) === ''" i18n = "dashboard.latest-transactions.USD" > USD</ th >
< th class = "table-cell-fees" i18n = "dashboard.latest-transactions.fee" > Fee</ th >
2020-10-27 02:58:29 +07:00
</ thead >
< tbody >
< tr * ngFor = "let transaction of transactions$ | async; let i = index;" >
2021-05-03 10:11:30 -03:00
< td class = "table-cell-txid" >< a [ routerLink ]="['/ tx ' | relativeUrl , transaction . txid ]" > {{ transaction.txid | shortenString : 10 }}</ a ></ td >
2021-12-27 22:54:45 +04:00
< td class = "table-cell-satoshis" >< app-amount * ngIf = "(network$ | async) !== 'liquid' && (network$ | async) !== 'liquidtestnet'; else liquidAmount" [ satoshis ]=" transaction . value " digitsInfo = "1.2-4" [ noFiat ]=" true " ></ app-amount >< ng-template # liquidAmount i18n = "shared.confidential" > Confidential</ ng-template ></ td >
2021-05-03 10:11:30 -03:00
< td class = "table-cell-fiat" * ngIf = "(network$ | async) === ''" >< app-fiat [ value ]=" transaction . value " digitsInfo = "1.0-0" ></ app-fiat ></ td >
2021-08-18 18:57:35 +05:30
< td class = "table-cell-fees" > {{ transaction.fee / transaction.vsize | feeRounding }} < span class = "symbol" i18n = "shared.sat-vbyte|sat/vB" > sat/vB</ span ></ td >
2020-10-27 02:58:29 +07:00
</ tr >
</ tbody >
</ table >
2021-06-06 17:07:04 -03:00
< div class = "" > </ div >
2020-10-27 02:58:29 +07:00
</ div >
2020-09-26 03:50:32 +07:00
</ div >
</ div >
2020-10-27 02:58:29 +07:00
</ ng-template >
2020-10-27 16:34:27 +07:00
</ ng-template >
2020-09-21 19:41:12 +07:00
</ div >
2020-10-27 16:34:27 +07:00
< button type = "button" class = "btn btn-secondary btn-sm d-block mx-auto" ( click )=" toggleCollapsed ()" >
< div [ ngSwitch ]=" collapseLevel " >
2020-12-05 00:16:23 +07:00
< fa-icon * ngSwitchCase = "'three'" [ icon ]="[' fas ', ' angle-down ']" [ fixedWidth ]=" true " i18n-title = "dashboard.expand" title = "Expand" ></ fa-icon >
< fa-icon * ngSwitchDefault [ icon ]="[' fas ', ' angle-up ']" [ fixedWidth ]=" true " i18n-title = "dashboard.collapse" title = "Collapse" ></ fa-icon >
2020-10-27 16:34:27 +07:00
</ div >
</ button >
2020-10-27 02:58:29 +07:00
2021-05-12 14:51:55 +04:00
< app-language-selector ></ app-language-selector >
2020-12-02 04:19:33 +09:00
2021-06-06 17:07:04 -03:00
< div class = "terms-of-service" >
2020-12-02 04:19:33 +09:00
< a [ routerLink ]="['/ terms-of-service ']" i18n = "shared.terms-of-service|Terms of Service" > Terms of Service</ a >
2021-08-02 18:42:18 +09:00
|
< a [ routerLink ]="['/ privacy-policy ']" i18n = "shared.privacy-policy|Privacy Policy" > Privacy Policy</ a >
2021-10-19 15:37:45 +04:00
|
< a [ routerLink ]="['/ tx / push ' | relativeUrl ]" i18n = "shared.broadcast-transaction|Broadcast Transaction" > Broadcast Transaction</ a >
2020-10-11 19:25:38 +09:00
</ div >
2020-09-22 12:50:12 +07:00
</ div >
2022-02-12 00:15:13 +04:00
< ng-template # loadingAssetsTable >
< table class = "table table-borderless table-striped asset-table" >
< tbody >
2022-02-13 00:46:42 +04:00
< tr * ngFor = "let i of [1,2,3,4]" >
2022-02-12 00:15:13 +04:00
< td class = "asset-icon" >
< div class = "skeleton-loader skeleton-loader-transactions" ></ div >
</ td >
< td class = "asset-title" >
< div class = "skeleton-loader skeleton-loader-transactions" ></ div >
2022-02-13 00:46:42 +04:00
</ td >
< td class = "asset-title d-none d-md-table-cell" >
< div class = "skeleton-loader skeleton-loader-transactions" ></ div >
</ td >
< td class = "asset-title" >
< div class = "skeleton-loader skeleton-loader-transactions" ></ div >
2022-02-12 00:15:13 +04:00
</ td >
</ tr >
</ tbody >
</ table >
</ ng-template >
2021-07-26 20:47:08 -03:00
< ng-template # loadingTransactions >
< div class = "skeleton-loader skeleton-loader-transactions" ></ div >
</ ng-template >
2020-09-22 12:50:12 +07:00
< ng-template # loading >
< div class = "skeleton-loader" ></ div >
2020-09-26 02:11:30 +07:00
</ ng-template >
2021-07-26 20:47:08 -03:00
< ng-template # loadingbig >
< span class = "skeleton-loader skeleton-loader-big" ></ span >
2021-01-12 16:41:54 +07:00
</ ng-template >
2020-09-26 02:11:30 +07:00
< ng-template # emptyBlock >
2021-06-06 17:07:04 -03:00
< div class = "col" >
2020-09-26 02:11:30 +07:00
</ div >
2020-10-11 19:25:38 +09:00
</ ng-template >
2020-10-27 02:58:29 +07:00
< ng-template # mempoolTable let-mempoolInfoData >
2021-05-03 10:11:30 -03:00
< div class = "mempool-info-data" >
< div class = "item" >
2021-08-05 02:03:52 +03:00
< h5 * ngIf = "!mempoolInfoData.value || mempoolInfoData.value.memPoolInfo.mempoolminfee === 0.00001 || (stateService.env.BASE_MODULE === 'liquid' && mempoolInfoData.value.memPoolInfo.mempoolminfee === 0.000001) else purgingText" class = "card-title" i18n = "dashboard.minimum-fee|Minimum mempool fee" > Minimum fee</ h5 >
2021-05-03 10:11:30 -03:00
< ng-template # purgingText >< h5 class = "card-title" i18n = "dashboard.purging|Purgin below fee" > Purging</ h5 ></ ng-template >
2021-07-26 20:47:08 -03:00
< p class = "card-text" * ngIf = "(isLoadingWebSocket$ | async) === false && mempoolInfoData.value; else loading" >
2021-08-18 18:57:35 +05:30
< ng-template [ ngIf ]=" mempoolInfoData . value . memPoolInfo . mempoolminfee > 0.00001">< </ ng-template > {{ mempoolInfoData.value.memPoolInfo.mempoolminfee * 100000 | feeRounding }} < span >< ng-container i18n = "shared.sat-vbyte|sat/vB" > sat/vB</ ng-container ></ span >
2021-05-03 10:11:30 -03:00
</ p >
</ div >
< div class = "item" >
< h5 class = "card-title" i18n = "dashboard.unconfirmed|Unconfirmed count" > Unconfirmed</ h5 >
2021-07-26 20:47:08 -03:00
< p class = "card-text" * ngIf = "(isLoadingWebSocket$ | async) === false && mempoolInfoData.value; else loading" >
2021-05-03 10:11:30 -03:00
{{ mempoolInfoData.value.memPoolInfo.size | number }} < span i18n = "dashboard.txs" > TXs</ span >
</ p >
</ div >
< div class = "item bar" >
< h5 class = "card-title" i18n = "dashboard.memory-usage|Memory usage" > Memory usage</ h5 >
2021-07-26 20:47:08 -03:00
< div class = "card-text" * ngIf = "(isLoadingWebSocket$ | async) === false && mempoolInfoData.value; else loadingbig" >
2021-05-03 10:11:30 -03:00
< div class = "progress" >
< div class = "progress-bar {{ mempoolInfoData.value.mempoolSizeProgress }}" role = "progressbar" [ ngStyle ]="{' width ' : ( mempoolInfoData . value . memPoolInfo . usage / mempoolInfoData . value . memPoolInfo . maxmempool * 100 ) + '%' }" > </ div >
2021-09-15 10:56:30 +02:00
< div class = "progress-text" > ‎ < span [ innerHTML ]=" mempoolInfoData . value . memPoolInfo . usage | bytes " ></ span > / < span [ innerHTML ]=" mempoolInfoData . value . memPoolInfo . maxmempool | bytes " ></ span ></ div >
2021-01-15 21:21:53 +07:00
</ div >
2021-05-03 10:11:30 -03:00
</ div >
</ div >
</ div >
2020-10-27 02:58:29 +07:00
</ ng-template >
2021-09-25 03:13:07 +04:00
< ng-template # lbtcPegs let-mempoolInfoData >
< div class = "mempool-info-data" >
< div class = "item" >
< h5 class = "card-title" i18n = "dashboard.lbtc-pegs-in-circulation" > L-BTC in circulation</ h5 >
< ng-container * ngIf = "(liquidPegsMonth$ | async) as liquidPegsMonth; else loadingTransactions" >
< p class = "card-text" > {{ liquidPegsMonth.series.slice(-1)[0] | number: '1.2-2' }} < span > L-BTC</ span ></ p >
</ ng-container >
</ div >
</ div >
</ ng-template >
2020-10-27 02:58:29 +07:00
< ng-template # txPerSecond let-mempoolInfoData >
2020-12-02 04:19:33 +09:00
< h5 class = "card-title" i18n = "dashboard.incoming-transactions" > Incoming transactions</ h5 >
2021-07-26 20:47:08 -03:00
< ng-template [ ngIf ]="( isLoadingWebSocket $ | async ) === false && mempoolInfoData . value " [ ngIfElse ]=" loadingTransactions " >
2021-01-05 18:57:06 +07:00
< span * ngIf = "(mempoolLoadingStatus$ | async) !== 100; else inSync" >
< span class = "badge badge-pill badge-warning" >< ng-container i18n = "dashboard.backend-is-synchronizing" > Backend is synchronizing</ ng-container > ({{ mempoolLoadingStatus$ | async }}%)</ span >
2020-10-27 02:58:29 +07:00
</ span >
< ng-template # inSync >
2021-06-06 17:07:04 -03:00
< div class = "progress inc-tx-progress-bar" >
2021-08-21 01:46:28 -03:00
< div class = "progress-bar" role = "progressbar" [ ngStyle ]="{' width ' : mempoolInfoData . value . progressWidth , ' background-color ' : mempoolInfoData . value . progressColor }" > </ div >
2021-09-15 10:56:30 +02:00
< div class = "progress-text" > ‎ {{ mempoolInfoData.value.vBytesPerSecond | ceil | number }} < ng-container i18n = "shared.vbytes-per-second|vB/s" > vB/s</ ng-container ></ div >
2020-10-27 02:58:29 +07:00
</ div >
</ ng-template >
</ ng-template >
</ ng-template >