yuriy0803 2 years ago
parent
commit
d03ebc9038
  1. 73
      install.sh
  2. 22
      www/app/controllers/account.js
  3. 166
      www/app/controllers/account/index.js
  4. 2
      www/app/controllers/application.js
  5. 492
      www/app/controllers/index.js
  6. 2
      www/app/helpers/format-threshold.js
  7. 7
      www/app/helpers/wallet.js
  8. 2
      www/app/helpers/with-metric-prefix.js
  9. 21
      www/app/index.html
  10. 49
      www/app/models/block.js
  11. 1
      www/app/router.js
  12. 171
      www/app/styles/app.css
  13. 5
      www/app/templates/about.hbs
  14. 55
      www/app/templates/account.hbs
  15. 49
      www/app/templates/account/index.hbs
  16. 68
      www/app/templates/account/mining.hbs
  17. 2
      www/app/templates/account/payouts.hbs
  18. 21
      www/app/templates/account/rewards.hbs
  19. 5
      www/app/templates/account/settings.hbs
  20. 2
      www/app/templates/application.hbs
  21. 9
      www/app/templates/blocks.hbs
  22. 30
      www/app/templates/blocks/block.hbs
  23. 21
      www/app/templates/blocks/immature.hbs
  24. 21
      www/app/templates/blocks/index.hbs
  25. 24
      www/app/templates/blocks/pending.hbs
  26. 2
      www/app/templates/finders.hbs
  27. 7
      www/app/templates/help.hbs
  28. 190
      www/app/templates/index.hbs
  29. 8
      www/app/templates/luck.hbs
  30. 9
      www/app/templates/miners.hbs
  31. 26
      www/app/templates/payments.hbs
  32. 45
      www/config/environment.js

73
install.sh

@ -58,35 +58,94 @@ module.exports = function (environment) {
rootURL: '/', rootURL: '/',
locationType: 'hash', locationType: 'hash',
EmberENV: { EmberENV: {
FEATURES: {} FEATURES: {
// Here you can enable experimental features on an ember canary build
// e.g. 'with-controller': true
}
}, },
APP: { APP: {
// API host and port
ApiUrl: '//$ip_address/', ApiUrl: '//$ip_address/',
HttpHost: 'http://$ip_address',
// HTTP mining endpoint
HttpHost: '$ip_address',
HttpPort: 8888, HttpPort: 8888,
// Stratum mining endpoint
StratumHost: '$ip_address', StratumHost: '$ip_address',
StratumPort: 8008, StratumPort: 8008,
// The ETC network
Unit: 'ETC', Unit: 'ETC',
Currency: 'USD', Mining: 'SOLO',
PoolFee: '1%',
// Fee and payout details
PoolFee: '1.0%',
PayoutThreshold: '0.5 ETC', PayoutThreshold: '0.5 ETC',
BlockReward: 2.56, 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') { 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') { if (environment === 'test') {
// Testem prefers this...
ENV.locationType = 'none'; ENV.locationType = 'none';
// keep test console output quieter
ENV.APP.LOG_ACTIVE_GENERATION = false; ENV.APP.LOG_ACTIVE_GENERATION = false;
ENV.APP.LOG_VIEW_LOOKUPS = false; ENV.APP.LOG_VIEW_LOOKUPS = false;
ENV.APP.rootElement = '#ember-testing'; ENV.APP.rootElement = '#ember-testing';
} }
if (environment === 'production') {} if (environment === 'production') {
}
return ENV; return ENV;
}; };

22
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', { roundPercent: Ember.computed('stats', 'model', {
get() { get() {
var percent = this.get('model.roundShares') / this.get('stats.nShares'); 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() { get() {
return 24 * 60 * 60 / this.get('applicationController.blockTime') * this.get('config').BlockReward * return 24 * 60 * 60 / this.get('applicationController.blockTime') * this.get('config').BlockReward *
this.getWithDefault('model.hashrate') / this.get('hashrate'); 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');
}
}) })
}); });

166
www/app/controllers/account/index.js

@ -14,9 +14,9 @@ export default Ember.Controller.extend({
a = { a = {
chart: { chart: {
backgroundColor: "rgba(255, 255, 255, 0.1)", backgroundColor: "rgba(255, 255, 255, 0.1)",
type: "spline", type: "column",
marginRight: 10, marginRight: 10,
height: 290, height: 300,
events: { events: {
load: function() { load: function() {
var series = this.series[0]; var series = this.series[0];
@ -31,67 +31,8 @@ export default Ember.Controller.extend({
title: { title: {
text: "" 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, ordinal: false,
labels: {
style: {
color: "#000"
}
},
type: "datetime", type: "datetime",
dateTimeLabelFormats: { dateTimeLabelFormats: {
millisecond: "%H:%M:%S", millisecond: "%H:%M:%S",
@ -106,18 +47,11 @@ export default Ember.Controller.extend({
}, },
yAxis: { yAxis: {
title: { title: {
text: "Hashrate", text: "HASHRATE"
style: {
color: "#000"
}, },
}, //min: 0,
labels: { softMin: e.getWithDefault("model.currentHashrate") / 1.1,
style: { softMax: e.getWithDefault("model.currentHashrate") * 1.2
color: "#000"
}
},
//softMin: e.getWithDefault("model.currentHashrate") / 1000000,
//softMax: e.getWithDefault("model.currentHashrate") / 1000000,
}, },
plotLines: [{ plotLines: [{
value: 0, value: 0,
@ -125,26 +59,40 @@ export default Ember.Controller.extend({
color: "#808080" color: "#808080"
}], }],
legend: { legend: {
enabled: true, enabled: true
itemStyle:
{
color: "#000"
},
}, },
tooltip: { tooltip: {
formatter: function() { formatter: function() {
return this.y > 1000000000000 ? "<b>" + this.point.d + "<b><br>Hashrate&nbsp;" + (this.y / 1000000000000).toFixed(2) + "&nbsp;TH/s</b>" : this.y > 1000000000 ? "<b>" + this.point.d + "<b><br>Hashrate&nbsp;" + (this.y / 1000000000).toFixed(2) + "&nbsp;GH/s</b>" : this.y > 1000000 ? "<b>" + this.point.d + "<b><br>Hashrate&nbsp;" + (this.y / 1000000).toFixed(2) + "&nbsp;MH/s</b>" : "<b>" + this.point.d + "<b><br>Hashrate&nbsp;<b>" + this.y.toFixed(2) + "&nbsp;H/s</b>"; return this.y > 1000000000000 ? "<b>" + this.point.d + "<b><br>Hashrate&nbsp;" + (this.y / 1000000000000).toFixed(2) + "&nbsp;TH/s</b>" : this.y > 1000000000 ? "<b>" + this.point.d + "<b><br>Hashrate&nbsp;" + (this.y / 1000000000).toFixed(2) + "&nbsp;GH/s</b>" : this.y > 1000000 ? "<b>" + this.point.d + "<b><br>Hashrate&nbsp;" + (this.y / 1000000).toFixed(2) + "&nbsp;MH/s</b>" : "<b>" + this.point.d + "<b><br>Hashrate&nbsp;<b>" + this.y.toFixed(2) + "&nbsp;H/s</b>";
}, },
useHTML: true useHTML: true
}, },
exporting: { exporting: {
enabled: true 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: [{ series: [{
color: "#15BD27", color: "#E99002",
name: "3 hours average hashrate", name: "Average Hashrate",
type: 'spline',
tooltip: {
valueDecimals: 2
},
data: function() { data: function() {
var e, a = []; var e, a = [];
if (null != t) { if (null != t) {
@ -161,8 +109,7 @@ export default Ember.Controller.extend({
y: n y: n
}); });
} }
} else { } else { a.push({
a.push({
x: 0, x: 0,
d: 0, d: 0,
y: 0 y: 0
@ -171,8 +118,11 @@ export default Ember.Controller.extend({
return a; return a;
}() }()
}, { }, {
name: "30 minutes average hashrate", name: "Current hashrate",
color: "#E99002", type: 'spline',
tooltip: {
valueDecimals: 2
},
data: function() { data: function() {
var e, a = []; var e, a = [];
if (null != t) { if (null != t) {
@ -189,8 +139,7 @@ export default Ember.Controller.extend({
y: n y: n
}); });
} }
} else { } else { a.push({
a.push({
x: 0, x: 0,
d: 0, d: 0,
y: 0 y: 0
@ -198,9 +147,15 @@ export default Ember.Controller.extend({
} }
return a; 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; return a;
} }
}), }),
@ -402,36 +357,5 @@ export default Ember.Controller.extend({
}; };
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');
}
}),
}); });

2
www/app/controllers/application.js

@ -100,7 +100,7 @@ export default Ember.Controller.extend({
nextEpoch: Ember.computed('height', { nextEpoch: Ember.computed('height', {
get() { 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; return Date.now() + epochOffset;
} }
}) })

492
www/app/controllers/index.js

@ -1,305 +1,338 @@
function formatDate(date, format) { import Ember from 'ember';
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;
}
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];
}
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++;
}
number = number < 10 ? number.toFixed(2) : number.toFixed(2);
return number.replace(".00", "") + " " + units[index];
}
import Ember from "ember";
export default Ember.Controller.extend({ export default Ember.Controller.extend({
applicationController: Ember.inject.controller("application"), applicationController: Ember.inject.controller('application'),
stats: Ember.computed.reads("applicationController"), stats: Ember.computed.reads('applicationController'),
config: Ember.computed.reads("applicationController.config"), config: Ember.computed.reads('applicationController.config'),
cachedLogin: Ember.computed("login", { cachedLogin: Ember.computed('login', {
get() { get() {
return this.get("login") || Ember.$.cookie("login"); return this.get('login') || Ember.$.cookie('login');
}, },
set(key, value) { set(key, value) {
Ember.$.cookie("login", value); Ember.$.cookie('login', value);
this.set("model.login", value); this.set('model.login', value);
return value; return value;
}, }
}), }),
chartOptions: Ember.computed("model.hashrate", "model.poolCharts", "model.netCharts", { chartOptions: Ember.computed("model.hashrate", {
get() { get() {
var now = new Date(); var now = new Date();
var e = this, var e = this,
t = e.getWithDefault("model.poolCharts", []), t = e.getWithDefault("stats.model.poolCharts"),
netCharts = e.getWithDefault("model.netCharts", []),
a = { a = {
chart: { chart: {
backgroundColor: "rgba(48, 97, 63, 0.0) ", backgroundColor: "rgba(255, 255, 255, 0.1)",
type: "areaspline", type: "spline",
height: 270, height: 300,
ignoreHiddenSeries: !1, marginRight: 10,
events: { events: {
load: function() { load: function() {
var self = this; var self = this;
var chartInterval = setInterval(function() { var chartInterval = setInterval(function() {
var series = self.series; if (!self.series) {
if (!series) {
clearInterval(chartInterval); clearInterval(chartInterval);
return; return;
} }
var series = self.series[0];
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 now = new Date(); 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); var shift = false;
series[1].setData(netDiffData, true, {}, true); // partially update chart
if (now - series.data[0].x > 18*60*60*1000) {
}, 88 * 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: { title: {
text: '<b>Ethereum Classic - PPLNS </b>', text: "Our pool's hashrate"
align: 'center',
x: 0,
y: 15,
useHTML: false,
style: {
color: "rgba(0,0,0,0.76)",
fontSize: '15px',
fontFamily: 'Arial',
fontWeight: '400'
}
}, },
xAxis: { xAxis: {
ordinal: false,
gridLineWidth: 1,
type: "datetime",
labels: { labels: {
style: { style: {
color: "#000", color: "#000"
}, }
formatter: function () {
return formatDate(this.value, "hours:minutes");
}, },
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: [ yAxis: {
{
index: 0,
tickAmount: 4,
title: { title: {
text: "Pool Hashrate", text: " Pool Hash Rate",
style: { style: {
color: "#32e400", color: "#000"
}, }
}, },
min: 0,
labels: { labels: {
enabled: true,
style: { style: {
color: "#000", color: "#000"
}
},
gridLineWidth: 1,
gridLineColor: "#e6e6e6"
},
plotLines: [{
value: 0,
width: 1,
color: "#000"
}],
legend: {
enabled: false
}, },
tooltip: {
formatter: function() { formatter: function() {
return formatNumber(this.value); 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);
return "<b>" + this.point.d + "</b><br />" +
"<b>Pool Hashrate&nbsp;" + h + "H/s</b>"
}, },
useHTML: true
}, },
exporting: {
enabled: false
}, },
{ plotOptions: {
index: 1, line: {
tickAmount: 4, pointInterval: 5
title: {
text: "NETWORK DIFFICULTY",
style: {
color: "#007BFF",
}, },
pointInterval:10
}, },
min: 0, 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;
}
}),
chartDiff: Ember.computed("model.hashrate", {
get() {
var now = new Date();
var e = this,
t = e.getWithDefault("stats.model.netCharts"),
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();
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: "Our pool's hashrate"
},
xAxis: {
labels: { labels: {
enabled: true,
style: { style: {
color: "#000", 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"
}, },
opposite: true, gridLineWidth: 1,
gridLineColor: "#e6e6e6"
}, },
], yAxis: {
plotOptions: { title: {
areaspline: { text: " Pool Hash Rate",
marker: { style: {
enabled: false, color: "#000"
}
}, },
labels: {
style: {
color: "#000"
}
}, },
gridLineWidth: 1,
gridLineColor: "#e6e6e6"
}, },
plotLines: [ plotLines: [{
{
value: 0, value: 0,
width: 1, width: 1,
color: "#000", color: "#000"
}, }],
],
legend: { legend: {
symbolRadius: 4, enabled: false
borderWidth: 1,
itemStyle: {
color: "rgba(0,0,0,0.76)",
},
itemHoverStyle: {
color: "#000000",
},
itemHiddenStyle: {
color: "#A8A2A2",
},
}, },
tooltip: { tooltip: {
borderRadius: 7, formatter: function() {
borderWidth: 1, function scale(v) {
shared: false, var f = v;
headerFormat: "", var units = ['', 'K', 'M', 'G', 'T', 'P'];
shared: false, for (var i = 0; i < 5 && f > 1000; i++) {
headerFormat: "", f /= 1000;
}, }
exporting: { return f.toFixed(2) + ' ' + units[i];
enabled: false, }
var h = scale(this.point.y);
return "<b>" + this.point.d + "</b><br />" +
"<b>Network Difficulty&nbsp;" + h + "H/s</b>"
}, },
series: [ useHTML: true
{
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") +
"<br><b>Pool Hashrate: " +
formatHashrate(this.y, true) +
"</b>"
);
}, },
exporting: {
enabled: false
}, },
states: { plotOptions: {
inactive: { line: {
opacity: 0.1, pointInterval: 5
}, },
pointStart: Date.UTC(2022, 0, 1),
pointInterval: 24 * 3600 * 1000 // one day
}, },
series: [{
color: "#e99002",
name: "Hashrate",
shadow: true,
data: function() { data: function() {
var hashData = []; var a = [];
if (null != t) { if (null != t) {
t.forEach(function (entry) { t.forEach(function(d) {
var x = new Date(1000 * entry.x); var x = new Date(1000 * d.x);
var l = x.toLocaleString(); var l = x.toLocaleString();
var y = entry.y; var y = d.y;
hashData.push({ x: x, y: y, d: l }); a.push({x: x, y: y, d: l});
}); });
} }
var l = now.toLocaleString(); var l = now.toLocaleString();
var y = e.getWithDefault("model.hashrate"); var y = e.getWithDefault("stats.model.netCharts");
var lastHash = { x: now, y: y, d: l }; var last = {x: now, y: y, d: l};
{ hashData.push(lastHash); } var interval = e.get('config.highcharts.main.interval') || 60000;
if (a.length > 0 && now - a[a.length - 1].x > interval) {
return hashData; a.push(last);
}()
},
{
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") +
"<br><b>NETWORK DIFFICULTY: " +
formatNumber(this.y) +
"</b>"
);
},
},
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 a;
return netDiffData;
}() }()
}, }]
],
}; };
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; return a;
}, }
}), }),
dag: Ember.computed("stats", "model", { dag: Ember.computed("stats", "model", {
get() { get() {
var percent = (this.get("epoch") * 8192) / 1024 / 1024 + 1; var percent = (this.get("epoch") * 8192) / 1024 / 1024 + 1;
@ -309,7 +342,6 @@ export default Ember.Controller.extend({
return percent; return percent;
}, },
}), }),
epoch: Ember.computed("model.stats", { epoch: Ember.computed("model.stats", {
get() { get() {
return parseInt(this.get("applicationController.height") / 30000); return parseInt(this.get("applicationController.height") / 30000);

2
www/app/helpers/format-threshold.js

@ -5,7 +5,7 @@ export function formatBalance(value) {
value = 0; value = 0;
} }
value = value * 0.000000001 ; value = value * 0.000000001 ;
return value.toFixed(2); // Change toFixed(1) to toFixed(2) return value.toFixed(1);
} }
export default buildHelper(formatBalance); export default buildHelper(formatBalance);

7
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);

2
www/app/helpers/with-metric-prefix.js

@ -13,7 +13,7 @@ export function withMetricPrefix(params/*, hash*/) {
n = n / 1000; n = n / 1000;
i++; i++;
} }
return n.toFixed(3) + ' ' + units[i - 1]; return n.toFixed(2) + ' ' + units[i - 1];
} }
export default Ember.Helper.helper(withMetricPrefix); export default Ember.Helper.helper(withMetricPrefix);

21
www/app/index.html

@ -1,5 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
@ -7,13 +8,17 @@
<title>ETC Mining Pool</title> <title>ETC Mining Pool</title>
<meta name="description" content="High profitability ETC mining pool" /> <meta name="description" content="High profitability ETC mining pool" />
<meta name="keywords" content="Ethereum, ethereum, Classic, classic, ETC, etc, pool, mining, cryptocurrency" /> <meta name="keywords" content="Ethereum, ethereum, Classic, classic, ETC, etc, pool, mining, cryptocurrency" />
<script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=Intl.~locale.en"></script> <script src="https://cdn.polyfill.io/v1/polyfill.min.js?features=Intl.~locale.en"></script>
{{content-for "head"}} {{content-for "head"}}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css"
integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
<link rel="stylesheet" href="{{rootURL}}assets/vendor.css"> <link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
<link rel="stylesheet" href="{{rootURL}}assets/open-etc-pool.css"> <link rel="stylesheet" href="{{rootURL}}assets/open-etc-pool.css">
<link rel="shortcut icon" type="image/x-icon" href="{{rootURL}}favicon.png" /> <link rel="shortcut icon" type="image/x-icon" href="{{rootURL}}etc.svg" />
{{content-for "head-footer"}} {{content-for "head-footer"}}
</head> </head>
<body> <body>
{{content-for "body"}} {{content-for "body"}}
@ -27,8 +32,14 @@
<div class="text-center"> <div class="text-center">
<div class="row"> <div class="row">
<div class="col-md-12" style="text-align: center;"> <div class="col-md-12" style="text-align: center;">
<p class="text-muted" style="margin:20px 0">&copy; | <p class="text-muted" style="margin:20px 0">2024 &copy; |
Powered by <a href="https://github.com/yuriy0803/open-etc-pool-friends" target="_blank">open-etc-pool-friends</a> Powered by <i class="fa fa-home" aria-hidden="true"> <a href="https://open-etc-pool-friends"
target="_blank">open-etc-pool-friends</a></i> |
<i class='fas fa-wallet'> <a
href="https://etc.blockscout.com/address/0xFc9B271B1b03B60e5aD68CB89Bb1016b9eAc2baC"
target="_blank">Pool Wallet</a></i> |
<span class="bi bi-discord blue-color"> <a href="https://discord.com/invite/zdnuXm4uby"
target="_blank">Discord</a></span>
</p> </p>
</div> </div>
</div> </div>
@ -36,5 +47,5 @@
</div> </div>
</footer> </footer>
</body> </body>
</html>
</html>

49
www/app/models/block.js

@ -1,47 +1,38 @@
import Ember from 'ember'; import EmberObject from '@ember/object';
import { computed } from '@ember/object';
// {
// "candidatesTotal": 0, var Block = EmberObject.extend({
// "hashrate": 0,
// "immatureTotal": 0, variance: computed('difficulty', 'shares', function() {
// "maturedTotal": 11, let percent = this.get('shares') / this.get('difficulty');
// "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) { if (!percent) {
return 0; return 0;
} }
return percent; return percent;
}), }),
isLucky: Ember.computed('variance', function() { isLucky: computed('variance', function() {
return this.get('variance') <= 1.0; return this.get('variance') <= 1.0;
}), }),
isHard: Ember.computed('variance', function() {
return this.get('variance') >= 1.2; isSolo: computed('miningType', function() {
return this.get('miningType') == "solo";
}), }),
isOk: Ember.computed('orphan', 'uncle', function() { isOk: computed('orphan', 'uncle', function() {
return !this.get('orphan'); return !this.get('orphan');
}), }),
formatReward: Ember.computed('reward', function() { lastBlockFound: Ember.computed('model', {
get() {
return parseInt(this.get('model.lastBlockFound')) || 0;
}
}),
formatReward: computed('reward', function() {
if (!this.get('orphan')) { if (!this.get('orphan')) {
var value = parseInt(this.get('reward')) * 0.000000000000000001; let value = parseInt(this.get('reward')) * 0.000000000000000001;
return value.toFixed(6); return value.toFixed(6);
} else { } else {
return 0; return 0;

1
www/app/router.js

@ -10,6 +10,7 @@ Router.map(function() {
this.route('payouts'); this.route('payouts');
this.route('rewards'); this.route('rewards');
this.route('settings'); this.route('settings');
this.route('mining');
}); });
this.route('not-found'); this.route('not-found');

171
www/app/styles/app.css

@ -4,13 +4,11 @@ html {
position: relative; position: relative;
min-height: 100%; min-height: 100%;
} }
body { body {
/* Margin bottom by footer height */ /* Margin bottom by footer height */
margin-bottom: 110px; margin-bottom: 110px;
/* background: url('/bg.png'); /* */ /* background: url('/bg.png'); /* */
} }
.footer { .footer {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
@ -18,7 +16,6 @@ body {
/* Set the fixed height of the footer here */ /* Set the fixed height of the footer here */
background-color: #3a3b3c; background-color: #3a3b3c;
} }
.center { .center {
align-items: center; align-items: center;
display: flex; display: flex;
@ -38,14 +35,9 @@ body>.container {
background-color: #f3f2eb; background-color: #f3f2eb;
} }
.navbar {
display: flex;
}
.page-header { .page-header {
border-bottom-color: #d6d6d6; border-bottom-color: #d6d6d6;
} }
.container .text-muted { .container .text-muted {
margin: 20px 0; margin: 20px 0;
color: #9babb3; color: #9babb3;
@ -83,66 +75,46 @@ code {
border-color: #61BD81; border-color: #61BD81;
border-bottom-width: 2px; border-bottom-width: 2px;
} }
.navbar-default .navbar-brand { .navbar-default .navbar-brand {
color: #4A4A4A; color: #4A4A4A;
} }
.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
.navbar-default .navbar-brand:hover,
.navbar-default .navbar-brand:focus {
color: #4A4A4A; color: #4A4A4A;
} }
.navbar-default .navbar-text { .navbar-default .navbar-text {
color: #4A4A4A; color: #4A4A4A;
} }
.navbar-default .navbar-nav > li > a { .navbar-default .navbar-nav > li > a {
color: #4A4A4A; color: #4A4A4A;
} }
.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
.navbar-default .navbar-nav>li>a:hover,
.navbar-default .navbar-nav>li>a:focus {
color: #61BD81; color: #61BD81;
} }
.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
.navbar-default .navbar-nav>.active>a,
.navbar-default .navbar-nav>.active>a:hover,
.navbar-default .navbar-nav>.active>a:focus {
color: #ffffff; color: #ffffff;
background-color: #61BD81; background-color: #61BD81;
text-shadow: 1px 1px 2px #000; 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 {
.navbar-default .navbar-nav>.open>a,
.navbar-default .navbar-nav>.open>a:hover,
.navbar-default .navbar-nav>.open>a:focus {
color: #ffffff; color: #ffffff;
background-color: #69102b; background-color: #69102b;
} }
.navbar-default .navbar-toggle { .navbar-default .navbar-toggle {
border-color: #2885da; border-color: #2885da;
} }
.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
.navbar-default .navbar-toggle:hover,
.navbar-default .navbar-toggle:focus {
background-color: #2885da; background-color: #2885da;
} }
.navbar-default .navbar-toggle .icon-bar { .navbar-default .navbar-toggle .icon-bar {
background-color: #4A4A4A; background-color: #4A4A4A;
} }
.navbar-default .navbar-collapse, .navbar-default .navbar-collapse,
.navbar-default .navbar-form { .navbar-default .navbar-form {
border-color: #4A4A4A; border-color: #4A4A4A;
} }
.navbar-default .navbar-link { .navbar-default .navbar-link {
color: #4A4A4A; color: #4A4A4A;
} }
.navbar-default .navbar-link:hover { .navbar-default .navbar-link:hover {
color: #ffffff; color: #ffffff;
} }
@ -151,15 +123,10 @@ code {
.navbar-default .navbar-nav .open .dropdown-menu > li > a { .navbar-default .navbar-nav .open .dropdown-menu > li > a {
color: #4A4A4A; color: #4A4A4A;
} }
.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,
.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus {
color: #ffffff; 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 {
.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; color: #ffffff;
background-color: #3f9ff7; background-color: #3f9ff7;
} }
@ -184,17 +151,11 @@ span.logo-3 {
padding: 0 3px 0 3px; padding: 0 3px 0 3px;
} }
h1, h1, h2, h3, h4, h4, h6 {
h2,
h3,
h4,
h4,
h6 {
margin-top: 0px; margin-top: 0px;
} }
.container>h2, .container>h2, .container>h3 {
.container>h3 {
margin-top:2.0rem; margin-top:2.0rem;
} }
@ -282,7 +243,6 @@ h4.note {
margin-top: 0; margin-top: 0;
font-weight: 300 !important; font-weight: 300 !important;
} }
/*---------------------------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------------------------*/
/*----------------------------Bootstrap side notes for calling out things----------------------------*/ /*----------------------------Bootstrap side notes for calling out things----------------------------*/
/*---------------------------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------------------------*/
@ -295,24 +255,19 @@ h4.note {
border-left-width: 5px; border-left-width: 5px;
border-radius: 3px; border-radius: 3px;
} }
.bs-callout h4 { .bs-callout h4 {
margin-top: 0; margin-top: 0;
margin-bottom: 5px; margin-bottom: 5px;
} }
.bs-callout p:last-child { .bs-callout p:last-child {
margin-bottom: 0; margin-bottom: 0;
} }
.bs-callout code { .bs-callout code {
border-radius: 3px; border-radius: 3px;
} }
.bs-callout+.bs-callout { .bs-callout+.bs-callout {
margin-top: -5px; margin-top: -5px;
} }
/* Themes for different contexts */ /* Themes for different contexts */
/* Default */ /* Default */
@ -320,7 +275,6 @@ h4.note {
background-color: #eeeeee; background-color: #eeeeee;
border-left-color: #777; border-left-color: #777;
} }
.bs-callout-default h4 { .bs-callout-default h4 {
color: #777; color: #777;
} }
@ -330,7 +284,6 @@ h4.note {
background-color: #e8effc; background-color: #e8effc;
border-left-color: #428bca; border-left-color: #428bca;
} }
.bs-callout-primary h4 { .bs-callout-primary h4 {
color: #428bca; color: #428bca;
} }
@ -340,7 +293,6 @@ h4.note {
background-color: #eafce8; background-color: #eafce8;
border-left-color: #5cb85c; border-left-color: #5cb85c;
} }
.bs-callout-success h4 { .bs-callout-success h4 {
color: #5cb85c; color: #5cb85c;
} }
@ -350,7 +302,6 @@ h4.note {
background-color: #fce8e8; background-color: #fce8e8;
border-left-color: #d9534f; border-left-color: #d9534f;
} }
.bs-callout-danger h4 { .bs-callout-danger h4 {
color: #d9534f; color: #d9534f;
} }
@ -360,7 +311,6 @@ h4.note {
background-color: #fcfbe8; background-color: #fcfbe8;
border-left-color: #f0ad4e; border-left-color: #f0ad4e;
} }
.bs-callout-warning h4 { .bs-callout-warning h4 {
color: #f0ad4e; color: #f0ad4e;
} }
@ -370,7 +320,6 @@ h4.note {
background-color: #E8F6FC; background-color: #E8F6FC;
border-left-color: #5bc0de; border-left-color: #5bc0de;
} }
.bs-callout-info h4 { .bs-callout-info h4 {
color: #5bc0de; color: #5bc0de;
} }
@ -384,37 +333,30 @@ h4.note {
margin-bottom: 10px; margin-bottom: 10px;
margin-top: 5px; margin-top: 5px;
} }
.stats:last-child{ .stats:last-child{
width: auto; width: auto;
} }
.stats > h3 > i { .stats > h3 > i {
width: 21px; width: 21px;
} }
.stats > div{ .stats > div{
padding: 5px 0; padding: 5px 0;
} }
.stats > div > .fa { .stats > div > .fa {
width: 25px; width: 25px;
} }
.stats > div > span:first-of-type{ .stats > div > span:first-of-type{
font-weight: bold; font-weight: bold;
} }
/*--------------------------------------| Bootstrap overrides |--------------------------------------*/ /*--------------------------------------| Bootstrap overrides |--------------------------------------*/
.ul, .ul, .ul-link {
.ul-link {
font-weight: 200; font-weight: 200;
text-align: center; text-align: center;
} }
.ul-link:hover, .ul-link:hover, .ul-link:focus {
.ul-link:focus {
color: inherit; color: inherit;
text-decoration: none; text-decoration: none;
opacity: .70; opacity: .70;
@ -455,8 +397,7 @@ h4.note {
border-bottom: 2px solid #61BD81; border-bottom: 2px solid #61BD81;
} }
#alertError, #alertError,#alertSuccess{
#alertSuccess {
display:none; display:none;
} }
@ -496,31 +437,24 @@ h4.note {
.bg-black { .bg-black {
color: #f9f9f9 !important; color: #f9f9f9 !important;
} }
.bg-gray { .bg-gray {
background-color: #eaeaec !important; background-color: #eaeaec !important;
} }
.bg-blackd{ .bg-blackd{
background-color: #222222 !important; background-color: #222222 !important;
} }
.bg-red { .bg-red {
background-color: #f56954 !important; background-color: #f56954 !important;
} }
.bg-yellow { .bg-yellow {
background-color: #f39c12 !important; background-color: #f39c12 !important;
} }
.bg-cherry{ .bg-cherry{
background-color: #cd1231 !important; background-color: #cd1231 !important;
} }
.bg-aqua { .bg-aqua {
background-color: #00c0ef !important; background-color: #00c0ef !important;
} }
.bg-blue { .bg-blue {
background-color: #0073b7 !important; background-color: #0073b7 !important;
} }
@ -528,47 +462,36 @@ h4.note {
.bg-light-blue { .bg-light-blue {
background-color: #5fb4ef !important; background-color: #5fb4ef !important;
} }
.bg-wood{ .bg-wood{
background-color: #ab7d44 !important; background-color: #ab7d44 !important;
} }
.bg-green { .bg-green {
background-color: #00a65a !important; background-color: #00a65a !important;
} }
.bg-grass { .bg-grass {
background-color: #a1c436 !important; background-color: #a1c436 !important;
} }
.bg-navy { .bg-navy {
background-color: #001f3f !important; background-color: #001f3f !important;
} }
.bg-teal { .bg-teal {
background-color: #39cccc !important; background-color: #39cccc !important;
} }
.bg-olive { .bg-olive {
background-color: #7f8000 !important; background-color: #7f8000 !important;
} }
.bg-lime { .bg-lime {
background-color: #00e405 !important; background-color: #00e405 !important;
} }
.bg-orange { .bg-orange {
background-color: #ff851b !important; background-color: #ff851b !important;
} }
.bg-fuchsia { .bg-fuchsia {
background-color: #f012be !important; background-color: #f012be !important;
} }
.bg-purple { .bg-purple {
background-color: #932ab6 !important; background-color: #932ab6 !important;
} }
.bg-maroon { .bg-maroon {
background-color: #85144b !important; background-color: #85144b !important;
} }
@ -576,60 +499,46 @@ h4.note {
.bg-black { .bg-black {
background-color: #000 !important; background-color: #000 !important;
} }
/* Text colors */ /* Text colors */
.text-red { .text-red {
color: #f56954 !important; color: #f56954 !important;
} }
.text-yellow { .text-yellow {
color: #f39c12 !important; color: #f39c12 !important;
} }
.text-aqua { .text-aqua {
color: #00c0ef !important; color: #00c0ef !important;
} }
.text-blue { .text-blue {
color: #0073b7 !important; color: #0073b7 !important;
} }
.text-light-blue { .text-light-blue {
color: #3c8dbc !important; color: #3c8dbc !important;
} }
.text-green { .text-green {
color: #00a65a !important; color: #00a65a !important;
} }
.text-navy { .text-navy {
color: #001f3f !important; color: #001f3f !important;
} }
.text-teal { .text-teal {
color: #39cccc !important; color: #39cccc !important;
} }
.text-olive { .text-olive {
color: #7f8000 !important; color: #7f8000 !important;
} }
.text-lime { .text-lime {
color: #01ff70 !important; color: #01ff70 !important;
} }
.text-orange { .text-orange {
color: #ff851b !important; color: #ff851b !important;
} }
.text-fuchsia { .text-fuchsia {
color: #f012be !important; color: #f012be !important;
} }
.text-purple { .text-purple {
color: #932ab6 !important; color: #932ab6 !important;
} }
.text-maroon { .text-maroon {
color: #85144b !important; color: #85144b !important;
} }
@ -638,7 +547,8 @@ h4.note {
color: #ffffff !important; color: #ffffff !important;
} }
.text-light-yellow { .text-light-yellow
{
color: #fefc2e !important; color: #fefc2e !important;
} }
@ -751,7 +661,6 @@ h4.note {
color: #fff; color: #fff;
background-color: #5bc0de; background-color: #5bc0de;
} }
.panel-footer { .panel-footer {
padding: 10px 15px; padding: 10px 15px;
background-color: #f5f5f5; background-color: #f5f5f5;
@ -781,108 +690,56 @@ h4.note {
} }
@-webkit-keyframes load4 { @-webkit-keyframes load4 {
0%, 0%,
100% { 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% { 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% { 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% { 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% { 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% { 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% { 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% { 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%, 0%,
100% { 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% { 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% { 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% { 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% { 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% { 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% { 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% { 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)
}

5
www/app/templates/about.hbs

@ -9,12 +9,7 @@
<h3>Details</h3> <h3>Details</h3>
<p> <p>
<ul> <ul>
<li>It's a solo mining pool.</li>
<li>Written in Go it's a rocket highly concurrent and low RAM consuming piece of code</li> <li>Written in Go it's a rocket highly concurrent and low RAM consuming piece of code</li>
<li>It's a stratum over a coin node with many options.</li>
<li>Each miner works independently of the others.</li>
<li>The block reward goes to only the miner who found it.</li>
<li>Block search time depends on your hashrate and luck.</li>
<li>High performance proxy</li> <li>High performance proxy</li>
<li>Payouts and block unlocking module</li> <li>Payouts and block unlocking module</li>
<li>Designed for 100% distributed setup</li> <li>Designed for 100% distributed setup</li>

55
www/app/templates/account.hbs

@ -9,19 +9,22 @@
</div> </div>
<div style="display: block;"> <div style="display: block;">
<i class="fa fa-bank"></i> Pending Balance: <span>{{format-balance model.stats.balance}}</span><br> <i class="fa fa-bank"></i> Pending Balance: <span>{{format-balance model.stats.balance}}</span><br>
<i class="fa fa-bank"></i> Your Threshold: <span>{{format-threshold model.threshold}} <i class="fa fa-bank"></i> Your Threshold: <span>{{format-threshold model.threshold}}</span><br>
{{config.Unit}}</span><br>
<small>Credited coins awaiting payout.</small> <small>Credited coins awaiting payout.</small>
</div> </div>
{{#if model.stats.payouttreshold}}
<div style="display: block;">
<i class="fa fa-bank"></i> Payout Treshold: <span>{{format-balance model.stats.payouttreshold}}</span><br>
</div>
{{/if}}
{{#if model.stats.pending}} {{#if model.stats.pending}}
<div style="display: block;"> <div style="display: block;">
<i class="fa fa-clock-o"></i> Current Payment: <span>{{format-balance model.stats.pending}}</span><br> <i class="fa fa-clock-o"></i> Current Payment: <span>{{format-balance model.stats.pending}}</span><br>
</div> </div>
{{/if}} {{/if}}
<div style="display: block;"><i class="fa fa-money"></i> Total Paid: <span>{{format-balance <div style="display: block;"><i class="fa fa-money"></i> Total Paid: <span>{{format-balance model.stats.paid}}</span></div>
model.stats.paid}}</span> / <span>{{format-balance earnTotalPaid}} $</span></div> <div style="display: block;"><i class="fa fa-money"></i> Last 24h Reward: <span>{{format-balance model.24hreward}}</span></div>
<div style="display: block;"><i class="fa fa-money"></i> Last 24h Reward: <span>{{format-balance <div style="display: block;"><i class="fa fa-calculator"></i>Earnings per day (24h avg):<span>{{format-number earnPerDay}}</span></div>
model.24hreward}}</span></div>
</div> </div>
<div class="col-md-4 stats"> <div class="col-md-4 stats">
{{#if model.stats.lastShare}} {{#if model.stats.lastShare}}
@ -29,34 +32,24 @@
Last Share Submitted: <span>{{format-relative (seconds-to-ms (string-to-int model.stats.lastShare))}}</span> Last Share Submitted: <span>{{format-relative (seconds-to-ms (string-to-int model.stats.lastShare))}}</span>
</div> </div>
{{/if}} {{/if}}
<div style="display: block;"><i class="fa fa-gears"></i> Workers Online: <span>{{format-number <div style="display: block;"><i class="fa fa-gears"></i> Workers Online: <span>{{format-number model.workersOnline}}</span></div>
model.workersOnline}}</span></div> <div style="display: block;"><i class="fa fa-tachometer"></i> Hashrate (1 Hour): <span>{{format-hashrate model.currentHashrate}}</span></div>
<div style="display: block;"><i class="fa fa-tachometer"></i> Hashrate (30m): <span>{{format-hashrate <div style="display: block;"><i class="fa fa-tachometer"></i> Hashrate (6 Hour): <span>{{format-hashrate model.hashrate}}</span></div>
model.currentHashrate}}</span></div> <div style="display: block;"><i class="fa fa-gears"></i> Shares found: <span>{{format-hashrate model.stats.lastShareDiff}}</span></div>
<div style="display: block;"><i class="fa fa-tachometer"></i> Hashrate (3h): <span>{{format-hashrate <div style="display: block;"><i class="fa fa-gears"></i> Mining Type:<span>{{#if model.miningTypeSolo}}<span>SOLO</span>{{else}}<span> PPLNS</span>{{/if}}</span></div>
model.hashrate}}</span></div>
<div style="display: block;"><i class="fa fa-gears"></i> Last Share Diff: <span>{{format-hashrate
model.stats.lastShareDiff}}</span></div>
<div style="display: block;">
<i class="fa fa-gears"></i> Your Round Share: <span>{{format-number roundPercent style='percent'
maximumFractionDigits='2'}}</span><br />
</div>
</div> </div>
<div class="col-md-4 stats"> <div class="col-md-4 stats">
<div style="display: block;"><i class="fa fa-tachometer"></i> Blocks Found: <span>{{format-number <div style="display: block;"><i class="fa fa-tachometer"></i> Blocks Found: <span>{{format-number model.stats.blocksFound fallback='0'}}</span></div>
model.stats.blocksFound fallback='0'}}</span></div>
<div style="display: block;"><i class="fa fa-paper-plane-o"></i> Total Payments: <span>{{format-number
model.paymentsTotal}}</span></div>
<div style="display: block;"><i class="fa fa-gears"></i> Personal Luck: <span>{{format-number PersonalLuck
style='percent'}}</span></div>
<div style="display: block;"><i class="fa fa-calculator"></i> Est. Earnings /day (3h avg): <span>{{format-number
earnPerDayToken maximumFractionDigits='1'}}</span> / <span>{{format-number earnPerDayUsd
maximumFractionDigits='1'}} $</span></div>
<div style="display: block;"> <div style="display: block;">
<i class="fa fa-clock-o"></i> <i class="fa fa-clock-o"></i>
Epoch Switch: <span>{{format-relative applicationController.nextEpoch units="hour"}}</span> Epoch Switch: <span>{{format-relative applicationController.nextEpoch units="hour"}}</span>
</div> </div>
<!--<div style="display: block;"><i class="fa fa-thermometer fa-fw"></i> My Shares in the last 'N' <span>{{roundSharesN}}</span></div>-->
<div style="display: block;"><i class="fa fa-gears"></i> Personal Luck: <span>{{format-number PersonalLuck style='percent'}}</span></div>
<div style="display: block;">
<i class="fa fa-gears"></i>PPLNS Your Round Share: <span>{{format-number roundPercent style='percent' maximumFractionDigits='0'}}</span><br/>
<small>Percent of your contribution to current round.</small>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -65,8 +58,7 @@
<div class="container"> <div class="container">
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
{{#active-li currentWhen='account.index' role='presentation'}} {{#active-li currentWhen='account.index' role='presentation'}}
{{#link-to 'account.index'}}Workers <span class="label label-success">{{model.workersOnline}}</span> / <span {{#link-to 'account.index'}}Workers <span class="label label-success">{{model.workersOnline}}</span> / <span class="label label-danger">{{model.workersOffline}}</span>{{/link-to}}
class="label label-danger">{{model.workersOffline}}</span>{{/link-to}}
{{/active-li}} {{/active-li}}
{{#active-li currentWhen='account.rewards' role='presentation'}} {{#active-li currentWhen='account.rewards' role='presentation'}}
{{#link-to 'account.rewards'}}Rewards{{/link-to}} {{#link-to 'account.rewards'}}Rewards{{/link-to}}
@ -76,6 +68,9 @@
{{/active-li}} {{/active-li}}
{{#active-li currentWhen='account.settings' role='presentation'}} {{#active-li currentWhen='account.settings' role='presentation'}}
{{#link-to 'account.settings'}}Settings{{/link-to}} {{#link-to 'account.settings'}}Settings{{/link-to}}
{{/active-li}}
{{#active-li currentWhen='account.mining' role='presentation'}}
{{#link-to 'account.mining'}}PPLNS/SOLO{{/link-to}}
{{/active-li}} {{/active-li}}
</ul> </ul>
</div> </div>

49
www/app/templates/account/index.hbs

@ -1,36 +1,6 @@
<div class="container"> <div class="container">
{{high-charts mode=chartMode chartOptions=chartOptions content=chartData}} {{high-charts mode=chartMode chartOptions=chartOptions content=chartData}}
{{high-charts mode=chartMode chartOptions=shareChart content=chartData}} {{high-charts mode=chartMode chartOptions=shareChart content=chartData}}
<table class="table table-condensed table-striped">
<thead>
<tr class="active">
<th>Time</th>
<th>Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td><span>Last 60 minutes</span></td>
<td><span>{{format-number earnPerHour maximumFractionDigits='8'}}</span></td>
</tr>
<tr>
<td><span>Last 12 hours</span></td>
<td><span>{{format-number earnPerHour12 maximumFractionDigits='8'}}</span></td>
</tr>
<tr>
<td><span>Last 24 hours</span></td>
<td>{{format-number earnPerDay maximumFractionDigits='8'}}</td>
</tr>
<tr>
<td><span>Last 7 days</span></td>
<td>{{format-number earnPerWeek maximumFractionDigits='8'}}</td>
</tr>
<tr>
<td><span>Last 30 days</span></td>
<td>{{format-number earnPerMonth maximumFractionDigits='8'}}</td>
</tr>
</tbody>
</table>
{{#if model.workers}} {{#if model.workers}}
<h4>Your Workers</h4> <h4>Your Workers</h4>
<div class="table-responsive"> <div class="table-responsive">
@ -38,8 +8,7 @@
<thead> <thead>
<tr> <tr>
<th>ID</th> <th>ID</th>
<th>Hashrate (rough, short average)</th> <th>Current Hashrate / Average Hashrate</th>
<th>Hashrate (accurate, long average)</th>
<th>Hostname</th> <th>Hostname</th>
<th>Port Difficulty</th> <th>Port Difficulty</th>
<th>Blocks</th> <th>Blocks</th>
@ -51,17 +20,11 @@
{{#each-in model.workers as |k v|}} {{#each-in model.workers as |k v|}}
<tr class="{{if v.offline "warning" "success"}}"> <tr class="{{if v.offline "warning" "success"}}">
<td>{{k}}</td> <td>{{k}}</td>
<td>{{format-hashrate v.hr}} {{#if v.w_stat_s}}<i class="fa fa-arrow-up" style="color:rgb(0, 9, 128)" <td>{{format-hashrate v.hr}} {{#if v.w_stat_s}}<i class="fa fa-arrow-up" style="color:rgb(0, 9, 128)" aria-hidden="true"></i>{{else}}<i class="fa fa-arrow-down" style="color:red" aria-hidden="true"></i>{{/if}} / {{format-hashrate v.hr2}} {{#if v.w_stat}}<i class="fa fa-arrow-up" style="color:rgb(0, 9, 128)" aria-hidden="true"></i>{{else}}<i class="fa fa-arrow-down" style="color:red" aria-hidden="true"></i>{{/if}}</td>
aria-hidden="true"></i>{{else}}<i class="fa fa-arrow-down" style="color:red"
aria-hidden="true"></i>{{/if}}</td>
<td>{{format-hashrate v.hr2}} {{#if v.w_stat}}<i class="fa fa-arrow-up" style="color:rgb(0, 9, 128)"
aria-hidden="true"></i>{{else}}<i class="fa fa-arrow-down" style="color:red"
aria-hidden="true"></i>{{/if}}</td>
<td>{{v.hostname}}</td> <td>{{v.hostname}}</td>
<td><span class="label label-success">{{format-hashrate v.portDiff}}</span></td> <td><span class="label label-success">{{format-hashrate v.portDiff}}</span></td>
<td>{{v.blocks}}</td> <td>{{v.blocks}}</td>
<td><span class="text-green">{{v.valid}}</span> ({{v.v_per}}%) / <span class="text-yellow">{{v.stale}}</span> <td><span class="text-green">{{v.valid}}</span> ({{v.v_per}}%) / <span class="text-yellow">{{v.stale}}</span> ({{v.s_per}}%) / <span class="text-red">{{v.invalid}}</span> ({{v.i_per}}%)</td>
({{v.s_per}}%) / <span class="text-red">{{v.invalid}}</span> ({{v.i_per}}%)</td>
<td>{{format-relative (seconds-to-ms v.lastBeat)}}</td> <td>{{format-relative (seconds-to-ms v.lastBeat)}}</td>
</tr> </tr>
{{/each-in}} {{/each-in}}
@ -74,13 +37,11 @@
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
<span class="sr-only">Notice:</span> <span class="sr-only">Notice:</span>
Your average hashrate will be smoothly adjusted until you have shares to fullfill estimation window.<br/> Your average hashrate will be smoothly adjusted until you have shares to fullfill estimation window.<br/>
There are two windows, long and short, first is equal to about 30 minutes and long window is usually equal to 3 There are two windows, long and short, first is equal to about 1 hours and long window is usually equal to 6 hours.<br/>
hours.<br />
Dead (sick) workers will be highlighted in a table of workers if they didn't submit a share for 1/2 of short window, Dead (sick) workers will be highlighted in a table of workers if they didn't submit a share for 1/2 of short window,
so you can perform maintenance of your rigs. so you can perform maintenance of your rigs.
</div> </div>
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
<strong>Your bulk stats JSON API URL:</strong> <a <strong>Your bulk stats JSON API URL:</strong> <a href="/api/accounts/{{model.login}}">/api/accounts/{{model.login}}</a>
href="/api/accounts/{{model.login}}">/api/accounts/{{model.login}}</a>
</div> </div>
</div> </div>

68
www/app/templates/account/mining.hbs

@ -0,0 +1,68 @@
<div class="container">
<div id="mining" style="margin-top:50px;" class="col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
<div class="row">
<div id="alertSuccess" class="alert alert-success" role="alert">
Success
</div>
<div id="alertError" class="alert alert-danger" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span></button>
Error
</div>
</div>
<form action="/api/mining" method="post">
<input type="hidden" id="login" name="login" value="{{model.login}}">
<div class="form-group">
<div class="funkyradio">
<div class="funkyradio-success">
<input type="radio" name="radio" id="radio2" value="pplns" checked="{{if model.miningTypePplns "true"}}" />
<label for="radio2">PPLNS Mining</label>
</div>
</div>
<div class="funkyradio">
<div class="funkyradio-danger">
<input type="radio" name="radio" id="radio1" value="solo" checked="{{if model.miningTypeSolo "true"}}" />
<label for="radio1">SOLO Mining</label>
</div>
</div>
</div>
<div class="form-group">
<label for="ip_address">Active Worker IP address </label>
<input class="form-control" name="ip_address" id="ip_address" placeholder="192.168.0.1" type="text">
<small id="ip_address" class="form-text text-dark">
Please complete your worker`s IP address in order to validate and save your settings.
</small>
</div>
<br>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
<script>
$(document).ready(function () {
var $form = $('form');
$form.submit(function () {
$.post($(this).attr('action'), $(this).serialize(), function (response) {
if (response.result == "success") {
$('#alertSuccess').html(response.result);
$("#alertSuccess").fadeIn() //or fadeIn
setTimeout(function() {
$("#alertSuccess").fadeOut(); //or fadeOut
}, 5000);
} else {
$('#alertError').html(response.result);
$("#alertError").fadeIn() //or fadeIn
setTimeout(function() {
$("#alertError").fadeOut(); //or fadeOut
}, 5000);
}
}, 'json');
return false;
});
});
</script>

2
www/app/templates/account/payouts.hbs

@ -16,7 +16,7 @@
<tr> <tr>
<td>{{format-date-locale tx.timestamp}}</td> <td>{{format-date-locale tx.timestamp}}</td>
<td> <td>
<a href="https://expedition.dev/tx/{{tx.tx}}" class="hash" rel="nofollow" target="_blank">{{tx.tx}}</a> <a href="https://etc.blockscout.com/tx/{{tx.tx}}" class="hash" rel="nofollow" target="_blank">{{tx.tx}}</a>
</td> </td>
<td>{{format-balance tx.amount}}</td> <td>{{format-balance tx.amount}}</td>
</tr> </tr>

21
www/app/templates/account/rewards.hbs

@ -7,8 +7,7 @@
<th>Time</th> <th>Time</th>
<th>Blocks</th> <th>Blocks</th>
<th>Amount</th> <th>Amount</th>
<th>Luck</th> <th>Personal Luck</th>
<th>USD</th>
</tr> </tr>
</thead> </thead>
@ -18,16 +17,10 @@
<td>{{sumreward.name}}</td> <td>{{sumreward.name}}</td>
<td>{{sumreward.blocks}}</td> <td>{{sumreward.blocks}}</td>
<td>{{format-balance sumreward.reward}}</td> <td>{{format-balance sumreward.reward}}</td>
<td>{{format-number sumreward.personalLuck style='percent'}}</td> <td>
<td><em> {{format-number sumreward.averageLuck style='percent'}}
</td>
{{#if (eq config.Currency 'USD') }}
{{format-ethusd sumreward.reward model.exchangedata.price_usd}}
{{else}}
{{format-ethinr sumreward.reward model.exchangedata.price_inr}}
{{/if}}
</em></td>
</tr> </tr>
{{/each}} {{/each}}
</tbody> </tbody>
@ -39,7 +32,7 @@
<th>Block Height</th> <th>Block Height</th>
<th>Time Found</th> <th>Time Found</th>
<th>Reward</th> <th>Reward</th>
<th>Your Round Share</th> <th>Round Share</th>
<th>Personal Luck</th> <th>Personal Luck</th>
</tr> </tr>
@ -57,7 +50,9 @@
{{/if}} {{/if}}
</td> </td>
<td>{{format-number tx.percent style='percent' maximumFractionDigits='2'}}</td> <td>{{format-number tx.percent style='percent' maximumFractionDigits='2'}}</td>
<td>{{format-number tx.personalLuck style='percent' maximumFractionDigits='2'}}</td> <td>
{{format-number tx.personalLuck style='percent'}}
</td>
</tr> </tr>
{{/each}} {{/each}}
</tbody> </tbody>

5
www/app/templates/account/settings.hbs

@ -11,6 +11,7 @@
</div> </div>
</div> </div>
<form action="/api/settings" method="post"> <form action="/api/settings" method="post">
<div class="form-group"> <div class="form-group">
@ -20,7 +21,6 @@
placeholder="Enter email"> placeholder="Enter email">
<small id="emailHelp" class="form-text text-dark">We'll never share your email with anyone else.</small> <small id="emailHelp" class="form-text text-dark">We'll never share your email with anyone else.</small>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="threshold">Payment Threshold</label> <label for="threshold">Payment Threshold</label>
<input class="form-control" id="threshold" name="threshold" placeholder="min 0.5 - max 10000" min="0.5" <input class="form-control" id="threshold" name="threshold" placeholder="min 0.5 - max 10000" min="0.5"
@ -28,7 +28,6 @@
<small id="thresholdHelp" class="form-text text-dark">Payment threshold in {{config.Unit}} (Min: 0.5, Max: <small id="thresholdHelp" class="form-text text-dark">Payment threshold in {{config.Unit}} (Min: 0.5, Max:
10000)</small> 10000)</small>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="ip_address">Active Worker IP address</label> <label for="ip_address">Active Worker IP address</label>
<input class="form-control" name="ip_address" id="ip_address" placeholder="192.168.0.1" type="text"> <input class="form-control" name="ip_address" id="ip_address" placeholder="192.168.0.1" type="text">
@ -36,7 +35,6 @@
Please complete your worker`s IP address in order to validate and save your settings. Please complete your worker`s IP address in order to validate and save your settings.
</small> </small>
</div> </div>
<div class="form-group form-check"> <div class="form-group form-check">
<label class="form-check-label" for="worker_offline"> <label class="form-check-label" for="worker_offline">
<input type="checkbox" name="alertCheck" class="form-check-input" id="alertCheck" checked> Send a mail if one <input type="checkbox" name="alertCheck" class="form-check-input" id="alertCheck" checked> Send a mail if one
@ -44,7 +42,6 @@
my workers goes offline my workers goes offline
</label> </label>
</div> </div>
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
</form> </form>

2
www/app/templates/application.hbs

@ -63,6 +63,7 @@
<script> <script>
$(document).mouseup(function (e) { $(document).mouseup(function (e) {
var container = $(".collapse"); var container = $(".collapse");
if (!container.is(e.target) // if the target of the click isn't the container... if (!container.is(e.target) // if the target of the click isn't the container...
&& container.has(e.target).length === 0) // ... nor a descendant of the container && container.has(e.target).length === 0) // ... nor a descendant of the container
{ {
@ -71,6 +72,7 @@
$("#navBtn").attr('aria-expanded', false); $("#navBtn").attr('aria-expanded', false);
$("#navbarSupportedContent").removeClass("show"); $("#navbarSupportedContent").removeClass("show");
} }
}); });
</script> </script>
</div> </div>

9
www/app/templates/blocks.hbs

@ -16,16 +16,13 @@
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
{{#active-li currentWhen='blocks.index' role='presentation'}} {{#active-li currentWhen='blocks.index' role='presentation'}}
{{#link-to 'blocks.index'}}Blocks <span class="badge alert-success">{{format-number {{#link-to 'blocks.index'}}Blocks <span class="badge alert-success">{{format-number model.maturedTotal}}</span>{{/link-to}}
model.maturedTotal}}</span>{{/link-to}}
{{/active-li}} {{/active-li}}
{{#active-li currentWhen='blocks.immature' role='presentation'}} {{#active-li currentWhen='blocks.immature' role='presentation'}}
{{#link-to 'blocks.immature'}}Immature <span class="badge alert-success">{{format-number {{#link-to 'blocks.immature'}}Immature <span class="badge alert-success">{{format-number model.immatureTotal}}</span>{{/link-to}}
model.immatureTotal}}</span>{{/link-to}}
{{/active-li}} {{/active-li}}
{{#active-li currentWhen='blocks.pending' role='presentation'}} {{#active-li currentWhen='blocks.pending' role='presentation'}}
{{#link-to 'blocks.pending'}}New Blocks <span class="badge alert-info">{{format-number {{#link-to 'blocks.pending'}}New Blocks <span class="badge alert-info">{{format-number model.candidatesTotal}}</span>{{/link-to}}
model.candidatesTotal}}</span>{{/link-to}}
{{/active-li}} {{/active-li}}
</ul> </ul>
{{outlet}} {{outlet}}

30
www/app/templates/blocks/block.hbs

@ -1,10 +1,10 @@
<tr> <tr>
<td> <td>
{{#if block.uncle}} {{#if block.uncle}}
<a href="{{t " links.blockExplorerLink_uncle"}}{{block.uncleHeight}}" rel="nofollow" target="_blank">{{format-number <a href="https://etc.blockscout.com/block/{{block.uncleHeight}}" rel="nofollow" target="_blank">{{format-number
block.height}}</a> block.height}}</a>
{{else}} {{else}}
<a href="{{t " links.blockExplorerLink_block"}}{{block.height}}" rel="nofollow" target="_blank">{{format-number <a href="https://etc.blockscout.com/block/{{block.height}}" rel="nofollow" target="_blank">{{format-number
block.height}}</a> block.height}}</a>
{{/if}} {{/if}}
</td> </td>
@ -12,33 +12,26 @@
{{#if block.uncle}} {{#if block.uncle}}
<td>{{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}}</td> <td>{{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}}</td>
{{else if block.orphan}} {{else if block.orphan}}
<span class="label label-danger">{{t "block.orphan"}}</span> <span class="label label-danger">Orphan</span>
{{else}} {{else}}
<td>{{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}}</td> <td>{{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}}</td>
{{/if}} {{/if}}
</td> </td>
<td>{{format-date-locale block.timestamp}}</td>
<td> <td>
{{#if block.uncle}} {{#if block.isSolo}}
<a href="{{t " links.blockExplorerLink_uncle"}}{{block.hash}}" class="hash" rel="nofollow" <span class="label label-danger">{{block.miningType}}</span>
target="_blank">{{block.hash}}</a>
{{else if block.orphan}}
<span class="label label-danger">{{t "block.orphan"}}</span>
{{else}} {{else}}
<a href="{{t " links.blockExplorerLink_block"}}{{block.hash}}" class="hash" rel="nofollow" <span class="label label-warning">{{block.miningType}}</span>
target="_blank">{{block.hash}}</a>
{{/if}} {{/if}}
</td> </td>
<td>{{format-date-locale block.timestamp}}</td>
<td> <td>
{{#if block.isLucky}} {{#if block.isLucky}}
<span class="label label-success">{{format-number block.variance style='percent'}}</span> <span class="label label-success">{{format-number block.variance style='percent'}}</span>
{{else}} {{else}}
{{#if block.isHard}}
<span class="label label-danger">{{format-number block.variance style='percent'}}</span>
{{else}}
<span class="label label-info">{{format-number block.variance style='percent'}}</span> <span class="label label-info">{{format-number block.variance style='percent'}}</span>
{{/if}} {{/if}}
{{/if}}
</td> </td>
<td> <td>
{{#if block.uncle}} {{#if block.uncle}}
@ -47,6 +40,13 @@
<span class="label label-primary">{{block.formatReward}}</span> <span class="label label-primary">{{block.formatReward}}</span>
{{/if}} {{/if}}
</td> </td>
<td>
{{#if block.uncle}}
<span class="label label-default">Uncle</span>
{{else if block.isOk}}
<span class="label label-primary">Block</span>
{{/if}}
</td>
<td>{{format-hashrate block.shareDiff}}</td> <td>{{format-hashrate block.shareDiff}}</td>
<td>{{block.worker}}</td> <td>{{block.worker}}</td>
</tr> </tr>

21
www/app/templates/blocks/immature.hbs

@ -1,17 +1,18 @@
{{#if model.immature}} {{#if model.immature}}
<h3>{{t "block.immature_blocks"}}</h3> <h4>Immature Blocks</h4>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-condensed table-striped"> <table class="table table-condensed table-striped">
<thead> <thead>
<tr> <tr>
<th>{{t "block.height"}}</th> <th>Height</th>
<th>{{t "block.login"}}</th> <th>Login</th>
<th>{{t "block.hash"}}</th> <th>Time Found</th>
<th>{{t "block.time_found"}}</th> <th>Type</th>
<th>{{t "block.variance"}}</th> <th>Variance</th>
<th>{{t "block.reward"}}</th> <th>Reward</th>
<th>{{t "block.shares"}}</th> <th>Type</th>
<th>{{t "block.worker"}}</th> <th>Shares/Diff</th>
<th>Worker ID</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -22,5 +23,5 @@
</table> </table>
</div> </div>
{{else}} {{else}}
<h3>{{t "block.no_immature_blocks_yet"}}</h3> <h3>No immature blocks yet</h3>
{{/if}} {{/if}}

21
www/app/templates/blocks/index.hbs

@ -1,17 +1,18 @@
{{#if model.matured}} {{#if model.matured}}
<h3>{{t "block.matured"}}</h3> <h4>Matured Blocks</h4>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-condensed table-striped"> <table class="table table-condensed table-striped">
<thead> <thead>
<tr> <tr>
<th>{{t "block.height"}}</th> <th>Height</th>
<th>{{t "block.login"}}</th> <th>Login</th>
<th>{{t "block.hash"}}</th> <th>Time Found</th>
<th>{{t "block.time_found"}}</th> <th>Current Type</th>
<th>{{t "block.variance"}}</th> <th>Variance</th>
<th>{{t "block.reward"}}</th> <th>Reward</th>
<th>{{t "block.shares"}}</th> <th>Type</th>
<th>{{t "block.worker"}}</th> <th>Shares/Diff</th>
<th>Worker ID</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -22,5 +23,5 @@
</table> </table>
</div> </div>
{{else}} {{else}}
<h3>{{t "block.no_matured_blocks_yet"}}</h3> <h3>No matured blocks yet</h3>
{{/if}} {{/if}}

24
www/app/templates/blocks/pending.hbs

@ -4,21 +4,29 @@
<table class="table table-condensed table-striped"> <table class="table table-condensed table-striped">
<thead> <thead>
<tr> <tr>
<th>{{t "block.height"}}</th> <th>Height</th>
<th>{{t "block.login"}}</th> <th>Login</th>
<th>{{t "block.time_found"}}</th> <th>Time Found</th>
<th>{{t "block.variance"}}</th> <th>Type</th>
<th>{{t "block.shares"}}</th> <th>Variance</th>
<th>Shares/Diff</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{{#each model.candidates as |block|}} {{#each model.candidates as |block|}}
<tr> <tr>
<td><a href="{{t " links.blockExplorerLink_block"}}{{block.height}}" rel="nofollow" <td><a href="https://etc.blockscout.com/block/{{block.height}}" rel="nofollow" target="_blank">{{format-number
target="_blank">{{format-number
block.height}}</a></td> block.height}}</a></td>
<td>{{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}}</td> <td>{{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}}</td>
<td>{{format-date-locale block.timestamp}}</td> <td>{{format-date-locale block.timestamp}}</td>
<td>
{{#if block.isSolo}}
<span class="label label-danger">{{block.miningType}}</span>
{{else}}
<span class="label label-warning">{{block.miningType}}</span>
{{/if}}
</td>
<td> <td>
{{#if block.isLucky}} {{#if block.isLucky}}
<span class="label label-success">{{format-number block.variance style='percent'}}</span> <span class="label label-success">{{format-number block.variance style='percent'}}</span>
@ -33,5 +41,5 @@
</table> </table>
</div> </div>
{{else}} {{else}}
<h3>{{t "block.no_new_blocks_yet"}}</h3> <h3>No new blocks yet</h3>
{{/if}} {{/if}}

2
www/app/templates/finders.hbs

@ -16,7 +16,7 @@
<tbody> <tbody>
{{#each model.finders as |f|}} {{#each model.finders as |f|}}
<tr> <tr>
<td>{{#link-to 'account' f.address class='hash'}}{{f.address}}{{/link-to}}</td> <td>{{wallet f.address}}</td>
<td>{{format-number f.blocks}}</td> <td>{{format-number f.blocks}}</td>
</tr> </tr>
{{/each}} {{/each}}

7
www/app/templates/help.hbs

@ -10,9 +10,12 @@
<h3>lolMiner</h3> <h3>lolMiner</h3>
</div> </div>
<p class="lead">In order to mine etchash you need <p class="lead">In order to mine etchash you need
<a href="https://github.com/Lolliedieb/lolMiner-releases/releases" rel="nofollow" target="_blank">lolMiner</a> v1.12+ <a href="https://github.com/Lolliedieb/lolMiner-releases/releases" rel="nofollow" target="_blank">lolMiner</a>
v1.12+
</p>
<p>
<code>./lolMiner --pool {{config.StratumHost}}:{{config.StratumPort}} --user [YOUR_ETC_ADDRESS] -c ETC {{if (equals config.Network 'mordor') "--ecip1099-activation 84"}} --ethstratum=ETHPROXY</code>
</p> </p>
<p><code>./lolMiner --pool {{config.StratumHost}}:{{config.StratumPort}} --user [YOUR_ETC_ADDRESS] -c ETC {{if (equals config.Network 'mordor') "--ecip1099-activation 84"}} --ethstratum=ETHPROXY</code></p>
<dl class="dl-horizontal"> <dl class="dl-horizontal">
<dt>YOUR_ETC_ADDRESS</dt> <dt>YOUR_ETC_ADDRESS</dt>
<dd>This is your address for payouts, generate one with core-geth, or mine directly to exchange like <dd>This is your address for payouts, generate one with core-geth, or mine directly to exchange like

190
www/app/templates/index.hbs

@ -1,177 +1,83 @@
<div class="jumbotron"> <div class="jumbotron-brand">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-5">
<div class="alert alert-info text-center join_telegram"> <div class="row">
Join our <a class="alert-link" href="https://discord.gg/FDx7TzXDFQ">Discord</a> for support! <h1 style="font-size: 24px">
<div class="etc-green">
<strong><span class="logo-2">ETHW Pool</span></strong>
</div> </div>
</h1>
</div> </div>
<div class="row" style="padding:15px 5px;">
<strong>Min. payout threshold: {{config.PayoutThreshold}}</strong>, Payouts are continuos throughout the day.
<br />
<span class="label label-success">PPLNS</span>/<span class="label label-danger">SOLO</span> Stable and
profitable pool with regular payouts.
</div> </div>
<div class="row">
<div class="col-md-4">
<strong>{{t "home.min_payout_threshold"}}: {{config.PayoutThreshold}} {{config.Unit}}</strong> / {{t
"home.payouts_run" interval=config.PayoutInterval}}<br />
<span class="label label-success">PPLNS</span> {{t "home.payout_scheme_detail"}}
</div> </div>
<div class="col-md-4 stats"> <div class="col-md-3 stats">
<div class="stats-box"> <div><i class="fa fa-users"></i> Miners Online: <span id="poolHashrate">{{format-number
<div><i class="fa fa-users"></i> {{t "home.miners_online"}}: <span id="poolHashrate">{{format-number
stats.model.minersTotal}}</span></div> stats.model.minersTotal}}</span></div>
<div><i class="fa fa-tachometer"></i> {{t "home.pool_hashrate"}}: <span id="poolHashrate">{{format-hashrate <div><i class="fa fa-tachometer"></i> Pool Hashrate: <span id="poolHashrate">{{format-hashrate
stats.model.hashrate}}</span></div> stats.model.hashrate}}</span></div>
<div><i class="fa fa-money"></i> {{t "home.pool_fee"}}: <span id="poolFee" <div><i class="fa fa-money"></i> Pool Fee: <span id="poolFee"
class="label label-success">{{config.PoolFee}}</span></div> class="label label-success">{{config.PoolFee}}</span></div>
{{#if stats.model.stats.lastBlockFound}} {{#if stats.model.stats.lastBlockFound}}
<div><i class="fa fa-clock-o"></i> {{t "home.last_block_found"}}: <span>{{format-relative (seconds-to-ms <div><i class="fa fa-clock-o"></i> Last Block Found: <span>{{format-relative (seconds-to-ms
stats.model.stats.lastBlockFound)}}</span></div> stats.model.stats.lastBlockFound)}}</span></div>
{{/if}} {{/if}}
<div><i class="fa fa-clock-o"></i> {{t "home.block_time"}}: <span>{{format-number stats.blockTime}} s</span> <div><i class="fa fa-clock-o"></i> AVG BLOCK TIME: <span>{{format-number stats.blockTime}} s</span></div>
</div> <div><i class="fa fa-gears"></i>Epoch: <span>{{format-number epoch}}</span> DAG Size: <span>{{format-number
<div><i class="fa fa-gears"></i> {{t "home.epoch"}}: <span>{{format-number epoch}}</span> {{t dag}} GB</span></div>
"home.dag_Size"}}:
<span>{{format-number
dag}} GB</span>
</div> </div>
</div>
</div>
<div class="col-md-4 stats"> <div class="col-md-4 stats">
<div class="stats-box"> <div><i class="fa fa-unlock-alt"></i> Network Difficulty: <span>{{with-metric-prefix stats.difficulty}}</span>
<div><i class="fa fa-unlock-alt"></i> {{t "home.network_difficulty"}}: <span>{{with-metric-prefix
stats.difficulty}}</span></div>
<div><i class="fa fa-tachometer"></i> {{t "home.network_hashrate"}}: <span>{{format-hashrate
stats.hashrate}}</span></div>
<div><i class="fa fa-bars"></i> {{t "home.blockchain_height"}}: <span>{{format-number stats.height}}</span>
</div> </div>
<div><i class="fa fa-clock-o"></i> {{t "home.current_round_variance"}}: <span>{{format-number <div><i class="fa fa-tachometer"></i> Network Hashrate: <span>{{format-hashrate stats.hashrate}}</span></div>
stats.roundVariance style='percent'}}</span></div> <div><i class="fa fa-bars"></i> Mining Block: <span>{{stats.height}}</span></div>
<div><i class="fa fa-clock-o"></i> Luck: <span>{{format-number stats.roundVariance style='percent'}}</span>
</div> </div>
<div><i class="fa fa-money"></i> {{t "home.current_price"}}: <span>$ <div><i class="fa fa-credit-card-alt fa-fw"></i> Current price: <span>$ {{model.exchangedata.price_usd}}</span>
{{format-number model.exchangedata.price_usd maximumFractionDigits='8'}}</span></div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="container">
<div>
{{high-charts mode=chartMode chartOptions=chartOptions content=chartData}}
</div> </div>
<div class="container">
<div class="stats"> <div class="stats">
<h3>{{t "home.query_history"}}</h3> <h4>Your Stats &amp; Payment History</h4>
<div class="input-group"> <div class="input-group">
{{input value=cachedLogin class="form-control" placeholder=(t "home.input.enter_your_wallet_address")}} {{input value=cachedLogin class="form-control" placeholder="Your wallet address"}}
<span class="input-group-btn"> <span class="input-group-btn">
<button class="btn btn-primary" type="button" {{action 'lookup' cachedLogin}}> <button class="btn btn-primary btn-etc" type="button" {{action 'lookup' cachedLogin}}>
<span style="display: inline;"><i class="fa fa-search"></i> {{t "home.button.lookup"}}</span> <span style="display: inline;"><i class="fa fa-search"></i> Search</span>
</button> </button>
</span> </span>
</div> </div>
</div> </div>
<div> <div>
<hr /> {{#if config.highcharts.main.enabled}}
<div class="row"> <div class="container">
<div class="col-md-4 col-sm-12"> {{high-charts mode=mode chartOptions=chartOptions content=chartData}}
<h5 class="note note-info text-center">
<span class="label label-success">8b</span>&nbsp;<a href="./#/help" title={{t "home.settings.help" }}><b>{{t
"home.settings.title" hashes="> 800"}} & NiceHash</b></a>
<br>
{{t "home.settings.difficulty" diff="8"}}
<br><br>
<b>{{t "home.settings.stratum_mining"}}:</b>
<br><br>
<code>stratum+tcp://{{config.StratumHost}}:{{config.StratumPort}}</code>
</h5>
</div>
</div>
<div class="row command_lines">
<!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="active"><a href="#windows_settings" aria-controls="home" role="tab"
data-toggle="tab">{{t "home.settings.commands.windows"}}</a></li>
<li role="presentation"><a href="#smos_settings" aria-controls="profile" role="tab" data-toggle="tab">{{t
"home.settings.commands.smos"}}</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="windows_settings">
<div style="padding:15px;">
<h5>{{t "home.settings.commands.windows_instruction"}}</h5>
<div class="panel-group" id="windows_settings_windows_tab" role="tablist" aria-multiselectable="true">
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="win_headingOne">
<h4 class="panel-title">
<a role="button" data-toggle="collapse" data-parent="#windows_settings_windows_tab"
href="#win_collapseOne" aria-expanded="true" aria-controls="win_collapseOne">
lolMiner
</a>
</h4>
</div>
<div id="win_collapseOne" class="panel-collapse collapse in" role="tabpanel"
aria-labelledby="headingOne">
<div class="panel-body">
<code>
lolMiner --coin {{config.Unit}} --pool {{config.StratumHost}}:{{config.StratumPort}} --user wallet_address.WorkerName</code>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="win_headingTwo">
<h4 class="panel-title">
<a class="collapsed" role="button" data-toggle="collapse"
data-parent="#windows_settings_windows_tab" href="#win_collapseTwo" aria-expanded="false"
aria-controls="win_collapseTwo">
PhoenixMiner
</a>
</h4>
</div>
<div id="win_collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo">
<div class="panel-body">
<code>
PhoenixMiner -pool {{config.StratumHost}}:{{config.StratumPort}} -wal wallet_address.WorkerName -coin etc</code>
</div>
</div>
</div>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane" id="smos_settings">
<div style="padding:15px;">
<h5>{{t "home.settings.commands.windows_instruction"}}</h5>
<div class="panel-group" id="smos_settings_smos_tab" role="tablist" aria-multiselectable="true">
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="smos_headingOne">
<h4 class="panel-title">
<a role="button" data-toggle="collapse" data-parent="#smos_settings_smos_tab"
href="#smos_collapseOne" aria-expanded="true" aria-controls="smos_collapseOne">
lolMiner
</a>
</h4>
</div>
<div id="smos_collapseOne" class="panel-collapse collapse in" role="tabpanel"
aria-labelledby="headingOne">
<div class="panel-body">
<code>--coin {{config.Unit}} --pool {{config.StratumHost}}:{{config.StratumPort}} --user wallet_address.WorkerName
</code>
</div>
</div> </div>
{{/if}}
<div class="container">
{{high-charts mode=mode chartOptions=chartDiff content=chartData}}
</div> </div>
<div class="panel panel-default"> <div class="jumbotron">
<div class="panel-heading" role="tab" id="smos_headingTwo"> <div class="container">
<h4 class="panel-title"> <h3 class="text-center" style="padding: 0 0 5px 0; margin: 0 0 40px 0;"> Instructions</h3>
<a class="collapsed" role="button" data-toggle="collapse" data-parent="#smos_settings_smos_tab" <div class="row">
href="#smos_collapseTwo" aria-expanded="false" aria-controls="smos_collapseTwo"> <div class="col-md-12">
PhoenixMiner <p class="lead text-center">
<a href="#/help" class="ul-link">
<span class="ul ul-danger">stratum</span><br /><br />
</a> </a>
</h4> <code>{{config.StratumHost}}:{{config.StratumPort}}</code><br /> <br />
</div> <code>Nicehash Europe password: #</code>
<div id="smos_collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo"> </p>
<div class="panel-body">
<code>
-pool {{config.StratumHost}}:{{config.StratumPort}} -wal wallet_address.WorkerName -coin etc</code>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

8
www/app/templates/luck.hbs

@ -2,10 +2,10 @@
<table class="table table-condensed table-striped"> <table class="table table-condensed table-striped">
<thead> <thead>
<tr> <tr>
<th>{{t "luck.blocks"}}</th> <th>Blocks</th>
<th>{{t "luck.shares_diff"}}</th> <th>Shares/Diff</th>
<th>{{t "luck.uncle_rate"}}</th> <th>Uncle Rate</th>
<th>{{t "luck.orphan_rate"}}</th> <th>Orphan Rate</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

9
www/app/templates/miners.hbs

@ -14,6 +14,7 @@
<th>Login</th> <th>Login</th>
<th>Hashrate</th> <th>Hashrate</th>
<th>Last Beat</th> <th>Last Beat</th>
<th>Mining Type</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -22,6 +23,14 @@
<td>{{#link-to 'account' m.login class='hash'}}{{m.login}}{{/link-to}}</td> <td>{{#link-to 'account' m.login class='hash'}}{{m.login}}{{/link-to}}</td>
<td>{{format-hashrate m.hr}}</td> <td>{{format-hashrate m.hr}}</td>
<td>{{format-date-locale m.lastBeat}}</td> <td>{{format-date-locale m.lastBeat}}</td>
<td>
{{#if m.solo}}
<span class="label label-danger">solo</span>
{{else}}
<span class="label label-warning">pplns</span>
{{/if}}
</td>
</tr> </tr>
{{/each}} {{/each}}
</tbody> </tbody>

26
www/app/templates/payments.hbs

@ -1,20 +1,20 @@
<div class="jumbotron"> <div class="jumbotron-brand">
<div class="container"> <div class="container">
<p class="lead">{{t "payments.pay_tx"}}</p> <p class="lead">Pool always pays tx fees from it's own pocket for now.</p>
<strong>{{t "payments.total_payments_sent"}}:</strong> <span class="label label-info">{{model.paymentsTotal}}</span> <strong>Total payments sent:</strong> <span class="label label-info">{{model.paymentsTotal}}</span>
</div> </div>
</div> </div>
<div class="container"> <div class="container">
{{#if model.payments}} {{#if model.payments}}
<h3>{{t "payments.latest_payouts"}}</h3> <h4>Latest Payouts</h4>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-condensed table-striped"> <table class="table table-condensed table-striped">
<thead> <thead>
<tr> <tr>
<th>{{t "payments.time"}}</th> <th>Time</th>
<th>{{t "payments.amount"}}</th> <th>Amount</th>
<th>{{t "payments.address"}}</th> <th>Address</th>
<th>{{t "payments.txid"}}</th> <th>Tx ID</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -23,12 +23,12 @@
<td>{{format-date-locale tx.timestamp}}</td> <td>{{format-date-locale tx.timestamp}}</td>
<td>{{format-number tx.formatAmount}}</td> <td>{{format-number tx.formatAmount}}</td>
<td> <td>
<a href="{{t " links.blockExplorerLink_address"}}{{tx.address}}" class="hash" rel="nofollow" <a href="https://etc.blockscout.com/address/{{tx.address}}" class="hash" rel="nofollow"
target="_blank">{{tx.address}}</a> target="_blank">{{wallet tx.address}}</a>
</td> </td>
<td> <td>
<a href="{{t " links.blockExplorerLink_tx"}}{{tx.tx}}" class="hash" rel="nofollow" <a href="https://etc.blockscout.com/tx/{{tx.tx}}" class="hash" rel="nofollow" target="_blank">{{format-tx
target="_blank">{{format-tx tx.tx}}</a> tx.tx}}</a>
</td> </td>
</tr> </tr>
{{/each}} {{/each}}
@ -36,6 +36,6 @@
</table> </table>
</div> </div>
{{else}} {{else}}
<h3>{{t "payments.no_payouts_yet"}}</h3> <h3>No payouts yet</h3>
{{/if}} {{/if}}
</div> </div>

45
www/config/environment.js

@ -15,27 +15,57 @@ module.exports = function (environment) {
APP: { APP: {
// API host and port // API host and port
ApiUrl: '//192.168.178.27/', ApiUrl: '//192.168.178.41/',
// HTTP mining endpoint // HTTP mining endpoint
HttpHost: 'http://192.168.178.27', HttpHost: 'http://192.168.178.41',
HttpPort: 8888, HttpPort: 8888,
// Stratum mining endpoint // Stratum mining endpoint
StratumHost: 'example.net', StratumHost: '192.168.178.41',
StratumPort: 8008, StratumPort: 3001,
// The ETC network // The ETC network
Unit: 'ETC', Unit: 'ETC',
Currency: 'USD', Mining: 'SOLO',
// Fee and payout details // Fee and payout details
PoolFee: '1%', PoolFee: '1.0%',
PayoutThreshold: '0.5 ETC', PayoutThreshold: '0.5 ETC',
BlockReward: 2.56, BlockReward: 2.56,
// For network hashrate (change for your favourite fork) // 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; return ENV;
}; };

Loading…
Cancel
Save