2022-06-15 11:26:58 +02:00
import { ChangeDetectionStrategy , Component , Inject , Input , LOCALE_ID , OnInit , HostBinding } from '@angular/core' ;
2023-11-06 18:19:54 +00:00
import { echarts , EChartsOption } from '../../graphs/echarts' ;
2023-03-08 02:15:15 -06:00
import { merge , Observable , of } from 'rxjs' ;
import { map , mergeMap , share , startWith , switchMap , tap } from 'rxjs/operators' ;
2022-09-21 17:23:45 +02:00
import { ApiService } from '../../services/api.service' ;
import { SeoService } from '../../services/seo.service' ;
2022-02-19 22:09:35 +09:00
import { formatNumber } from '@angular/common' ;
2022-11-28 11:55:23 +09:00
import { UntypedFormBuilder , UntypedFormGroup } from '@angular/forms' ;
2022-09-21 17:23:45 +02:00
import { selectPowerOfTen } from '../../bitcoin.utils' ;
import { StorageService } from '../../services/storage.service' ;
import { MiningService } from '../../services/mining.service' ;
import { download } from '../../shared/graphs.utils' ;
2022-06-15 11:26:58 +02:00
import { ActivatedRoute } from '@angular/router' ;
2022-09-21 17:23:45 +02:00
import { StateService } from '../../services/state.service' ;
2023-08-30 20:26:07 +09:00
import { seoDescriptionNetwork } from '../../shared/common.utils' ;
2022-02-18 15:26:15 +09:00
@Component ( {
selector : 'app-hashrate-chart' ,
templateUrl : './hashrate-chart.component.html' ,
2022-02-19 22:09:35 +09:00
styleUrls : [ './hashrate-chart.component.scss' ] ,
styles : [ `
. loadingGraphs {
position : absolute ;
2022-03-07 19:54:17 +01:00
top : 50 % ;
2022-02-19 22:09:35 +09:00
left : calc ( 50 % - 15 px ) ;
z - index : 100 ;
}
` ],
2022-03-09 21:21:44 +01:00
changeDetection : ChangeDetectionStrategy.OnPush ,
2022-02-18 15:26:15 +09:00
} )
export class HashrateChartComponent implements OnInit {
2022-02-28 17:52:55 +09:00
@Input ( ) tableOnly = false ;
@Input ( ) widget = false ;
2022-02-22 15:50:14 +09:00
@Input ( ) right : number | string = 45 ;
2022-02-21 14:02:41 +09:00
@Input ( ) left : number | string = 75 ;
2022-02-18 15:26:15 +09:00
2022-04-11 18:17:36 +09:00
miningWindowPreference : string ;
2022-11-28 11:55:23 +09:00
radioGroupForm : UntypedFormGroup ;
2022-02-19 22:09:35 +09:00
chartOptions : EChartsOption = { } ;
chartInitOptions = {
2022-02-21 14:02:41 +09:00
renderer : 'svg' ,
2022-02-19 22:09:35 +09:00
} ;
2022-04-05 20:37:18 +02:00
@HostBinding ( 'attr.dir' ) dir = 'ltr' ;
2022-02-19 22:09:35 +09:00
hashrateObservable$ : Observable < any > ;
isLoading = true ;
formatNumber = formatNumber ;
2022-05-05 16:18:28 +09:00
timespan = '' ;
chartInstance : any = undefined ;
2022-07-06 21:03:55 +02:00
network = '' ;
2022-02-19 22:09:35 +09:00
constructor (
@Inject ( LOCALE_ID ) public locale : string ,
private seoService : SeoService ,
private apiService : ApiService ,
2022-11-28 11:55:23 +09:00
private formBuilder : UntypedFormBuilder ,
2022-04-11 18:17:36 +09:00
private storageService : StorageService ,
2022-06-15 11:26:58 +02:00
private miningService : MiningService ,
private route : ActivatedRoute ,
2022-07-06 21:03:55 +02:00
private stateService : StateService
2022-02-19 22:09:35 +09:00
) {
}
2022-02-18 15:26:15 +09:00
ngOnInit ( ) : void {
2022-07-06 21:03:55 +02:00
this . stateService . networkChanged $ . subscribe ( ( network ) = > this . network = network ) ;
2022-04-11 18:17:36 +09:00
let firstRun = true ;
if ( this . widget ) {
this . miningWindowPreference = '1y' ;
} else {
2022-05-10 17:05:07 +04:00
this . seoService . setTitle ( $localize ` :@@3510fc6daa1d975f331e3a717bdf1a34efa06dff:Hashrate & Difficulty ` ) ;
2023-08-30 20:26:07 +09:00
this . seoService . setDescription ( $localize ` :@@meta.description.bitcoin.graphs.hashrate:See hashrate and difficulty for the Bitcoin ${ seoDescriptionNetwork ( this . network ) } network visualized over time. ` ) ;
2022-07-06 22:27:45 +02:00
this . miningWindowPreference = this . miningService . getDefaultTimespan ( '3m' ) ;
2022-02-24 20:20:18 +09:00
}
2022-04-11 18:17:36 +09:00
this . radioGroupForm = this . formBuilder . group ( { dateSpan : this.miningWindowPreference } ) ;
this . radioGroupForm . controls . dateSpan . setValue ( this . miningWindowPreference ) ;
2022-02-24 20:20:18 +09:00
2022-06-15 11:26:58 +02:00
this . route
. fragment
. subscribe ( ( fragment ) = > {
if ( [ '1m' , '3m' , '6m' , '1y' , '2y' , '3y' , 'all' ] . indexOf ( fragment ) > - 1 ) {
2022-06-23 15:30:42 +02:00
this . radioGroupForm . controls . dateSpan . setValue ( fragment , { emitEvent : false } ) ;
2022-06-15 11:26:58 +02:00
}
} ) ;
2023-03-08 02:15:15 -06:00
this . hashrateObservable $ = merge (
this . radioGroupForm . get ( 'dateSpan' ) . valueChanges
. pipe (
startWith ( this . radioGroupForm . controls . dateSpan . value ) ,
switchMap ( ( timespan ) = > {
if ( ! this . widget && ! firstRun ) {
this . storageService . setValue ( 'miningWindowPreference' , timespan ) ;
}
this . timespan = timespan ;
firstRun = false ;
this . miningWindowPreference = timespan ;
this . isLoading = true ;
return this . apiService . getHistoricalHashrate $ ( this . timespan ) ;
} )
) ,
this . stateService . chainTip $
. pipe (
switchMap ( ( ) = > {
return this . apiService . getHistoricalHashrate $ ( this . timespan ) ;
} )
)
) . pipe (
tap ( ( response : any ) = > {
const data = response . body ;
2023-07-12 12:58:48 +09:00
// always include the latest difficulty
if ( data . difficulty . length && data . difficulty [ data . difficulty . length - 1 ] . difficulty !== data . currentDifficulty ) {
data . difficulty . push ( {
timestamp : Date.now ( ) / 1000 ,
difficulty : data.currentDifficulty
} ) ;
}
2023-03-08 02:15:15 -06:00
// We generate duplicated data point so the tooltip works nicely
const diffFixed = [ ] ;
let diffIndex = 1 ;
let hashIndex = 0 ;
while ( hashIndex < data . hashrates . length ) {
if ( diffIndex >= data . difficulty . length ) {
while ( hashIndex < data . hashrates . length ) {
diffFixed . push ( {
timestamp : data.hashrates [ hashIndex ] . timestamp ,
difficulty : data.difficulty.length > 0 ? data . difficulty [ data . difficulty . length - 1 ] . difficulty : null
2022-02-22 15:50:14 +09:00
} ) ;
2023-03-08 02:15:15 -06:00
++ hashIndex ;
}
2023-07-14 11:05:09 +09:00
diffIndex ++ ;
2023-03-08 02:15:15 -06:00
break ;
}
while ( hashIndex < data . hashrates . length && diffIndex < data . difficulty . length &&
data . hashrates [ hashIndex ] . timestamp <= data . difficulty [ diffIndex ] . time
) {
diffFixed . push ( {
timestamp : data.hashrates [ hashIndex ] . timestamp ,
difficulty : data.difficulty [ diffIndex - 1 ] . difficulty
} ) ;
++ hashIndex ;
}
++ diffIndex ;
}
2023-07-12 12:58:48 +09:00
while ( diffIndex <= data . difficulty . length ) {
diffFixed . push ( {
timestamp : data.difficulty [ diffIndex - 1 ] . time ,
difficulty : data.difficulty [ diffIndex - 1 ] . difficulty
} ) ;
diffIndex ++ ;
}
2023-03-08 02:15:15 -06:00
let maResolution = 15 ;
const hashrateMa = [ ] ;
for ( let i = maResolution - 1 ; i < data . hashrates . length ; ++ i ) {
let avg = 0 ;
for ( let y = maResolution - 1 ; y >= 0 ; -- y ) {
avg += data . hashrates [ i - y ] . avgHashrate ;
}
avg /= maResolution ;
hashrateMa . push ( [ data . hashrates [ i ] . timestamp * 1000 , avg ] ) ;
}
this . prepareChartOptions ( {
hashrates : data.hashrates.map ( val = > [ val . timestamp * 1000 , val . avgHashrate ] ) ,
difficulty : diffFixed.map ( val = > [ val . timestamp * 1000 , val . difficulty ] ) ,
hashrateMa : hashrateMa ,
} ) ;
this . isLoading = false ;
} ) ,
map ( ( response ) = > {
const data = response . body ;
return {
blockCount : parseInt ( response . headers . get ( 'x-total-count' ) , 10 ) ,
currentDifficulty : data.currentDifficulty ,
currentHashrate : data.currentHashrate ,
} ;
2022-02-21 12:22:20 +09:00
} ) ,
share ( )
) ;
2022-02-18 15:26:15 +09:00
}
2022-02-19 22:09:35 +09:00
prepareChartOptions ( data ) {
2022-03-09 20:10:51 +01:00
let title : object ;
2022-03-09 12:15:10 +01:00
if ( data . hashrates . length === 0 ) {
title = {
textStyle : {
2022-03-16 17:56:05 +01:00
color : 'grey' ,
fontSize : 15
2022-03-09 12:15:10 +01:00
} ,
2022-06-10 23:29:27 +02:00
text : $localize ` :@@23555386d8af1ff73f297e89dd4af3f4689fb9dd:Indexing blocks ` ,
2022-03-09 20:10:51 +01:00
left : 'center' ,
top : 'center'
2022-03-09 12:15:10 +01:00
} ;
}
2022-02-19 22:09:35 +09:00
this . chartOptions = {
2022-03-09 12:15:10 +01:00
title : title ,
2022-03-14 18:06:54 +01:00
animation : false ,
2022-02-22 15:50:14 +09:00
color : [
2023-11-06 18:19:54 +00:00
new echarts . graphic . LinearGradient ( 0 , 0 , 0 , 0.65 , [
2022-06-18 10:22:38 +02:00
{ offset : 0 , color : '#F4511E99' } ,
{ offset : 0.25 , color : '#FB8C0099' } ,
{ offset : 0.5 , color : '#FFB30099' } ,
{ offset : 0.75 , color : '#FDD83599' } ,
{ offset : 1 , color : '#7CB34299' }
] ) ,
'#D81B60' ,
2023-11-06 18:19:54 +00:00
new echarts . graphic . LinearGradient ( 0 , 0 , 0 , 0.65 , [
2022-02-22 15:50:14 +09:00
{ offset : 0 , color : '#F4511E' } ,
{ offset : 0.25 , color : '#FB8C00' } ,
{ offset : 0.5 , color : '#FFB300' } ,
{ offset : 0.75 , color : '#FDD835' } ,
{ offset : 1 , color : '#7CB342' }
] ) ,
] ,
2022-02-21 14:02:41 +09:00
grid : {
2022-06-18 10:22:38 +02:00
top : this.widget ? 20 : 40 ,
2022-03-31 18:14:07 +09:00
bottom : this.widget ? 30 : 70 ,
2022-02-21 14:02:41 +09:00
right : this.right ,
left : this.left ,
} ,
2022-02-19 22:09:35 +09:00
tooltip : {
2022-03-07 11:41:41 +01:00
show : ! this . isMobile ( ) || ! this . widget ,
2022-02-19 22:09:35 +09:00
trigger : 'axis' ,
2022-02-22 15:50:14 +09:00
axisPointer : {
type : 'line'
} ,
2022-02-21 23:36:05 +09:00
backgroundColor : 'rgba(17, 19, 31, 1)' ,
borderRadius : 4 ,
shadowColor : 'rgba(0, 0, 0, 0.5)' ,
textStyle : {
color : '#b1b1b1' ,
2022-02-22 20:30:14 +09:00
align : 'left' ,
2022-02-21 23:36:05 +09:00
} ,
borderColor : '#000' ,
2022-03-31 18:14:07 +09:00
formatter : ( ticks ) = > {
2022-03-16 17:56:05 +01:00
let hashrateString = '' ;
let difficultyString = '' ;
2022-06-18 10:22:38 +02:00
let hashrateStringMA = '' ;
2022-02-22 20:15:15 +09:00
let hashratePowerOfTen : any = selectPowerOfTen ( 1 ) ;
2022-03-16 17:56:05 +01:00
for ( const tick of ticks ) {
if ( tick . seriesIndex === 0 ) { // Hashrate
let hashrate = tick . data [ 1 ] ;
if ( this . isMobile ( ) ) {
hashratePowerOfTen = selectPowerOfTen ( tick . data [ 1 ] ) ;
hashrate = Math . round ( tick . data [ 1 ] / hashratePowerOfTen . divider ) ;
}
2022-06-18 10:22:38 +02:00
hashrateString = ` ${ tick . marker } ${ tick . seriesName } : ${ formatNumber ( hashrate , this . locale , '1.0-0' ) } ${ hashratePowerOfTen . unit } H/s<br> ` ;
2022-03-16 17:56:05 +01:00
} else if ( tick . seriesIndex === 1 ) { // Difficulty
let difficultyPowerOfTen = hashratePowerOfTen ;
let difficulty = tick . data [ 1 ] ;
2022-07-12 09:03:39 +02:00
if ( difficulty === null ) {
2023-08-30 20:26:07 +09:00
difficultyString = ` ${ tick . marker } ${ tick . seriesName } : No data<br> ` ;
2022-07-12 09:03:39 +02:00
} else {
if ( this . isMobile ( ) ) {
difficultyPowerOfTen = selectPowerOfTen ( tick . data [ 1 ] ) ;
difficulty = Math . round ( tick . data [ 1 ] / difficultyPowerOfTen . divider ) ;
}
difficultyString = ` ${ tick . marker } ${ tick . seriesName } : ${ formatNumber ( difficulty , this . locale , '1.2-2' ) } ${ difficultyPowerOfTen . unit } <br> ` ;
2022-03-16 17:56:05 +01:00
}
2022-06-18 10:22:38 +02:00
} else if ( tick . seriesIndex === 2 ) { // Hashrate MA
let hashrate = tick . data [ 1 ] ;
if ( this . isMobile ( ) ) {
hashratePowerOfTen = selectPowerOfTen ( tick . data [ 1 ] ) ;
hashrate = Math . round ( tick . data [ 1 ] / hashratePowerOfTen . divider ) ;
}
hashrateStringMA = ` ${ tick . marker } ${ tick . seriesName } : ${ formatNumber ( hashrate , this . locale , '1.0-0' ) } ${ hashratePowerOfTen . unit } H/s ` ;
2022-03-16 17:56:05 +01:00
}
2022-02-22 20:15:15 +09:00
}
2022-03-16 17:56:05 +01:00
const date = new Date ( ticks [ 0 ] . data [ 0 ] ) . toLocaleDateString ( this . locale , { year : 'numeric' , month : 'short' , day : 'numeric' } ) ;
2022-02-22 20:15:15 +09:00
return `
2022-06-10 23:34:13 +02:00
< b style = "color: white; margin-left: 2px" > $ { date } < / b > < br >
2022-03-16 17:56:05 +01:00
< span > $ { difficultyString } < / span >
2022-06-18 10:22:38 +02:00
< span > $ { hashrateString } < / span >
< span > $ { hashrateStringMA } < / span >
2022-02-22 20:15:15 +09:00
` ;
2022-03-31 18:14:07 +09:00
}
2022-02-19 22:09:35 +09:00
} ,
2022-03-09 20:10:51 +01:00
xAxis : data.hashrates.length === 0 ? undefined : {
2022-02-19 22:09:35 +09:00
type : 'time' ,
2022-02-22 23:32:14 +09:00
splitNumber : ( this . isMobile ( ) || this . widget ) ? 5 : 10 ,
2022-04-11 21:17:15 +09:00
axisLabel : {
hideOverlap : true ,
}
2022-02-19 22:09:35 +09:00
} ,
2022-03-14 20:00:19 +01:00
legend : ( this . widget || data . hashrates . length === 0 ) ? undefined : {
2022-02-22 15:50:14 +09:00
data : [
{
2022-05-18 03:06:31 +04:00
name : $localize ` :@@79a9dc5b1caca3cbeb1733a19515edacc5fc7920:Hashrate ` ,
2022-02-22 15:50:14 +09:00
inactiveColor : 'rgb(110, 112, 121)' ,
textStyle : {
color : 'white' ,
} ,
icon : 'roundRect' ,
itemStyle : {
color : '#FFB300' ,
} ,
} ,
{
2022-07-06 21:03:55 +02:00
name : $localize ` :@@25148835d92465353fc5fe8897c27d5369978e5a:Difficulty ` ,
2022-06-18 10:22:38 +02:00
inactiveColor : 'rgb(110, 112, 121)' ,
2022-07-06 21:03:55 +02:00
textStyle : {
2022-06-18 10:22:38 +02:00
color : 'white' ,
} ,
icon : 'roundRect' ,
} ,
{
2022-07-06 21:03:55 +02:00
name : $localize ` Hashrate (MA) ` ,
2022-02-22 15:50:14 +09:00
inactiveColor : 'rgb(110, 112, 121)' ,
2022-07-06 21:03:55 +02:00
textStyle : {
2022-02-22 15:50:14 +09:00
color : 'white' ,
} ,
icon : 'roundRect' ,
itemStyle : {
2022-06-18 10:22:38 +02:00
color : '#FFB300' ,
} ,
2022-02-22 15:50:14 +09:00
} ,
] ,
2022-07-06 21:03:55 +02:00
selected : JSON.parse ( this . storageService . getValue ( 'hashrate_difficulty_legend' ) ) ? ? {
'$localize`:@@79a9dc5b1caca3cbeb1733a19515edacc5fc7920:Hashrate`' : true ,
'$localize`::Difficulty`' : this . network === '' ,
'$localize`Hashrate (MA)`' : true ,
} ,
2022-02-22 15:50:14 +09:00
} ,
2022-03-09 20:10:51 +01:00
yAxis : data.hashrates.length === 0 ? undefined : [
2022-02-22 15:50:14 +09:00
{
2022-03-31 18:14:07 +09:00
min : ( value ) = > {
2022-07-06 21:03:55 +02:00
const selectedPowerOfTen : any = selectPowerOfTen ( value . min ) ;
const newMin = Math . floor ( value . min / selectedPowerOfTen . divider / 10 ) ;
return newMin * selectedPowerOfTen . divider * 10 ;
2022-02-22 20:15:15 +09:00
} ,
2022-02-22 15:50:14 +09:00
type : 'value' ,
axisLabel : {
color : 'rgb(110, 112, 121)' ,
2023-11-06 18:19:54 +00:00
formatter : ( val ) : string = > {
2022-02-22 15:50:14 +09:00
const selectedPowerOfTen : any = selectPowerOfTen ( val ) ;
2022-02-22 20:15:15 +09:00
const newVal = Math . round ( val / selectedPowerOfTen . divider ) ;
2022-04-11 21:17:15 +09:00
return ` ${ newVal } ${ selectedPowerOfTen . unit } H/s ` ;
2022-02-22 15:50:14 +09:00
}
} ,
splitLine : {
2022-06-18 10:22:38 +02:00
lineStyle : {
type : 'dotted' ,
color : '#ffffff66' ,
opacity : 0.25 ,
}
} ,
2022-02-19 22:09:35 +09:00
} ,
2022-02-22 15:50:14 +09:00
{
2022-03-31 18:14:07 +09:00
min : ( value ) = > {
2022-02-22 20:15:15 +09:00
return value . min * 0.9 ;
} ,
2022-02-22 15:50:14 +09:00
type : 'value' ,
position : 'right' ,
axisLabel : {
color : 'rgb(110, 112, 121)' ,
2023-11-06 18:19:54 +00:00
formatter : ( val ) : string = > {
2022-07-10 14:32:15 +02:00
if ( this . stateService . network === 'signet' ) {
2023-11-06 18:19:54 +00:00
return ` ${ val } ` ;
2022-07-10 14:32:15 +02:00
}
2022-02-22 15:50:14 +09:00
const selectedPowerOfTen : any = selectPowerOfTen ( val ) ;
2022-02-22 20:15:15 +09:00
const newVal = Math . round ( val / selectedPowerOfTen . divider ) ;
2022-03-31 18:14:07 +09:00
return ` ${ newVal } ${ selectedPowerOfTen . unit } ` ;
2022-02-22 15:50:14 +09:00
}
} ,
splitLine : {
2022-06-18 10:22:38 +02:00
show : false ,
}
2022-02-22 15:50:14 +09:00
}
] ,
2022-03-09 20:10:51 +01:00
series : data.hashrates.length === 0 ? [ ] : [
2022-02-22 15:50:14 +09:00
{
2022-04-11 21:17:15 +09:00
zlevel : 0 ,
2022-06-06 10:14:40 +02:00
yAxisIndex : 0 ,
2022-05-18 03:06:31 +04:00
name : $localize ` :@@79a9dc5b1caca3cbeb1733a19515edacc5fc7920:Hashrate ` ,
2022-02-22 15:50:14 +09:00
showSymbol : false ,
2022-02-25 13:06:33 +09:00
symbol : 'none' ,
2022-02-22 15:50:14 +09:00
data : data.hashrates ,
type : 'line' ,
lineStyle : {
2022-06-18 10:22:38 +02:00
width : 1 ,
2022-02-22 15:50:14 +09:00
} ,
2022-02-19 22:09:35 +09:00
} ,
2022-02-22 15:50:14 +09:00
{
2022-04-11 21:17:15 +09:00
zlevel : 1 ,
2022-02-22 15:50:14 +09:00
yAxisIndex : 1 ,
2022-05-18 03:06:31 +04:00
name : $localize ` :@@25148835d92465353fc5fe8897c27d5369978e5a:Difficulty ` ,
2022-02-22 15:50:14 +09:00
showSymbol : false ,
2022-02-25 13:06:33 +09:00
symbol : 'none' ,
2022-02-22 15:50:14 +09:00
data : data.difficulty ,
type : 'line' ,
lineStyle : {
width : 3 ,
}
2022-06-18 10:22:38 +02:00
} ,
{
zlevel : 2 ,
2022-07-06 21:03:55 +02:00
name : $localize ` Hashrate (MA) ` ,
2022-06-18 10:22:38 +02:00
showSymbol : false ,
symbol : 'none' ,
data : data.hashrateMa ,
type : 'line' ,
smooth : true ,
lineStyle : {
width : 3 ,
}
2022-02-22 15:50:14 +09:00
}
] ,
2022-02-19 22:09:35 +09:00
dataZoom : this.widget ? null : [ {
type : 'inside' ,
realtime : true ,
zoomLock : true ,
maxSpan : 100 ,
2022-04-15 19:39:27 +09:00
minSpan : 5 ,
2022-03-14 18:25:16 +01:00
moveOnMouseMove : false ,
2022-02-19 22:09:35 +09:00
} , {
showDetail : false ,
show : true ,
type : 'slider' ,
brushSelect : false ,
realtime : true ,
2022-03-14 18:06:54 +01:00
left : 20 ,
right : 15 ,
2022-02-19 22:09:35 +09:00
selectedDataBackground : {
lineStyle : {
color : '#fff' ,
opacity : 0.45 ,
} ,
areaStyle : {
opacity : 0 ,
}
} ,
} ] ,
} ;
}
2022-05-05 16:18:28 +09:00
onChartInit ( ec ) {
this . chartInstance = ec ;
2022-07-06 21:03:55 +02:00
this . chartInstance . on ( 'legendselectchanged' , ( e ) = > {
this . storageService . setValue ( 'hashrate_difficulty_legend' , JSON . stringify ( e . selected ) ) ;
} ) ;
2022-05-05 16:18:28 +09:00
}
2022-02-19 22:09:35 +09:00
isMobile() {
return ( window . innerWidth <= 767.98 ) ;
}
2022-05-05 16:18:28 +09:00
onSaveChart() {
// @ts-ignore
const prevBottom = this . chartOptions . grid . bottom ;
const now = new Date ( ) ;
// @ts-ignore
this . chartOptions . grid . bottom = 30 ;
2022-05-09 11:01:51 +02:00
this . chartOptions . backgroundColor = '#11131f' ;
2022-05-05 16:18:28 +09:00
this . chartInstance . setOption ( this . chartOptions ) ;
download ( this . chartInstance . getDataURL ( {
pixelRatio : 2 ,
excludeComponents : [ 'dataZoom' ] ,
2022-05-09 11:01:51 +02:00
} ) , ` hashrate-difficulty- ${ this . timespan } - ${ Math . round ( now . getTime ( ) / 1000 ) } .svg ` ) ;
2022-05-05 16:18:28 +09:00
// @ts-ignore
this . chartOptions . grid . bottom = prevBottom ;
2022-05-09 11:01:51 +02:00
this . chartOptions . backgroundColor = 'none' ;
2022-05-05 16:18:28 +09:00
this . chartInstance . setOption ( this . chartOptions ) ;
}
2022-02-18 15:26:15 +09:00
}