yuriy0803 2 years ago
parent
commit
d03ebc9038
  1. 73
      install.sh
  2. 22
      www/app/controllers/account.js
  3. 182
      www/app/controllers/account/index.js
  4. 2
      www/app/controllers/application.js
  5. 504
      www/app/controllers/index.js
  6. 4
      www/app/helpers/format-threshold.js
  7. 7
      www/app/helpers/wallet.js
  8. 2
      www/app/helpers/with-metric-prefix.js
  9. 33
      www/app/index.html
  10. 49
      www/app/models/block.js
  11. 1
      www/app/router.js
  12. 317
      www/app/styles/app.css
  13. 5
      www/app/templates/about.hbs
  14. 55
      www/app/templates/account.hbs
  15. 57
      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. 25
      www/app/templates/blocks/immature.hbs
  24. 25
      www/app/templates/blocks/index.hbs
  25. 24
      www/app/templates/blocks/pending.hbs
  26. 2
      www/app/templates/finders.hbs
  27. 13
      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: '/',
locationType: 'hash',
EmberENV: {
FEATURES: {}
FEATURES: {
// Here you can enable experimental features on an ember canary build
// e.g. 'with-controller': true
}
},
APP: {
// API host and port
ApiUrl: '//$ip_address/',
HttpHost: 'http://$ip_address',
// HTTP mining endpoint
HttpHost: '$ip_address',
HttpPort: 8888,
// Stratum mining endpoint
StratumHost: '$ip_address',
StratumPort: 8008,
// The ETC network
Unit: 'ETC',
Currency: 'USD',
PoolFee: '1%',
Mining: 'SOLO',
// Fee and payout details
PoolFee: '1.0%',
PayoutThreshold: '0.5 ETC',
BlockReward: 2.56,
BlockTime: 13.2
// For network hashrate (change for your favourite fork)
BlockTime: 14.4,
highcharts: {
main: {
enabled: true,
height: 200,
type: 'spline',
color: '',
labelColor: '#909090',
lineColor: '#404850',
tickColor: '#404850',
gridLineColor: '#404850',
gridLineWidthX: 1,
gridLineWidthY: 1,
backgroundColor: 'transparent',
title: '',
ytitle: '',
interval: 180000,
chartInterval: 900000
},
account: {
enabled: true,
height: 300,
type: 'spline',
color: ['', ''],
title: '',
ytitle: '',
interval: 180000,
chartInterval: 900000,
paymentInterval: 30000
}
}
}
};
if (environment === 'development') {
ENV.APP.ApiUrl = 'http://localhost:8080/';
/* Override ApiUrl just for development, while you are customizing
frontend markup and css theme on your workstation.
*/
ENV.APP.ApiUrl = 'http://localhost:8080/'
// ENV.APP.LOG_RESOLVER = true;
// ENV.APP.LOG_ACTIVE_GENERATION = true;
// ENV.APP.LOG_TRANSITIONS = true;
// ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
// ENV.APP.LOG_VIEW_LOOKUPS = true;
}
if (environment === 'test') {
// Testem prefers this...
ENV.locationType = 'none';
// keep test console output quieter
ENV.APP.LOG_ACTIVE_GENERATION = false;
ENV.APP.LOG_VIEW_LOOKUPS = false;
ENV.APP.rootElement = '#ember-testing';
}
if (environment === 'production') {}
if (environment === 'production') {
}
return ENV;
};

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', {
get() {
var percent = this.get('model.roundShares') / this.get('stats.nShares');
@ -30,25 +36,11 @@ export default Ember.Controller.extend({
}
}),
earnPerDayToken: Ember.computed('model', {
earnPerDay: Ember.computed('model', {
get() {
return 24 * 60 * 60 / this.get('applicationController.blockTime') * this.get('config').BlockReward *
this.getWithDefault('model.hashrate') / this.get('hashrate');
}
}),
earnPerDayUsd: Ember.computed('model', {
get() {
return 24 * 60 * 60 / this.get('applicationController.blockTime') * this.get('config').BlockReward *
this.getWithDefault('model.hashrate') / this.get('hashrate') * this.get ('model.exchangedata.price_usd');
}
}),
earnTotalPaid: Ember.computed('model', {
get() {
return 1 * this.get ('model.exchangedata.price_usd') * this.get ('model.stats.paid');
}
})
});

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

@ -14,13 +14,13 @@ export default Ember.Controller.extend({
a = {
chart: {
backgroundColor: "rgba(255, 255, 255, 0.1)",
type: "spline",
type: "column",
marginRight: 10,
height: 290,
height: 300,
events: {
load: function () {
load: function() {
var series = this.series[0];
setInterval(function () {
setInterval(function() {
var x = (new Date()).getTime(),
y = e.getWithDefault("model.currentHashrate") / 1000000;
series.addPoint([x, y], true, true);
@ -31,67 +31,8 @@ export default Ember.Controller.extend({
title: {
text: ""
},
//////
rangeSelector: {
enabled: true,
selected: 4,
allButtonsEnabled: true,
inputDateFormat: '%Y/%m/%d %H:%M',
inputEditDateFormat: '%Y/%m/%d %H:%M',
inputEnabled: false,
buttons: [{
type: 'hour',
count: 1,
text: '1h'
},
{
type: 'hour',
count: 2,
text: '2h'
},
{
type: 'hour',
count: 4,
text: '4h'
},
{
type: 'hour',
count: 6,
text: '6h'
},
{
type: 'hour',
count: 12,
text: '12h'
},
{
type: 'all',
text: 'All'
}
],
},
navigator: {
enabled: true
},
credits: {
enabled: false,
position: {
align: 'right',
x: -10,
verticalAlign: 'bottom',
y: -5
},
href: "https://highcharts.com",
text: "Highcharts"
},
///////
xAxis: {
ordinal: false,
labels: {
style: {
color: "#000"
}
},
type: "datetime",
dateTimeLabelFormats: {
millisecond: "%H:%M:%S",
@ -106,18 +47,11 @@ export default Ember.Controller.extend({
},
yAxis: {
title: {
text: "Hashrate",
style: {
color: "#000"
text: "HASHRATE"
},
},
labels: {
style: {
color: "#000"
}
},
//softMin: e.getWithDefault("model.currentHashrate") / 1000000,
//softMax: e.getWithDefault("model.currentHashrate") / 1000000,
//min: 0,
softMin: e.getWithDefault("model.currentHashrate") / 1.1,
softMax: e.getWithDefault("model.currentHashrate") * 1.2
},
plotLines: [{
value: 0,
@ -125,27 +59,41 @@ export default Ember.Controller.extend({
color: "#808080"
}],
legend: {
enabled: true,
itemStyle:
{
color: "#000"
},
enabled: true
},
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>";
},
useHTML: true
},
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: [{
color: "#15BD27",
name: "3 hours average hashrate",
data: function () {
color: "#E99002",
name: "Average Hashrate",
type: 'spline',
tooltip: {
valueDecimals: 2
},
data: function() {
var e, a = [];
if (null != t) {
for (e = 0; e <= t.length - 1; e += 1) {
@ -161,8 +109,7 @@ export default Ember.Controller.extend({
y: n
});
}
} else {
a.push({
} else { a.push({
x: 0,
d: 0,
y: 0
@ -171,9 +118,12 @@ export default Ember.Controller.extend({
return a;
}()
}, {
name: "30 minutes average hashrate",
color: "#E99002",
data: function () {
name: "Current hashrate",
type: 'spline',
tooltip: {
valueDecimals: 2
},
data: function() {
var e, a = [];
if (null != t) {
for (e = 0; e <= t.length - 1; e += 1) {
@ -189,8 +139,7 @@ export default Ember.Controller.extend({
y: n
});
}
} else {
a.push({
} else { a.push({
x: 0,
d: 0,
y: 0
@ -198,9 +147,15 @@ export default Ember.Controller.extend({
}
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;
}
}),
@ -294,7 +249,7 @@ export default Ember.Controller.extend({
},
},
tooltip: {
formatter: function () {
formatter: function() {
return this.y > 1000000000000 ? "<b>" + this.point.d + "<b><br>Shares&nbsp;" + (this.y / 1000000000000) + "</b>" : this.y > 1000000000 ? "<b>" + this.point.d + "<b><br>Shares&nbsp;" + (this.y / 1000000000) + "</b>" : this.y > 1000000 ? "<b>" + this.point.d + "<b><br>Shares&nbsp;" + (this.y / 1000000) + "</b>" : "<b>" + this.point.d + "<b><br>Shares&nbsp;<b>" + this.y + "</b>";
},
@ -307,7 +262,7 @@ export default Ember.Controller.extend({
series: [{
color: "#15BD27",
name: "Valid share",
data: function () {
data: function() {
var e, a = [];
if (null != t) {
for (e = 0; e <= t.length - 1; e += 1) {
@ -337,7 +292,7 @@ export default Ember.Controller.extend({
name: "Stale share",
color: "#E99002",
data: function () {
data: function() {
var e, a = [];
if (null != t) {
for (e = 0; e <= t.length - 1; e += 1) {
@ -402,36 +357,5 @@ export default Ember.Controller.extend({
};
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', {
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;
}
})

504
www/app/controllers/index.js

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

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

@ -4,8 +4,8 @@ export function formatBalance(value) {
if (value < 0) {
value = 0;
}
value = value * 0.000000001;
return value.toFixed(2); // Change toFixed(1) to toFixed(2)
value = value * 0.000000001 ;
return value.toFixed(1);
}
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;
i++;
}
return n.toFixed(3) + ' ' + units[i - 1];
return n.toFixed(2) + ' ' + units[i - 1];
}
export default Ember.Helper.helper(withMetricPrefix);

33
www/app/index.html

@ -1,20 +1,25 @@
<!DOCTYPE html>
<html lang="en">
<head>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ETC Mining Pool</title>
<meta name="description" content="High profitability ETC mining pool"/>
<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>
<meta name="description" content="High profitability ETC mining pool" />
<meta name="keywords" content="Ethereum, ethereum, Classic, classic, ETC, etc, pool, mining, cryptocurrency" />
<script src="https://cdn.polyfill.io/v1/polyfill.min.js?features=Intl.~locale.en"></script>
{{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/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"}}
</head>
<body>
</head>
<body>
{{content-for "body"}}
<script src="{{rootURL}}assets/vendor.js"></script>
@ -27,14 +32,20 @@
<div class="text-center">
<div class="row">
<div class="col-md-12" style="text-align: center;">
<p class="text-muted" style="margin:20px 0">&copy; |
Powered by <a href="https://github.com/yuriy0803/open-etc-pool-friends" target="_blank">open-etc-pool-friends</a>
<p class="text-muted" style="margin:20px 0">2024 &copy; |
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>
</div>
</div>
</div>
</div>
</footer>
</body>
</html>
</body>
</html>

49
www/app/models/block.js

@ -1,47 +1,38 @@
import Ember from 'ember';
// {
// "candidatesTotal": 0,
// "hashrate": 0,
// "immatureTotal": 0,
// "maturedTotal": 11,
// "minersTotal": 0,
// "nodes": [{
// "difficulty": "2735271",
// "height": "63151",
// "lastBeat": "1471098611",
// "name": "jee-test-pool"
// }],
// "now": 1471098614036,
// "stats": {
// "lastBlockFound": 1471052210
// }
// }
var Block = Ember.Object.extend({
variance: Ember.computed('difficulty', 'shares', function() {
var percent = this.get('shares') / this.get('difficulty');
import EmberObject from '@ember/object';
import { computed } from '@ember/object';
var Block = EmberObject.extend({
variance: computed('difficulty', 'shares', function() {
let percent = this.get('shares') / this.get('difficulty');
if (!percent) {
return 0;
}
return percent;
}),
isLucky: Ember.computed('variance', function() {
isLucky: computed('variance', function() {
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');
}),
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')) {
var value = parseInt(this.get('reward')) * 0.000000000000000001;
let value = parseInt(this.get('reward')) * 0.000000000000000001;
return value.toFixed(6);
} else {
return 0;

1
www/app/router.js

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

317
www/app/styles/app.css

@ -4,13 +4,11 @@ html {
position: relative;
min-height: 100%;
}
body {
/* Margin bottom by footer height */
margin-bottom: 110px;
/* background: url('/bg.png'); /* */
}
.footer {
position: absolute;
bottom: 0;
@ -18,14 +16,13 @@ body {
/* Set the fixed height of the footer here */
background-color: #3a3b3c;
}
.center {
align-items: center;
display: flex;
}
/* Custom page CSS
-------------------------------------------------- */
-------------------------------------------------- */
/* Not required for template or sticky footer method. */
body {
@ -33,26 +30,21 @@ body {
padding-bottom: 5px;
}
body>.container {
body > .container {
padding: 0px 15px 0;
background-color: #f3f2eb;
}
.navbar {
display: flex;
}
.page-header {
border-bottom-color: #d6d6d6;
}
.container .text-muted {
margin: 20px 0;
color: #9babb3;
text-shadow: 1px 1px 3px #202225;
}
.footer>.container {
.footer > .container {
padding-right: 15px;
padding-left: 15px;
}
@ -83,83 +75,58 @@ code {
border-color: #61BD81;
border-bottom-width: 2px;
}
.navbar-default .navbar-brand {
color: #4A4A4A;
}
.navbar-default .navbar-brand:hover,
.navbar-default .navbar-brand:focus {
.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
color: #4A4A4A;
}
.navbar-default .navbar-text {
color: #4A4A4A;
}
.navbar-default .navbar-nav>li>a {
.navbar-default .navbar-nav > li > a {
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;
}
.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;
background-color: #61BD81;
text-shadow: 1px 1px 2px #000;
}
.navbar-default .navbar-nav>.open>a,
.navbar-default .navbar-nav>.open>a:hover,
.navbar-default .navbar-nav>.open>a:focus {
.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
color: #ffffff;
background-color: #69102b;
}
.navbar-default .navbar-toggle {
border-color: #2885da;
}
.navbar-default .navbar-toggle:hover,
.navbar-default .navbar-toggle:focus {
.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
background-color: #2885da;
}
.navbar-default .navbar-toggle .icon-bar {
background-color: #4A4A4A;
}
.navbar-default .navbar-collapse,
.navbar-default .navbar-form {
border-color: #4A4A4A;
}
.navbar-default .navbar-link {
color: #4A4A4A;
}
.navbar-default .navbar-link:hover {
color: #ffffff;
}
@media (max-width: 767px) {
.navbar-default .navbar-nav .open .dropdown-menu>li>a {
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
color: #4A4A4A;
}
.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,
.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus {
.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
color: #ffffff;
}
.navbar-default .navbar-nav .open .dropdown-menu>.active>a,
.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,
.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus {
.navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
color: #ffffff;
background-color: #3f9ff7;
}
@ -184,18 +151,12 @@ span.logo-3 {
padding: 0 3px 0 3px;
}
h1,
h2,
h3,
h4,
h4,
h6 {
h1, h2, h3, h4, h4, h6 {
margin-top: 0px;
}
.container>h2,
.container>h3 {
margin-top: 2.0rem;
.container>h2, .container>h3 {
margin-top:2.0rem;
}
.note code {
@ -239,11 +200,11 @@ span.logo-gold {
pointer-events: none;
}
.etc-green>object {
.etc-green > object{
float: left;
}
.etc-green>strong {
.etc-green > strong{
float: left;
}
@ -253,8 +214,8 @@ span.logo-gold {
.etc-green {
transform: scale(0.4);
transform: translate(-200px, -50px);
}
*/
}
*/
.navbar-collapse {
font-size: 14px;
@ -282,7 +243,6 @@ h4.note {
margin-top: 0;
font-weight: 300 !important;
}
/*---------------------------------------------------------------------------------------------------*/
/*----------------------------Bootstrap side notes for calling out things----------------------------*/
/*---------------------------------------------------------------------------------------------------*/
@ -295,24 +255,19 @@ h4.note {
border-left-width: 5px;
border-radius: 3px;
}
.bs-callout h4 {
margin-top: 0;
margin-bottom: 5px;
}
.bs-callout p:last-child {
margin-bottom: 0;
}
.bs-callout code {
border-radius: 3px;
}
.bs-callout+.bs-callout {
margin-top: -5px;
}
/* Themes for different contexts */
/* Default */
@ -320,7 +275,6 @@ h4.note {
background-color: #eeeeee;
border-left-color: #777;
}
.bs-callout-default h4 {
color: #777;
}
@ -330,7 +284,6 @@ h4.note {
background-color: #e8effc;
border-left-color: #428bca;
}
.bs-callout-primary h4 {
color: #428bca;
}
@ -340,7 +293,6 @@ h4.note {
background-color: #eafce8;
border-left-color: #5cb85c;
}
.bs-callout-success h4 {
color: #5cb85c;
}
@ -350,7 +302,6 @@ h4.note {
background-color: #fce8e8;
border-left-color: #d9534f;
}
.bs-callout-danger h4 {
color: #d9534f;
}
@ -360,7 +311,6 @@ h4.note {
background-color: #fcfbe8;
border-left-color: #f0ad4e;
}
.bs-callout-warning h4 {
color: #f0ad4e;
}
@ -370,7 +320,6 @@ h4.note {
background-color: #E8F6FC;
border-left-color: #5bc0de;
}
.bs-callout-info h4 {
color: #5bc0de;
}
@ -384,37 +333,30 @@ h4.note {
margin-bottom: 10px;
margin-top: 5px;
}
.stats:last-child {
.stats:last-child{
width: auto;
}
.stats>h3>i {
.stats > h3 > i {
width: 21px;
}
.stats>div {
.stats > div{
padding: 5px 0;
}
.stats>div>.fa {
.stats > div > .fa {
width: 25px;
}
.stats>div>span:first-of-type {
.stats > div > span:first-of-type{
font-weight: bold;
}
/*--------------------------------------| Bootstrap overrides |--------------------------------------*/
.ul,
.ul-link {
.ul, .ul-link {
font-weight: 200;
text-align: center;
}
.ul-link:hover,
.ul-link:focus {
.ul-link:hover, .ul-link:focus {
color: inherit;
text-decoration: none;
opacity: .70;
@ -455,9 +397,8 @@ h4.note {
border-bottom: 2px solid #61BD81;
}
#alertError,
#alertSuccess {
display: none;
#alertError,#alertSuccess{
display:none;
}
/*-----------------------------------------| Custom Classes |-----------------------------------------*/
@ -496,31 +437,24 @@ h4.note {
.bg-black {
color: #f9f9f9 !important;
}
.bg-gray {
background-color: #eaeaec !important;
}
.bg-blackd {
.bg-blackd{
background-color: #222222 !important;
}
.bg-red {
background-color: #f56954 !important;
}
.bg-yellow {
background-color: #f39c12 !important;
}
.bg-cherry {
.bg-cherry{
background-color: #cd1231 !important;
}
.bg-aqua {
background-color: #00c0ef !important;
}
.bg-blue {
background-color: #0073b7 !important;
}
@ -528,47 +462,36 @@ h4.note {
.bg-light-blue {
background-color: #5fb4ef !important;
}
.bg-wood {
.bg-wood{
background-color: #ab7d44 !important;
}
.bg-green {
background-color: #00a65a !important;
}
.bg-grass {
background-color: #a1c436 !important;
}
.bg-navy {
background-color: #001f3f !important;
}
.bg-teal {
background-color: #39cccc !important;
}
.bg-olive {
background-color: #7f8000 !important;
}
.bg-lime {
background-color: #00e405 !important;
}
.bg-orange {
background-color: #ff851b !important;
}
.bg-fuchsia {
background-color: #f012be !important;
}
.bg-purple {
background-color: #932ab6 !important;
}
.bg-maroon {
background-color: #85144b !important;
}
@ -576,60 +499,46 @@ h4.note {
.bg-black {
background-color: #000 !important;
}
/* Text colors */
.text-red {
color: #f56954 !important;
}
.text-yellow {
color: #f39c12 !important;
}
.text-aqua {
color: #00c0ef !important;
}
.text-blue {
color: #0073b7 !important;
}
.text-light-blue {
color: #3c8dbc !important;
}
.text-green {
color: #00a65a !important;
}
.text-navy {
color: #001f3f !important;
}
.text-teal {
color: #39cccc !important;
}
.text-olive {
color: #7f8000 !important;
}
.text-lime {
color: #01ff70 !important;
}
.text-orange {
color: #ff851b !important;
}
.text-fuchsia {
color: #f012be !important;
}
.text-purple {
color: #932ab6 !important;
}
.text-maroon {
color: #85144b !important;
}
@ -638,7 +547,8 @@ h4.note {
color: #ffffff !important;
}
.text-light-yellow {
.text-light-yellow
{
color: #fefc2e !important;
}
@ -646,22 +556,22 @@ h4.note {
.funkyradio div {
clear: both;
overflow: hidden;
}
}
.funkyradio label {
.funkyradio label {
width: 100%;
border-radius: 3px;
border: 1px solid #D1D3D4;
font-weight: normal;
}
}
.funkyradio input[type="radio"]:empty,
.funkyradio input[type="checkbox"]:empty {
.funkyradio input[type="radio"]:empty,
.funkyradio input[type="checkbox"]:empty {
display: none;
}
}
.funkyradio input[type="radio"]:empty~label,
.funkyradio input[type="checkbox"]:empty~label {
.funkyradio input[type="radio"]:empty ~ label,
.funkyradio input[type="checkbox"]:empty ~ label {
position: relative;
line-height: 2.5em;
text-indent: 3.25em;
@ -671,10 +581,10 @@ h4.note {
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
}
.funkyradio input[type="radio"]:empty~label:before,
.funkyradio input[type="checkbox"]:empty~label:before {
.funkyradio input[type="radio"]:empty ~ label:before,
.funkyradio input[type="checkbox"]:empty ~ label:before {
position: absolute;
display: block;
top: 0;
@ -684,83 +594,82 @@ h4.note {
width: 2.5em;
background: #D1D3D4;
border-radius: 3px 0 0 3px;
}
}
.funkyradio input[type="radio"]:hover:not(:checked)~label,
.funkyradio input[type="checkbox"]:hover:not(:checked)~label {
.funkyradio input[type="radio"]:hover:not(:checked) ~ label,
.funkyradio input[type="checkbox"]:hover:not(:checked) ~ label {
color: #888;
}
}
.funkyradio input[type="radio"]:hover:not(:checked)~label:before,
.funkyradio input[type="checkbox"]:hover:not(:checked)~label:before {
.funkyradio input[type="radio"]:hover:not(:checked) ~ label:before,
.funkyradio input[type="checkbox"]:hover:not(:checked) ~ label:before {
content: '\2714';
text-indent: .9em;
color: #C2C2C2;
}
}
.funkyradio input[type="radio"]:checked~label,
.funkyradio input[type="checkbox"]:checked~label {
.funkyradio input[type="radio"]:checked ~ label,
.funkyradio input[type="checkbox"]:checked ~ label {
color: #777;
}
}
.funkyradio input[type="radio"]:checked~label:before,
.funkyradio input[type="checkbox"]:checked~label:before {
.funkyradio input[type="radio"]:checked ~ label:before,
.funkyradio input[type="checkbox"]:checked ~ label:before {
content: '\2714';
text-indent: .9em;
color: #333;
background-color: #ccc;
}
}
.funkyradio input[type="radio"]:focus~label:before,
.funkyradio input[type="checkbox"]:focus~label:before {
.funkyradio input[type="radio"]:focus ~ label:before,
.funkyradio input[type="checkbox"]:focus ~ label:before {
box-shadow: 0 0 0 3px #999;
}
}
.funkyradio-default input[type="radio"]:checked~label:before,
.funkyradio-default input[type="checkbox"]:checked~label:before {
.funkyradio-default input[type="radio"]:checked ~ label:before,
.funkyradio-default input[type="checkbox"]:checked ~ label:before {
color: #333;
background-color: #ccc;
}
}
.funkyradio-primary input[type="radio"]:checked~label:before,
.funkyradio-primary input[type="checkbox"]:checked~label:before {
.funkyradio-primary input[type="radio"]:checked ~ label:before,
.funkyradio-primary input[type="checkbox"]:checked ~ label:before {
color: #fff;
background-color: #337ab7;
}
}
.funkyradio-success input[type="radio"]:checked~label:before,
.funkyradio-success input[type="checkbox"]:checked~label:before {
.funkyradio-success input[type="radio"]:checked ~ label:before,
.funkyradio-success input[type="checkbox"]:checked ~ label:before {
color: #fff;
background-color: #5cb85c;
}
}
.funkyradio-danger input[type="radio"]:checked~label:before,
.funkyradio-danger input[type="checkbox"]:checked~label:before {
.funkyradio-danger input[type="radio"]:checked ~ label:before,
.funkyradio-danger input[type="checkbox"]:checked ~ label:before {
color: #fff;
background-color: #d9534f;
}
}
.funkyradio-warning input[type="radio"]:checked~label:before,
.funkyradio-warning input[type="checkbox"]:checked~label:before {
.funkyradio-warning input[type="radio"]:checked ~ label:before,
.funkyradio-warning input[type="checkbox"]:checked ~ label:before {
color: #fff;
background-color: #f0ad4e;
}
}
.funkyradio-info input[type="radio"]:checked~label:before,
.funkyradio-info input[type="checkbox"]:checked~label:before {
.funkyradio-info input[type="radio"]:checked ~ label:before,
.funkyradio-info input[type="checkbox"]:checked ~ label:before {
color: #fff;
background-color: #5bc0de;
}
.panel-footer {
}
.panel-footer {
padding: 10px 15px;
background-color: #f5f5f5;
border-top: 1px solid #ddd;
border-bottom-right-radius: 0px;
border-bottom-left-radius: 0px;
}
}
.loader {
.loader {
color: #025886;
font-size: 20px;
margin: auto;
@ -773,116 +682,64 @@ h4.note {
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
top: 0;
top:0;
bottom: 0;
left: 0;
right: 0;
position: absolute;
}
@-webkit-keyframes load4 {
}
@-webkit-keyframes load4 {
0%,
100% {
box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
}
@keyframes load4 {
}
@keyframes load4 {
0%,
100% {
box-shadow: 0 -3em 0 0.2em, 2em -2em 0 0em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 -1em, -3em 0 0 -1em, -2em -2em 0 0;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
}
.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>
<p>
<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>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>Payouts and block unlocking module</li>
<li>Designed for 100% distributed setup</li>

55
www/app/templates/account.hbs

@ -9,19 +9,22 @@
</div>
<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> Your Threshold: <span>{{format-threshold model.threshold}}
{{config.Unit}}</span><br>
<i class="fa fa-bank"></i> Your Threshold: <span>{{format-threshold model.threshold}}</span><br>
<small>Credited coins awaiting payout.</small>
</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}}
<div style="display: block;">
<i class="fa fa-clock-o"></i> Current Payment: <span>{{format-balance model.stats.pending}}</span><br>
</div>
{{/if}}
<div style="display: block;"><i class="fa fa-money"></i> Total Paid: <span>{{format-balance
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> Total Paid: <span>{{format-balance model.stats.paid}}</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-calculator"></i>Earnings per day (24h avg):<span>{{format-number earnPerDay}}</span></div>
</div>
<div class="col-md-4 stats">
{{#if model.stats.lastShare}}
@ -29,34 +32,24 @@
Last Share Submitted: <span>{{format-relative (seconds-to-ms (string-to-int model.stats.lastShare))}}</span>
</div>
{{/if}}
<div style="display: block;"><i class="fa fa-gears"></i> Workers Online: <span>{{format-number
model.workersOnline}}</span></div>
<div style="display: block;"><i class="fa fa-tachometer"></i> Hashrate (30m): <span>{{format-hashrate
model.currentHashrate}}</span></div>
<div style="display: block;"><i class="fa fa-tachometer"></i> Hashrate (3h): <span>{{format-hashrate
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 style="display: block;"><i class="fa fa-gears"></i> Workers Online: <span>{{format-number 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 (6 Hour): <span>{{format-hashrate model.hashrate}}</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-gears"></i> Mining Type:<span>{{#if model.miningTypeSolo}}<span>SOLO</span>{{else}}<span> PPLNS</span>{{/if}}</span></div>
</div>
<div class="col-md-4 stats">
<div style="display: block;"><i class="fa fa-tachometer"></i> Blocks Found: <span>{{format-number
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;"><i class="fa fa-tachometer"></i> Blocks Found: <span>{{format-number model.stats.blocksFound fallback='0'}}</span></div>
<div style="display: block;">
<i class="fa fa-clock-o"></i>
Epoch Switch: <span>{{format-relative applicationController.nextEpoch units="hour"}}</span>
</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>
@ -65,8 +58,7 @@
<div class="container">
<ul class="nav nav-tabs">
{{#active-li currentWhen='account.index' role='presentation'}}
{{#link-to 'account.index'}}Workers <span class="label label-success">{{model.workersOnline}}</span> / <span
class="label label-danger">{{model.workersOffline}}</span>{{/link-to}}
{{#link-to 'account.index'}}Workers <span class="label label-success">{{model.workersOnline}}</span> / <span class="label label-danger">{{model.workersOffline}}</span>{{/link-to}}
{{/active-li}}
{{#active-li currentWhen='account.rewards' role='presentation'}}
{{#link-to 'account.rewards'}}Rewards{{/link-to}}
@ -76,6 +68,9 @@
{{/active-li}}
{{#active-li currentWhen='account.settings' role='presentation'}}
{{#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}}
</ul>
</div>

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

@ -1,36 +1,6 @@
<div class="container">
{{high-charts mode=chartMode chartOptions=chartOptions 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>
{{high-charts mode=chartMode chartOptions=chartOptions content=chartData}}
{{high-charts mode=chartMode chartOptions=shareChart content=chartData}}
{{#if model.workers}}
<h4>Your Workers</h4>
<div class="table-responsive">
@ -38,8 +8,7 @@
<thead>
<tr>
<th>ID</th>
<th>Hashrate (rough, short average)</th>
<th>Hashrate (accurate, long average)</th>
<th>Current Hashrate / Average Hashrate</th>
<th>Hostname</th>
<th>Port Difficulty</th>
<th>Blocks</th>
@ -49,19 +18,13 @@
</thead>
<tbody>
{{#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>{{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}}</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>{{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>
<td>{{v.hostname}}</td>
<td><span class="label label-success">{{format-hashrate v.portDiff}}</span></td>
<td>{{v.blocks}}</td>
<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>
<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>
<td>{{format-relative (seconds-to-ms v.lastBeat)}}</td>
</tr>
{{/each-in}}
@ -73,14 +36,12 @@
{{/if}}
<div class="alert alert-info" role="alert">
<span class="sr-only">Notice:</span>
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
hours.<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 1 hours and long window is usually equal to 6 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,
so you can perform maintenance of your rigs.
</div>
<div class="alert alert-info" role="alert">
<strong>Your bulk stats JSON API URL:</strong> <a
href="/api/accounts/{{model.login}}">/api/accounts/{{model.login}}</a>
<strong>Your bulk stats JSON API URL:</strong> <a href="/api/accounts/{{model.login}}">/api/accounts/{{model.login}}</a>
</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>
<td>{{format-date-locale tx.timestamp}}</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>{{format-balance tx.amount}}</td>
</tr>

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

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

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

@ -11,6 +11,7 @@
</div>
</div>
<form action="/api/settings" method="post">
<div class="form-group">
@ -20,7 +21,6 @@
placeholder="Enter email">
<small id="emailHelp" class="form-text text-dark">We'll never share your email with anyone else.</small>
</div>
<div class="form-group">
<label for="threshold">Payment Threshold</label>
<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:
10000)</small>
</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">
@ -36,7 +35,6 @@
Please complete your worker`s IP address in order to validate and save your settings.
</small>
</div>
<div class="form-group form-check">
<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
@ -44,7 +42,6 @@
my workers goes offline
</label>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>

2
www/app/templates/application.hbs

@ -63,6 +63,7 @@
<script>
$(document).mouseup(function (e) {
var container = $(".collapse");
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
{
@ -71,6 +72,7 @@
$("#navBtn").attr('aria-expanded', false);
$("#navbarSupportedContent").removeClass("show");
}
});
</script>
</div>

9
www/app/templates/blocks.hbs

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

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

@ -1,10 +1,10 @@
<tr>
<td>
{{#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>
{{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>
{{/if}}
</td>
@ -12,33 +12,26 @@
{{#if block.uncle}}
<td>{{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}}</td>
{{else if block.orphan}}
<span class="label label-danger">{{t "block.orphan"}}</span>
<span class="label label-danger">Orphan</span>
{{else}}
<td>{{#link-to 'account' block.finder class='hash'}}{{block.finder}}{{/link-to}}</td>
{{/if}}
</td>
<td>{{format-date-locale block.timestamp}}</td>
<td>
{{#if block.uncle}}
<a href="{{t " links.blockExplorerLink_uncle"}}{{block.hash}}" class="hash" rel="nofollow"
target="_blank">{{block.hash}}</a>
{{else if block.orphan}}
<span class="label label-danger">{{t "block.orphan"}}</span>
{{#if block.isSolo}}
<span class="label label-danger">{{block.miningType}}</span>
{{else}}
<a href="{{t " links.blockExplorerLink_block"}}{{block.hash}}" class="hash" rel="nofollow"
target="_blank">{{block.hash}}</a>
<span class="label label-warning">{{block.miningType}}</span>
{{/if}}
</td>
<td>{{format-date-locale block.timestamp}}</td>
<td>
{{#if block.isLucky}}
<span class="label label-success">{{format-number block.variance style='percent'}}</span>
{{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>
{{/if}}
{{/if}}
</td>
<td>
{{#if block.uncle}}
@ -47,6 +40,13 @@
<span class="label label-primary">{{block.formatReward}}</span>
{{/if}}
</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>{{block.worker}}</td>
</tr>

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

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

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

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

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

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

2
www/app/templates/finders.hbs

@ -16,7 +16,7 @@
<tbody>
{{#each model.finders as |f|}}
<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>
</tr>
{{/each}}

13
www/app/templates/help.hbs

@ -10,19 +10,22 @@
<h3>lolMiner</h3>
</div>
<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><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">
<dt>YOUR_ETC_ADDRESS</dt>
<dd>This is your address for payouts, generate one with core-geth, or mine directly to exchange like
<a href="http://bittrex.com" rel="nofollow" target="_blank">Bittrex</a>.<br/>
<a href="http://bittrex.com" rel="nofollow" target="_blank">Bittrex</a>.<br />
<strong>Example:</strong> <code>0xd92fa5a9732a0aec36dc8d5a6a1305dc2d3e09e6</code>.
</dd>
</dl>
<p>
<strong>Full example:</strong>
<code>./lolMiner --pool {{config.StratumHost}}:{{config.StratumPort}} --user 0xd92fa5a9732a0aec36dc8d5a6a1305dc2d3e09e6 -c ETC {{if (equals config.Network 'mordor') "--ecip1099-activation 84"}} --ethstratum=ETHPROXY</code>.<br/>
<code>./lolMiner --pool {{config.StratumHost}}:{{config.StratumPort}} --user 0xd92fa5a9732a0aec36dc8d5a6a1305dc2d3e09e6 -c ETC {{if (equals config.Network 'mordor') "--ecip1099-activation 84"}} --ethstratum=ETHPROXY</code>.<br />
</p>
</div>
@ -52,7 +55,7 @@ pool1={{config.StratumHost}}:{{config.StratumPort}}
<h4>Advice</h4>
<p>CPU mining is not recommended.</p>
<h4>Terms of Service</h4>
<p>By using the pool you accept all possible risks related to experimental software usage.<br/>
<p>By using the pool you accept all possible risks related to experimental software usage.<br />
Pool owner can't compensate any irreversible losses, but will do his best to prevent worst case.
</p>
</p>

190
www/app/templates/index.hbs

@ -1,177 +1,83 @@
<div class="jumbotron">
<div class="jumbotron-brand">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="alert alert-info text-center join_telegram">
Join our <a class="alert-link" href="https://discord.gg/FDx7TzXDFQ">Discord</a> for support!
<div class="col-md-5">
<div class="row">
<h1 style="font-size: 24px">
<div class="etc-green">
<strong><span class="logo-2">ETHW Pool</span></strong>
</div>
</h1>
</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 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 class="col-md-4 stats">
<div class="stats-box">
<div><i class="fa fa-users"></i> {{t "home.miners_online"}}: <span id="poolHashrate">{{format-number
<div class="col-md-3 stats">
<div><i class="fa fa-users"></i> Miners Online: <span id="poolHashrate">{{format-number
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>
<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>
{{#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>
{{/if}}
<div><i class="fa fa-clock-o"></i> {{t "home.block_time"}}: <span>{{format-number stats.blockTime}} s</span>
</div>
<div><i class="fa fa-gears"></i> {{t "home.epoch"}}: <span>{{format-number epoch}}</span> {{t
"home.dag_Size"}}:
<span>{{format-number
dag}} GB</span>
<div><i class="fa fa-clock-o"></i> AVG BLOCK TIME: <span>{{format-number stats.blockTime}} s</span></div>
<div><i class="fa fa-gears"></i>Epoch: <span>{{format-number epoch}}</span> DAG Size: <span>{{format-number
dag}} GB</span></div>
</div>
</div>
</div>
<div class="col-md-4 stats">
<div class="stats-box">
<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><i class="fa fa-unlock-alt"></i> Network Difficulty: <span>{{with-metric-prefix stats.difficulty}}</span>
</div>
<div><i class="fa fa-clock-o"></i> {{t "home.current_round_variance"}}: <span>{{format-number
stats.roundVariance style='percent'}}</span></div>
<div><i class="fa fa-tachometer"></i> Network Hashrate: <span>{{format-hashrate stats.hashrate}}</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><i class="fa fa-credit-card-alt fa-fw"></i> Current price: <span>$ {{model.exchangedata.price_usd}}</span>
</div>
<div><i class="fa fa-money"></i> {{t "home.current_price"}}: <span>$
{{format-number model.exchangedata.price_usd maximumFractionDigits='8'}}</span></div>
</div>
</div>
</div>
</div>
<div class="container">
<div>
{{high-charts mode=chartMode chartOptions=chartOptions content=chartData}}
</div>
<div class="stats">
<h3>{{t "home.query_history"}}</h3>
<h4>Your Stats &amp; Payment History</h4>
<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">
<button class="btn btn-primary" type="button" {{action 'lookup' cachedLogin}}>
<span style="display: inline;"><i class="fa fa-search"></i> {{t "home.button.lookup"}}</span>
<button class="btn btn-primary btn-etc" type="button" {{action 'lookup' cachedLogin}}>
<span style="display: inline;"><i class="fa fa-search"></i> Search</span>
</button>
</span>
</div>
</div>
<div>
<hr />
<div class="row">
<div class="col-md-4 col-sm-12">
<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>
{{#if config.highcharts.main.enabled}}
<div class="container">
{{high-charts mode=mode chartOptions=chartOptions content=chartData}}
</div>
{{/if}}
<div class="container">
{{high-charts mode=mode chartOptions=chartDiff content=chartData}}
</div>
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="smos_headingTwo">
<h4 class="panel-title">
<a class="collapsed" role="button" data-toggle="collapse" data-parent="#smos_settings_smos_tab"
href="#smos_collapseTwo" aria-expanded="false" aria-controls="smos_collapseTwo">
PhoenixMiner
<div class="jumbotron">
<div class="container">
<h3 class="text-center" style="padding: 0 0 5px 0; margin: 0 0 40px 0;"> Instructions</h3>
<div class="row">
<div class="col-md-12">
<p class="lead text-center">
<a href="#/help" class="ul-link">
<span class="ul ul-danger">stratum</span><br /><br />
</a>
</h4>
</div>
<div id="smos_collapseTwo" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingTwo">
<div class="panel-body">
<code>
-pool {{config.StratumHost}}:{{config.StratumPort}} -wal wallet_address.WorkerName -coin etc</code>
</div>
</div>
</div>
</div>
<code>{{config.StratumHost}}:{{config.StratumPort}}</code><br /> <br />
<code>Nicehash Europe password: #</code>
</p>
</div>
</div>
</div>

8
www/app/templates/luck.hbs

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

9
www/app/templates/miners.hbs

@ -14,6 +14,7 @@
<th>Login</th>
<th>Hashrate</th>
<th>Last Beat</th>
<th>Mining Type</th>
</tr>
</thead>
<tbody>
@ -22,6 +23,14 @@
<td>{{#link-to 'account' m.login class='hash'}}{{m.login}}{{/link-to}}</td>
<td>{{format-hashrate m.hr}}</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>
{{/each}}
</tbody>

26
www/app/templates/payments.hbs

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

45
www/config/environment.js

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

Loading…
Cancel
Save