diff --git a/install.sh b/install.sh index 2dccc167..d6e7ad5a 100644 --- a/install.sh +++ b/install.sh @@ -58,35 +58,94 @@ module.exports = function (environment) { rootURL: '/', locationType: 'hash', EmberENV: { - FEATURES: {} + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + } }, + APP: { + // API host and port ApiUrl: '//$ip_address/', - HttpHost: 'http://$ip_address', + + // HTTP mining endpoint + HttpHost: '$ip_address', HttpPort: 8888, + + // Stratum mining endpoint StratumHost: '$ip_address', StratumPort: 8008, + + // The ETC network Unit: 'ETC', - Currency: 'USD', - PoolFee: '1%', + Mining: 'SOLO', + + // Fee and payout details + PoolFee: '1.0%', PayoutThreshold: '0.5 ETC', BlockReward: 2.56, - BlockTime: 13.2 + + // For network hashrate (change for your favourite fork) + BlockTime: 14.4, + highcharts: { + main: { + enabled: true, + height: 200, + type: 'spline', + color: '', + labelColor: '#909090', + lineColor: '#404850', + tickColor: '#404850', + gridLineColor: '#404850', + gridLineWidthX: 1, + gridLineWidthY: 1, + backgroundColor: 'transparent', + title: '', + ytitle: '', + interval: 180000, + chartInterval: 900000 + }, + account: { + enabled: true, + height: 300, + type: 'spline', + color: ['', ''], + title: '', + ytitle: '', + interval: 180000, + chartInterval: 900000, + paymentInterval: 30000 + } + } } }; if (environment === 'development') { - ENV.APP.ApiUrl = 'http://localhost:8080/'; + /* Override ApiUrl just for development, while you are customizing + frontend markup and css theme on your workstation. + */ + ENV.APP.ApiUrl = 'http://localhost:8080/' + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; } if (environment === 'test') { + // Testem prefers this... ENV.locationType = 'none'; + + // keep test console output quieter ENV.APP.LOG_ACTIVE_GENERATION = false; ENV.APP.LOG_VIEW_LOOKUPS = false; + ENV.APP.rootElement = '#ember-testing'; } - if (environment === 'production') {} + if (environment === 'production') { + + } return ENV; }; diff --git a/www/app/controllers/account.js b/www/app/controllers/account.js index b99bfdf9..17d4ea5b 100644 --- a/www/app/controllers/account.js +++ b/www/app/controllers/account.js @@ -16,6 +16,12 @@ export default Ember.Controller.extend({ }, }), + roundSharesN: Ember.computed("stats", "model", { + get() { + return parseInt(this.get("model.stats.roundShares") / 10000000000); + }, + }), + roundPercent: Ember.computed('stats', 'model', { get() { var percent = this.get('model.roundShares') / this.get('stats.nShares'); @@ -30,25 +36,11 @@ export default Ember.Controller.extend({ } }), - earnPerDayToken: Ember.computed('model', { + earnPerDay: Ember.computed('model', { get() { return 24 * 60 * 60 / this.get('applicationController.blockTime') * this.get('config').BlockReward * this.getWithDefault('model.hashrate') / this.get('hashrate'); } - }), - - earnPerDayUsd: Ember.computed('model', { - get() { - return 24 * 60 * 60 / this.get('applicationController.blockTime') * this.get('config').BlockReward * - this.getWithDefault('model.hashrate') / this.get('hashrate') * this.get ('model.exchangedata.price_usd'); - } - }), - - earnTotalPaid: Ember.computed('model', { - get() { - return 1 * this.get ('model.exchangedata.price_usd') * this.get ('model.stats.paid'); - } }) - -}); +}); \ No newline at end of file diff --git a/www/app/controllers/account/index.js b/www/app/controllers/account/index.js index 583f638e..f889bed3 100644 --- a/www/app/controllers/account/index.js +++ b/www/app/controllers/account/index.js @@ -1,91 +1,190 @@ import Ember from 'ember'; export default Ember.Controller.extend({ - applicationController: Ember.inject.controller('application'), - netstats: Ember.computed.reads('applicationController'), - stats: Ember.computed.reads('applicationController.model.stats'), - config: Ember.computed.reads('applicationController.config'), - hashrate: Ember.computed.reads('applicationController.hashrate'), + applicationController: Ember.inject.controller('application'), + netstats: Ember.computed.reads('applicationController'), + stats: Ember.computed.reads('applicationController.model.stats'), + config: Ember.computed.reads('applicationController.config'), + hashrate: Ember.computed.reads('applicationController.hashrate'), - chartOptions: Ember.computed("model.hashrate", { + chartOptions: Ember.computed("model.hashrate", { + get() { + var e = this, + t = e.getWithDefault("model.minerCharts"), + a = { + chart: { + backgroundColor: "rgba(255, 255, 255, 0.1)", + type: "column", + marginRight: 10, + height: 300, + events: { + load: function() { + var series = this.series[0]; + setInterval(function() { + var x = (new Date()).getTime(), + y = e.getWithDefault("model.currentHashrate") / 1000000; + series.addPoint([x, y], true, true); + }, 1090000000); + } + } + }, + title: { + text: "" + }, + xAxis: { + ordinal: false, + type: "datetime", + dateTimeLabelFormats: { + millisecond: "%H:%M:%S", + second: "%H:%M:%S", + minute: "%H:%M", + hour: "%H:%M", + day: "%e. %b", + week: "%e. %b", + month: "%b '%y", + year: "%Y" + } + }, + yAxis: { + title: { + text: "HASHRATE" + }, + //min: 0, + softMin: e.getWithDefault("model.currentHashrate") / 1.1, + softMax: e.getWithDefault("model.currentHashrate") * 1.2 + }, + plotLines: [{ + value: 0, + width: 1, + color: "#808080" + }], + legend: { + enabled: true + }, + tooltip: { + formatter: function() { + return this.y > 1000000000000 ? "" + this.point.d + "
Hashrate " + (this.y / 1000000000000).toFixed(2) + " TH/s
" : this.y > 1000000000 ? "" + this.point.d + "
Hashrate " + (this.y / 1000000000).toFixed(2) + " GH/s
" : this.y > 1000000 ? "" + this.point.d + "
Hashrate " + (this.y / 1000000).toFixed(2) + " MH/s
" : "" + this.point.d + "
Hashrate " + this.y.toFixed(2) + " H/s"; + }, + useHTML: true + }, + exporting: { + enabled: false + }, + navigation: { + enabled: true, + }, + scrollbar: { + barBackgroundColor: 'gray', + barBorderRadius: 7, + barBorderWidth: 0, + buttonBackgroundColor: 'gray', + buttonBorderWidth: 0, + buttonBorderRadius: 7, + trackBackgroundColor: 'none', + trackBorderWidth: 1, + trackBorderRadius: 8, + trackBorderColor: '#CCC' + }, + + series: [{ + color: "#E99002", + name: "Average Hashrate", + type: 'spline', + tooltip: { + valueDecimals: 2 + }, + data: function() { + var e, a = []; + if (null != t) { + for (e = 0; e <= t.length - 1; e += 1) { + var n = 0, + r = 0, + l = 0; + r = new Date(1e3 * t[e].x); + l = r.toLocaleString(); + n = t[e].minerLargeHash; + a.push({ + x: r, + d: l, + y: n + }); + } + } else { a.push({ + x: 0, + d: 0, + y: 0 + }); + } + return a; + }() + }, { + name: "Current hashrate", + type: 'spline', + tooltip: { + valueDecimals: 2 + }, + data: function() { + var e, a = []; + if (null != t) { + for (e = 0; e <= t.length - 1; e += 1) { + var n = 0, + r = 0, + l = 0; + r = new Date(1e3 * t[e].x); + l = r.toLocaleString(); + n = t[e].minerHash; + a.push({ + x: r, + d: l, + y: n + }); + } + } else { a.push({ + x: 0, + d: 0, + y: 0 + }); + } + return a; + }() + }] + }; + a.title.text = this.get('config.highcharts.account.title') || ""; + a.yAxis.title.text = this.get('config.highcharts.account.ytitle') || "Hashrate"; + a.chart.height = this.get('config.highcharts.account.height') || 300; + a.chart.type = this.get('config.highcharts.account.type') || 'spline'; + var colors = this.get('config.highcharts.account.color'); + a.series[0].color = colors[0] || 'rgba(25,148,184)'; + a.series[1].color = colors[1] || 'rgba(233,144,2)'; + return a; + } + }), + + shareChart: Ember.computed("model.hashrate", { get() { var e = this, - t = e.getWithDefault("model.minerCharts"), + t = e.getWithDefault("model.shareCharts"), a = { chart: { backgroundColor: "rgba(255, 255, 255, 0.1)", - type: "spline", + type: "column", marginRight: 10, - height: 290, - events: { - load: function () { + height: 180 + // events: { + /* load: function() { var series = this.series[0]; - setInterval(function () { + setInterval(function() { var x = (new Date()).getTime(), - y = e.getWithDefault("model.currentHashrate") / 1000000; + y = e.getWithDefault("model.workersOnline") / 1000000; series.addPoint([x, y], true, true); }, 1090000000); - } - } + } */ + // } }, title: { text: "" }, - ////// - rangeSelector: { - enabled: true, - selected: 4, - allButtonsEnabled: true, - inputDateFormat: '%Y/%m/%d %H:%M', - inputEditDateFormat: '%Y/%m/%d %H:%M', - inputEnabled: false, - buttons: [{ - type: 'hour', - count: 1, - text: '1h' - }, - { - type: 'hour', - count: 2, - text: '2h' - }, - { - type: 'hour', - count: 4, - text: '4h' - }, - { - type: 'hour', - count: 6, - text: '6h' - }, - { - type: 'hour', - count: 12, - text: '12h' - }, - { - type: 'all', - text: 'All' - } - ], - }, - navigator: { - enabled: true - }, - credits: { - enabled: false, - position: { - align: 'right', - x: -10, - verticalAlign: 'bottom', - y: -5 - }, - href: "https://highcharts.com", - text: "Highcharts" - }, - /////// - xAxis: { + xAxis: { ordinal: false, labels: { style: { @@ -104,48 +203,66 @@ export default Ember.Controller.extend({ year: "%Y" } }, + //rangeSelector: { + // selected: 1, + // }, yAxis: { title: { - text: "Hashrate", + text: "Shares", style: { color: "#000" }, - }, + }, labels: { style: { color: "#000" } - }, + } //softMin: e.getWithDefault("model.currentHashrate") / 1000000, //softMax: e.getWithDefault("model.currentHashrate") / 1000000, }, + plotOptions: { + series: { + marginleft: 0, + pointWidth: 10 + // marker: { + // enabled: false + // } + }, + column: { + stacking: 'normal', + grouping: false + //shadow: false + //borderWidth: 0 + } + }, plotLines: [{ value: 0, width: 1, - color: "#808080" + color: "#aaaaaa" }], legend: { enabled: true, itemStyle: - { + { color: "#000" - }, + }, }, tooltip: { - formatter: function () { - return this.y > 1000000000000 ? "" + this.point.d + "
Hashrate " + (this.y / 1000000000000).toFixed(2) + " TH/s
" : this.y > 1000000000 ? "" + this.point.d + "
Hashrate " + (this.y / 1000000000).toFixed(2) + " GH/s
" : this.y > 1000000 ? "" + this.point.d + "
Hashrate " + (this.y / 1000000).toFixed(2) + " MH/s
" : "" + this.point.d + "
Hashrate " + this.y.toFixed(2) + " H/s"; + formatter: function() { + return this.y > 1000000000000 ? "" + this.point.d + "
Shares " + (this.y / 1000000000000) + "
" : this.y > 1000000000 ? "" + this.point.d + "
Shares " + (this.y / 1000000000) + "
" : this.y > 1000000 ? "" + this.point.d + "
Shares " + (this.y / 1000000) + "
" : "" + this.point.d + "
Shares " + this.y + ""; }, useHTML: true }, - exporting: { - enabled: true - }, + exporting: { + enabled: false + }, series: [{ color: "#15BD27", - name: "3 hours average hashrate", - data: function () { + name: "Valid share", + data: function() { var e, a = []; if (null != t) { for (e = 0; e <= t.length - 1; e += 1) { @@ -154,7 +271,7 @@ export default Ember.Controller.extend({ l = 0; r = new Date(1e3 * t[e].x); l = r.toLocaleString(); - n = t[e].minerLargeHash; + n = t[e].valid; a.push({ x: r, d: l, @@ -163,17 +280,19 @@ export default Ember.Controller.extend({ } } else { a.push({ - x: 0, - d: 0, - y: 0 + x: 0, + d: 0, + y: 0 }); } return a; }() + }, { - name: "30 minutes average hashrate", + + name: "Stale share", color: "#E99002", - data: function () { + data: function() { var e, a = []; if (null != t) { for (e = 0; e <= t.length - 1; e += 1) { @@ -182,7 +301,7 @@ export default Ember.Controller.extend({ l = 0; r = new Date(1e3 * t[e].x); l = r.toLocaleString(); - n = t[e].minerHash; + n = t[e].stale; a.push({ x: r, d: l, @@ -198,146 +317,18 @@ export default Ember.Controller.extend({ } return a; }() - - }] - }; - return a; - } - }), - - shareChart: Ember.computed("model.hashrate", { - get() { - var e = this, - t = e.getWithDefault("model.shareCharts"), - a = { - chart: { - backgroundColor: "rgba(255, 255, 255, 0.1)", - type: "column", - marginRight: 10, - height: 180 - // events: { - /* load: function() { - var series = this.series[0]; - setInterval(function() { - var x = (new Date()).getTime(), - y = e.getWithDefault("model.workersOnline") / 1000000; - series.addPoint([x, y], true, true); - }, 1090000000); - } */ - // } - }, - title: { - text: "" - }, - xAxis: { - ordinal: false, - labels: { - style: { - color: "#000" - } - }, - type: "datetime", - dateTimeLabelFormats: { - millisecond: "%H:%M:%S", - second: "%H:%M:%S", - minute: "%H:%M", - hour: "%H:%M", - day: "%e. %b", - week: "%e. %b", - month: "%b '%y", - year: "%Y" - } - }, - //rangeSelector: { - // selected: 1, - // }, - yAxis: { - title: { - text: "Shares", - style: { - color: "#000" - }, - }, - labels: { - style: { - color: "#000" - } - } - //softMin: e.getWithDefault("model.currentHashrate") / 1000000, - //softMax: e.getWithDefault("model.currentHashrate") / 1000000, - }, - plotOptions: { - series: { - marginleft: 0, - pointWidth: 10 - // marker: { - // enabled: false - // } - }, - column: { - stacking: 'normal', - grouping: false - //shadow: false - //borderWidth: 0 - } - }, - plotLines: [{ - value: 0, + + /* }, { + + name: "Workers", + color: "#FF0000", + type: 'spline', + plotLines: [{ + // value: 0, width: 1, color: "#aaaaaa" }], - legend: { - enabled: true, - itemStyle: - { - color: "#000" - }, - }, - tooltip: { - formatter: function () { - return this.y > 1000000000000 ? "" + this.point.d + "
Shares " + (this.y / 1000000000000) + "
" : this.y > 1000000000 ? "" + this.point.d + "
Shares " + (this.y / 1000000000) + "
" : this.y > 1000000 ? "" + this.point.d + "
Shares " + (this.y / 1000000) + "
" : "" + this.point.d + "
Shares " + this.y + ""; - - }, - - useHTML: true - }, - exporting: { - enabled: false - }, - series: [{ - color: "#15BD27", - name: "Valid share", - data: function () { - var e, a = []; - if (null != t) { - for (e = 0; e <= t.length - 1; e += 1) { - var n = 0, - r = 0, - l = 0; - r = new Date(1e3 * t[e].x); - l = r.toLocaleString(); - n = t[e].valid; - a.push({ - x: r, - d: l, - y: n - }); - } - } else { - a.push({ - x: 0, - d: 0, - y: 0 - }); - } - return a; - }() - - }, { - - name: "Stale share", - color: "#E99002", - data: function () { + data: function() { var e, a = []; if (null != t) { for (e = 0; e <= t.length - 1; e += 1) { @@ -346,7 +337,7 @@ export default Ember.Controller.extend({ l = 0; r = new Date(1e3 * t[e].x); l = r.toLocaleString(); - n = t[e].stale; + n = t[e].workerOnline; a.push({ x: r, d: l, @@ -361,77 +352,10 @@ export default Ember.Controller.extend({ }); } return a; - }() - - /* }, { - - name: "Workers", - color: "#FF0000", - type: 'spline', - plotLines: [{ - // value: 0, - width: 1, - color: "#aaaaaa" - }], - data: function() { - var e, a = []; - if (null != t) { - for (e = 0; e <= t.length - 1; e += 1) { - var n = 0, - r = 0, - l = 0; - r = new Date(1e3 * t[e].x); - l = r.toLocaleString(); - n = t[e].workerOnline; - a.push({ - x: r, - d: l, - y: n - }); - } - } else { - a.push({ - x: 0, - d: 0, - y: 0 - }); - } - return a; - }() */ + }() */ }] }; return a; } - }), - earnPerHour: Ember.computed('model', { - get() { - return 1 * 60 * 60 / this.get('config').BlockTime * this.get('config').BlockReward * - this.getWithDefault('model.hashrate') / this.get('hashrate'); - } - }), - earnPerHour12: Ember.computed('model', { - get() { - return 12 * 60 * 60 / this.get('config').BlockTime * this.get('config').BlockReward * - this.getWithDefault('model.hashrate') / this.get('hashrate'); - } - }), - earnPerDay: Ember.computed('model', { - get() { - return 24 * 60 * 60 / this.get('config').BlockTime * this.get('config').BlockReward * - this.getWithDefault('model.hashrate') / this.get('hashrate'); - } - }), - earnPerWeek: Ember.computed('model', { - get() { - return 168 * 60 * 60 / this.get('config').BlockTime * this.get('config').BlockReward * - this.getWithDefault('model.hashrate') / this.get('hashrate'); - } - }), - earnPerMonth: Ember.computed('model', { - get() { - return 672 * 60 * 60 / this.get('config').BlockTime * this.get('config').BlockReward * - this.getWithDefault('model.hashrate') / this.get('hashrate'); - } - }), - -}); \ No newline at end of file + }) +}); \ No newline at end of file diff --git a/www/app/controllers/application.js b/www/app/controllers/application.js index f45d8404..b5a7ab3d 100644 --- a/www/app/controllers/application.js +++ b/www/app/controllers/application.js @@ -100,7 +100,7 @@ export default Ember.Controller.extend({ nextEpoch: Ember.computed('height', { get() { - var epochOffset = (60000 - (this.getWithDefault('height', 1) % 60000)) * 1000 * this.get('blockTime'); + var epochOffset = (60000 - (this.getWithDefault('height', 1) % 30000)) * 1000 * this.get('blockTime'); return Date.now() + epochOffset; } }) diff --git a/www/app/controllers/index.js b/www/app/controllers/index.js index 2e26a638..a3d15328 100644 --- a/www/app/controllers/index.js +++ b/www/app/controllers/index.js @@ -1,305 +1,338 @@ -function formatDate(date, format) { - date = new Date(date); - var formattedDate = { - year: date.getFullYear(), - month: date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1, - day: date.getDate() < 10 ? "0" + date.getDate() : date.getDate(), - hours: date.getHours() < 10 ? "0" + date.getHours() : date.getHours(), - minutes: date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(), - seconds: date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds(), - }; - for (var key in formattedDate) { - format = format.replace(key, formattedDate[key]); - } - return format; -} +import Ember from 'ember'; -function formatHashrate(hashrate, showUnit) { - var units = ["H/s", "KH/s", "MH/s", "GH/s", "TH/s", "PH/s"]; - var index = 0; - while (hashrate > 1e3) { - hashrate /= 1e3; - index++; - } - return showUnit - ? hashrate.toFixed(2) + " " + units[index] - : hashrate.toFixed(2) + " " + units[index]; -} +export default Ember.Controller.extend({ + applicationController: Ember.inject.controller('application'), + stats: Ember.computed.reads('applicationController'), + config: Ember.computed.reads('applicationController.config'), -function formatNumber(number) { - var units = ["H/s", "KH/s", "MH/s", "GH/s", "TH/s", "PH/s"]; - var index = 0; - while (number >= 1e3) { - number /= 1e3; - index++; + cachedLogin: Ember.computed('login', { + get() { + return this.get('login') || Ember.$.cookie('login'); + }, + set(key, value) { + Ember.$.cookie('login', value); + this.set('model.login', value); + return value; } - number = number < 10 ? number.toFixed(2) : number.toFixed(2); - return number.replace(".00", "") + " " + units[index]; -} - -import Ember from "ember"; + }), + + chartOptions: Ember.computed("model.hashrate", { + get() { + var now = new Date(); + var e = this, + t = e.getWithDefault("stats.model.poolCharts"), + a = { + chart: { + backgroundColor: "rgba(255, 255, 255, 0.1)", + type: "spline", + height: 300, + marginRight: 10, + events: { + load: function() { + var self = this; + var chartInterval = setInterval(function() { + if (!self.series) { + clearInterval(chartInterval); + return; + } + var series = self.series[0]; + var now = new Date(); -export default Ember.Controller.extend({ - applicationController: Ember.inject.controller("application"), - stats: Ember.computed.reads("applicationController"), - config: Ember.computed.reads("applicationController.config"), + var shift = false; + // partially update chart + if (now - series.data[0].x > 18*60*60*1000) { + // show 18 hours ~ 15(min) * 74(points) ~ poolChartsNum: 74, poolChars: "0 */15 ..." + shift = true; + } + // check latest added temporary point and remove tempory added point for less than 5 minutes + if (series.data.length > 1 && series.data[series.data.length - 1].x - series.data[series.data.length - 2].x < 5*60*1000) { + series.removePoint(series.data.length - 1, false, false); + } + var x = now, y = e.getWithDefault("model.hashrate"); + var d = x.toLocaleString(); + series.addPoint({x: x, y: y, d:d}, true, shift); + }, e.get('config.highcharts.main.interval') || 60000); + } + } + }, + title: { + text: "Our pool's hashrate" + }, + xAxis: { + labels: { + style: { + color: "#000" + } + }, + ordinal: false, + type: "datetime", + dateTimeLabelFormats: { + millisecond: "%H:%M:%S", + //second: "%H:%M:%S", + second: "%H:%M", + minute: "%H:%M", + hour: "%H:%M", + day: "%d.%m.%y", + week: "%m/%d", + month: "%b '%y", + year: "%Y" + }, + gridLineWidth: 1, + gridLineColor: "#e6e6e6" + }, + yAxis: { + title: { + text: " Pool Hash Rate", + style: { + color: "#000" + } + }, + labels: { + style: { + color: "#000" + } + }, + gridLineWidth: 1, + gridLineColor: "#e6e6e6" + }, + plotLines: [{ + value: 0, + width: 1, + color: "#000" + }], + legend: { + enabled: false + }, + tooltip: { + formatter: function() { + function scale(v) { + var f = v; + var units = ['', 'K', 'M', 'G', 'T']; + for (var i = 0; i < 5 && f > 1000; i++) { + f /= 1000; + } + return f.toFixed(2) + ' ' + units[i]; + } + var h = scale(this.point.y); - cachedLogin: Ember.computed("login", { - get() { - return this.get("login") || Ember.$.cookie("login"); - }, - set(key, value) { - Ember.$.cookie("login", value); - this.set("model.login", value); - return value; - }, + return "" + this.point.d + "
" + + "Pool Hashrate " + h + "H/s" + }, + useHTML: true + }, + exporting: { + enabled: false + }, + plotOptions: { + line: { + pointInterval: 5 + }, + pointInterval:10 + }, + series: [{ + color: "#1994b8", + name: "Hashrate", + shadow: true, + data: function() { + var a = []; + if (null != t) { + t.forEach(function(d) { + var x = new Date(1000 * d.x); + var l = x.toLocaleString(); + var y = d.y; + a.push({x: x, y: y, d: l}); + }); + } + var l = now.toLocaleString(); + var y = e.getWithDefault("model.hashrate"); + var last = {x: now, y: y, d: l}; + var interval = e.get('config.highcharts.main.interval') || 60000; + if (a.length > 0 && now - a[a.length - 1].x > interval) { + a.push(last); + } + return a; + }() + }] + }; + a.title.text = this.getWithDefault('config.highcharts.main.title', ""); + a.yAxis.title.text = this.getWithDefault('config.highcharts.main.ytitle', "Pool Hashrate"); + a.chart.height = this.getWithDefault('config.highcharts.main.height', 300); + a.chart.type = this.getWithDefault('config.highcharts.main.type', 'spline'); + a.chart.backgroundColor = this.getWithDefault('config.highcharts.main.backgroundColor', "rgba(255, 255, 255, 0.1)"); + a.xAxis.labels.style.color = this.getWithDefault('config.highcharts.main.labelColor', "#000"); + a.yAxis.labels.style.color = this.getWithDefault('config.highcharts.main.labelColor', "#000"); + a.yAxis.title.style.color = this.getWithDefault('config.highcharts.main.labelColor', "#000"); + a.xAxis.gridLineColor = this.getWithDefault('config.highcharts.main.gridLineColor', "#e6e6e6"); + a.yAxis.gridLineColor = this.getWithDefault('config.highcharts.main.gridLineColor', "#e6e6e6"); + a.xAxis.gridLineWidth = this.getWithDefault('config.highcharts.main.gridLineWidthX', "0"); + a.yAxis.gridLineWidth = this.getWithDefault('config.highcharts.main.gridLineWidthY', "1"); + a.xAxis.lineColor = this.getWithDefault('config.highcharts.main.lineColor', "#ccd6eb"); + a.yAxis.lineColor = this.getWithDefault('config.highcharts.main.lineColor', "#ccd6eb"); + a.xAxis.tickColor = this.getWithDefault('config.highcharts.main.tickColor', "#ccd6eb"); + a.yAxis.tickColor = this.getWithDefault('config.highcharts.main.tickColor', "#ccd6eb"); + return a; + } }), - - chartOptions: Ember.computed("model.hashrate", "model.poolCharts", "model.netCharts", { + + chartDiff: Ember.computed("model.hashrate", { get() { var now = new Date(); var e = this, - t = e.getWithDefault("model.poolCharts", []), - netCharts = e.getWithDefault("model.netCharts", []), + t = e.getWithDefault("stats.model.netCharts"), a = { chart: { - backgroundColor: "rgba(48, 97, 63, 0.0) ", - type: "areaspline", - height: 270, - ignoreHiddenSeries: !1, + backgroundColor: "rgba(255, 255, 255, 0.1)", + type: "spline", + height: 300, + marginRight: 10, events: { - load: function () { + load: function() { var self = this; - - var chartInterval = setInterval(function () { - var series = self.series; - if (!series) { + var chartInterval = setInterval(function() { + if (!self.series) { clearInterval(chartInterval); return; } - - t = e.getWithDefault("model.poolCharts", []); - netCharts = e.getWithDefault("model.netCharts", []); - - // Hashrate chart - var hashData = []; - t.forEach(function (entry) { - var x = new Date(1000 * entry.x); - var l = x.toLocaleString(); - var y = entry.y; - hashData.push({ x: x, y: y, d: l }); - }); - - // Point for now + var series = self.series[0]; var now = new Date(); - var l = now.toLocaleString(); - var y = e.getWithDefault("model.hashrate"); - var lastHash = { x: now, y: y, d: l }; - { hashData.push(lastHash); } - - // Network Difficulty chart - var netDiffData = []; - netCharts.forEach(function (entry) { - var x = new Date(1000 * entry.x); - var l = x.toLocaleString(); - var y = entry.y; - netDiffData.push({ x: x, y: y, d: l }); - }); - - series[0].setData(hashData, true, {}, true); - series[1].setData(netDiffData, true, {}, true); - - }, 88 * 1000); - }, - }, + + var shift = false; + // partially update chart + if (now - series.data[0].x > 18*60*60*1000) { + // show 18 hours ~ 15(min) * 74(points) ~ poolChartsNum: 74, poolChars: "0 */15 ..." + shift = true; + } + // check latest added temporary point and remove tempory added point for less than 5 minutes + if (series.data.length > 1 && series.data[series.data.length - 1].x - series.data[series.data.length - 2].x < 5*60*1000) { + series.removePoint(series.data.length - 1, false, false); + } + var x = now, y = e.getWithDefault("stats.model.netCharts"); + var d = x.toLocaleString(); + series.addPoint({x: x, y: y, d:d}, true, shift); + }, e.get('config.highcharts.main.interval') || 60000); + } + } }, title: { - text: 'Ethereum Classic - PPLNS ', - align: 'center', - x: 0, - y: 15, - useHTML: false, - style: { - color: "rgba(0,0,0,0.76)", - fontSize: '15px', - fontFamily: 'Arial', - fontWeight: '400' - } + text: "Our pool's hashrate" }, xAxis: { - ordinal: false, - gridLineWidth: 1, - type: "datetime", labels: { style: { - color: "#000", - }, - formatter: function () { - return formatDate(this.value, "hours:minutes"); - }, + color: "#000" + } }, - }, - yAxis: [ - { - index: 0, - tickAmount: 4, - title: { - text: "Pool Hashrate", - style: { - color: "#32e400", - }, - }, - min: 0, - labels: { - enabled: true, - style: { - color: "#000", - }, - formatter: function () { - return formatNumber(this.value); - }, - }, + ordinal: false, + type: "datetime", + dateTimeLabelFormats: { + millisecond: "%H:%M:%S", + //second: "%H:%M:%S", + second: "%H:%M", + minute: "%H:%M", + hour: "%H:%M", + day: "%d.%m.%y", + week: "%m/%d", + month: "%b '%y", + year: "%Y" }, - { - index: 1, - tickAmount: 4, - title: { - text: "NETWORK DIFFICULTY", - style: { - color: "#007BFF", - }, - }, - min: 0, - labels: { - enabled: true, - style: { - color: "#000", - }, - formatter: function () { - return formatNumber(this.value); - }, - }, - opposite: true, + gridLineWidth: 1, + gridLineColor: "#e6e6e6" + }, + yAxis: { + title: { + text: " Pool Hash Rate", + style: { + color: "#000" + } }, - ], - plotOptions: { - areaspline: { - marker: { - enabled: false, - }, + labels: { + style: { + color: "#000" + } }, + gridLineWidth: 1, + gridLineColor: "#e6e6e6" }, - plotLines: [ - { - value: 0, - width: 1, - color: "#000", - }, - ], + plotLines: [{ + value: 0, + width: 1, + color: "#000" + }], legend: { - symbolRadius: 4, - borderWidth: 1, - itemStyle: { - color: "rgba(0,0,0,0.76)", - }, - itemHoverStyle: { - color: "#000000", - }, - itemHiddenStyle: { - color: "#A8A2A2", - }, + enabled: false }, tooltip: { - borderRadius: 7, - borderWidth: 1, - shared: false, - headerFormat: "", - shared: false, - headerFormat: "", + formatter: function() { + function scale(v) { + var f = v; + var units = ['', 'K', 'M', 'G', 'T', 'P']; + for (var i = 0; i < 5 && f > 1000; i++) { + f /= 1000; + } + return f.toFixed(2) + ' ' + units[i]; + } + var h = scale(this.point.y); + + return "" + this.point.d + "
" + + "Network Difficulty " + h + "H/s" + }, + useHTML: true }, exporting: { - enabled: false, + enabled: false }, - series: [ - { - yAxis: 0, - name: "Pool Hashrate", - fillColor: "rgba(49, 227, 0, 0.22)", - color: "#32e400", - tooltip: { - pointFormatter: function () { - return ( - formatDate(this.x, "day.month.year hours:minutes") + - "
Pool Hashrate: " + - formatHashrate(this.y, true) + - "" - ); - }, - }, - states: { - inactive: { - opacity: 0.1, - }, - }, - data: function () { - var hashData = []; - if (null != t) { - t.forEach(function (entry) { - var x = new Date(1000 * entry.x); - var l = x.toLocaleString(); - var y = entry.y; - hashData.push({ x: x, y: y, d: l }); - }); - } - - var l = now.toLocaleString(); - var y = e.getWithDefault("model.hashrate"); - var lastHash = { x: now, y: y, d: l }; - { hashData.push(lastHash); } - - return hashData; - }() - }, - { - yAxis: 1, - name: "NETWORK DIFFICULTY", - fillColor: "rgba(212, 175, 55, 0.35)", - color: "#007BFF", - tooltip: { - pointFormatter: function () { - return ( - formatDate(this.x, "day.month.year hours:minutes") + - "
NETWORK DIFFICULTY: " + - formatNumber(this.y) + - "" - ); - }, - }, - states: { - inactive: { - opacity: 0.1, - }, - }, - data: function () { - var netDiffData = []; - if (null != netCharts) { - netCharts.forEach(function (entry) { - var x = new Date(1000 * entry.x); - var l = x.toLocaleString(); - var y = entry.y; - netDiffData.push({ x: x, y: y, d: l }); - }); - } - - return netDiffData; - }() + plotOptions: { + line: { + pointInterval: 5 }, - ], + pointStart: Date.UTC(2022, 0, 1), + pointInterval: 24 * 3600 * 1000 // one day + }, + series: [{ + color: "#e99002", + name: "Hashrate", + shadow: true, + data: function() { + var a = []; + if (null != t) { + t.forEach(function(d) { + var x = new Date(1000 * d.x); + var l = x.toLocaleString(); + var y = d.y; + a.push({x: x, y: y, d: l}); + }); + } + var l = now.toLocaleString(); + var y = e.getWithDefault("stats.model.netCharts"); + var last = {x: now, y: y, d: l}; + var interval = e.get('config.highcharts.main.interval') || 60000; + if (a.length > 0 && now - a[a.length - 1].x > interval) { + a.push(last); + } + return a; + }() + }] }; + a.title.text = this.getWithDefault('config.highcharts.main.title', ""); + a.yAxis.title.text = this.getWithDefault('config.highcharts.main.ytitle', "Pool Hashrate"); + a.chart.height = this.getWithDefault('config.highcharts.main.height', 300); + a.chart.type = this.getWithDefault('config.highcharts.main.type', 'spline'); + a.chart.backgroundColor = this.getWithDefault('config.highcharts.main.backgroundColor', "rgba(255, 255, 255, 0.1)"); + a.xAxis.labels.style.color = this.getWithDefault('config.highcharts.main.labelColor', "#000"); + a.yAxis.labels.style.color = this.getWithDefault('config.highcharts.main.labelColor', "#000"); + a.yAxis.title.style.color = this.getWithDefault('config.highcharts.main.labelColor', "#000"); + a.xAxis.gridLineColor = this.getWithDefault('config.highcharts.main.gridLineColor', "#e6e6e6"); + a.yAxis.gridLineColor = this.getWithDefault('config.highcharts.main.gridLineColor', "#e6e6e6"); + a.xAxis.gridLineWidth = this.getWithDefault('config.highcharts.main.gridLineWidthX', "0"); + a.yAxis.gridLineWidth = this.getWithDefault('config.highcharts.main.gridLineWidthY', "1"); + a.xAxis.lineColor = this.getWithDefault('config.highcharts.main.lineColor', "#ccd6eb"); + a.yAxis.lineColor = this.getWithDefault('config.highcharts.main.lineColor', "#ccd6eb"); + a.xAxis.tickColor = this.getWithDefault('config.highcharts.main.tickColor', "#ccd6eb"); + a.yAxis.tickColor = this.getWithDefault('config.highcharts.main.tickColor', "#ccd6eb"); + return a; - }, + } }), - dag: Ember.computed("stats", "model", { get() { var percent = (this.get("epoch") * 8192) / 1024 / 1024 + 1; @@ -309,10 +342,9 @@ export default Ember.Controller.extend({ return percent; }, }), - epoch: Ember.computed("model.stats", { get() { return parseInt(this.get("applicationController.height") / 30000); }, }), -}); +}); \ No newline at end of file diff --git a/www/app/helpers/format-threshold.js b/www/app/helpers/format-threshold.js index 7fd409bf..7e6ceb1c 100644 --- a/www/app/helpers/format-threshold.js +++ b/www/app/helpers/format-threshold.js @@ -1,11 +1,11 @@ import { helper as buildHelper } from '@ember/component/helper'; export function formatBalance(value) { - if (value < 0) { - value = 0; - } - value = value * 0.000000001; - return value.toFixed(2); // Change toFixed(1) to toFixed(2) + if (value < 0) { + value = 0; + } + value = value * 0.000000001 ; + return value.toFixed(1); } -export default buildHelper(formatBalance); +export default buildHelper(formatBalance); \ No newline at end of file diff --git a/www/app/helpers/wallet.js b/www/app/helpers/wallet.js new file mode 100644 index 00000000..9f25e246 --- /dev/null +++ b/www/app/helpers/wallet.js @@ -0,0 +1,7 @@ +import Ember from 'ember'; + +export function formatTx(value) { + return value[0].substring(0, 26) + "..." + value[0].substring(26); +} + +export default Ember.Helper.helper(formatTx); \ No newline at end of file diff --git a/www/app/helpers/with-metric-prefix.js b/www/app/helpers/with-metric-prefix.js index 2359f339..4c9be61b 100644 --- a/www/app/helpers/with-metric-prefix.js +++ b/www/app/helpers/with-metric-prefix.js @@ -13,7 +13,7 @@ export function withMetricPrefix(params/*, hash*/) { n = n / 1000; i++; } - return n.toFixed(3) + ' ' + units[i - 1]; + return n.toFixed(2) + ' ' + units[i - 1]; } export default Ember.Helper.helper(withMetricPrefix); diff --git a/www/app/index.html b/www/app/index.html index f1622b0a..40890906 100644 --- a/www/app/index.html +++ b/www/app/index.html @@ -1,40 +1,51 @@ - - - - - ETC Mining Pool - - - - {{content-for "head"}} - - - - {{content-for "head-footer"}} - - - {{content-for "body"}} - - + + + + + ETC Mining Pool + + + + {{content-for "head"}} + + + + + + {{content-for "head-footer"}} + - {{content-for "body-footer"}} + + {{content-for "body"}} - + + \ No newline at end of file diff --git a/www/app/models/block.js b/www/app/models/block.js index d4d17b02..a35d8c62 100644 --- a/www/app/models/block.js +++ b/www/app/models/block.js @@ -1,52 +1,43 @@ -import Ember from 'ember'; - -// { -// "candidatesTotal": 0, -// "hashrate": 0, -// "immatureTotal": 0, -// "maturedTotal": 11, -// "minersTotal": 0, -// "nodes": [{ -// "difficulty": "2735271", -// "height": "63151", -// "lastBeat": "1471098611", -// "name": "jee-test-pool" -// }], -// "now": 1471098614036, -// "stats": { -// "lastBlockFound": 1471052210 -// } -// } - -var Block = Ember.Object.extend({ - variance: Ember.computed('difficulty', 'shares', function() { - var percent = this.get('shares') / this.get('difficulty'); - if (!percent) { - return 0; - } - return percent; - }), - - isLucky: Ember.computed('variance', function() { - return this.get('variance') <= 1.0; - }), - - isHard: Ember.computed('variance', function() { - return this.get('variance') >= 1.2; - }), - - isOk: Ember.computed('orphan', 'uncle', function() { - return !this.get('orphan'); - }), - - formatReward: Ember.computed('reward', function() { - if (!this.get('orphan')) { - var value = parseInt(this.get('reward')) * 0.000000000000000001; - return value.toFixed(6); - } else { - return 0; - } - }) +import EmberObject from '@ember/object'; +import { computed } from '@ember/object'; + +var Block = EmberObject.extend({ + + variance: computed('difficulty', 'shares', function() { + let percent = this.get('shares') / this.get('difficulty'); + if (!percent) { + return 0; + } + return percent; + }), + + isLucky: computed('variance', function() { + return this.get('variance') <= 1.0; + }), + + + isSolo: computed('miningType', function() { + return this.get('miningType') == "solo"; + }), + + isOk: computed('orphan', 'uncle', function() { + return !this.get('orphan'); + }), + + lastBlockFound: Ember.computed('model', { + get() { + return parseInt(this.get('model.lastBlockFound')) || 0; + } + }), + + formatReward: computed('reward', function() { + if (!this.get('orphan')) { + let value = parseInt(this.get('reward')) * 0.000000000000000001; + return value.toFixed(6); + } else { + return 0; + } + }) }); -export default Block; +export default Block; \ No newline at end of file diff --git a/www/app/router.js b/www/app/router.js index a5cc3cf0..ba8b584b 100644 --- a/www/app/router.js +++ b/www/app/router.js @@ -10,6 +10,7 @@ Router.map(function() { this.route('payouts'); this.route('rewards'); this.route('settings'); + this.route('mining'); }); this.route('not-found'); diff --git a/www/app/styles/app.css b/www/app/styles/app.css index 277685d0..08e6aa21 100644 --- a/www/app/styles/app.css +++ b/www/app/styles/app.css @@ -1,222 +1,183 @@ /* Sticky footer styles -------------------------------------------------- */ html { - position: relative; - min-height: 100%; + position: relative; + min-height: 100%; } - body { - /* Margin bottom by footer height */ - margin-bottom: 110px; - /* background: url('/bg.png'); /* */ + /* Margin bottom by footer height */ + margin-bottom: 110px; + /* background: url('/bg.png'); /* */ } - .footer { - position: absolute; - bottom: 0; - width: 100%; - /* Set the fixed height of the footer here */ - background-color: #3a3b3c; + position: absolute; + bottom: 0; + width: 100%; + /* Set the fixed height of the footer here */ + background-color: #3a3b3c; } - .center { - align-items: center; - display: flex; + align-items: center; + display: flex; } /* Custom page CSS - -------------------------------------------------- */ +-------------------------------------------------- */ /* Not required for template or sticky footer method. */ body { - padding-top: 20px; - padding-bottom: 5px; -} - -body>.container { - padding: 0px 15px 0; - background-color: #f3f2eb; + padding-top: 20px; + padding-bottom: 5px; } -.navbar { - display: flex; +body > .container { + padding: 0px 15px 0; + background-color: #f3f2eb; } .page-header { - border-bottom-color: #d6d6d6; + border-bottom-color: #d6d6d6; } - .container .text-muted { - margin: 20px 0; - color: #9babb3; - text-shadow: 1px 1px 3px #202225; + margin: 20px 0; + color: #9babb3; + text-shadow: 1px 1px 3px #202225; } -.footer>.container { - padding-right: 15px; - padding-left: 15px; +.footer > .container { + padding-right: 15px; + padding-left: 15px; } .jumbotron { - margin: 0; - padding: 40px 0 15px 0; - margin-bottom: 15px; + margin: 0; + padding: 40px 0 15px 0; + margin-bottom: 15px; } .jumbotron-brand { - margin: 0; - padding: 40px 0 15px 0; - margin-bottom: 15px; - background-color: #e9ffee; + margin: 0; + padding: 40px 0 15px 0; + margin-bottom: 15px; + background-color: #e9ffee; } code { - font-size: 80%; + font-size: 80%; } .hash { - font-family: Courier, monospace; + font-family: Courier, monospace; } .navbar-default { - background-color: #ffffff; - border-color: #61BD81; - border-bottom-width: 2px; + background-color: #ffffff; + border-color: #61BD81; + border-bottom-width: 2px; } - .navbar-default .navbar-brand { - color: #4A4A4A; + color: #4A4A4A; } - -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #4A4A4A; +.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #4A4A4A; } - .navbar-default .navbar-text { - color: #4A4A4A; + color: #4A4A4A; } - -.navbar-default .navbar-nav>li>a { - color: #4A4A4A; +.navbar-default .navbar-nav > li > a { + color: #4A4A4A; } - -.navbar-default .navbar-nav>li>a:hover, -.navbar-default .navbar-nav>li>a:focus { - color: #61BD81; +.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: #61BD81; } - -.navbar-default .navbar-nav>.active>a, -.navbar-default .navbar-nav>.active>a:hover, -.navbar-default .navbar-nav>.active>a:focus { - color: #ffffff; - background-color: #61BD81; +.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #61BD81; text-shadow: 1px 1px 2px #000; } - -.navbar-default .navbar-nav>.open>a, -.navbar-default .navbar-nav>.open>a:hover, -.navbar-default .navbar-nav>.open>a:focus { - color: #ffffff; - background-color: #69102b; +.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + color: #ffffff; + background-color: #69102b; } - .navbar-default .navbar-toggle { - border-color: #2885da; + border-color: #2885da; } - -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #2885da; +.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: #2885da; } - .navbar-default .navbar-toggle .icon-bar { - background-color: #4A4A4A; + background-color: #4A4A4A; } - .navbar-default .navbar-collapse, .navbar-default .navbar-form { - border-color: #4A4A4A; + border-color: #4A4A4A; } - .navbar-default .navbar-link { - color: #4A4A4A; + color: #4A4A4A; } - .navbar-default .navbar-link:hover { - color: #ffffff; + color: #ffffff; } @media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu>li>a { - color: #4A4A4A; - } - - .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover, - .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus { - color: #ffffff; - } - - .navbar-default .navbar-nav .open .dropdown-menu>.active>a, - .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover, - .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus { - color: #ffffff; - background-color: #3f9ff7; - } + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #4A4A4A; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #3f9ff7; + } } span.logo-1 { - font-weight: 700; - font-style: italic; - color: #61BD81; - padding: 0 7px 0 23px; + font-weight: 700; + font-style: italic; + color: #61BD81; + padding: 0 7px 0 23px; } span.logo-2 { - font-weight: 700; - color: #4A4A4A; - padding: 0 23px 0 5px; + font-weight: 700; + color: #4A4A4A; + padding: 0 23px 0 5px; } span.logo-3 { - color: #FFF; - font-weight: 100; - padding: 0 3px 0 3px; + color: #FFF; + font-weight: 100; + padding: 0 3px 0 3px; } -h1, -h2, -h3, -h4, -h4, -h6 { - margin-top: 0px; +h1, h2, h3, h4, h4, h6 { + margin-top: 0px; } -.container>h2, -.container>h3 { - margin-top: 2.0rem; +.container>h2, .container>h3 { + margin-top:2.0rem; } .note code { - background-color: transparent; - font-size: 16px; - color: #000; + background-color: transparent; + font-size: 16px; + color: #000; } /* tabs */ .tab-content>.tab-pane { - background-color: #ffffff; - padding: 1em; - border-radius: 0 0 5px 5px; - border: 1px #eeeeee solid; - border-width: 0 1px 1px 1px; + background-color: #ffffff; + padding: 1em; + border-radius: 0 0 5px 5px; + border: 1px #eeeeee solid; + border-width: 0 1px 1px 1px; } code { - font-size: 100%; - /* color: #444f67; /* */ - background-color: #f7f7f7; + font-size: 100%; + /* color: #444f67; /* */ + background-color: #f7f7f7; } .table-responsive { @@ -224,65 +185,64 @@ code { } code em { - color: #3b9218; + color: #3b9218; } span.logo-gold { - color: #f2cf18; - font-weight: 700; - padding: 0 3px 0 3px; + color: #f2cf18; + font-weight: 700; + padding: 0 3px 0 3px; } .etc { - height: 30px; - width: 30px; - pointer-events: none; + height: 30px; + width: 30px; + pointer-events: none; } -.etc-green>object { - float: left; +.etc-green > object{ + float: left; } -.etc-green>strong { - float: left; +.etc-green > strong{ + float: left; } /* That time i figured out how to do that thing to scale svg - - .etc-green { - transform: scale(0.4); - transform: translate(-200px, -50px); - } - */ + + .etc-green { + transform: scale(0.4); + transform: translate(-200px, -50px); +} +*/ .navbar-collapse { - font-size: 14px; - font-weight: 200; + font-size: 14px; + font-weight: 200; } .note { - margin: 0 0 20px 0; - padding: 15px 30px 15px 15px; - border-left: 5px solid #eee; - border-radius: 5px; + margin: 0 0 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; + border-radius: 5px; } .note-info { - background-color: #E8F6FC; - border-color: #57b5e3; + background-color: #E8F6FC; + border-color: #57b5e3; } .note-danger { - background-color: #fce8e8; - border-color: #ff0000; + background-color: #fce8e8; + border-color: #ff0000; } h4.note { - margin-top: 0; - font-weight: 300 !important; + margin-top: 0; + font-weight: 300 !important; } - /*---------------------------------------------------------------------------------------------------*/ /*----------------------------Bootstrap side notes for calling out things----------------------------*/ /*---------------------------------------------------------------------------------------------------*/ @@ -295,24 +255,19 @@ h4.note { border-left-width: 5px; border-radius: 3px; } - .bs-callout h4 { margin-top: 0; margin-bottom: 5px; } - .bs-callout p:last-child { margin-bottom: 0; } - .bs-callout code { border-radius: 3px; } - .bs-callout+.bs-callout { margin-top: -5px; } - /* Themes for different contexts */ /* Default */ @@ -320,7 +275,6 @@ h4.note { background-color: #eeeeee; border-left-color: #777; } - .bs-callout-default h4 { color: #777; } @@ -330,7 +284,6 @@ h4.note { background-color: #e8effc; border-left-color: #428bca; } - .bs-callout-primary h4 { color: #428bca; } @@ -340,7 +293,6 @@ h4.note { background-color: #eafce8; border-left-color: #5cb85c; } - .bs-callout-success h4 { color: #5cb85c; } @@ -350,7 +302,6 @@ h4.note { background-color: #fce8e8; border-left-color: #d9534f; } - .bs-callout-danger h4 { color: #d9534f; } @@ -360,7 +311,6 @@ h4.note { background-color: #fcfbe8; border-left-color: #f0ad4e; } - .bs-callout-warning h4 { color: #f0ad4e; } @@ -370,7 +320,6 @@ h4.note { background-color: #E8F6FC; border-left-color: #5bc0de; } - .bs-callout-info h4 { color: #5bc0de; } @@ -381,43 +330,36 @@ h4.note { /* Stats */ .stats { - margin-bottom: 10px; - margin-top: 5px; + margin-bottom: 10px; + margin-top: 5px; } - -.stats:last-child { - width: auto; +.stats:last-child{ + width: auto; } - -.stats>h3>i { - width: 21px; +.stats > h3 > i { + width: 21px; } - -.stats>div { - padding: 5px 0; +.stats > div{ + padding: 5px 0; } - -.stats>div>.fa { - width: 25px; +.stats > div > .fa { + width: 25px; } - -.stats>div>span:first-of-type { - font-weight: bold; +.stats > div > span:first-of-type{ + font-weight: bold; } /*--------------------------------------| Bootstrap overrides |--------------------------------------*/ -.ul, -.ul-link { - font-weight: 200; - text-align: center; +.ul, .ul-link { + font-weight: 200; + text-align: center; } -.ul-link:hover, -.ul-link:focus { - color: inherit; - text-decoration: none; - opacity: .70; +.ul-link:hover, .ul-link:focus { + color: inherit; + text-decoration: none; + opacity: .70; } .ul-default { @@ -455,16 +397,15 @@ h4.note { border-bottom: 2px solid #61BD81; } -#alertError, -#alertSuccess { - display: none; +#alertError,#alertSuccess{ + display:none; } /*-----------------------------------------| Custom Classes |-----------------------------------------*/ .btn-etc { - background-color: #61BD81; - border-color: #408c5a; + background-color: #61BD81; + border-color: #408c5a; } .btn-etc:hover { @@ -496,31 +437,24 @@ h4.note { .bg-black { color: #f9f9f9 !important; } - .bg-gray { background-color: #eaeaec !important; } - -.bg-blackd { +.bg-blackd{ background-color: #222222 !important; } - .bg-red { background-color: #f56954 !important; } - .bg-yellow { background-color: #f39c12 !important; } - -.bg-cherry { +.bg-cherry{ background-color: #cd1231 !important; } - .bg-aqua { background-color: #00c0ef !important; } - .bg-blue { background-color: #0073b7 !important; } @@ -528,47 +462,36 @@ h4.note { .bg-light-blue { background-color: #5fb4ef !important; } - -.bg-wood { +.bg-wood{ background-color: #ab7d44 !important; } - .bg-green { background-color: #00a65a !important; } - .bg-grass { background-color: #a1c436 !important; } - .bg-navy { background-color: #001f3f !important; } - .bg-teal { background-color: #39cccc !important; } - .bg-olive { background-color: #7f8000 !important; } - .bg-lime { background-color: #00e405 !important; } - .bg-orange { background-color: #ff851b !important; } - .bg-fuchsia { background-color: #f012be !important; } - .bg-purple { background-color: #932ab6 !important; } - .bg-maroon { background-color: #85144b !important; } @@ -576,60 +499,46 @@ h4.note { .bg-black { background-color: #000 !important; } - /* Text colors */ .text-red { color: #f56954 !important; } - .text-yellow { color: #f39c12 !important; } - .text-aqua { color: #00c0ef !important; } - .text-blue { color: #0073b7 !important; } - .text-light-blue { color: #3c8dbc !important; } - .text-green { color: #00a65a !important; } - .text-navy { color: #001f3f !important; } - .text-teal { color: #39cccc !important; } - .text-olive { color: #7f8000 !important; } - .text-lime { color: #01ff70 !important; } - .text-orange { color: #ff851b !important; } - .text-fuchsia { color: #f012be !important; } - .text-purple { color: #932ab6 !important; } - .text-maroon { color: #85144b !important; } @@ -638,30 +547,31 @@ h4.note { color: #ffffff !important; } -.text-light-yellow { - color: #fefc2e !important; +.text-light-yellow +{ + color: #fefc2e !important; } .funkyradio div { clear: both; overflow: hidden; -} - -.funkyradio label { + } + + .funkyradio label { width: 100%; border-radius: 3px; border: 1px solid #D1D3D4; font-weight: normal; -} - -.funkyradio input[type="radio"]:empty, -.funkyradio input[type="checkbox"]:empty { + } + + .funkyradio input[type="radio"]:empty, + .funkyradio input[type="checkbox"]:empty { display: none; -} - -.funkyradio input[type="radio"]:empty~label, -.funkyradio input[type="checkbox"]:empty~label { + } + + .funkyradio input[type="radio"]:empty ~ label, + .funkyradio input[type="checkbox"]:empty ~ label { position: relative; line-height: 2.5em; text-indent: 3.25em; @@ -671,10 +581,10 @@ h4.note { -moz-user-select: none; -ms-user-select: none; user-select: none; -} - -.funkyradio input[type="radio"]:empty~label:before, -.funkyradio input[type="checkbox"]:empty~label:before { + } + + .funkyradio input[type="radio"]:empty ~ label:before, + .funkyradio input[type="checkbox"]:empty ~ label:before { position: absolute; display: block; top: 0; @@ -684,83 +594,82 @@ h4.note { width: 2.5em; background: #D1D3D4; border-radius: 3px 0 0 3px; -} - -.funkyradio input[type="radio"]:hover:not(:checked)~label, -.funkyradio input[type="checkbox"]:hover:not(:checked)~label { + } + + .funkyradio input[type="radio"]:hover:not(:checked) ~ label, + .funkyradio input[type="checkbox"]:hover:not(:checked) ~ label { color: #888; -} - -.funkyradio input[type="radio"]:hover:not(:checked)~label:before, -.funkyradio input[type="checkbox"]:hover:not(:checked)~label:before { + } + + .funkyradio input[type="radio"]:hover:not(:checked) ~ label:before, + .funkyradio input[type="checkbox"]:hover:not(:checked) ~ label:before { content: '\2714'; text-indent: .9em; color: #C2C2C2; -} - -.funkyradio input[type="radio"]:checked~label, -.funkyradio input[type="checkbox"]:checked~label { + } + + .funkyradio input[type="radio"]:checked ~ label, + .funkyradio input[type="checkbox"]:checked ~ label { color: #777; -} - -.funkyradio input[type="radio"]:checked~label:before, -.funkyradio input[type="checkbox"]:checked~label:before { + } + + .funkyradio input[type="radio"]:checked ~ label:before, + .funkyradio input[type="checkbox"]:checked ~ label:before { content: '\2714'; text-indent: .9em; color: #333; background-color: #ccc; -} - -.funkyradio input[type="radio"]:focus~label:before, -.funkyradio input[type="checkbox"]:focus~label:before { + } + + .funkyradio input[type="radio"]:focus ~ label:before, + .funkyradio input[type="checkbox"]:focus ~ label:before { box-shadow: 0 0 0 3px #999; -} - -.funkyradio-default input[type="radio"]:checked~label:before, -.funkyradio-default input[type="checkbox"]:checked~label:before { + } + + .funkyradio-default input[type="radio"]:checked ~ label:before, + .funkyradio-default input[type="checkbox"]:checked ~ label:before { color: #333; background-color: #ccc; -} - -.funkyradio-primary input[type="radio"]:checked~label:before, -.funkyradio-primary input[type="checkbox"]:checked~label:before { + } + + .funkyradio-primary input[type="radio"]:checked ~ label:before, + .funkyradio-primary input[type="checkbox"]:checked ~ label:before { color: #fff; background-color: #337ab7; -} - -.funkyradio-success input[type="radio"]:checked~label:before, -.funkyradio-success input[type="checkbox"]:checked~label:before { + } + + .funkyradio-success input[type="radio"]:checked ~ label:before, + .funkyradio-success input[type="checkbox"]:checked ~ label:before { color: #fff; background-color: #5cb85c; -} - -.funkyradio-danger input[type="radio"]:checked~label:before, -.funkyradio-danger input[type="checkbox"]:checked~label:before { + } + + .funkyradio-danger input[type="radio"]:checked ~ label:before, + .funkyradio-danger input[type="checkbox"]:checked ~ label:before { color: #fff; background-color: #d9534f; -} - -.funkyradio-warning input[type="radio"]:checked~label:before, -.funkyradio-warning input[type="checkbox"]:checked~label:before { + } + + .funkyradio-warning input[type="radio"]:checked ~ label:before, + .funkyradio-warning input[type="checkbox"]:checked ~ label:before { color: #fff; background-color: #f0ad4e; -} - -.funkyradio-info input[type="radio"]:checked~label:before, -.funkyradio-info input[type="checkbox"]:checked~label:before { + } + + .funkyradio-info input[type="radio"]:checked ~ label:before, + .funkyradio-info input[type="checkbox"]:checked ~ label:before { color: #fff; background-color: #5bc0de; -} - -.panel-footer { + } + .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; -} - -.loader { + } + + .loader { color: #025886; font-size: 20px; margin: auto; @@ -773,116 +682,64 @@ h4.note { -webkit-transform: translateZ(0); -ms-transform: translateZ(0); transform: translateZ(0); - top: 0; + top:0; bottom: 0; left: 0; right: 0; position: absolute; -} - -@-webkit-keyframes load4 { - + } + + @-webkit-keyframes load4 { 0%, 100% { - box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; + box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; } - 12.5% { - box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; } - 25% { - box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; } - 37.5% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; } - 50% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; } - 62.5% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; } - 75% { - box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; + box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; } - 87.5% { - box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; + box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; } -} - -@keyframes load4 { - + } + @keyframes load4 { 0%, 100% { - box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; + box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0; } - 12.5% { - box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 0, 2em -2em 0 0.2em, 3em 0 0 0, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; } - 25% { - box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 -0.5em, 2em -2em 0 0, 3em 0 0 0.2em, 2em 2em 0 0, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 -1em; } - 37.5% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 0, 2em 2em 0 0.2em, 0 3em 0 0em, -2em 2em 0 -1em, -3em 0em 0 -1em, -2em -2em 0 -1em; } - 50% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 0em, 0 3em 0 0.2em, -2em 2em 0 0, -3em 0em 0 -1em, -2em -2em 0 -1em; } - 62.5% { - box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; + box-shadow: 0 -3em 0 -1em, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 0, -2em 2em 0 0.2em, -3em 0 0 0, -2em -2em 0 -1em; } - 75% { - box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; + box-shadow: 0em -3em 0 -1em, 2em -2em 0 -1em, 3em 0em 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0.2em, -2em -2em 0 0; } - 87.5% { - box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; + box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em; } -} - -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg) -} - -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg) -} - -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg) -} - -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - transform: scale(-1, 1) -} - -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - -ms-transform: scale(1, -1); - transform: scale(1, -1) -} \ No newline at end of file + } \ No newline at end of file diff --git a/www/app/templates/about.hbs b/www/app/templates/about.hbs index e44b3ac6..f6f59793 100644 --- a/www/app/templates/about.hbs +++ b/www/app/templates/about.hbs @@ -9,12 +9,7 @@

Details

    -
  • It's a solo mining pool.
  • Written in Go it's a rocket highly concurrent and low RAM consuming piece of code
  • -
  • It's a stratum over a coin node with many options.
  • -
  • Each miner works independently of the others.
  • -
  • The block reward goes to only the miner who found it.
  • -
  • Block search time depends on your hashrate and luck.
  • High performance proxy
  • Payouts and block unlocking module
  • Designed for 100% distributed setup
  • diff --git a/www/app/templates/account.hbs b/www/app/templates/account.hbs index 19ebf75a..721d44d9 100644 --- a/www/app/templates/account.hbs +++ b/www/app/templates/account.hbs @@ -9,19 +9,22 @@
    Pending Balance: {{format-balance model.stats.balance}}
    - Your Threshold: {{format-threshold model.threshold}} - {{config.Unit}}
    + Your Threshold: {{format-threshold model.threshold}}
    Credited coins awaiting payout.
    + {{#if model.stats.payouttreshold}} +
    + Payout Treshold: {{format-balance model.stats.payouttreshold}}
    +
    + {{/if}} {{#if model.stats.pending}}
    Current Payment: {{format-balance model.stats.pending}}
    {{/if}} -
    Total Paid: {{format-balance - model.stats.paid}} / {{format-balance earnTotalPaid}} $
    -
    Last 24h Reward: {{format-balance - model.24hreward}}
    +
    Total Paid: {{format-balance model.stats.paid}}
    +
    Last 24h Reward: {{format-balance model.24hreward}}
    +
    Earnings per day (24h avg):{{format-number earnPerDay}}
    {{#if model.stats.lastShare}} @@ -29,34 +32,24 @@ Last Share Submitted: {{format-relative (seconds-to-ms (string-to-int model.stats.lastShare))}}
    {{/if}} -
    Workers Online: {{format-number - model.workersOnline}}
    -
    Hashrate (30m): {{format-hashrate - model.currentHashrate}}
    -
    Hashrate (3h): {{format-hashrate - model.hashrate}}
    -
    Last Share Diff: {{format-hashrate - model.stats.lastShareDiff}}
    -
    - Your Round Share: {{format-number roundPercent style='percent' - maximumFractionDigits='2'}}
    -
    - +
    Workers Online: {{format-number model.workersOnline}}
    +
    Hashrate (1 Hour): {{format-hashrate model.currentHashrate}}
    +
    Hashrate (6 Hour): {{format-hashrate model.hashrate}}
    +
    Shares found: {{format-hashrate model.stats.lastShareDiff}}
    +
    Mining Type:{{#if model.miningTypeSolo}}SOLO{{else}} PPLNS{{/if}}
    -
    Blocks Found: {{format-number - model.stats.blocksFound fallback='0'}}
    -
    Total Payments: {{format-number - model.paymentsTotal}}
    -
    Personal Luck: {{format-number PersonalLuck - style='percent'}}
    -
    Est. Earnings /day (3h avg): {{format-number - earnPerDayToken maximumFractionDigits='1'}} / {{format-number earnPerDayUsd - maximumFractionDigits='1'}} $
    +
    Blocks Found: {{format-number model.stats.blocksFound fallback='0'}}
    Epoch Switch: {{format-relative applicationController.nextEpoch units="hour"}}
    + +
    Personal Luck: {{format-number PersonalLuck style='percent'}}
    +
    + PPLNS Your Round Share: {{format-number roundPercent style='percent' maximumFractionDigits='0'}}
    + Percent of your contribution to current round. +
    @@ -65,19 +58,21 @@
    -{{outlet}} \ No newline at end of file +{{outlet}} diff --git a/www/app/templates/account/index.hbs b/www/app/templates/account/index.hbs index 9fa69ba8..daac3a09 100644 --- a/www/app/templates/account/index.hbs +++ b/www/app/templates/account/index.hbs @@ -1,36 +1,6 @@
    - {{high-charts mode=chartMode chartOptions=chartOptions content=chartData}} - {{high-charts mode=chartMode chartOptions=shareChart content=chartData}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TimeAmount
    Last 60 minutes{{format-number earnPerHour maximumFractionDigits='8'}}
    Last 12 hours{{format-number earnPerHour12 maximumFractionDigits='8'}}
    Last 24 hours{{format-number earnPerDay maximumFractionDigits='8'}}
    Last 7 days{{format-number earnPerWeek maximumFractionDigits='8'}}
    Last 30 days{{format-number earnPerMonth maximumFractionDigits='8'}}
    +{{high-charts mode=chartMode chartOptions=chartOptions content=chartData}} +{{high-charts mode=chartMode chartOptions=shareChart content=chartData}} {{#if model.workers}}

    Your Workers

    @@ -38,8 +8,7 @@ ID - Hashrate (rough, short average) - Hashrate (accurate, long average) + Current Hashrate / Average Hashrate Hostname Port Difficulty Blocks @@ -49,38 +18,30 @@ {{#each-in model.workers as |k v|}} - - {{k}} - {{format-hashrate v.hr}} {{#if v.w_stat_s}}{{else}}{{/if}} - {{format-hashrate v.hr2}} {{#if v.w_stat}}{{else}}{{/if}} - {{v.hostname}} - {{format-hashrate v.portDiff}} - {{v.blocks}} - {{v.valid}} ({{v.v_per}}%) / {{v.stale}} - ({{v.s_per}}%) / {{v.invalid}} ({{v.i_per}}%) - {{format-relative (seconds-to-ms v.lastBeat)}} - + + {{k}} + {{format-hashrate v.hr}} {{#if v.w_stat_s}}{{else}}{{/if}} / {{format-hashrate v.hr2}} {{#if v.w_stat}}{{else}}{{/if}} + {{v.hostname}} + {{format-hashrate v.portDiff}} + {{v.blocks}} + {{v.valid}} ({{v.v_per}}%) / {{v.stale}} ({{v.s_per}}%) / {{v.invalid}} ({{v.i_per}}%) + {{format-relative (seconds-to-ms v.lastBeat)}} + {{/each-in}}
    {{else}} -

    No workers online

    +

    No workers online

    {{/if}} -
    \ No newline at end of file + diff --git a/www/app/templates/account/mining.hbs b/www/app/templates/account/mining.hbs new file mode 100644 index 00000000..c2564d49 --- /dev/null +++ b/www/app/templates/account/mining.hbs @@ -0,0 +1,68 @@ +
    +
    +
    + + +
    + +
    + + +
    +
    +
    + + +
    +
    +
    +
    + + +
    + +
    +
    +
    + + + + Please complete your worker`s IP address in order to validate and save your settings. + +
    +
    + +
    + +
    +
    + + \ No newline at end of file diff --git a/www/app/templates/account/payouts.hbs b/www/app/templates/account/payouts.hbs index 78c5c302..2c38a667 100644 --- a/www/app/templates/account/payouts.hbs +++ b/www/app/templates/account/payouts.hbs @@ -1,5 +1,5 @@
    - {{high-charts mode=chartMode chartOptions=chartPayment content=chartData}} + {{high-charts mode=chartMode chartOptions=chartPayment content=chartData}} {{#if model.payments}}

    Your Latest Payouts

    @@ -13,13 +13,13 @@ {{#each model.payments as |tx|}} - - {{format-date-locale tx.timestamp}} - - {{tx.tx}} - - {{format-balance tx.amount}} - + + {{format-date-locale tx.timestamp}} + + {{tx.tx}} + + {{format-balance tx.amount}} + {{/each}} @@ -27,4 +27,4 @@ {{else}}

    No payouts yet

    {{/if}} -
    +
    \ No newline at end of file diff --git a/www/app/templates/account/rewards.hbs b/www/app/templates/account/rewards.hbs index aaa190f6..471888dd 100644 --- a/www/app/templates/account/rewards.hbs +++ b/www/app/templates/account/rewards.hbs @@ -3,62 +3,57 @@

    Your Latest Rewards

    - - - - - - - - + + + + + + + {{#each model.sumrewards as |sumreward|}} - + - - + + {{/each}}
    TimeBlocksAmountLuckUSD
    TimeBlocksAmountPersonal Luck
    {{sumreward.name}}{{sumreward.blocks}}{{sumreward.blocks}} {{format-balance sumreward.reward}}{{format-number sumreward.personalLuck style='percent'}} - - {{#if (eq config.Currency 'USD') }} - {{format-ethusd sumreward.reward model.exchangedata.price_usd}} - {{else}} - {{format-ethinr sumreward.reward model.exchangedata.price_inr}} - {{/if}} - - + {{format-number sumreward.averageLuck style='percent'}} +
    - Immature Matured + Immature Matured - + - + {{#each model.rewards as |tx|}} - - - - + + + + + - - - + {{/each}}
    Block Height Time Found RewardYour Round ShareRound Share Personal Luck
    {{format-number tx.blockheight}}{{format-date-locale tx.timestamp}} - {{#if tx.immature}} - {{format-balance tx.reward}} - {{else}} - {{format-balance tx.reward}} - {{/if}} +
    {{format-number tx.blockheight}}{{format-date-locale tx.timestamp}} + {{#if tx.immature}} + {{format-balance tx.reward}} + {{else}} + {{format-balance tx.reward}} + {{/if}} + {{format-number tx.percent style='percent' maximumFractionDigits='2'}} + {{format-number tx.personalLuck style='percent'}} {{format-number tx.percent style='percent' maximumFractionDigits='2'}}{{format-number tx.personalLuck style='percent' maximumFractionDigits='2'}}
    diff --git a/www/app/templates/account/settings.hbs b/www/app/templates/account/settings.hbs index b4e4621f..bd6b3e02 100644 --- a/www/app/templates/account/settings.hbs +++ b/www/app/templates/account/settings.hbs @@ -11,6 +11,7 @@ +
    @@ -20,7 +21,6 @@ placeholder="Enter email"> We'll never share your email with anyone else.
    -
    Payment threshold in {{config.Unit}} (Min: 0.5, Max: 10000)
    -
    @@ -36,7 +35,6 @@ Please complete your worker`s IP address in order to validate and save your settings.
    -
    -
    diff --git a/www/app/templates/application.hbs b/www/app/templates/application.hbs index e8774d10..3f9cf1d0 100644 --- a/www/app/templates/application.hbs +++ b/www/app/templates/application.hbs @@ -63,6 +63,7 @@ -{{outlet}} +{{outlet}} \ No newline at end of file diff --git a/www/app/templates/blocks.hbs b/www/app/templates/blocks.hbs index a87193d3..69e47d7f 100644 --- a/www/app/templates/blocks.hbs +++ b/www/app/templates/blocks.hbs @@ -11,22 +11,19 @@
    {{high-charts mode=stockChart chartOptions=chartOptions content=chartData}} {{#if model.luck}} - {{partial "luck"}} + {{partial "luck"}} {{/if}} {{outlet}} -
    \ No newline at end of file + diff --git a/www/app/templates/blocks/block.hbs b/www/app/templates/blocks/block.hbs index 16e29b2c..f102cd1c 100644 --- a/www/app/templates/blocks/block.hbs +++ b/www/app/templates/blocks/block.hbs @@ -1,10 +1,10 @@ {{#if block.uncle}} - {{format-number + {{format-number block.height}} {{else}} - {{format-number + {{format-number block.height}} {{/if}} @@ -12,33 +12,26 @@ {{#if block.uncle}} {{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}} {{else if block.orphan}} - {{t "block.orphan"}} + Orphan {{else}} {{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}} {{/if}} + {{format-date-locale block.timestamp}} - {{#if block.uncle}} - {{block.hash}} - {{else if block.orphan}} - {{t "block.orphan"}} + {{#if block.isSolo}} + {{block.miningType}} {{else}} - {{block.hash}} + {{block.miningType}} {{/if}} + - {{format-date-locale block.timestamp}} {{#if block.isLucky}} {{format-number block.variance style='percent'}} {{else}} - {{#if block.isHard}} - {{format-number block.variance style='percent'}} - {{else}} {{format-number block.variance style='percent'}} {{/if}} - {{/if}} {{#if block.uncle}} @@ -47,6 +40,13 @@ {{block.formatReward}} {{/if}} + + {{#if block.uncle}} + Uncle + {{else if block.isOk}} + Block + {{/if}} + {{format-hashrate block.shareDiff}} {{block.worker}} - + \ No newline at end of file diff --git a/www/app/templates/blocks/immature.hbs b/www/app/templates/blocks/immature.hbs index 95e9bff7..f0f62b85 100644 --- a/www/app/templates/blocks/immature.hbs +++ b/www/app/templates/blocks/immature.hbs @@ -1,26 +1,27 @@ {{#if model.immature}} -

    {{t "block.immature_blocks"}}

    +

    Immature Blocks

    - - - - - - - - - - - - - - - {{#each model.immature as |block|}} +
    {{t "block.height"}}{{t "block.login"}}{{t "block.hash"}}{{t "block.time_found"}}{{t "block.variance"}}{{t "block.reward"}}{{t "block.shares"}}{{t "block.worker"}}
    + + + + + + + + + + + + + + + {{#each model.immature as |block|}} {{partial "blocks/block"}} - {{/each}} - -
    HeightLoginTime FoundTypeVarianceRewardTypeShares/DiffWorker ID
    + {{/each}} + +
    {{else}} -

    {{t "block.no_immature_blocks_yet"}}

    +

    No immature blocks yet

    {{/if}} diff --git a/www/app/templates/blocks/index.hbs b/www/app/templates/blocks/index.hbs index bfc844a8..704ccdef 100644 --- a/www/app/templates/blocks/index.hbs +++ b/www/app/templates/blocks/index.hbs @@ -1,26 +1,27 @@ {{#if model.matured}} -

    {{t "block.matured"}}

    +

    Matured Blocks

    - - - - - - - - - - - - - - - {{#each model.matured as |block|}} +
    {{t "block.height"}}{{t "block.login"}}{{t "block.hash"}}{{t "block.time_found"}}{{t "block.variance"}}{{t "block.reward"}}{{t "block.shares"}}{{t "block.worker"}}
    + + + + + + + + + + + + + + + {{#each model.matured as |block|}} {{partial "blocks/block"}} - {{/each}} - -
    HeightLoginTime FoundCurrent TypeVarianceRewardTypeShares/DiffWorker ID
    + {{/each}} + +
    {{else}} -

    {{t "block.no_matured_blocks_yet"}}

    +

    No matured blocks yet

    {{/if}} diff --git a/www/app/templates/blocks/pending.hbs b/www/app/templates/blocks/pending.hbs index 61efd113..f62a807d 100644 --- a/www/app/templates/blocks/pending.hbs +++ b/www/app/templates/blocks/pending.hbs @@ -4,21 +4,29 @@ - - - - - + + + + + + {{#each model.candidates as |block|}} - +
    {{t "block.height"}}{{t "block.login"}}{{t "block.time_found"}}{{t "block.variance"}}{{t "block.shares"}}HeightLoginTime FoundTypeVarianceShares/Diff
    {{format-number + {{format-number block.height}} {{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}} {{format-date-locale block.timestamp}} + {{#if block.isSolo}} + {{block.miningType}} + {{else}} + {{block.miningType}} + {{/if}} + + {{#if block.isLucky}} {{format-number block.variance style='percent'}} @@ -33,5 +41,5 @@
    {{else}} -

    {{t "block.no_new_blocks_yet"}}

    -{{/if}} +

    No new blocks yet

    +{{/if}} \ No newline at end of file diff --git a/www/app/templates/finders.hbs b/www/app/templates/finders.hbs index dd263d3c..99e1178b 100644 --- a/www/app/templates/finders.hbs +++ b/www/app/templates/finders.hbs @@ -16,7 +16,7 @@ {{#each model.finders as |f|}} - {{#link-to 'account' f.address class='hash'}}{{f.address}}{{/link-to}} + {{wallet f.address}} {{format-number f.blocks}} {{/each}} diff --git a/www/app/templates/help.hbs b/www/app/templates/help.hbs index bec9e42f..6501802b 100644 --- a/www/app/templates/help.hbs +++ b/www/app/templates/help.hbs @@ -9,20 +9,23 @@ -

    In order to mine etchash you need - lolMiner v1.12+ +

    In order to mine etchash you need + lolMiner + v1.12+ +

    +

    + ./lolMiner --pool {{config.StratumHost}}:{{config.StratumPort}} --user [YOUR_ETC_ADDRESS] -c ETC {{if (equals config.Network 'mordor') "--ecip1099-activation 84"}} --ethstratum=ETHPROXY

    -

    ./lolMiner --pool {{config.StratumHost}}:{{config.StratumPort}} --user [YOUR_ETC_ADDRESS] -c ETC {{if (equals config.Network 'mordor') "--ecip1099-activation 84"}} --ethstratum=ETHPROXY

    YOUR_ETC_ADDRESS
    This is your address for payouts, generate one with core-geth, or mine directly to exchange like - Bittrex.
    + Bittrex.
    Example: 0xd92fa5a9732a0aec36dc8d5a6a1305dc2d3e09e6.

    Full example: - ./lolMiner --pool {{config.StratumHost}}:{{config.StratumPort}} --user 0xd92fa5a9732a0aec36dc8d5a6a1305dc2d3e09e6 -c ETC {{if (equals config.Network 'mordor') "--ecip1099-activation 84"}} --ethstratum=ETHPROXY.
    + ./lolMiner --pool {{config.StratumHost}}:{{config.StratumPort}} --user 0xd92fa5a9732a0aec36dc8d5a6a1305dc2d3e09e6 -c ETC {{if (equals config.Network 'mordor') "--ecip1099-activation 84"}} --ethstratum=ETHPROXY.

    @@ -30,7 +33,7 @@ -

    In order to mine etchash you need +

    In order to mine etchash you need nanominer v1.12.0+

    example config

    @@ -49,14 +52,14 @@ pool1={{config.StratumHost}}:{{config.StratumPort}}

    -

    Advice

    -

    CPU mining is not recommended.

    -

    Terms of Service

    -

    By using the pool you accept all possible risks related to experimental software usage.
    - Pool owner can't compensate any irreversible losses, but will do his best to prevent worst case. -

    +

    Advice

    +

    CPU mining is not recommended.

    +

    Terms of Service

    +

    By using the pool you accept all possible risks related to experimental software usage.
    + Pool owner can't compensate any irreversible losses, but will do his best to prevent worst case. +

    - + \ No newline at end of file diff --git a/www/app/templates/index.hbs b/www/app/templates/index.hbs index 3aee771c..6e0e80d5 100644 --- a/www/app/templates/index.hbs +++ b/www/app/templates/index.hbs @@ -1,177 +1,83 @@ -
    +
    -
    -
    - Join our Discord for support! +
    +
    +

    +
    + ETHW Pool +
    +

    +
    +
    + Min. payout threshold: {{config.PayoutThreshold}}, Payouts are continuos throughout the day. +
    + PPLNS/SOLO Stable and + profitable pool with regular payouts.
    -
    -
    -
    - {{t "home.min_payout_threshold"}}: {{config.PayoutThreshold}} {{config.Unit}} / {{t - "home.payouts_run" interval=config.PayoutInterval}}
    - PPLNS {{t "home.payout_scheme_detail"}} +
    +
    Miners Online: {{format-number + stats.model.minersTotal}}
    +
    Pool Hashrate: {{format-hashrate + stats.model.hashrate}}
    +
    Pool Fee: {{config.PoolFee}}
    + {{#if stats.model.stats.lastBlockFound}} +
    Last Block Found: {{format-relative (seconds-to-ms + stats.model.stats.lastBlockFound)}}
    + {{/if}} +
    AVG BLOCK TIME: {{format-number stats.blockTime}} s
    +
    Epoch: {{format-number epoch}} DAG Size: {{format-number + dag}} GB
    -
    -
    {{t "home.miners_online"}}: {{format-number - stats.model.minersTotal}}
    -
    {{t "home.pool_hashrate"}}: {{format-hashrate - stats.model.hashrate}}
    -
    {{t "home.pool_fee"}}: {{config.PoolFee}}
    - {{#if stats.model.stats.lastBlockFound}} -
    {{t "home.last_block_found"}}: {{format-relative (seconds-to-ms - stats.model.stats.lastBlockFound)}}
    - {{/if}} -
    {{t "home.block_time"}}: {{format-number stats.blockTime}} s -
    -
    {{t "home.epoch"}}: {{format-number epoch}} {{t - "home.dag_Size"}}: - {{format-number - dag}} GB -
    +
    Network Difficulty: {{with-metric-prefix stats.difficulty}}
    -
    - -
    -
    -
    {{t "home.network_difficulty"}}: {{with-metric-prefix - stats.difficulty}}
    -
    {{t "home.network_hashrate"}}: {{format-hashrate - stats.hashrate}}
    -
    {{t "home.blockchain_height"}}: {{format-number stats.height}} -
    -
    {{t "home.current_round_variance"}}: {{format-number - stats.roundVariance style='percent'}}
    +
    Network Hashrate: {{format-hashrate stats.hashrate}}
    +
    Mining Block: {{stats.height}}
    +
    Luck: {{format-number stats.roundVariance style='percent'}} +
    +
    Current price: $ {{model.exchangedata.price_usd}}
    -
    {{t "home.current_price"}}: $ - {{format-number model.exchangedata.price_usd maximumFractionDigits='8'}}
    +
    -
    - {{high-charts mode=chartMode chartOptions=chartOptions content=chartData}} -
    -

    {{t "home.query_history"}}

    +

    Your Stats & Payment History

    - {{input value=cachedLogin class="form-control" placeholder=(t "home.input.enter_your_wallet_address")}} + {{input value=cachedLogin class="form-control" placeholder="Your wallet address"}} -
    -
    -
    -
    -
    - 8b {{t - "home.settings.title" hashes="> 800"}} & NiceHash -
    - {{t "home.settings.difficulty" diff="8"}} -

    - {{t "home.settings.stratum_mining"}}: -

    - stratum+tcp://{{config.StratumHost}}:{{config.StratumPort}} -
    -
    + {{#if config.highcharts.main.enabled}} +
    + {{high-charts mode=mode chartOptions=chartOptions content=chartData}}
    -
    - - - -
    -
    -
    -
    {{t "home.settings.commands.windows_instruction"}}
    -
    -
    - -
    -
    - - lolMiner --coin {{config.Unit}} --pool {{config.StratumHost}}:{{config.StratumPort}} --user wallet_address.WorkerName -
    -
    -
    -
    - -
    -
    - - PhoenixMiner -pool {{config.StratumHost}}:{{config.StratumPort}} -wal wallet_address.WorkerName -coin etc -
    -
    -
    -
    -
    -
    -
    -
    -
    {{t "home.settings.commands.windows_instruction"}}
    -
    -
    - -
    -
    - --coin {{config.Unit}} --pool {{config.StratumHost}}:{{config.StratumPort}} --user wallet_address.WorkerName - -
    -
    -
    -
    - -
    -
    - - -pool {{config.StratumHost}}:{{config.StratumPort}} -wal wallet_address.WorkerName -coin etc -
    -
    -
    -
    + {{/if}} +
    + {{high-charts mode=mode chartOptions=chartDiff content=chartData}} +
    +
    +
    +

    Instructions

    +
    +
    +

    + + stratum

    +
    + {{config.StratumHost}}:{{config.StratumPort}}

    + Nicehash Europe password: # +

    diff --git a/www/app/templates/luck.hbs b/www/app/templates/luck.hbs index 655ccf20..56a1c822 100644 --- a/www/app/templates/luck.hbs +++ b/www/app/templates/luck.hbs @@ -2,21 +2,21 @@ - - - - + + + + - {{#each-in model.luck as |total row|}} - - - - - - - {{/each-in}} + {{#each-in model.luck as |total row|}} + + + + + + + {{/each-in}}
    {{t "luck.blocks"}}{{t "luck.shares_diff"}}{{t "luck.uncle_rate"}}{{t "luck.orphan_rate"}}BlocksShares/DiffUncle RateOrphan Rate
    {{total}}{{format-number row.luck style='percent'}}{{format-number row.uncleRate style='percent'}}{{format-number row.orphanRate style='percent'}}
    {{total}}{{format-number row.luck style='percent'}}{{format-number row.uncleRate style='percent'}}{{format-number row.orphanRate style='percent'}}
    diff --git a/www/app/templates/miners.hbs b/www/app/templates/miners.hbs index 4d3b9563..dd74fa8d 100644 --- a/www/app/templates/miners.hbs +++ b/www/app/templates/miners.hbs @@ -14,6 +14,7 @@ Login Hashrate Last Beat + Mining Type @@ -22,6 +23,14 @@ {{#link-to 'account' m.login class='hash'}}{{m.login}}{{/link-to}} {{format-hashrate m.hr}} {{format-date-locale m.lastBeat}} + + {{#if m.solo}} + solo + {{else}} + pplns + {{/if}} + + {{/each}} @@ -30,4 +39,4 @@ {{else}}

    No miners

    {{/if}} -
    +
    \ No newline at end of file diff --git a/www/app/templates/payments.hbs b/www/app/templates/payments.hbs index f966e89b..47020080 100644 --- a/www/app/templates/payments.hbs +++ b/www/app/templates/payments.hbs @@ -1,20 +1,20 @@ -
    +
    -

    {{t "payments.pay_tx"}}

    - {{t "payments.total_payments_sent"}}: {{model.paymentsTotal}} +

    Pool always pays tx fees from it's own pocket for now.

    + Total payments sent: {{model.paymentsTotal}}
    {{#if model.payments}} -

    {{t "payments.latest_payouts"}}

    +

    Latest Payouts

    - - - - + + + + @@ -23,12 +23,12 @@ {{/each}} @@ -36,6 +36,6 @@
    {{t "payments.time"}}{{t "payments.amount"}}{{t "payments.address"}}{{t "payments.txid"}}TimeAmountAddressTx ID
    {{format-date-locale tx.timestamp}} {{format-number tx.formatAmount}} - {{tx.address}} + {{wallet tx.address}} - {{format-tx tx.tx}} + {{format-tx + tx.tx}}
    {{else}} -

    {{t "payments.no_payouts_yet"}}

    +

    No payouts yet

    {{/if}} -
    +
    \ No newline at end of file diff --git a/www/config/environment.js b/www/config/environment.js index ceb3dabe..151564d1 100644 --- a/www/config/environment.js +++ b/www/config/environment.js @@ -15,27 +15,57 @@ module.exports = function (environment) { APP: { // API host and port - ApiUrl: '//192.168.178.27/', + ApiUrl: '//192.168.178.41/', // HTTP mining endpoint - HttpHost: 'http://192.168.178.27', + HttpHost: 'http://192.168.178.41', HttpPort: 8888, // Stratum mining endpoint - StratumHost: 'example.net', - StratumPort: 8008, + StratumHost: '192.168.178.41', + StratumPort: 3001, // The ETC network Unit: 'ETC', - Currency: 'USD', + Mining: 'SOLO', // Fee and payout details - PoolFee: '1%', + PoolFee: '1.0%', PayoutThreshold: '0.5 ETC', BlockReward: 2.56, // For network hashrate (change for your favourite fork) - BlockTime: 13.2 + BlockTime: 14.4, + highcharts: { + main: { + enabled: true, + height: 200, + type: 'spline', + color: '', + labelColor: '#909090', + lineColor: '#404850', + tickColor: '#404850', + gridLineColor: '#404850', + gridLineWidthX: 1, + gridLineWidthY: 1, + backgroundColor: 'transparent', + title: '', + ytitle: '', + interval: 180000, + chartInterval: 900000 + }, + account: { + enabled: true, + height: 300, + type: 'spline', + color: ['', ''], + title: '', + ytitle: '', + interval: 180000, + chartInterval: 900000, + paymentInterval: 30000 + } + } } }; @@ -68,4 +98,3 @@ module.exports = function (environment) { return ENV; }; -